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)
尝试:
-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)
但我收到相同的无效凭据错误
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)
可能的解决途径:
我在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 在我们的记录中不存在。
就这样。
我希望这有帮助
使用不同的方法(例如 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)
| 归档时间: |
|
| 查看次数: |
29344 次 |
| 最近记录: |