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
。非常令人沮丧,但希望这对其他人有所帮助。
我正在尝试使用 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
。非常令人沮丧,但希望这对其他人有所帮助。