#terraform #terraform-provider-aws
#terraform #terraform-provider-aws
Вопрос:
Кто-нибудь придумал достойный способ сделать это?
Короче говоря, у вас есть provider "aws"
, настроенный через переменные среды или профиль, с или без sts
, это не имеет значения. Возможно, у вас их несколько.
Теперь вы хотите обратиться к aws
cli, потому что что-то не очень хорошо реализовано в поставщике aws. В моем случае мне нужно сгенерировать и загрузить некоторую конфиденциальную информацию непосредственно в корзину S3, которую я не хочу видеть в файле состояния. В любом случае, это было s3 sync
, поэтому действие является идемпотентным.
Однако, похоже, нет способа передать учетные данные поставщика — постоянные, env var, profile временному sts — в null_resource
предложение:
provider "aws" {
# set using explicit setting or profile or however
alias = "myaws"
}
resource "null_resource" "cli" {
provisioner "local-exec" {
command = "aws <do something>"
environment {
# happy to pass AWS_PROFILE or AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY here...
# if there were a way to retrieve it from the "myaws" provider
}
}
}
Комментарии:
1. Python boto3, вероятно, будут работать лучше, чем AWS CLI здесь, для того, что вы хотите.
2. Возможно. Или, может быть, мне нужен скрипт. Или какой-либо другой двоичный файл. Для любого из вышеперечисленных действий все равно потребуется null_resource local-exec, у которого такая же проблема с передачей учетных данных поставщика.
3. Как вы получаете учетные данные для своего поставщика AWS? Вы принимаете на себя роль? Если да, то почему бы просто не взять на себя эту роль также через AWS CLI?
4. Интерфейс командной строки также имеет, как и большинство SDK. В tf я мог передавать учетные данные напрямую, мог использовать переменные среды, мог использовать профиль, мог взять на себя роль, мог иметь несколько наборов учетных данных / ролей. Прелесть ресурсов aws в tf в том, что никому не нужно знать, он просто получает правильные учетные данные для действий. Внешняя дочерняя команда должна уметь делать то же самое.
5. Да, у нас определенно нет жестко запрограммированных учетных данных; никогда бы не стали. Похоже, вы предполагаете, что существует один профиль по умолчанию или один набор учетных данных. Если нет, то вам нужно указать профиль в
provider
части, возможно, даже сделатьassume role
там. Независимо от того, что указано «по умолчанию» в моих учетных данных, могут быть или не быть правильными учетными данными / ролью для использования при выполнении команды. terraform проделал довольно хорошую работу, предоставляя управление с помощью vars иalias
опцииprovider "aws"{}
, и он использует правильный, но у меня нет способа передать его вlocal-exec
Ответ №1:
Вы можете передать AWS role_arn в local-exec
скрипт. Например:
variable "aws_role" {
type = string
description = "AWS role for local exec to assume"
default = "arn:aws:iam::123456789012:role/DBMigrateRole"
}
resource "null_resource" "call-db-migrate" {
provisioner "local-exec" {
interpreter = ["/bin/bash", "-c"]
command = <<EOF
set -e
CREDENTIALS=(`aws sts assume-role
--role-arn ${var.aws_role}
--role-session-name "db-migration-cli"
--query "[Credentials.AccessKeyId,Credentials.SecretAccessKey,Credentials.SessionToken]"
--output text`)
unset AWS_PROFILE
export AWS_DEFAULT_REGION=us-east-1
export AWS_ACCESS_KEY_ID="$${CREDENTIALS[0]}"
export AWS_SECRET_ACCESS_KEY="$${CREDENTIALS[1]}"
export AWS_SESSION_TOKEN="$${CREDENTIALS[2]}"
aws sts get-caller-identity
EOF
}
}
Спасибо https://github.com/hashicorp/terraform-provider-aws/issues/8242#issuecomment-586687360 .