Как передать учетные данные поставщика aws поставщику null_resource local-exec?

#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 .