#amazon-cloudformation #amazon-ecs #aws-cdk #datadog
Вопрос:
Я пытаюсь использовать CDK для развертывания определения задач EC2 для агента журнала данных, который использует 3 тома для подключения привязки. Определение задачи в примере DD выглядит довольно простым.
Приведенный ниже фрагмент шаблона Cloudformation был сгенерирован AWS CDK. При развертывании возникает Unknown volume: 'null'
ошибка со всеми тремя томами как есть. Он успешно развертывается, если тома не установлены.
Я пробовал использовать наборы изменений в пользовательском интерфейсе cloudformation для добавления томов по одному за раз. Добавление первого тома само по себе работает нормально, но добавление двух или трех завершается Unknown volume: 'null'
ошибкой, независимо от того, выполняется ли это поэтапно или единовременно.
Редактирование определения задачи вручную с помощью консоли ECS успешно добавляет второй том.
Похоже, что по этой конкретной ошибке нет никакой документации, и я не могу понять, как служба ECS получает значение null в массиве томов. Я подозреваю, что где-то упускаю что-то очевидное, поэтому надеюсь, что у кого-то есть некоторое представление о том, что происходит.
{
"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, использует параметр rest ( ...mountPoints
), поэтому он рассматривал сам массив как единый MountPoint
. Очень неприятно, но, надеюсь, это поможет кому-то другому.