Docker容器挂载AWS CLI凭证后未被识别导致API调用失败如何解决
问题原因
AWS CLI 默认会读取运行用户家目录下的.aws文件夹内的凭证和配置文件,你容器内使用root用户运行进程,root的家目录为/root,但你将宿主机的.aws目录挂载到了容器的根路径/.aws下,不在CLI的默认查找路径内,因此无法读取到有效凭证。
另外你当前的docker run命令参数顺序错误,镜像名需要放在所有启动参数之后,传入容器的参数放在镜像名之后,否则会出现镜像识别错误、参数传递错位的问题。
解决方案
以下方案任选其一即可:
方案1:调整挂载路径(最简便)
将.aws目录直接挂载到root用户的家目录下,匹配AWS CLI的默认查找规则,修改docker run的挂载参数:
# 原挂载参数 -v $PWD/.aws:/.aws:ro 调整为 -v $PWD/.aws:/root/.aws:ro
调整后的完整运行命令示例:
docker run -d -v $PWD/.aws:/root/.aws:ro -e XDG_CACHE_HOME=/tmp/go/.cache test-image arn:aws:iam::829327394277:role/myjenkins
方案2:指定AWS CLI凭证路径环境变量
如果需要保留挂载到根目录的逻辑,可在启动容器时添加AWS CLI的配置路径环境变量,告知CLI凭证的实际存放位置:
docker run -d -v $PWD/.aws:/.aws:ro \ -e XDG_CACHE_HOME=/tmp/go/.cache \ -e AWS_CONFIG_FILE=/.aws/config \ -e AWS_SHARED_CREDENTIALS_FILE=/.aws/credentials \ test-image arn:aws:iam::829327394277:role/myjenkins
方案3:在脚本内指定凭证路径
也可以直接在assume-role.sh脚本开头添加环境变量声明,无需修改启动命令:
#!/usr/bin/env bash # 新增以下两行 export AWS_CONFIG_FILE="/.aws/config" export AWS_SHARED_CREDENTIALS_FILE="/.aws/credentials" # 原有脚本内容...
修改完成后重新构建镜像运行即可,STS AssumeRole调用成功后生成的临时凭证会自动覆盖原有凭证,后续的AWS API调用也会正常执行。
内容的提问来源于stack exchange,提问作者vinod827
相关产品推荐
相关产品推荐

