传递 AWS 系统管理器参数存储变量时 Terraform AWS 提供商凭证无效

Mar*_*llm 9 amazon-web-services terraform aws-codebuild aws-parameter-store

背景:

我使用 AWS CodeBuild buildspec.yml 迭代 GitHub 存储库中的目录,以使用 Terraform 应用 IaC。为了访问 Terraform AWS 提供商所需的凭证,我使用 AWS 系统管理器参数存储来检索 buildspec.yml 中的访问权限和密钥。

问题:

系统管理器参数存储屏蔽了访问权限和密钥环境值,因此当 Terraform AWS 提供程序继承它们时,提供程序会输出凭证无效:

Error: error configuring Terraform AWS Provider: error validating provider credentials: error calling sts:GetCallerIdentity: InvalidClientTokenId: The security token included in the request is invalid.
    status code: 403, request id: xxxx
Run Code Online (Sandbox Code Playgroud)

要重现该问题:

  • 创建系统管理器参数存储变量(TF_VAR_AWS_ACCESS_KEY_ID=访问权限,TF_AWS_SECRET_ACCESS_KEY=秘密)

  • 使用以下命令创建 AWS CodeBuild 项目:

 "source": {
                "type": "NO_SOURCE",
}
"environment": {
                "type": "LINUX_CONTAINER",
                "image": "aws/codebuild/standard:4.0",
                "computeType": "BUILD_GENERAL1_SMALL"
}
Run Code Online (Sandbox Code Playgroud)

buildspec.yml具有以下内容:(修改为创建 .tf 文件而不是从 github 采购)

version: 0.2
env:
  shell: bash
  parameter-store:
    TF_VAR_AWS_ACCESS_KEY_ID: TF_AWS_ACCESS_KEY_ID
    TF_VAR_AWS_SECRET_ACCESS_KEY: TF_AWS_SECRET_ACCESS_KEY
phases:
  install:
    commands:
      - wget https://releases.hashicorp.com/terraform/0.12.28/terraform_0.12.28_linux_amd64.zip -q
      - unzip terraform_0.12.28_linux_amd64.zip && mv terraform /usr/local/bin/
      - printf "provider "aws" {\n\taccess_key = var.AWS_ACCESS_KEY_ID\n\tsecret_key = var.AWS_SECRET_ACCESS_KEY\n\tversion    = \"~> 3.2.0\"\n}" >> provider.tf
      - printf "variable "AWS_ACCESS_KEY_ID" {}\nvariable "AWS_SECRET_ACCESS_KEY" {}" > vars.tf
      - printf "resource \"aws_s3_bucket\" \"test\" {\n\tbucket = \"test\"\n\tacl = \"private\"\n}" >> s3.tf
      - terraform init
      - terraform plan
Run Code Online (Sandbox Code Playgroud)

尝试:

  1. 通过 terraform 选项传递信用-vars
terraform plan -var="AWS_ACCESS_KEY_ID=$TF_VAR_AWS_ACCESS_KEY_ID" -var="AWS_ACCESS_KEY_ID=$TF_VAR_AWS_SECRET_ACCESS_KEY"
Run Code Online (Sandbox Code Playgroud)

但我收到相同的无效凭据错误

  1. 在 buildspec.yml 中导出系统管理器参数存储凭据:
commands:
  - export AWS_ACCESS_KEY_ID=$TF_VAR_AWS_ACCESS_KEY_ID
  - export AWS_SECRET_ACCESS_KEY=$TF_VAR_AWS_SECRET_ACCESS_KEY
Run Code Online (Sandbox Code Playgroud)

这会导致重复的屏蔽变量和上面相同的错误。printenvbuildspec.yml 中的输出:

AWS_ACCESS_KEY_ID=***
TF_VAR_AWS_ACCESS_KEY_ID=***
AWS_SECRET_ACCESS_KEY=***
TF_VAR_AWS_SECRET_ACCESS_KEY=***
Run Code Online (Sandbox Code Playgroud)

可能的解决途径:

  • 以某种方式将 MASKED 参数存储凭证值成功传递到 Terraform(首选)
  • 使用不同的方法(例如 AWS 秘密管理器、IAM 角色等)将敏感凭证传递到 Terraform AWS 提供商。
  • 取消屏蔽参数存储变量以传递到 aws 提供程序(可能首先违背了使用 aws 系统管理器的目的)

Pro*_*ton 5

我在Ubuntu 20.04上使用Terraform时遇到了同样的问题。

我已使用该命令以及我在 AWS 上创建的terraformaws configure用户的 IAM 凭证配置了 AWS CLI 。

但是,当我运行命令时:

terraform plan
Run Code Online (Sandbox Code Playgroud)

我收到错误:

错误:配置 Terraform AWS 提供程序时出错:验证提供程序凭据时出错:调用 sts:GetCallerIdentity 时出错:InvalidClientTokenId:请求中包含的安全令牌无效。状态代码:403,请求 ID:17268b96-6451-4527-8b17-0312f49eec51

这是我修复它的方法

该问题是由于我的 AWS CLI 使用aws configure命令配置错误导致的。我在要输入AWS 秘密访问密钥的地方输入了AWS 访问密钥 ID,并且在要输入AWS 访问密钥 ID的地方输入了AWS 秘密访问密钥

我必须运行以下命令,才能使用我在 AWS 上创建的terraform用户的 IAM 凭证正确重新配置 AWS CLI :

aws configure
Run Code Online (Sandbox Code Playgroud)

您可以通过运行简单的 was cli 命令来确认它是否正常:

aws s3 ls
Run Code Online (Sandbox Code Playgroud)

如果您收到如下错误,那么您就知道您尚未正确设置:

调用 ListBuckets 操作时发生错误 (InvalidAccessKeyId):您提供的 AWS 访问密钥 ID 在我们的记录中不存在。

就这样。

我希望这有帮助


Mar*_*cin 4

使用不同的方法(例如 AWS 秘密管理器、IAM 角色等)将敏感凭证传递到 Terraform AWS 提供商。

一般来说,您不需要对 AWS 凭证进行硬编码即可使 terraform 正常工作。相反,CodeBuild IAM 角色对于 terraform 来说应该足够了,如 terraform文档中所述。

考虑到这一点,我验证了以下操作是否有效,并使用 CodeBuild 项目中的 terraform 创建了请求的存储桶。默认 CB 角色已使用S3 权限进行修改,以允许创建存储桶。

version: 0.2
phases:
  install:
    commands:
      - wget https://releases.hashicorp.com/terraform/0.12.28/terraform_0.12.28_linux_amd64.zip -q
      - unzip terraform_0.12.28_linux_amd64.zip && mv terraform /usr/local/bin/
      - printf "resource \"aws_s3_bucket\" \"test\" {\n\tbucket = \"test-43242-efdfdfd-4444334\"\n\tacl = \"private\"\n}" >> s3.tf
      - terraform init
      - terraform plan
      - terraform apply -auto-approve
Run Code Online (Sandbox Code Playgroud)