Dockerfile中aws sts assume-role-with-web-identity执行aws s3 ls报错求助
解决方案
问题核心在于:你通过awk生成的export语句只是被输出,并未被当前shell执行,导致后续的aws s3 ls命令无法获取到临时凭证。
以下是几种无需写入凭证文件的解决方法:
方法1:用eval执行凭证导出命令
修改RUN命令,让awk生成的export语句直接在当前shell环境中生效:
RUN eval $(aws sts assume-role-with-web-identity \ --role-arn ${AWS_ROLE_ARN} \ --role-session-name "test" \ --web-identity-token "$(cat /tmp/tokenfile)" \ --query "Credentials.[AccessKeyId,SecretAccessKey,SessionToken]" \ --output text | awk '{print "export AWS_ACCESS_KEY_ID="$1"\nexport AWS_SECRET_ACCESS_KEY="$2"\nexport AWS_SESSION_TOKEN="$3}') \ && aws s3 ls
eval会将awk输出的内容作为shell命令执行,使临时凭证环境变量在当前shell中生效,后续的aws s3 ls就能正常调用凭证。
方法2:在子shell内完成全流程
将凭证获取、环境变量设置和S3命令执行放到同一个子shell中,确保环境变量共享:
RUN bash -c ' CREDS=$(aws sts assume-role-with-web-identity \ --role-arn ${AWS_ROLE_ARN} \ --role-session-name "test" \ --web-identity-token "$(cat /tmp/tokenfile)" \ --query "Credentials.[AccessKeyId,SecretAccessKey,SessionToken]" \ --output text) export AWS_ACCESS_KEY_ID=$(echo "$CREDS" | awk "{print \$1}") export AWS_SECRET_ACCESS_KEY=$(echo "$CREDS" | awk "{print \$2}") export AWS_SESSION_TOKEN=$(echo "$CREDS" | awk "{print \$3}") aws s3 ls '
通过bash -c启动独立子shell,所有操作在同一环境内完成,避免环境变量隔离问题。
方法3:利用AWS CLI自动凭证缓存(推荐)
AWS CLI支持自动缓存临时凭证,只需指定缓存目录即可,无需手动管理环境变量:
RUN export AWS_CACHE_DIR=/tmp/aws-cache \ && mkdir -p $AWS_CACHE_DIR \ && aws sts assume-role-with-web-identity \ --role-arn ${AWS_ROLE_ARN} \ --role-session-name "test" \ --web-identity-token "$(cat /tmp/tokenfile)" \ && aws s3 ls
执行assume-role-with-web-identity后,CLI会自动将临时凭证缓存到指定目录,后续AWS命令会自动读取缓存内容,全程无需手动写入文件或设置环境变量,安全且简洁。
内容的提问来源于stack exchange,提问作者Gogo
相关产品推荐
相关产品推荐

