【发布时间】:2020-09-09 23:52:01
【问题描述】:
我正在使用 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"
}
【问题讨论】:
-
可能有很多原因,错误的凭据,没有连接到容器注册表来提取图像(例如 ecr)。如果你去 ecs 控制台,去任务或服务应该有一些关于它为什么无法启动的消息或信息。你检查过 ecs concole 和 tasks 是否有任何消息?
-
在 ECS 控制台我看到
Stopped reason: Task failed to start -
但是如果你去详细了解,比如screenshot,通常那里有更多信息。你的情况没有别的了?
-
由于您使用
awsvpc,请检查您是否为它们启用了公共 IP(假设您在公共子网中运行您的 ecs 服务)。您还指的是哪些容器实例? fargate 没有它们供您登录或在它们上执行任何命令。 -
没有任务在私有子网中。看起来我的选项是公共子网、NAT 网关或从 ECR 实例中存在的图像中提取。 source
标签: amazon-web-services terraform aws-fargate