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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 10:57:14