将AWS访问密钥存储到环境变量中,并解决Terraform无法读取时的应对方法:错误:验证提供程序凭据:从STS中检索调用者身份

挑战

我是Terraform的新手,每次访问AWS时,我习惯直接在源代码中写入这样的内容。

variable "region" {
  default = "ap-northeast-1"
}

variable "access_key" {
  default = "自分のaccess_key"
}

variable "secret_key" {
  default = "自分のsecret_key"
}

# AWS プロバイダの設定
provider "aws" {
  access_key = var.access_key
  secret_key = var.secret_key
  region     = var.region
}

最近我们从部门内收到了有关在源代码中写入导致易泄露的意见,因此我们正在研究将其存储在Windows环境变量中并加载到Terraform的方法。

这次我尝试了这篇文章的方法,但是没有成功。。。

 

方式,从文章中摘录↓↓↓

provider "aws" { }
$ export AWS_ACCESS_KEY_ID="自分のkey"
$ export AWS_SECRET_ACCESS_KEY="自分のkey"
$ export AWS_DEFAULT_REGION="ap-northeast-1"
$ terraform plan

最后,就我个人而言,只执行这个操作的话,会出现以下错误…

Planning failed. Terraform encountered an error while generating this plan.

╷
│ Error: validating provider credentials: retrieving caller identity from STS: operation error STS: GetCallerIdentity, https response error StatusCode: 403, RequestID: fdef4df2-5afd-4e07-aa6e-be3039c0fc03, api error InvalidClientTokenId: The security token included 
in the request is invalid.
│
│   with provider["registry.terraform.io/hashicorp/aws"],
│   on main.tf line 2, in provider "aws":
│    2: provider "aws" {

假设

・已经安装了AWS-CLI
・已经生成了有效的AWS用户访问密钥
・已经设置了环境变量

$ export AWS_ACCESS_KEY_ID="自分のkey"
$ export AWS_SECRET_ACCESS_KEY="自分のkey"
$ export AWS_DEFAULT_REGION="ap-northeast-1"
image.png
image.png

已验证可通过AWS-CLI访问AWS
已安装了Terraform

处理办法

我进行了各种调查,不知道什么是最好的,但通过查看以下的网站,问题解决了!

 

如果想要在Terraform中读取Windows的环境变量,似乎必须在变量名前面加上TF_VAR,否则Terraform无法正确读取。

image.png

如果以这种方式编写Terraform的源代码

variable "region" {
  default = "ap-northeast-1"
}

variable "access_key " {

}

variable "secret_key " {

}

# AWS プロバイダの設定
provider "aws" {
  access_key = var.access_key
  secret_key = var.secret_key
  region     = var.region
}

最后,终于可以顺利加载啦!

※附带说明
这是我在一篇英文文章中看到的观点,
“作为Terraform变量读取的优先级,Windows环境变量是最后一个,所以容易出错(很容易读取失败,很容易被中途覆盖),
现在不推荐使用Windows环境变量…要么将其作为terraform的var写入,要么存储在tfvar文件中更好”。
也许,AWS_ACCESS_KEY_ID在我的Windows环境下无法成功读取到Terraform只是我个人遇到的问题吧。

结束

我了解了关于AWS访问的不同方法!

最终可能不那么适合使用Windows环境变量进行管理,更好的方法可能是将其写入terraform的var中或存储在tfvar文件中。

然而,考虑到PJ的安全限制,有时候在Terraform文件内写就不行了吧。。。

视情况而定,我们可能需要考虑哪一个是最佳选择…

这次我们使用了TF_VAR来解决,但如果有机会的话,我也想考虑其他的方法!

bannerAds