web-dev-qa-db-fra.com

Définition de tâche Terraform Fargate demandant un rôle d'exécution

J'utilise Terraform pour créer quelques services dans AWS. L'un de ces services est une définition de tâche ECS. J'ai suivi les documents et je reçois toujours l'erreur suivante:

aws_ecs_task_definition.github-backup: ClientException: Fargate requires task definition to have execution role ARN to support ECR images.
status code: 400, request id: 84df70ec-94b4-11e8-b116-97f92c6f483f

Tout d'abord, le task_role_arn est facultatif et je peux voir qu'un nouveau rôle a été créé. J'ai également essayé de créer moi-même un rôle avec les autorisations requises par la définition des tâches.

Voici ce que j'ai:

Définition de la tâche:

resource "aws_ecs_task_definition" "github-backup" {
  family                   = "${var.task_name}"
  requires_compatibilities = ["FARGATE"]
  network_mode             = "awsvpc"
  cpu                      = "${var.fargate_cpu}"
  memory                   = "${var.fargate_memory}"
  task_role_arn            = "${aws_iam_role.github-role.arn}"

  container_definitions = <<DEFINITION
[
    {
        "cpu": ${var.fargate_cpu},
        "image": "${var.image}",
        "memory": ${var.fargate_memory},
        "name": "github-backup",
        "networkMode": "awsvpc"
    }
]
DEFINITION
}

Politique IAM:

resource "aws_iam_policy" "access_policy" {
  name = "github_policy"

  policy = <<EOF
{
    "Version": "2012-10-17",
    "Statement": [
    {
        "Sid": "Stmt1532966429082",
        "Action": [
        "s3:PutObject",
        "s3:PutObjectTagging",
        "s3:PutObjectVersionTagging"
        ],
        "Effect": "Allow",
        "Resource": "arn:aws:s3:::zego-github-backup11"
    },
    {
        "Sid": "Stmt1532967608746",
        "Action": "lambda:*",
        "Effect": "Allow",
        "Resource": "*"
    },
    {
        "Effect": "Allow",
        "Action": [
            "ecr:GetAuthorizationToken",
            "ecr:BatchCheckLayerAvailability",
            "ecr:GetDownloadUrlForLayer",
            "ecr:BatchGetImage",
            "logs:CreateLogStream",
            "logs:PutLogEvents"
            ],
            "Resource": "*"
        }
    ]
}
EOF
}

Rôle IAM:

resource "aws_iam_role" "github-role" {
  name = "github-backup"

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

Attachement de stratégie IAM:

resource "aws_iam_role_policy_attachment" "test-attach" {
    role       = "${aws_iam_role.github-role.name}"
    policy_arn = "${aws_iam_policy.access_policy.arn}"
}

Le plan Terraform ne me montre aucune erreur. Ce n'est qu'en exécutant Terraform apply que j'obtiens cette erreur. Je fournis un rôle avec les autorisations requises pour la définition des tâches et je l'obtiens toujours. Quel est le probleme avec ca?

12
davidb

Comme mentionné dans le AWS ECS User Guide Les tâches Fargate nécessitent que le rôle d'exécution soit spécifié dans le cadre de la définition de la tâche.

Les tâches de type de lancement EC2 ne nécessitent pas cela, car les instances EC2 elles-mêmes doivent avoir un rôle IAM qui leur permet d'extraire l'image du conteneur et éventuellement de pousser les journaux vers Cloudwatch.

Parce que c'est facultatif pour les types de lancement EC2, Terraform doit le rendre facultatif, sinon il les casse. À proprement parler, Terraform n'a pas de moyen de faire la validation entre champs au moment du plan, il n'est donc pas en mesure de vous dire dans le plan que parce que vous avez une tâche de type de lancement Fargate, vous devez spécifier le execution_role_arn. Il existe des solutions de contournement pour cela en utilisant le CustomizeDiff dans la source du fournisseur, mais il est hacky comme l'enfer et n'est utilisé que dans quelques endroits pour le moment.

Notez que le rôle d'exécution est ce qui est nécessaire pour lancer la tâche, pas le rôle de la tâche qui permet à la tâche de faire les choses.

Vous devez donc supprimer les autorisations liées à ECS de votre stratégie IAM car la tâche ne doit pas du tout interagir avec S3. Ajoutez simplement un rôle avec les autorisations appropriées comme rôle d'exécution.

Pour utiliser le rôle d'exécution de tâche ECS gérée par AWS, vous feriez quelque chose comme ceci:

data "aws_iam_role" "ecs_task_execution_role" {
  name = "ecsTaskExecutionRole"
}

resource "aws_ecs_task_definition" "github-backup" {
  family                   = "${var.task_name}"
  requires_compatibilities = ["FARGATE"]
  network_mode             = "awsvpc"
  cpu                      = "${var.fargate_cpu}"
  memory                   = "${var.fargate_memory}"
  task_role_arn            = "${aws_iam_role.github-role.arn}"
  execution_role_arn       = "${data.aws_iam_role.ecs_task_execution_role.arn}"

  container_definitions = <<DEFINITION
  [
    {
      "cpu": ${var.fargate_cpu},
      "image": "${var.image}",
      "memory": ${var.fargate_memory},
      "name": "github-backup",
      "networkMode": "awsvpc"
    }
  ]
  DEFINITION
}
12
ydaetskcoR