Terraform:导入 aws 资源时出现凭证错误 - 调用 sts 时出错:GetCallerIdentity:ExpiredToken
Posted
技术标签:
【中文标题】Terraform:导入 aws 资源时出现凭证错误 - 调用 sts 时出错:GetCallerIdentity:ExpiredToken【英文标题】:Terraform: Credential error when importing aws resources - error calling sts:GetCallerIdentity: ExpiredToken 【发布时间】:2021-02-28 08:54:44 【问题描述】:我有一些想要导入到我的 terraform 状态的 aws 资源。
我已在 ~/.aws/credentials
文件中设置 aws 凭据:
[my-profile]
aws_access_key_id=<ACCESS_KEY_ID>
aws_secret_access_key=<SECRET_ACCESS_KEY>
aws_session_token=<SESSION_TOKEN>
terraform init
运行成功,但是当我尝试导入资源时:
terraform import -var-file=config/us-west-2/default.tfvars -var-file=variables.tfvars -var-file=../globals.tfvars -var profile=my-profile -var region=us-west-2 -var tfstate_bucket=<MY_TF_BUCKET> -no-color <RESOURCE_NAME> <RESOURCE_ID>
即使我的凭据尚未过期,我也会收到以下错误:
Error: error using credentials to get account ID: error calling sts:GetCallerIdentity: ExpiredToken: The security token included in the request is expired
status code: 403, request id: 1684ef71-ecea-4fed-bcf5-a32eca688ab4
请注意,我在另一个非生产 aws 帐户中运行了类似的导入,但是当我尝试针对生产帐户运行它时出现此错误。不过,我确实拥有生产帐户的超级用户访问权限。
地形版本:
Terraform v0.12.29
+ provider.aws v3.14.1
+ provider.null v2.1.2
+ provider.random v2.3.1
+ provider.template v2.1.2
编辑:在我的 Mac 上打印环境变量
$ env
TERM_PROGRAM=Apple_Terminal
TERM=xterm-256color
SHELL=/bin/bash
TMPDIR=/var/folders/jz/w997kd9x4sb983kdyj8wjlkc0000gp/T/
GRADLE_HOME=/Users/john/.sdkman/candidates/gradle/current
Apple_PubSub_Socket_Render=/private/tmp/com.apple.launchd.k5lBL3QJ9R/Render
TERM_PROGRAM_VERSION=421.2
TERM_SESSION_ID=D2EB66E5-2DD7-456A-8E16-A0E00CE15112
SDKMAN_PLATFORM=Darwin
USER=john
SDKMAN_CANDIDATES_API=https://api.sdkman.io/2
SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.GG8D8SvuqA/Listeners
PATH=/Users/john/.sdkman/candidates/gradle/current/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
PWD=/Users/john/MyProjects/tf/foobar
LANG=en_US.UTF-8
SDKMAN_VERSION=5.7.4+362
XPC_FLAGS=0x0
XPC_SERVICE_NAME=0
HOME=/Users/john
SHLVL=1
LOGNAME=john
SDKMAN_DIR=/Users/john/.sdkman
SDKMAN_CANDIDATES_DIR=/Users/john/.sdkman/candidates
_=/usr/bin/env
编辑 2:
当我清理所有旧的配置文件和凭据时,~/.aws/credentials
和 ~/.aws/config
只有 my-profile
的条目而没有其他条目。
还有所有相关的环境变量:
for var in AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN AWS_SECURITY_TOKEN ; do eval unset $var ; done
所以现在我得到了:
Error: No valid credential sources found for AWS Provider.
Please see https://terraform.io/docs/providers/aws/index.html for more information on
providing credentials for the AWS Provider
【问题讨论】:
您的 AWS 一次性凭证是否会因为 Terraform 命令运行时间过长而过期?可以试试调整有效期吗? 它们的有效期为 1 小时,我的命令在不到一分钟的时间内以该错误终止。 您可能有一些其他凭据(在环境变量中?)会妨碍您。 谢谢,我在我的 Mac 上打印了环境变量(在上面的问题中添加),看起来没有任何冲突的凭据。还有什么需要检查的吗? 您还可以检查您的命令列表中的.tfvars
文件。
【参考方案1】:
正如 cmets 中所讨论的,最可能的答案是您在某处“存储”了一些旧凭据:
要么仍在当前终端会话的环境变量中 或在您的命令提到的.tfvars
文件之一中
我建议清理它们。获取新凭据。然后再试一次。
【讨论】:
这与旧凭据无关。它使用正确的凭据。但可能在脚本中设置了一些环境变量,例如TF_DATA_DIR
或一些.tfvar
或包含remove .tfstate
的S3 存储桶。
+1 为您提供指点和帮助。因此,基本上我们的环境已设置为通过此脚本运行 terraform 命令,以便它可以按预期进行设置。我试图直接运行terraform import
,导致它无法工作。以上是关于Terraform:导入 aws 资源时出现凭证错误 - 调用 sts 时出错:GetCallerIdentity:ExpiredToken的主要内容,如果未能解决你的问题,请参考以下文章
创建 AWS Cognito 用户池时出现 Terraform 错误
尝试通过 terraform 设置 cloudwatch 日志过滤器时出现 InvalidParameterException
使用谷歌传输服务将文件从 AWS 传输到 GCP 时出现凭证错误
通过 Terraform 运行“aws stepfunctions update-state-machine”时出现 Json 解析错误