为什么我的 Fargate 任务停留在待处理状态?

bsa*_*aka 2 amazon-web-services terraform aws-fargate

我正在使用 Terraform 设置一个由三个 apache 服务器任务组成的小型 Fargate 集群。任务挂起待处理,然后集群停止它们并创建新的待处理任务,然后循环继续。

AWS 文档称这可能是因为:

  • Docker 守护进程没有响应

文档说要设置 CloudWatch 以查看 CPU 使用情况并根据需要增加容器大小。我已将 CPU/内存提高到 1024/2048,但这并没有解决问题。

  • Docker 镜像很大

不太可能?图像无非是httpd:2.4

  • ECS 容器代理在任务启动过程中失去了与 Amazon ECS 服务的连接

该文档提供了一些在容器实例中运行的命令。为此,我似乎必须直接设置 AWS Systems ManagerSSH。如果我的 Terraform 配置没有发现任何问题,我将采用此路线。

  • ECS 容器代理需要很长时间才能停止现有任务

不太可能,因为我正在启动一个全新的 ECS 集群


以下是我的 Terraform 文件的 ECS 和 IAM 部分。为什么我的 Fargate 任务可能会陷入待处理状态?

#
# ECS
#
resource "aws_ecs_cluster" "main" {
  name = "main-ecs-cluster"
}

resource "aws_ecs_task_definition" "app" {
  family                   = "app"
  network_mode             = "awsvpc"
  requires_compatibilities = ["FARGATE"]
  cpu                      = 256
  memory                   = 512
  execution_role_arn       = aws_iam_role.task_execution.arn
  task_role_arn            = aws_iam_role.task_execution.arn
  container_definitions = <<DEFINITION
  [
    {
      "image": "httpd:2.4",
      "cpu": 256,
      "memory": 512,
      "name": "app",
      "networkMode": "awsvpc",
      "portMappings": [
        {
          "containerPort": 80,
          "hostPort": 80,
          "protocol": "tcp"
        }
      ]
    }
  ]
  DEFINITION
}

resource "aws_ecs_service" "main" {
  name            = "tf-ecs-service"
  cluster         = aws_ecs_cluster.main.id
  task_definition = aws_ecs_task_definition.app.arn
  desired_count   = 2
  launch_type     = "FARGATE"

  network_configuration {
    security_groups = [aws_security_group.main.id]
    subnets         = [
      aws_subnet.public1.id,
      aws_subnet.public2.id,
    ]
  }
}

#
# IAM
#
resource "aws_iam_role" "task_execution" {
  name               = "my-first-service-task-execution-role"
  assume_role_policy = data.aws_iam_policy_document.task_execution.json
}

data "aws_iam_policy_document" "task_execution" {
  statement {
    actions = ["sts:AssumeRole"]

    principals {
      type        = "Service"
      identifiers = ["ecs-tasks.amazonaws.com"]
    }
  }
}

resource "aws_iam_role_policy_attachment" "task_execution" {
  role       = aws_iam_role.task_execution.name
  policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy"
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*cin 5

根据评论中的讨论,确定该问题是由于Fargate 任务缺乏互联网访问造成的。

这是因为任务在私有子网中运行,而任务使用httpd来自 docker hub 的映像。从中心提取图像需要访问互联网。

可能的解决方案是使用 NAT 网关/实例、使用公共子网中的任务或在 ECR 中使用自定义映像。

  • 公共子网 + [`assign_public_ip`](https://www.terraform.io/docs/providers/aws/r/ecs_service.html#network_configuration-1) 修复了问题...再次感谢! (3认同)