背景:
我正在使用 AWS CodeBuild buildspec.yml 遍历 GitHub 存储库中的目录,以使用 Terraform 应用 IaC。为了访问 Terraform AWS 提供商所需的凭证,我使用 AWS 系统管理器参数存储来检索 buildspec.yml 中的访问密钥和密钥。
问题:
系统管理器参数存储屏蔽了访问和密钥 env 值,因此当它们被 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
要重现问题:
创建系统管理器参数存储变量(TF_VAR_AWS_ACCESS_KEY_ID=access, TF_AWS_SECRET_ACCESS_KEY=secret)
使用以下命令创建 AWS CodeBuild 项目:
"source": {
"type": "NO_SOURCE",
}
"environment": {
"type": "LINUX_CONTAINER",
"image": "aws/codebuild/standard:4.0",
"computeType": "BUILD_GENERAL1_SMALL"
}
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
尝试:
- 通过 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"
但我得到相同的无效凭据错误
- 在 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
这会导致重复的掩码变量和上述相同的错误。printenv
buildspec.yml 中的输出:
AWS_ACCESS_KEY_ID=***
TF_VAR_AWS_ACCESS_KEY_ID=***
AWS_SECRET_ACCESS_KEY=***
TF_VAR_AWS_SECRET_ACCESS_KEY=***
可能的解决途径:
- 以某种方式成功地将 MASKED 参数存储凭据值传递到 Terraform(首选)
- 使用不同的方法将敏感凭证传递到 Terraform AWS 提供商,例如 AWS 秘密管理器、IAM 角色等。
- 取消屏蔽参数存储变量以传递到 aws 提供程序(可能首先破坏了使用 aws 系统管理器的目的)