GitLab CI/CD通过OIDC获取AWS凭证失败请求排查
解决GitLab CI/CD通过OIDC获取AWS凭证的问题
问题根源
你遇到的两个错误核心都是未正确完成OIDC认证流程:
- 第一个错误:直接调用
aws sts get-caller-identity时,AWS CLI没有可用凭证,因为还没通过OIDC获取临时权限凭证 - 第二个错误:
aws configure是交互式命令,CI环境为非交互式,无法手动输入密钥,因此触发EOF错误
修正后的CI配置
以下是完整可运行的配置,包含OIDC认证获取AWS临时凭证的完整流程:
variables: AWS_REGION: "eu-west-2" # 替换为你创建的AWS IAM角色ARN,建议存为GitLab项目/群组的受保护变量 AWS_ROLE_ARN: "arn:aws:iam::123456789012:role/your-gitlab-oidc-role" IGNORE_TF_DEPRECATION_WARNING: "true" oidc-example: image: name: amazon/aws-cli:latest entrypoint: [""] id_tokens: MY_OIDC_TOKEN: aud: https://gitlab.com script: # 通过OIDC令牌获取AWS临时凭证 - | RESPONSE=$(aws sts assume-role-with-web-identity \ --role-arn $AWS_ROLE_ARN \ --role-session-name "gitlab-ci-session" \ --web-identity-token $MY_OIDC_TOKEN) # 导出临时凭证为环境变量,AWS CLI和Terraform会自动读取 - export AWS_ACCESS_KEY_ID=$(echo $RESPONSE | jq -r '.Credentials.AccessKeyId') - export AWS_SECRET_ACCESS_KEY=$(echo $RESPONSE | jq -r '.Credentials.SecretAccessKey') - export AWS_SESSION_TOKEN=$(echo $RESPONSE | jq -r '.Credentials.SessionToken') # 验证凭证有效性 - aws sts get-caller-identity
关键配置说明
- id_tokens 部分:
aud字段必须设置为https://gitlab.com(针对GitLab.com实例),这是GitLab OIDC令牌的受众标识,必须和AWS IAM角色信任策略中的aud完全匹配 - AWS_ROLE_ARN:替换为你提前创建的、允许GitLab OIDC身份访问的IAM角色ARN,建议将其设置为GitLab的受保护变量,避免敏感信息泄露
- 凭证获取逻辑:通过
aws sts assume-role-with-web-identity命令,传入OIDC令牌、角色ARN和会话名称获取临时凭证,之后导出为环境变量——AWS CLI和Terraform都会自动识别这些变量,无需额外配置
扩展到Terraform流水线
完成OIDC认证后,Terraform可直接使用这些环境变量操作AWS资源,只需在脚本中添加Terraform相关步骤即可,示例如下:
# 接上述脚本部分 - apk add --no-cache terraform - terraform init - terraform plan # 如需自动应用,添加以下命令(建议仅在受保护分支或手动触发时使用) # - terraform apply -auto-approve
内容的提问来源于stack exchange,提问作者DevNoob
相关产品推荐
相关产品推荐

