【问题标题】:How To Have Terragrunt Auto Set "AWS_PROFILE" environment variable?如何让 Terragrunt 自动设置“AWS_PROFILE”环境变量?
【发布时间】:2021-03-28 08:55:15
【问题描述】:

我这辈子都无法让它发挥作用。我需要设置 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,它仍然是空白的。所以这就好像运行命令实际上并没有将导出值保存到我的控制台。

我做错了什么?有没有人能够成功地使用 terragrunt 动态设置他们的AWS_PROFILE

【问题讨论】:

  • 可能不相关,但请确保在更改提供程序配置时清除两次运行之间的 terragrunt 缓存
  • 不幸的是没有骰子。我清除了我的.terragrunt-cache 目录。重新运行一个 terragrunt plan 相同的错误,仍然得到一个空白结果 echo $AWS_PROFILE
  • 哦,等等。我已经删除了在 s3 后端中指定我的个人资料的行。我再次添加它,再次被缓存清除,现在它可以工作了。我想就是这样!

标签: amazon-web-services terraform terragrunt


【解决方案1】:

这就是我的解决方案。 我有以下结构:

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

account.hcl

locals {
  aws_profile_name = "myprofile"
}

在主terragrunt.chl

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

【讨论】:

    【解决方案2】:

    这篇文章帮助我找出了我的问题:

    我忘记了我的配置有 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
      }
      

    希望这可以节省我今天浪费的所有时间!

    【讨论】:

      猜你喜欢
      • 2013-12-22
      • 1970-01-01
      • 2017-03-08
      • 1970-01-01
      • 2021-05-16
      • 2019-07-02
      • 2014-09-29
      • 1970-01-01
      相关资源
      最近更新 更多