CircleCI对接AWS ECR认证失败:安全令牌无效问题排查
问题描述
尝试让CircleCI流水线通过OIDC与AWS完成认证,已执行以下步骤:
- 创建OIDC身份提供商
- 在CircleCI配置中添加aws-cli orb
- 加入aws-cli/setup步骤
- 连接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角色认证,导致认证流程冲突,无法正确获取临时安全令牌:
- 手动设置的长期密钥环境变量会覆盖OIDC认证生成的临时凭证;
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
相关产品推荐
相关产品推荐

