Terraform:传递AWS系统管理器参数存储变量时,无效的Terraform AWS提供程序凭证

如何解决Terraform:传递AWS系统管理器参数存储变量时,无效的Terraform AWS提供程序凭证

背景

我正在使用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 =访问权限,TF_AWS_SECRET_ACCESS_KEY =秘密)

  • 使用以下方法创建AW​​S 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

尝试:

  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"

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

  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

这将导致重复的掩码变量和上面的相同错误。在buildspec.yml中的printenv输出

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系统管理器的目的)

解决方法

使用其他方法将敏感凭据传递到Terraform AWS提供程序中AWS秘密管理器,IAM角色等。

通常,您无需对AWS凭证进行硬编码即可使terraform正常工作。相反,如terraform docs中所述, CodeBuild IAM角色应该足以用于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
,

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

我已经使用aws configure命令配置了AWS CLI,并为我在AWS上创建的 terraform 用户提供了IAM凭证。

但是,当我运行命令时:

terraform plan

我得到了错误:

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

这是我修复的方式

该问题是由于使用aws configure命令对我的AWS CLI进行了错误配置导致的。我输入了输入 AWS秘密访问密钥 AWS访问密钥ID ,还输入了要输入的 AWS秘密访问密钥 AWS访问密钥ID

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

aws configure

仅此而已。

我希望这会有所帮助

,

我遇到了 403 错误。 问题是 - 您应该从示例代码中删除 {}。

def get_list_of_countries_whose_nth_letter_is(n_letter):
    countrie = []
    for countries1 in countries:
        if "M" in countries1.upper():
            countrie.append(countries1)
    print(countrie)

['Armenia','Bahamas','Belgium','Cambodia','Cameroon','Colombia','Comoros','Congo,Democratic Republic of the','Denmark','Dominica','Dominican Republic','East Timor','Federated States of Micronesia','Gambia','Germany','Guatemala','Jamaica','Luxembourg','Madagascar','Malawi','Malaysia','Maldives','Mali','Malta','Marshall Islands','Mauritania','Mauritius','Mexico','Moldova','Monaco','Mongolia','Montenegro','Morocco','Mozambique','Myanmar (Burma)','Namibia','North Macedonia (Macedonia)','Oman','Panama','Romania','Samoa','San Marino','Sao Tome and Principe','Solomon Islands','Somalia','Suriname','Turkmenistan','United Arab Emirates','United Kingdom','Vietnam','Yemen','Zambia','Zimbabwe']

应该是这样的,

provider "aws" { 
   access_key = "{YOUR ACCESS KEY}" 
   secret_key = "{YOUR SECRET KEY}"
   region = "eu-west-1"
}
,

好吧,我的情况很愚蠢,但可能会有所帮助:

因此,在下载 .csv 文件后,我使用 aws configure 复制粘贴密钥。

在密钥中间有一个“+”。在编辑器中我使用双击复制,但是遇到非字母数字字符时会停止,这意味着只复制了秘密访问密钥的第一部分。

确保您已尽职尽责地复制了完整的密钥。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?