You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 22:23:16