You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Terraform创建AWS ECS任务定义时遇容器名称字符无效错误

问题分析与修复

核心问题

  1. Terraform变量未被解析:使用file("templates/task.json")加载JSON文件时,file()仅读取原始文本,不会解析其中的Terraform变量(如${var.app_name})。AWS收到的是字符串"${var.app_name}",其中${}属于ECS容器名称的非法字符,触发Container.name contains invalid characters错误。
  2. JSON结构错误:任务定义JSON包含两个独立容器对象,第二个对象缺少必填的name字段,手动替换变量后,AWS检测到空/缺失的容器名称,触发Container.name should not be null or empty错误。
  3. 冗余字段:ECS任务定义中容器的名称字段是name,container_name是无效字段,会被忽略。

修复步骤

1. 改用templatefile()解析变量

将file()替换为templatefile(),它会解析文件中的Terraform变量,生成正确的JSON内容。

2. 修正JSON结构

合并两个容器对象(应是想定义单个容器,把端口映射等配置放在同一对象内),确保每个容器对象都有必填的name字段,移除冗余的container_name。

修改后的代码

Terraform任务定义资源

resource "aws_ecs_task_definition" "aws-ecs-task" {
  family = "${var.app_name}-task"
  # 用templatefile替代file,解析变量
  container_definitions = templatefile("templates/task.json", {
    app_name = var.app_name
    ecr_repo_url = data.aws_ecr_repository.aws-ecr.repository_url
  })

  requires_compatibilities = ["FARGATE"]
  network_mode             = "awsvpc"
  memory                   = "2048" #2 GB
  cpu                      = "1024" #1 vCPU
  execution_role_arn       = aws_iam_role.ecsTaskExecutionRole.arn
  task_role_arn            = aws_iam_role.ecsTaskExecutionRole.arn

  tags = {
    Name        = "${var.app_name}-ecs-td"
    Environment = var.app_environment
  }
}

修正后的templates/task.json

[
  {
    "name": "${app_name}",
    "image": "${ecr_repo_url}:latest",
    "essential": true,
    "portMappings": [
      {
        "containerPort": 80,
        "hostPort": 80
      }
    ],
    "cpu": 1024,
    "memory": 2048
  }
]

额外说明

  • FARGATE模式下,networkMode不需要在容器级定义,已经在任务级别设置为awsvpc,可移除容器中的networkMode字段。
  • ECS容器名称允许的字符是字母、数字、连字符(-)、下划线(_)、冒号(:)、句点(.),确保var.app_name的值符合规则(你的web-2048是合法的)。

内容的提问来源于stack exchange,提问作者compassionate_dirac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 06:15:29