ECS TaskDefinition 创建失败并显示 "Invalid request provided: Create TaskDefinition: Unknown volume 'null'."

ECS TaskDefinition creation fails with "Invalid request provided: Create TaskDefinition: Unknown volume 'null'."

我正在尝试使用 CDK 为使用 3 个绑定安装卷的 DataDog 代理部署 EC2 TaskDefinition。 DD example task definition 看起来很简单。

下面的 Cloudformation 模板片段是由 AWS CDK 生成的。部署它会按原样引发所有三个卷的 Unknown volume: 'null' 错误。如果没有设置卷,它会成功部署。

我尝试通过 cloudformation UI 使用变更集来一次添加一个卷。添加第一个卷本身正常,但是添加两个或三个失败并出现 Unknown volume: 'null' 错误,无论是分阶段还是一次性添加。

通过 ECS 控制台手动编辑任务定义确实成功添加了第二个卷。

似乎没有关于此特定错误的任何文档,而且我无法理解 ECS 服务如何在卷数组中获取空​​值。我怀疑我在某处遗漏了一些明显的东西,所以希望有人对发生的事情有所了解。

{
  "MonitoringTask9D49B4FA": {
    "Type": "AWS::ECS::TaskDefinition",
    "Properties": {
      "ContainerDefinitions": [
        {
          "Cpu": 10,
          "Environment": [
            {
              "Name": "DD_SITE",
              "Value": "datadoghq.com"
            }
          ],
          "Essential": true,
          "Image": "datadog/agent:latest",
          "LogConfiguration": {
            "LogDriver": "awslogs",
            "Options": {
              "awslogs-group": {
                "Ref": "MonitoringTaskDatadogAgentLogGroupC5828485"
              },
              "awslogs-region": "eu-west-1"
            }
          },
          "MemoryReservation": 256,
          "MountPoints": [
            {}
          ],
          "Name": "datadog"
        }
      ],
      "ExecutionRoleArn": {
        "Fn::GetAtt": [
          "MonitoringTaskExecutionRole3188D770",
          "Arn"
        ]
      },
      "Family": "datadog-agent-task",
      "NetworkMode": "bridge",
      "RequiresCompatibilities": [
        "EC2"
      ],
      "Tags": [
        {
          "Key": "Environment",
          "Value": "develop"
        },
      ],
      "TaskRoleArn": {
        "Fn::GetAtt": [
          "MonitoringTaskTaskRole70FF4D63",
          "Arn"
        ]
      },
      "Volumes": [
        {
          "Host": {
            "SourcePath": "/var/run/docker.sock"
          },
          "Name": "docker_sock"
        },
        {
          "Host": {
            "SourcePath": "/proc/"
          },
          "Name": "proc"
        },
        {
          "Host": {
            "SourcePath": "/sys/fs/cgroup/"
          },
          "Name": "cgroup"
        }
      ]
    },
    "Metadata": {
      "aws:cdk:path": "Stack/MonitoringTask/Resource"
    }
  }
}

原来我误读了 CDK addMountPoints 函数。

当我成功添加卷时,我也没有添加任何挂载点,但我在添加新内容的同时不断添加挂载点,因此掩盖了实际错误。这是我原始代码中的相关 javascript。

    container.addMountPoints([
      {
        containerPath: "/var/run/docker.sock",
        sourceVolume: "docker_sock",
        readOnly: true
      },
      {
        containerPath: "/host/sys/fs/cgroup",
        sourceVolume: "cgroup",
        readOnly: true
      },
      {
        containerPath: "/host/proc",
        sourceVolume: "proc",
        readOnly: true
      },
    ])

它正在生成一个如下所示的 Cloudformation 属性。

MountPoints:
  - {}

这是因为我为函数提供了一个 MountPoint 数组。 addMountPoints() 与许多其他 CDK 函数一样使用 rest 参数 (...mountPoints),因此它将数组本身视为单个 MountPoint。非常令人沮丧,但希望这对其他人有所帮助。