如何让Terraform读取AWS凭证文件?

33

我正在尝试使用Terraform创建AWS S3存储桶,这是我的代码:

provider "aws" {
  profile = "default"
  region  = "ap-south-1"
}

resource "aws_s3_bucket" "first_tf" {
  bucket = "svk-pl-2909202022"
  acl    = "private"
}

我已经使用记事本手动创建了“凭证”文件,并使用Powershell删除了“.txt”扩展名,将该文件存储在C:\Users\terraform\.aws中,该文件如下:

[default]
aws_access_key_id=**************
aws_secret_access_key=************

但是当我尝试运行terraform plan时,出现了一个错误,提示如下:

ERROR: error configuring Terraform AWS Provider: no valid credential sources for Terraform AWS Provider found

然后,我还尝试通过安装AWS CLI来创建“Credentials”文件,我运行了以下命令。
aws configure --profile terraform

这里 terraform 是我的用户名。因此,它要求我输入 aws_access_key_idaws_secret_access_key。输入所有凭据后,我运行了命令 terraform init,成功运行。但是当我运行 terraform plan 时,它再次显示以下错误:

ERROR: error configuring Terraform AWS Provider: no valid credential sources for Terraform AWS Provider found


只是想补充一下,由于这个提供商没有太多的答案,在我的情况下(alicloud),凭证文件的格式应该类似于 json 而不是 ini。这也在提供商本身的文档中说明了。 在我的情况下,这就是文件被忽略的原因。 - Ricky Levi
5个回答

47

当您手动创建个人资料时

provider "aws" {
  region                  = "your region"
  shared_credentials_file = "path_file_credentials like C:\Users\terraform\.aws\credentials"
  profile                 = "profile_name"
}

当您不想手动放置共享文件时

该文件需要位于此路径下 %USERPROFILE%.aws\credentials

provider "aws" {
  region                  = "your region"
  profile                 = "profile_name"
}

如果你想把你的凭证放在一个tf文件中。
provider "aws" {
  region     = "us-west-2"
  access_key = "my-access-key"
  secret_key = "my-secret-key"
}

1
自AWS提供程序的4.0.0版本以来,用于指定凭据文件的参数被称为shared_credentials_files(注意复数形式),并且它期望一个列表。因此,应该是shared_credentials_files = ["path_to_credentials_file"]。请参见此处 - Joe
1
我建议不要选择第三个选项,即在提供程序块内添加凭据,因为这可能会被提交到存储库,并且以这种方式公开凭据是一种安全风险。 - Cobus Bernard
如果使用profile="profile_name",则该配置文件具有一个区域,那么region="your region for??"是用来做什么的?如果它们不同怎么办? - undefined

43
我花了相当多的时间来尝试弄清楚如何让Terraform读取 ~/.aws/credentials 文件。唯一对我有效的选项是指定 AWS_PROFILE 环境变量,将其指向凭证文件的特定部分。
AWS_PROFILE=prod terraform plan
或者
export AWS_PROFILE=prod 
terraform plan

shared_credentials_file 和/或 profile 选项在提供者部分被忽略的事实对我来说看起来像是一个 bug。


我得出了同样的结论。这方面有任何更新吗? - LazyEval
2
如果您的问题涉及状态文件的后端配置,我遇到过这个问题:https://github.com/hashicorp/terraform/issues/13589;运行`terraform init -reconfigure`解决了我的问题。 - LazyEval
根据这个答案,这种行为并不是一个bug,而是由Terraform在推导配置时遵循的层次结构导致的(例如,环境变量,如AWS_PROFILE,比共享配置文件具有更高的优先级)。 - undefined

3
您需要使用以下命令在凭据文件中设置自定义部分:

```bash aws configure --profile yourprofilename ```

aws configure --profile=prod 

为了像这样使用环境变量。


3

您存储凭证文件的路径是错误的。

C:\Users\your-username\.aws

您可以将以下文件添加到上述位置。

credentials

[default]
aws_access_key_id = your access key
aws_secret_access_key = your secret key

配置

[default]
region=ap-south-1

如果你使用的是boto3,就不需要在terraform或python中进行任何配置。 Terraform和boto3会自动找到所需的凭据文件。


2

如果您已经在本地安装了AWS cli,则转到配置文件路径:%USERPROFILE%\.aws\credentials 按照以下方式更新凭据:

[default]
aws_access_key_id = "xxxxx"
aws_secret_access_key = "xxxxx"
region= us-east-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接