【问题标题】:Terraform Fargate task definition requesting execution roleTerraform Fargate 任务定义请求执行角色
【发布时间】:2019-01-07 19:14:03
【问题描述】:

我正在使用 Terraform 在 AWS 中创建一些服务。其中一项服务是 ECS 任务定义。我按照文档进行操作,但不断收到以下错误:

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

首先task_role_arn 是可选的,我可以看到创建了一个新角色。我还尝试自己创建一个具有任务定义所需权限的角色。

这是我所拥有的:

任务定义:

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
}

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
}

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
}

IAM 政策附件:

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

Terraform 计划没有显示任何错误。只有在运行 Terraform apply 时,我才会收到此错误。我正在提供一个具有任务定义所需权限的角色,但我仍然得到这个。这有什么问题?

【问题讨论】:

    标签: amazon-web-services terraform amazon-ecs


    【解决方案1】:

    正如AWS ECS User Guide Fargate 任务中所述,需要将执行角色指定为任务定义的一部分。

    EC2 启动类型的任务不需要这样做,因为 EC2 实例本身应该有一个 IAM 角色,允许它们拉取容器映像并可选择将日志推送到 Cloudwatch。

    因为这对于 EC2 启动类型是可选的,所以 Terraform 需要将其设为可选,否则会破坏这些。严格来说,Terraform 没有办法在计划时进行跨字段验证,因此它无法在计划中告诉您,因为您有一个 Fargate 启动类型的任务,所以您需要指定 execution_role_arn。使用提供程序源中的CustomizeDiff 可以解决此问题,但它非常糟糕,目前仅在几个地方使用。

    请注意,执行角色是启动任务所需的角色,而不是任务所具有的允许任务执行操作的角色。

    因此,您应该从 IAM 策略中删除与 ECS 相关的权限,因为该任务根本不应该与 S3 交互。相反,只需添加一个具有适当权限的角色作为执行角色。

    要使用 AWS 托管 ECS 任务执行角色,您需要执行以下操作:

    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
    }
    

    【讨论】:

    • 如果您查看我的帖子,您会发现我在任务定义中指定了execution_role_arn。另外,感谢格式化。
    • 您在问题中的任务定义不包括execution_role_arn。你错过了添加它吗?我已经编辑了我的答案以准确显示它应该如何使用并解释execution_role_arntask_role_arn 之间的区别。
    • 好吧,我现在有点尴尬。这个问题是因为我一直误读 execution_role_arn 和 task_role_arn 并认为它们是一样的。我将 task_role 更改为 execution_role_arn,它现在工作正常。感谢您帮助我注意到这一点。
    • 这是两个不同的东西。 execution_role_arn 是 Fargate 启动任务所必需的,task_role_arn 是 ECS 任务应该被赋予的角色,以便应用程序可以与 AWS 服务(例如 S3)进行交互。
    猜你喜欢
    • 2020-12-05
    • 2019-11-26
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    • 2015-08-26
    • 2021-05-16
    相关资源
    最近更新 更多