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:
-
这是因为我给函数一个MountPoint
s 的数组。 addMountPoints()
像许多其他 CDK 函数一样使用一个剩余参数 (...mountPoints
),因此它将数组本身视为单个 MountPoint
。非常令人沮丧,但希望这对其他人有所帮助。
【讨论】:
以上是关于ECS TaskDefinition 创建失败,并显示“提供的请求无效:创建 TaskDefinition:未知卷 'null'”。的主要内容,如果未能解决你的问题,请参考以下文章
CloudFormation yaml - 如何强制数字类型?