授予 aws s3 对 fargate 集群的读取权限

give aws s3 read permission to fargate cluster

我创建一个 AWS Fargate 集群

现在我更改了 docker 图像以便从 s3 读取输入数据。 在开发阶段,我通过环境变量传递了凭据并且容器工作了

现在在 AWS 上我想我应该添加一个策略

我先用

创建一个角色
iam_role='ecsTaskExecutionRole'
aws iam wait role-exists --role-name $iam_role 2>/dev/null || \ aws iam --region $REGION create-role --role-name $iam_role \
  --assume-role-policy-document file://task-execution-assume-role.json || return 1
 

aws iam --region $REGION attach-role-policy --role-name $iam_role \
  --policy-arn arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy || return 1

我传递的 Json 文件仅包含:

{
    "Version": "2012-10-17",
    "Statement": [
      {
        "Sid": "",
        "Effect": "Allow",
        "Principal": {
          "Service": "ecs-tasks.amazonaws.com"
        },
        "Action": "sts:AssumeRole"
      }
    ]
  }
  

然后我创建另一个角色,它应该是任务角色,让容器能够从 S3 读取

aws iam wait role-exists --role-name $task_role 2>/dev/null || \ 
aws iam --region $REGION create-role --role-name $task_role \
  --assume-role-policy-document file://task-role.json || return 1


aws iam --region $REGION attach-role-policy --role-name $task_role \
  --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess || return 1

在这种情况下,我传递的 json 是:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "s3.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

当我创建服务时,我还传递了一个 ecs-params.yml 文件

version: 1
task_definition:
  task_role_arn: ${task_role}
  task_execution_role: ${task_execution_role}
  ecs_network_mode: awsvpc
  task_size:
    mem_limit: 0.5GB
    cpu_limit: 256
run_params:
  network_configuration:
    awsvpc_configuration:
      subnets:
        - ${subnet1}
        - ${subnet2}
      security_groups:
        - ${secgroupid}
      assign_public_ip: ENABLED

我得到的错误是:

INFO[0016](服务仪表板)无法启动任务(错误 ECS 无法承担为该任务提供的角色 'arn:aws:iam::accountID:role/dashboard_role'。请确认传递的角色具有正确的角色信任关系和权限,并且您的 IAM 用户有权传递此角色。) timestamp="2021-03-04 12:13:23 +0000 UTC"

我错过了什么?

您可以将两个 IAM 角色分配给 ECS Fargate 任务。 "Task Execution Role" which allows the ECS to deploy your Fargate task, and the "Task Role",它允许容器内的代码 运行 调用 AWS API。

除了任务执行角色之外,检查您是否为 Fargate 任务定义分配了任务角色,并将 S3 权限添加到任务角色而不是任务执行角色。