AWS Batch 容器无法通过 aws-cli 访问 S3
AWS Batch container cannot access S3 via aws-cli
我正在尝试 运行 AWS Batch 作业,但在调用 aws-cli
将数据从 s3 复制到容器时失败。报错信息如下:
fatal error: Unable to locate credentials
我的作业定义有一个具有两个托管策略的执行角色:AmazonS3FullAccess
和 AmazonECSTaskExecutionRolePolicy
。容器镜像是从默认 ubuntu:22.04
镜像构建的,并且有一个类似于以下内容的入口点文件:
#!/bin/bash
set -ex
aws s3 cp ...
我也一直在阅读以下问题:ECS Fargate task not applying role,它指出容器应该有一个变量 AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
,但我没有。我在我的入口点添加了一个 declare -x
,这是我执行批处理作业时的输出:
declare -x AWS_BATCH_CE_NAME="MyCluster"
declare -x AWS_BATCH_JOB_ATTEMPT="1"
declare -x AWS_BATCH_JOB_ID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
declare -x AWS_BATCH_JQ_NAME="MyQueue"
declare -x AWS_DEFAULT_REGION="us-west-2"
declare -x AWS_EXECUTION_ENV="AWS_ECS_FARGATE"
declare -x AWS_REGION="us-west-2"
declare -x DEBIAN_FRONTEND="noninteractive"
declare -x ECS_CONTAINER_METADATA_URI="http://111.111.111.1/v3/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxx"
declare -x ECS_CONTAINER_METADATA_URI_V4="http://111.111.111.1/v4/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxx"
declare -x HOME="/root"
declare -x HOSTNAME="ip-111-11-1-111.us-west-2.compute.internal"
declare -x OLDPWD
declare -x PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
declare -x PWD="/"
declare -x SHLVL="1"
此外,在设置 Fargate 集群时,我可以看到任务定义除了执行角色外还有一个“任务角色”。我的理解是,“任务角色”是在容器内部定义的角色,而执行角色定义为设置容器。在 Batch 中,没有这样的“任务角色”。所以,我的问题是,如何授权我的容器访问容器内 aws-cli
的 AWS 资源?
我终于想通了如何将权限传递给容器。作业定义有一个直接传递给 ECS 任务角色的“作业角色”,但该配置选项在 AWS 控制台中不可用。必须通过 API 或 CLI 在 --container-properties
参数中注册作业定义:
aws batch register-job-definition --container-properties '{"jobRoleArn": "...","executionRoleArn": "..."}' ...
我正在尝试 运行 AWS Batch 作业,但在调用 aws-cli
将数据从 s3 复制到容器时失败。报错信息如下:
fatal error: Unable to locate credentials
我的作业定义有一个具有两个托管策略的执行角色:AmazonS3FullAccess
和 AmazonECSTaskExecutionRolePolicy
。容器镜像是从默认 ubuntu:22.04
镜像构建的,并且有一个类似于以下内容的入口点文件:
#!/bin/bash
set -ex
aws s3 cp ...
我也一直在阅读以下问题:ECS Fargate task not applying role,它指出容器应该有一个变量 AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
,但我没有。我在我的入口点添加了一个 declare -x
,这是我执行批处理作业时的输出:
declare -x AWS_BATCH_CE_NAME="MyCluster"
declare -x AWS_BATCH_JOB_ATTEMPT="1"
declare -x AWS_BATCH_JOB_ID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
declare -x AWS_BATCH_JQ_NAME="MyQueue"
declare -x AWS_DEFAULT_REGION="us-west-2"
declare -x AWS_EXECUTION_ENV="AWS_ECS_FARGATE"
declare -x AWS_REGION="us-west-2"
declare -x DEBIAN_FRONTEND="noninteractive"
declare -x ECS_CONTAINER_METADATA_URI="http://111.111.111.1/v3/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxx"
declare -x ECS_CONTAINER_METADATA_URI_V4="http://111.111.111.1/v4/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxx"
declare -x HOME="/root"
declare -x HOSTNAME="ip-111-11-1-111.us-west-2.compute.internal"
declare -x OLDPWD
declare -x PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
declare -x PWD="/"
declare -x SHLVL="1"
此外,在设置 Fargate 集群时,我可以看到任务定义除了执行角色外还有一个“任务角色”。我的理解是,“任务角色”是在容器内部定义的角色,而执行角色定义为设置容器。在 Batch 中,没有这样的“任务角色”。所以,我的问题是,如何授权我的容器访问容器内 aws-cli
的 AWS 资源?
我终于想通了如何将权限传递给容器。作业定义有一个直接传递给 ECS 任务角色的“作业角色”,但该配置选项在 AWS 控制台中不可用。必须通过 API 或 CLI 在 --container-properties
参数中注册作业定义:
aws batch register-job-definition --container-properties '{"jobRoleArn": "...","executionRoleArn": "..."}' ...