Сбой задачи AWS ECS с: CannotPullContainerError - PullRequest
0 голосов
/ 14 октября 2019

Я впервые работаю со службой aws ecs и сталкиваюсь с некоторыми проблемами с разрешениями. Я использую terraform для создания определения задачи и определения сервиса.

Мои определения задач json config:

  [
      {
          "dnsSearchDomains": null,
          "logConfiguration": null,
          "portMappings": [
            {
                "containerPort": 80,
                "hostPort": 0,
                "protocol": "tcp"
            }
          ],
          "entryPoint": [
            "httpd",
            "-DFOREGROUND"
          ],
          "command": null,
          "linuxParameters": null,
          "cpu": 0,
          "resourceRequirements": null,
          "ulimits": null,
          "dnsServers": null,
          "mountPoints": [],
          "workingDirectory": null,
          "secrets": [
            ...my_secrets..
          ],
          "dockerSecurityOptions": null,
          "memory": 350,
          "memoryReservation": null,
          "volumesFrom": [],
          "stopTimeout": null,
          "image": "${api_image}",
          "startTimeout": null,
          "dependsOn": null,
          "disableNetworking": null,
          "interactive": null,
          "healthCheck": null,
          "essential": true,
          "links": null,
          "hostname": null,
          "extraHosts": null,
          "pseudoTerminal": null,
          "user": null,
          "readonlyRootFilesystem": null,
          "dockerLabels": null,
          "systemControls": null,
          "privileged": null,
          "name": "myApp"
        }
    ]

Роль IAM, которую я создаю для определения задачи iam_role.tf:

resource "aws_iam_role" "api" {
  name = "api-${var.environment}"
  assume_role_policy = "${file("../../policies/iam_ecs_role.json")}"

  tags = {
      terraform = true
  }
}

# Attach SSM read only policy to read from param store.
resource "aws_iam_role_policy_attachment" "attach-ssm" {
    role        = "${aws_iam_role.api.name}"
    policy_arn  = "arn:aws:iam::aws:policy/AmazonSSMReadOnlyAccess"
}

# Attach policy to allow read and push from ECR. 
resource "aws_iam_role_policy_attachment" "attach-ecs-task" {
    role        = "${aws_iam_role.api.name}"
    policy_arn  = "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy"
}

# Attach policy to allow access to KSM to decrypt ssm values. 
resource "aws_iam_role_policy_attachment" "attach-ksm" {
    role        = "${aws_iam_role.api.name}"
    policy_arn  = "arn:aws:iam::aws:policy/AWSKeyManagementServicePowerUser"
}

resource "aws_iam_role_policy_attachment" "attach-admin" {
    role        = "${aws_iam_role.api.name}"
    policy_arn  = "arn:aws:iam::aws:policy/AdministratorAccess"
}

И файл json политики из предыдущего ресурса роли:

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

Итак, у моей роли есть следующая политика: enter image description here

Проблема, с которой я сталкиваюсь, - это когда я запускаю развертывание службы в кластере, я получаю следующую ошибку в задачах:

CannotPullContainerError: Ответ об ошибке от демона: вытягивать доступ, запрещенный для xxxxxxxxx.xxx.ecr.us-east-1.amazonaws.com / my-image, хранилище не существует или может потребоваться «вход в докер»

Не могу понять, почему задачане может вытащить из ECR. Экземпляр, на котором запущен контейнер, существует в общедоступной подсети и имеет общедоступный IP-адрес, поэтому он определенно имеет доступ к Интернету. Что мне здесь не хватает?

1 Ответ

0 голосов
/ 16 октября 2019

Вы должны получить разрешение ECR в ECS Task Execution IAM Role.

Вот пример политики роли выполнения задачи.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ecr:GetAuthorizationToken",
        "ecr:BatchCheckLayerAvailability",
        "ecr:GetDownloadUrlForLayer",
        "ecr:BatchGetImage",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "*"
    }
  ]
}

См .:

Вот Документ AWS о роли выполнения задачи ecs

...