Как отобразить корзину AWS S3 в контейнер на AWS ECS с помощью шаблона AWS CloudFormation?

#amazon-web-services #amazon-s3 #amazon-cloudformation #amazon-ecs #docker-container

#amazon-веб-сервисы #amazon-s3 #aws-cloudformation #amazon-ecs #docker-контейнер

Вопрос:

Я работаю над проектом VOIP с использованием Asterisk в Linux. Наша текущая цель — иметь несколько компьютеров EC2, на которых работает контейнер Asterisk, на каждом из них, и мы хотим иметь возможность разработки, промежуточной и производственной среды. Для этого я пишу шаблон CloudFormation для использования AWS-ECS. Моя проблема в том, что я не могу найти правильный способ сопоставления корзин AWS-S3 с объемами контейнеров. Я хочу использовать 2 разных корзины. Один для внедрения конфигурационных файлов Asterisk во все контейнеры. Еще один для сохранения голосовых сообщений и журналов всех контейнеров.

Спасибо,

PS Я поместил свой образ Asterisk в AWS-ECR и сослался на него в определении задачи. Я вижу там точки монтирования и тома, но они, похоже, не являются моим решением.

Ответ №1:

Не могли бы вы попробовать использовать переменную среды в своих определениях задач?

в шаблоне CF это было бы так:

 "DefJob":{
     "Type":"AWS::ECS::TaskDefinition",
     "Properties":{
        "ContainerDefinitions":[
           {
              "Name":"integration-jobs",
              "Cpu":"3096",
              "Essential":"true",
              "Image":"828387064194.dkr.ecr.us-east-1.amazonaws.com/poblano:integration",
              "Memory":"6483",
              "Environment":[
                 {
                    "Name":"S3_REGION",
                    "Value":"us-east-1"
                 },
                 {
                     "Name":"S3_BUCKET"
                     "Value":"Name-of-S3"
                  }
                  ........
  

А затем ссылайтесь на эти переменные среды в своих контейнерах, чтобы использовать эти корзины S3. Вы должны убедиться, что у вашего экземпляра есть доступ к использованию этих корзин S3.

Спасибо, Маниш

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

1. Привет, я собираюсь подключить том ECS к корзине s3, чтобы иметь доступ к журналам без входа на сервер, мне интересно, как ссылаться на эти переменные среды в контейнерах?

Ответ №2:

Я знаю, что это не совсем отвечает на эту проблему, это более простое решение, чем решение Manish, но простой способ обеспечить совместное хранение между контейнерами ECS — полагаться на эластичные файловые системы.

Установив такой сценарий в пользовательских данных экземпляров Docker или в конфигурации запуска группы автоматического масштабирования, EFS можно смонтировать в /mnt/efs каждого экземпляра Docker, таким образом разделяя тома, установленные на что-то вроде /mnt/efs/something .

Для этого этот блок пользовательских данных выполняет эту работу (мы используем его с оптимизированными изображениями Amazon ECS).

 Content-Type: multipart/mixed; boundary="==BOUNDARY=="
MIME-Version: 1.0

--==BOUNDARY==
MIME-Version: 1.0
Content-Type: text/text/x-shellscript; charset="us-ascii"
#!/bin/bash
yum install -y nfs-utils
mkdir "/mnt/efs"
echo "us-east-1a.fs-1234567.efs.us-east-1.amazonaws.com:/ /mnt/efs nfs4 nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 0 0" >> /etc/fstab
mount -a
/etc/init.d/docker restart
docker start ecs-agent
--==BOUNDARY==--
  

В конце Docker перезапускается, иначе он не видит подключенный том (необходимый только при создании экземпляра).

Конечно, чтобы это работало, группы безопасности должны быть настроены так, чтобы экземпляры и EFS могли взаимодействовать через сетевой порт NFS (2049).