文件可以在本地上传到 S3 但不能在容器内(无法找到凭据)

File can be uploaded to S3 locally but can't within a container (Unable to locate credential)

我有一个 Python 脚本可以将文件上传到 S3,代码与 中的相同。

我有一个传递 AWS 凭证的 bash 脚本。我想上传的文件是从 运行ning 在 Fargate(容器)上的模型生成的,所以我尝试 运行 将容器内的这个 Python 脚本上传到 S3,我已经构建了图像,但是当我 运行 docker run containername 时它会给我错误:

INFO:root:Uploading to S3 from test.csv to bucket_name test.csv

  File "/usr/local/lib/python3.6/dist-packages/botocore/auth.py", line 357, in add_auth
    raise NoCredentialsError
botocore.exceptions.NoCredentialsError: Unable to locate credentials

有人可以给我一些提示吗?我该如何解决?提前致谢。

要传递 docker 凭据,您需要在容器中安装 ~/.aws/credentials

docker -v ~/.aws/credentials:/root/.aws/credentials:ro 

或者将您的凭据作为环境变量传递

docker run -e -e AWS_ACCESS_KEY_ID=$(aws configure get aws_access_key_id --profile profilename) -e AWS_SECRET_ACCESS_KEY=$(aws configure get aws_secret_access_key --profile profilename)

对于 Fargate 端,您需要创建一个 IAM 角色并添加一个可以访问该存储桶的策略。

这需要分配给 Task Role。这与用于拉取 docker 图像的 Task Execution Role 不同。 Task Role 在 运行 时使用,这就是您需要添加 S3 访问策略的地方。