Создание определения задачи ECS завершается неудачно с «Предоставленным недопустимым запросом: Создание определения задачи: Неизвестный том ‘null'».

#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 . Очень неприятно, но, надеюсь, это поможет кому-то другому.