среда, 22 августа 2018 г.

Монтирование EFS в кластере AWS ECS

Есть несколько способов смонтировать EFS в ECS кластере:
  • монтировать EFS на ноде кластера из cloud-init/puppet/chef/ansible/etc и делать bind mount в контейнер при старте (придется монтировать EFS на каждой ноде кластера где может запуститься контейнер)
  • монтировать EFS внутри контейнера контейнера (требует privileged для контейнера, т.к. монтирование файловой системы зависит от CAP_SYS_ADMIN)
  • использовать EFS в качестве docker volume (вроде появилось начиная с docker api 1.21, но я точно не уверен)
Хочу подробнее остановиться на последнем варианте, т.к. на мой взгляд он наиболее универсальный, но требует относительно свежий docker daemon и ecs-agent.

Нужно описать volume в TaskDefinition используя dockerVolumeConfiguration в секции Volumes[1]

"TaskDefinition": {
  "Type": "AWS::ECS::TaskDefinition",
  "Properties": {
    "Volumes": [
      {
        "name": "efs",
        "dockerVolumeConfiguration": {
          "scope": "task",
          "driver": "local",
          "driverOpts": {
            "type": "nfs",
            "device": ":/",
            "o": "addr=1.2.3.4,nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport"
          }
        }
      }
    ]
  }
}

Проблема заключается в том, что CloudFormation еще не поддерживает[2] параметр dockerVolumeConfiguration в TaskDefinition и попытка обновления стека завершается с ошибкой

18:56:27 UTC+0300UPDATE_FAILEDAWS::ECS::TaskDefinitionTaskDefinitionEncountered unsupported property dockerVolumeConfiguration

Чтоы это обойти можно создать TaskDefinition через консоль и передать ее идентификатор в стек в виде параметра.

  1. https://docs.aws.amazon.com/AmazonECS/latest/developerguide/docker-volumes.html
  2. https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-volumes.html
  3. https://docs.docker.com/engine/reference/commandline/volume_create/#driver-specific-options

Комментариев нет:

Отправить комментарий