【问题标题】:ECS TaskDefinition creation fails with "Invalid request provided: Create TaskDefinition: Unknown volume 'null'."ECS TaskDefinition 创建失败,并显示“提供的请求无效:创建 TaskDefinition:未知卷 'null'”。
【发布时间】:2021-12-16 00:58:12
【问题描述】:

我正在尝试使用 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"
    }
  }
}

【问题讨论】:

    标签: amazon-cloudformation amazon-ecs aws-cdk datadog


    【解决方案1】:

    原来我误读了 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:
      - {}
    

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

    【讨论】:

      猜你喜欢
      • 2021-08-20
      • 2021-09-17
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      • 2018-03-01
      • 1970-01-01
      • 2015-01-23
      相关资源
      最近更新 更多