GitHub Actions中Terraform通过OIDC认证AWS时遇凭证源无效错误
解决GitHub Actions + Terraform OIDC认证时的“No valid credential sources found”错误
以下是针对你遇到问题的具体排查和解决方向:
核心排查点1:Terraform Cloud工作区的执行模式
你使用的是Terraform Cloud的API驱动工作区,如果工作流中是调用Terraform Cloud远程执行plan/apply,那么GitHub Actions里通过configure-aws-credentials获取的AWS凭证不会自动传递到Terraform Cloud环境中。
- 解决方式:
- 若要继续用Terraform Cloud远程执行,需在Terraform Cloud工作区中单独配置AWS认证(比如通过Terraform Cloud的OIDC集成,或者添加AWS凭证变量)
- 若改为本地执行Terraform(仅用Terraform Cloud作为状态后端),则确保工作流中执行
terraform init后直接在GitHub Runner上运行terraform plan,此时会自动读取configure-aws-credentials设置的环境变量。
核心排查点2:AWS Provider配置冲突
不要手动配置Web Identity相关参数,configure-aws-credentials已经会把临时凭证写入环境变量(AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_SESSION_TOKEN),Terraform AWS Provider会自动读取这些变量。
- 错误示例(会导致冲突):
provider "aws" { web_identity_token_file = "/path/to/token" role_arn = "arn:aws:iam::123456789012:role/MyRole" }
- 正确配置:
terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 5.0" # 确保使用较新版本 } } } provider "aws" { region = "你的AWS区域" # 比如us-east-1 }
核心排查点3:GitHub Actions权限配置
必须在job级别设置id-token: write权限,否则无法获取OIDC Token用于AWS认证:
jobs: deploy: permissions: id-token: write contents: read # 按需添加其他权限 runs-on: ubuntu-latest steps: # 后续步骤...
核心排查点4:IAM角色信任策略细节
检查信任策略的以下细节:
aud字段必须为sts.amazonaws.comsub字段的repo:<org>/<repo>:*必须完全匹配你的GitHub组织和仓库名称(注意大小写、拼写)- 信任策略示例:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::123456789012:oidc-provider/token.actions.githubusercontent.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "token.actions.githubusercontent.com:aud": "sts.amazonaws.com" }, "StringLike": { "token.actions.githubusercontent.com:sub": "repo:<你的组织>/<你的仓库>:*" } } } ] }
核心排查点5:验证凭证是否正确注入
在configure-aws-credentials之后、terraform plan之前添加步骤,确认AWS环境变量已正确设置:
- name: 验证AWS凭证环境变量 run: | echo "AWS_ACCESS_KEY_ID存在: $([ -n "$AWS_ACCESS_KEY_ID" ] && echo "是" || echo "否")" echo "AWS_SECRET_ACCESS_KEY存在: $([ -n "$AWS_SECRET_ACCESS_KEY" ] && echo "是" || echo "否")" echo "AWS_SESSION_TOKEN存在: $([ -n "$AWS_SESSION_TOKEN" ] && echo "是" || echo "否")"
如果输出有“否”,说明configure-aws-credentials动作未成功获取凭证,需检查该动作的日志报错。
额外排查点:Terraform及Provider版本
确保Terraform AWS Provider版本≥3.0,旧版本可能不支持自动读取临时会话凭证。
内容的提问来源于stack exchange,提问作者ArtistYay
相关产品推荐
相关产品推荐

