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

CircleCI对接AWS ECR认证失败:安全令牌无效问题排查

问题描述

尝试让CircleCI流水线通过OIDC与AWS完成认证,已执行以下步骤:

  1. 创建OIDC身份提供商
  2. 在CircleCI配置中添加aws-cli orb
  3. 加入aws-cli/setup步骤
  4. 连接AWS服务(此步骤失败)

执行时出现报错:

调用GetAuthorizationToken操作时发生UnrecognizedClientException错误:请求中包含的安全令牌无效,且无法从非TTY设备进行交互式登录。

CircleCI配置文件如下:

version: 2.1
orbs:
  aws-cli: circleci/aws-cli@4.0.0
  aws-ecr: circleci/aws-ecr@8.2.1

jobs:
  build-and-push:
    docker:
      - image: cimg/aws:2023.05
    environment:
      AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
      AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
    steps:
      - checkout
      - aws-cli/setup
      - aws-cli/role_arn_setup:
          profile_name: default
          role_arn: arn:aws:iam::7150000000000:role/CI_Role
      - setup_remote_docker
      - run:
          working_directory: ./dotnet-services/user
          name: Create docker image
          command: |
            docker build . --file ./UserService.Api/Dockerfile --tag userservice
            docker tag userservice:latest 715815605776.dkr.ecr.eu-west-1.amazonaws.com/userservice:${CIRCLE_BUILD_NUM}
            # **************** FAILS HERE
            echo "Logging in to ECR... Access key=$AWS_ACCESS_KEY_ID"
            aws ecr get-login-password --region eu-west-1 | docker login --username AWS --password-stdin 715815605776.dkr.ecr.eu-west-1.amazonaws.com

workflows:
  build:
    jobs:
      - build-and-push:
          context: aws # contains environment variables

额外测试情况:

  • 执行aws sts get-caller-identity --profile default、aws s3 ls --profile default等命令,返回调用AssumeRole操作时发生InvalidClientTokenId错误:请求中包含的安全令牌无效,退出码254。
  • 查看~/.aws/credentials文件仅包含以下内容,无令牌信息:
[default]
aws_access_key_id = ${AWS_ACCESS_KEY_ID}
aws_secret_access_key = ${AWS_SECRET_ACCESS_KEY}

该AWS ECR登录命令在本地可正常执行,仅在CircleCI中失败。

问题分析与解决

核心错误原因

配置同时混用了长期访问密钥(AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY)和OIDC角色认证,导致认证流程冲突,无法正确获取临时安全令牌:

  1. 手动设置的长期密钥环境变量会覆盖OIDC认证生成的临时凭证;
  2. aws-cli/role_arn_setup需要基于OIDC身份令牌AssumeRole,但长期密钥的存在让AWS优先使用无效的长期凭证,而非通过OIDC获取临时令牌。

修正步骤

1. 移除长期密钥环境变量配置

删除job中的environment块,OIDC认证不需要长期访问密钥:

jobs:
  build-and-push:
    docker:
      - image: cimg/aws:2023.05
    # 移除以下长期密钥配置块
    # environment:
    #   AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
    #   AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
    steps:
      # 其余步骤保持不变

2. 验证IAM角色信任策略

检查AWS IAM中CI_Role的信任策略,必须允许CircleCI的OIDC提供商进行角色假设,示例策略如下:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::7150000000000:oidc-provider/circleci.com/org/<你的CircleCI组织ID>"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "circleci.com/org/<你的CircleCI组织ID>:aud": "sts.amazonaws.com",
          "circleci.com/org/<你的CircleCI组织ID>:sub": "org/<你的CircleCI组织ID>/project/<你的项目ID>/user/*"
        }
      }
    }
  ]
}

3. 明确指定使用OIDC配置的profile

执行AWS命令时,明确指定default profile(role_arn_setup已配置该profile使用OIDC角色):

aws ecr get-login-password --region eu-west-1 --profile default | docker login --username AWS --password-stdin 715815605776.dkr.ecr.eu-west-1.amazonaws.com

4. 验证OIDC认证状态

在aws-cli/role_arn_setup步骤后添加验证命令,确认临时凭证已生成:

- run:
    name: Verify AWS OIDC Authentication
    command: |
      aws sts get-caller-identity --profile default
      cat ~/.aws/credentials

配置正确的话,~/.aws/credentials中会出现临时的aws_session_token、aws_access_key_id和aws_secret_access_key。

可选优化:使用aws-ecr orb简化登录

既然已引入aws-ecr orb,可直接用其login步骤替代手动docker登录命令:

- aws-ecr/login:
    profile-name: default
    region: eu-west-1

内容的提问来源于stack exchange,提问作者Fabio Milheiro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 15:50:07