Terraform在AWS凭证文件未找到

19

在阅读 Terraform 文档时,它提到了三种寻找 AWS 凭据的选项:

  1. 静态凭证(嵌入源文件中)
  2. 环境变量。
  3. 从 AWS 凭证文件中获取

我想让我的设置只使用凭证文件。我已经检查过环境变量并将 Terraform 中相关的变量留空。

当我这样做并运行 `Terraform Plan` 时,出现以下错误:

No Valid credential sources found for AWS Provider.

我甚至尝试将凭证文件位置添加到提供程序块中,但还是没有帮助:

provider "aws" {
    region  = "${var.region}"
    profile = "${var.profile}"
    shared_credentials_file = "/Users/david/.aws/credentials"
    profile = "testing"
}
有什么我忽略了的东西可以让Terraform读取这个文件而不需要环境变量吗?

1
你可以将你的代码上传到Github或其他开源目录进行发布,但这样会导致你的凭据不安全。因此,请像以下方式一样保护你的凭据export AWS_ACCESS_KEY_ID="*************" export AWS_SECRET_ACCESS_KEY="="*************" export AWS_DEFAULT_REGION="us-west-1" - Fefar Ravi
5个回答

13

我使用的是Terraform v0.6.15进行测试,并且运行良好。

问题可能出在profile上。请检查以下内容。

1. 从提供程序中删除2个profile标签。

provider "aws" {
  region  = "${var.region}"
  shared_credentials_file = "/Users/david/.aws/credentials"
  profile = "testing"
}

2. 确保您的凭据文件 /Users/david/.aws/credentials 符合以下格式,其中 testing 是在 provider "aws" 中指定的 profile

[testing]
aws_access_key_id = *****
aws_secret_access_key = *****

1
我已删除多余的配置文件行,并验证了凭据文件的正确格式。我在其中有两个条目,分别是默认和测试。我已验证它们可以使用Boto与此文件一起使用。 - David Ficociello
你正在运行的 Terraform 版本是什么?另外,对于 Boto,你是否使用了此处所用的配置文件进行测试? - Baskar
Terraform v0.6.15,是的,我已经使用boto进行了测试,这个配置文件确实有效。 - David Ficociello
我猜现在的问题是Terraform不支持凭证文件中有多个条目。如果我将它减少到只有默认设置,那就可以工作。然后,如果我只是将配置文件的名称从默认更改为测试,并更新我的计划,它就会失败。 - David Ficociello
我有所怀疑。我用多个配置文件进行了测试。也许是格式出了问题,当你在凭证文件中有多个配置文件时? - Baskar

2
为了让 Terraform 支持多个配置文件,请确保提供以下内容:
aws_access_key_id 

个人资料声明的一部分。每个个人资料应该看起来像这样:

[profile_name]
aws_access_key=*****
aws_secret_access_key****
aws_access_key_id=*****

从技术上讲,似乎底层的aws cli所需的是id版本,因此您甚至不需要aws_access_key。也许是我的问题,在我阅读的文件中从未清楚地表达过。


1
我发现 Terraform 在检测基于 AWS 配置文件的凭证方面并不好 - 它需要一些手动操作,特别是需要明确传递访问密钥 ID(可能还包括密钥)。你可以像你所做的那样通过在配置文件中指定访问密钥 ID 来实现这一点,或者通过将其指定为 AWS_ACCESS_KEY_ID 环境变量来解决此问题。我已经成功地采用了后一种方法。 - chriskilding

1

如果您只需要快速修复而不设置Terraform,
如评论中建议的,只需在终端中键入以下内容:

export AWS_ACCESS_KEY_ID="xxxxxxxxxxxxx" 
export AWS_SECRET_ACCESS_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxx" 
export AWS_DEFAULT_REGION="your-region-1"

0

(Terraform v0.14.2,macOS 11.0.1)

我需要做的是:

AWS_ACCESS_KEY_ID=... AWS_SECRET_ACCESS_KEY=... terraform plan

这对我来说很奇怪,因为我的 ~/.aws 是有序的,我的 .tf-s 也是。


0

我刚刚遇到了与terraform aws提供程序(2.12.0)相同的问题,这是我解决它的方法。

在我的情况下,提供程序无法处理我的默认配置文件$HOME/.aws/credentials中没有我的访问密钥和秘密,但它有一个“source_profile”。看起来terraform aws提供程序无法处理这个问题(然而,Java SDK和AWS CLI可以正常工作,因为我已经设置了一段时间了)。

这是我没有成功的内容,注意默认配置文件有一个role_arn和source_profile:

[default]
role_arn = arn:aws:iam::<ACCT_ID>:role/readonly
source_profile = account
region = us-east-1

[other-profile]
role_arn = arn:aws:iam::<ACCT_ID>:role/other-role
source_profile = account
region = us-east-1

[account]
region = us-east-1
aws_access_key_id=****
aws_secret_access_key=****

我将它改为以下内容,这使得 AWS 提供程序对我起作用。请注意,我将两个配置文件合并为“default”配置文件:

[other-profile]
role_arn = arn:aws:iam::<ACCT_ID>:role/other-role
source_profile = default
region = us-east-1

[default]
region = us-east-1
aws_access_key_id=****
aws_secret_access_key=****
role_arn = arn:aws:iam::<ACCT_ID>:role/readonly
source_profile = default

这似乎对于AWS CLI(默认为只读角色并支持切换到“其他配置文件”)运行良好,同时还允许terraform正确读取凭据。


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