传递 AWS 系统管理器参数存储变量时 Terraform AWS 提供商凭证无效
Invalid Terraform AWS provider credentials when passing AWS system manager parameter store variables
背景:
我正在使用 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 系统管理器的目的)
Pass sensitive credentials into the Terraform AWS provider using a different method e.g. AWS secret manager, IAM role, etc.
通常您不需要 hard-code AWS 凭据即可使 terraform 工作。相反,CodeBuild IAM 角色 应该足以用于 terraform,如 terraform docs.
中所述
考虑到这一点,我验证以下内容有效,并使用 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
我在 Ubuntu 20.04.
上使用 Terraform 时遇到了同样的问题
我已经使用 aws configure
命令为我在 AWS 上创建的 terraform 用户配置了 AWS CLI 和 IAM 凭证。
然而,当我运行命令时:
terraform plan
我收到错误:
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: 17268b96-6451-4527-8b17-0312f49eec51
这是我修复它的方法:
该问题是由于我的 AWS CLI 使用 aws configure
命令配置错误造成的。我输入了 AWS 访问密钥 ID 我要输入 AWS 秘密访问密钥 并且还输入了 AWS 秘密访问密钥 我要在其中输入 AWS 访问密钥 ID:
我必须运行下面的命令才能使用我在 AWS 上创建的 terraform 用户的 IAM 凭证正确地重新配置 AWS CLI:
aws configure
您可以通过 运行 一个简单的 was cli 命令确认它没问题:
aws s3 ls
如果您遇到如下错误,则说明您的设置仍然不正确:
An error occurred (InvalidAccessKeyId) when calling the ListBuckets operation: The AWS Access Key Id you provided does not exist in our records.
就这些了。
希望对您有所帮助
我遇到了 403 错误。
问题是 - 您应该从示例代码中删除 {}。
provider "aws" {
access_key = "{YOUR ACCESS KEY}"
secret_key = "{YOUR SECRET KEY}"
region = "eu-west-1"
}
它应该看起来像,
provider "aws" {
access_key = "YOUR ACCESS KEY"
secret_key = "YOUR SECRET KEY"
region = "eu-west-1"
}
好吧,我的情况很愚蠢,但它可能会有所帮助:
所以在下载 .csv 文件后,我使用 aws configure 复制粘贴密钥。
秘钥中间有个“+”。在编辑器中我使用双击复制,但是遇到非字母数字字符时会停止,这意味着只复制了秘密访问密钥的第一部分。
确保您已忠实地复制了完整的密钥。
背景:
我正在使用 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 系统管理器的目的)
Pass sensitive credentials into the Terraform AWS provider using a different method e.g. AWS secret manager, IAM role, etc.
通常您不需要 hard-code AWS 凭据即可使 terraform 工作。相反,CodeBuild IAM 角色 应该足以用于 terraform,如 terraform docs.
中所述考虑到这一点,我验证以下内容有效,并使用 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
我在 Ubuntu 20.04.
上使用 Terraform 时遇到了同样的问题我已经使用 aws configure
命令为我在 AWS 上创建的 terraform 用户配置了 AWS CLI 和 IAM 凭证。
然而,当我运行命令时:
terraform plan
我收到错误:
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: 17268b96-6451-4527-8b17-0312f49eec51
这是我修复它的方法:
该问题是由于我的 AWS CLI 使用 aws configure
命令配置错误造成的。我输入了 AWS 访问密钥 ID 我要输入 AWS 秘密访问密钥 并且还输入了 AWS 秘密访问密钥 我要在其中输入 AWS 访问密钥 ID:
我必须运行下面的命令才能使用我在 AWS 上创建的 terraform 用户的 IAM 凭证正确地重新配置 AWS CLI:
aws configure
您可以通过 运行 一个简单的 was cli 命令确认它没问题:
aws s3 ls
如果您遇到如下错误,则说明您的设置仍然不正确:
An error occurred (InvalidAccessKeyId) when calling the ListBuckets operation: The AWS Access Key Id you provided does not exist in our records.
就这些了。
希望对您有所帮助
我遇到了 403 错误。 问题是 - 您应该从示例代码中删除 {}。
provider "aws" {
access_key = "{YOUR ACCESS KEY}"
secret_key = "{YOUR SECRET KEY}"
region = "eu-west-1"
}
它应该看起来像,
provider "aws" {
access_key = "YOUR ACCESS KEY"
secret_key = "YOUR SECRET KEY"
region = "eu-west-1"
}
好吧,我的情况很愚蠢,但它可能会有所帮助:
所以在下载 .csv 文件后,我使用 aws configure 复制粘贴密钥。
秘钥中间有个“+”。在编辑器中我使用双击复制,但是遇到非字母数字字符时会停止,这意味着只复制了秘密访问密钥的第一部分。
确保您已忠实地复制了完整的密钥。