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

时间:2020-05-23 03:00:22

标签: amazon-web-services terraform aws-fargate

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

AWS docs说这可能是因为:

  • Docker守护程序无响应

文档说要设置CloudWatch来查看CPU使用率并在需要时增加容器大小。我已经将CPU /内存都提高到1024/2048,这不能解决问题。

  • Docker镜像很大

不太可能吗?图像不过是httpd:2.4

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

文档提供了一些在容器实例中运行的命令。为此,看来我必须set up AWS Systems ManagerSSH in directly。如果找不到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"
}

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

出于许多安全原因,公共子网/公共IP可能不是正确的解决方案。

考虑将您的任务放置在专用子网中。

  1. 如果您配置通过NAT连接到Internet,则将能够提取图像 pulling image from ECR using routing through NAT gateway

或者您可以使用更好的解决方案:

  1. 即使您放置在 PRIVATE子网中而没有连接到互联网,您的ECS FARGATE也可以从ECR中提取图像。 请检查AWS PrivateLink for ECR 图:pulling image from ECS using PrivateLink - VPC endpoints