ECS TaskDefinition 创建失败,并显示“提供的请求无效:创建 TaskDefinition:未知卷 'null'”。

Posted

技术标签:

【中文标题】ECS TaskDefinition 创建失败,并显示“提供的请求无效:创建 TaskDefinition:未知卷 \'null\'”。【英文标题】: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"
    
  

【问题讨论】:

【参考方案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。非常令人沮丧,但希望这对其他人有所帮助。

【讨论】:

以上是关于ECS TaskDefinition 创建失败,并显示“提供的请求无效:创建 TaskDefinition:未知卷 'null'”。的主要内容,如果未能解决你的问题,请参考以下文章

[AWS][容器][ECS] 容器动手实验201

无法在 Loki 中获取日志记录

CloudFormation yaml - 如何强制数字类型?

使用 Jenkins 或 Job Scheduler 在 AWS ECS 上自动部署 Docker 容器

使用 ECS 和 Fargate 时卷位于何处?

如何诊断 ECS Fargate 任务启动失败?