Разверните контейнерный Python для AWS, используя действия GitHub. (3 серии деталей)
В предыдущем посте мы узнали, как создать архитектуру AWS для поддержки нашего приложения Python. В этом посте мы узнаем, как создать определение задачи из файла докера.
Перед тем, как погрузиться в учебник, давайте определим, что такое файл с композитом Docker, и вспомнить из предыдущего учебника, что является определением задачи.
Что такое Docker-Compose?:
Из этого Учебник , Docker-Compose определяется как:
Docker Compose – это способ создать воспроизводимые контейнеры Docker, используя файл конфигурации вместо очень длинных команд Docker. Используя структурированный файл конфигурации, ошибки легче набрать, а контейнерные взаимодействия легче определить.
Что такое определение задачи:
Давайте вспомним, что такое определение задачи: это просто спецификация. Вы используете его для определения одного или нескольких контейнеров, которые вы хотите запустить вместе, наряду с другими деталями, такими как переменные среды, требования процессора/памяти и т. Д.
Из двух определений мы видим, что роль определения задачи похожа на роль файла с композитом Docker.
Поэтому мы будем использовать файл с композитом Docker для создания задачи.
Настоящий материал, преобразование:
Чтобы сделать нашу трансформацию, мы можем вернуться к проэкт Мы представили в первой части и CD
в каталог проекта.
Мы будем использовать инструмент Python под названием Контейнер-трансформ для достижения нашей трансформации.
Вы можете установить его в виртуальную среду своего проекта:
PIP установить контейнер-трансформу
С установленным инструментом мы можем теперь использовать его для генерации файла определения задачи.
Кошка Docker-Compose.yml | контейнер-трансформ -v> .aws/задача-definition.json
Вывод этой команды отправляется в файл .AWS/TASK-DEFINITION.JSON
, если все прошло хорошо, у вас будет что -то подобное:
{ "containerDefinitions": [ { "command": [ "celery", "-A", "celery_factory:celery", "beat", "-S", "redbeat.RedBeatScheduler", "--loglevel=info" ], "essential": true, "image": "task_runner", "links": [ "redis" ], "name": "celery-beat" }, { "command": [ "celery", "worker", "-A", "celery_factory:celery", "--loglevel=info", "-E" ], "essential": true, "image": "task_runner", "links": [ "redis" ], "name": "celery-worker" }, { "command": [ "./start_flower" ], "environment": [ { "name": "FLOWER_PORT", "value": "5556" } ], "essential": true, "image": "task_runner", "links": [ "redis" ], "name": "flower", "portMappings": [ { "containerPort": 5556, "hostPort": 5556 } ] }, { "essential": true, "image": "redis", "name": "redis" } ], "family": "", "volumes": [] }
Что здесь отметить; Все услуги, которые у нас есть в файле докеров, теперь находятся в Контейнердефиниции
разделы определения нашей задачи. Однако этот файл еще не полностью завершен. Нам придется обновить его с другими ключами, такими как сетевой режим, ресурсы, роль выполнения, которую мы создали ранее, и параметр журнала для отправки журналов в CloudWatch. Давайте отредактируем файл, добавив следующее. Нам также нужно удалить Ссылка
Ключ из каждого определения контейнера.
"requiresCompatibilities": [ "FARGATE" ], "inferenceAccelerators": [], "volumes": [], "networkMode": "awsvpc", "memory": "512", "cpu": "256", "executionRoleArn": "arn:aws:iam::Your-id-from-aws:role/ecs-devops-execution-role", "family": "ecs-devops-task-definition", "taskRoleArn": "", "placementConstraints": []
Что это за элементы?
Требуется совместимость
: Здесь мы указываем, что наш тип запуска имеет тип Fargate.NetworkMode
: Это режим сети Docker для использования для контейнеров в задаче. AWS предлагает следующие сетевые режимы:Нет
,мост
,AWSVPC
ихост
Анкет В типе запуска Fargate,AWSVPC
Сетевой режим требуется. С помощью этой настройки задача выделяется свой собственный эластичный сетевой интерфейс (ENI) и основной частный адрес IPv4. Это дает задаче те же сетевые свойства, что и экземпляры Amazon EC2. Узнайте больше о сетевом режиме Здесь Анкетпамять
: Является ли сумма оперативной памяти для распределения на контейнеры, если в вашем кластере нет каких -либо зарегистрированных экземпляров контейнеров с доступной запрашиваемой памятью, задача потерпит неудачу.Процессор
: Количество единиц процессора, которые будет зарезервировать контейнер Amazon ECS для контейнера.CERSUTIONROLEARN
: Имя ресурса Amazon (ARN) роли выполнения задачи, которая дает Amazon Как вы можете видеть, это роль IAM, которую мы создали в нашем стеке CloudFormation.Семья
: Имя определения задачи, которое мы создали в стеке CloudFormation.
В каждом определении контейнера нам нужно добавить этот код для отправки журналов контейнеров в CloudWatch.
"logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "ecs-devops-service-logs-groups", "awslogs-region": "us-east-2", "awslogs-stream-prefix": "celery-beat" } },
Добавьте эти строки в каждый сервис AWS и измените awslogs-stream-prefix
Ключ и поместите имя контейнера. Чтобы узнать больше о параметрах определения задач, проверьте Документация AWS
С этими параметрами отредактированы, мы получим следующее определение задачи.
{ "containerDefinitions": [ { "command": [ "celery", "-A", "celery_factory:celery", "beat", "--scheduler=redbeat.RedBeatScheduler", "--loglevel=debug" ], "essential": true, "image": "task_runner", "environment": [ { "name": "CELERY_BROKER_URL", "value": "redis://127.0.0.1:6379" } ], "name": "celery-beat", "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "ecs-devops-service-logs", "awslogs-region": "us-east-2", "awslogs-stream-prefix": "celery-beat" } } }, { "command": [ "celery", "-A", "celery_factory:celery", "worker", "--loglevel=error", "-E" ], "essential": true, "image": "task_runner", "name": "celery-worker", "environment": [ { "name": "CELERY_BROKER_URL", "value": "redis://127.0.0.1:6379" } ], "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "ecs-devops-service-logs", "awslogs-region": "us-east-2", "awslogs-stream-prefix": "celery-worker" } } }, { "command": ["./start_flower"], "environment": [ { "name": "FLOWER_PORT", "value": "5556" }, { "name": "CELERY_BROKER_URL", "value": "redis://127.0.0.1:6379" } ], "essential": true, "image": "task_runner", "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "ecs-devops-service-logs", "awslogs-region": "us-east-2", "awslogs-stream-prefix": "celery-flower" } }, "name": "flower", "portMappings": [ { "containerPort": 5556, "hostPort": 5556 } ] }, { "essential": true, "image": "redis", "name": "redis", "portMappings": [ { "containerPort": 6379 } ], "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "ecs-devops-service-logs", "awslogs-region": "us-east-2", "awslogs-stream-prefix": "celery-redis" } } } ], "requiresCompatibilities": ["FARGATE"], "inferenceAccelerators": [], "volumes": [], "networkMode": "awsvpc", "memory": "512", "cpu": "256", "executionRoleArn":"arn:aws:iam::****youraws id*****:role/ecs-devops-execution-role", "family": "ecs-devops-task-definition", "taskRoleArn": "", "placementConstraints": [] }
В этом уроке мы узнали, как использовать инструмент преобразования контейнеров, чтобы преобразовать файл с композитом Docker в определение задачи AWS.
С нашим определением задачи мы теперь можем перейти к третьей части этого учебника, где мы будем использовать определение задачи для развертывания наших контейнеров в нашу стек CloudFormation, созданный в первой части, используя действия GitHub.
Тогда увидимся.
Разверните контейнерный Python для AWS, используя действия GitHub. (3 серии деталей)
Оригинал: “https://dev.to/espoir/converting-a-docker-compose-file-to-an-aws-task-definition-3poc”