Terraform Fargate 任务定义请求执行角色

Posted

技术标签:

【中文标题】Terraform Fargate 任务定义请求执行角色【英文标题】:Terraform Fargate task definition requesting execution role 【发布时间】: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 时,我才会收到此错误。我正在提供一个具有任务定义所需权限的角色,但我仍然得到这个。这有什么问题?

【问题讨论】:

【参考方案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)进行交互。

以上是关于Terraform Fargate 任务定义请求执行角色的主要内容,如果未能解决你的问题,请参考以下文章

将命令行参数传递给 AWS Fargate 容器

AWS ECS Fargate ALB 错误(请求超时)

如何将输入转换器用于 ECS Fargate 启动类型和 Terraform CloudWatch 事件触发器

限制给定任务定义的并发 Fargate 任务数

如何在 ECS Fargate 任务定义中配置主机名

Amazon ECS:任务定义不支持 launch_type FARGATE