Как заставить Terragrunt автоматически устанавливать переменную среды «AWS_PROFILE»?

#amazon-web-services #terraform #terragrunt

#amazon-web-services #terraform #terragrunt

Вопрос:

Я не могу заставить это работать. Мне нужно установить переменную AWS_PROFILE среды, чтобы заставить terragrunt работать правильно. Если я запущу:

 export AWS_PROFILE=myprofile; terragrunt plan
 

Это сработает, но это не то, что мне нужно, я хочу просто запустить:

 terragrunt plan
 

и пусть этот автоматический выбор правильного профиля aws, который я должен использовать. Вот что у меня есть:

 generate "provider" {
  path = "provider.tf"
  if_exists = "overwrite_terragrunt"
  contents = <<EOF
provider "aws" {
  region  = "${local.region}"
  profile = "${trimspace(run_cmd("bash", "${get_parent_terragrunt_dir()}/../../set_profile.sh",local.profile))}"
}
EOF
}
remote_state {
  backend = "s3"
  generate = {
    path      = "backend.tf"
    if_exists = "overwrite"
  }
  config = {
    ...
    ...
    region         = local.region
    profile        = local.profile
    ...
    ...
  }
}
 

Он всегда выдает мне ошибку:

 Error finding AWS credentials (did you set the AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY environment variables?): NoCredentialProviders: no valid providers in chain. Deprecated.
        For verbose messaging see aws.Config.CredentialsChainVerboseErrors
 

set_profile.sh Сценарий выглядит следующим образом:

 #!/bin/bash

VALUE=$(echo $1 | sed $'s/r//')
export AWS_PROFILE=$VALUE
echo "$AWS_PROFILE"
 

Если я повторяю свое AWS_PROFILE , оно все еще пустое. Таким образом, команда run фактически не сохраняет значение экспорта на моей консоли.

Что я делаю не так? Кто-нибудь действительно успешно смог динамически устанавливать их AWS_PROFILE с помощью terragrunt?

Комментарии:

1. Может быть не связано, но убедитесь, что вы очищаете кэш terragrunt между запусками при внесении изменений в конфигурации поставщика

2. К сожалению, кубиков нет. Я очистил свой .terragrunt-cache каталог. Повторно запустил план terragrunt с той же ошибкой и все равно получил пустой результат с echo $AWS_PROFILE

3. О, подождите. Я удалил строку, указывающую мой профиль в серверной части s3. Я добавил его снова, снова очистил кешем, и теперь он работает. Я думаю, это было так!

Ответ №1:

Этот пост помог мне разобраться в моей проблеме:

Я забыл о том факте, что в моей конфигурации есть 2 подключения AWS к настройке

  • серверная часть
  • поставщик услуг

Следовательно, профиль AWS пришлось устанавливать дважды:

  • в remote_state
     remote_state {
      backend = "s3"
      config = {
        ...
        profile = local.profile
        ...
      }
    }
     
  • в provider.tf
     generate "provider" {
      path      = "provider.tf"
      if_exists = "skip"
      contents  = <<EOF
    provider "aws" {
      ...
      profile = "${local.profile}"
      ...
    }
    EOF
    }
     

Надеюсь, это сэкономит кому-то все время, которое я потратил впустую сегодня!

Ответ №2:

Это мое решение. У меня следующая структура:

 <project>
    |-- <region1>
    |-- <region2>
    |-- account.hcl
terragrunt.hcl
 

В account.hcl

 locals {
  aws_profile_name = "myprofile"
}
 

В основном terragrunt.hcl

 locals {
  # Automatically load account-level variables
  account_vars = read_terragrunt_config(find_in_parent_folders("account.hcl"))

  aws_profile = local.account_vars.locals.aws_profile_name
}

terraform {
  extra_arguments "aws_profile" {
    commands = [
      "init",
      "apply",
      "refresh",
      "import",
      "plan",
      "taint",
      "untaint"
    ]

    env_vars = {
      AWS_PROFILE = "${local.aws_profile}"
    }
  }
}

remote_state {
  ...
  config = {
    ...
    profile = "${local.aws_profile}"
  }
}

generate "provider" {
  ...
  contents 
  contents  = <<EOF
provider "aws" {
  profile = "${local.aws_profile}"
}
EOF
}
...