我正在使用Terraform来设置一个由三个Apache服务器任务组成的小型Fargate集群。任务挂起挂起,然后集群停止它们并创建新的挂起任务,然后循环继续。
AWS docs说这可能是因为:
- Docker守护程序无响应
文档说要设置CloudWatch来查看CPU使用率并在需要时增加容器大小。我已经将CPU /内存都提高到1024/2048,这不能解决问题。
- Docker镜像很大
不太可能吗?图像不过是httpd:2.4
- ECS容器代理在任务启动过程中失去了与Amazon ECS服务的连接
文档提供了一些在容器实例中运行的命令。为此,看来我必须set up AWS Systems Manager或SSH 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"
}
答案 0 :(得分:2)
根据评论中的讨论,确定该问题是由于Fargate任务的缺乏互联网访问权限引起的。
这是因为任务在私有子网中运行,而任务使用来自docker hub的httpd
映像。从集线器中提取图像需要互联网访问。
可能的解决方案是使用NAT网关/实例,使用公共子网中的任务或在ECR中具有自定义映像。
答案 1 :(得分:2)
出于许多安全原因,公共子网/公共IP可能不是正确的解决方案。
考虑将您的任务放置在专用子网中。
或者您可以使用更好的解决方案: