дать aws s3 разрешение на чтение для фаргейт-кластера

Создаю кластер AWS fargate

теперь я изменил образ докера, чтобы читать входные данные из 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', которая была предоставлена ​​для этой задачи. Убедитесь, что роль Pass имеет надлежащие отношения доверия и разрешения, а также что у вашего пользователя IAM есть разрешения на передачу этой роли.). timestamp = 2021-03-04 12:13:23 +0000 UTC

что мне не хватает?


person bruvio    schedule 03.03.2021    source источник


Ответы (1)


Задаче ECS Fargate можно назначить две роли IAM. роль выполнения задачи, которая позволяет ECS развернуть ваш Fargate задача и роль задачи, которая позволяет коду, запущенному внутри вашего контейнера, выполнять вызовы API AWS.

Убедитесь, что вашему определению задачи Fargate назначена роль задачи в дополнение к роли выполнения задачи, и добавьте разрешения S3 к роли задачи вместо роли выполнения задачи.

person Mark B    schedule 03.03.2021
comment
Я отредактировал вопрос, чтобы учесть ваши предложения. все еще ошибки - person bruvio; 04.03.2021
comment
@bruvio - это dashboard_role имя роли задачи? Вы не создали эту роль должным образом. Service в этом sts:AssumeRole заявлении должно быть ecs-tasks.amazonaws.com, как и другая роль. - person Mark B; 04.03.2021
comment
это сработало. поэтому роль задачи должна быть добавлена, а также доверена, а затем я могу добавить все политики, которые мне нужны. хороший - person bruvio; 04.03.2021