Terraform执行apply/plan时遇InvalidClientTokenId错误求助
以下是你可能未覆盖的排查点:
检查凭证文件的Profile匹配
如果你在~/.aws/credentials中配置了多个Profile(比如用aws configure --profile xxx创建的),而Terraform默认只会读取[default]段的凭证。如果你的aws sts get-caller-identity是用其他Profile执行的,需要在Terraform的AWS Provider块中显式指定Profile:provider "aws" { shared_credentials_files = "/home/nocnoc/.aws/credentials" profile = "你的Profile名称" region = "eu-central-1" }验证凭证文件格式正确性
打开/home/nocnoc/.aws/credentials,确认格式严格符合:[default] aws_access_key_id = AKIAXXX aws_secret_access_key = XXX检查键名是否拼写正确(比如有没有写成
access_key而不是aws_access_key_id),有没有多余空格或特殊字符。MFA强制策略的影响
若你的AWS账号或IAM用户配置了强制MFA访问策略,仅使用长期Access Key/Secret Key无法通过API验证,必须使用带MFA的临时凭证。解决方式:- 先通过AWS CLI生成临时凭证:
aws sts get-session-token --serial-number arn:aws:iam::你的账号ID:mfa/你的用户名 --token-code 你的MFA验证码 - 将返回的
AccessKeyId、SecretAccessKey、SessionToken导出为环境变量:export AWS_ACCESS_KEY_ID="临时密钥ID" export AWS_SECRET_ACCESS_KEY="临时密钥" export AWS_SESSION_TOKEN="临时会话Token" - 移除Terraform Provider块中
shared_credentials_files的配置,让Terraform自动读取环境变量中的临时凭证。
- 先通过AWS CLI生成临时凭证:
检查Terraform AWS Provider版本兼容性
过旧的Provider版本可能存在凭证处理逻辑问题,尝试在配置中指定最新稳定版:terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 5.0" } } } provider "aws" { shared_credentials_files = "/home/nocnoc/.aws/credentials" region = "eu-central-1" }执行
terraform init -upgrade升级Provider。验证路径与权限
确认/home/nocnoc/.aws/credentials文件的路径拼写正确(Linux区分大小写),且当前用户对该文件有可读权限(执行ls -l /home/nocnoc/.aws/credentials检查权限,确保当前用户有r权限)。检查环境变量冲突
执行以下命令,确认没有被错误的环境变量覆盖凭证:echo $AWS_ACCESS_KEY_ID echo $AWS_SECRET_ACCESS_KEY echo $AWS_PROFILE如果输出了非预期的值,需要清空这些环境变量(比如
unset AWS_ACCESS_KEY_ID)。
内容的提问来源于stack exchange,提问作者nocnoc

