Я впервые работаю со службой 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"
}
]
}
Итак, у моей роли есть следующая политика:
Проблема, с которой я сталкиваюсь, - это когда я запускаю развертывание службы в кластере, я получаю следующую ошибку в задачах:
CannotPullContainerError: Ответ об ошибке от демона: вытягивать доступ, запрещенный для xxxxxxxxx.xxx.ecr.us-east-1.amazonaws.com / my-image, хранилище не существует или может потребоваться «вход в докер»
Не могу понять, почему задачане может вытащить из ECR. Экземпляр, на котором запущен контейнер, существует в общедоступной подсети и имеет общедоступный IP-адрес, поэтому он определенно имеет доступ к Интернету. Что мне здесь не хватает?