«Во имя милостивого и милосердного Аллаха»

AWS ECS Fargate предоставляет бессерверное решение для запуска контейнера докеров в среде AWS. В этом руководстве мы развернем наше приложение nodejs с помощью docker и ECS. Так что нашей архитектуре этого хотелось бы.

К концу этой демонстрации приведенная выше картина станет более ясной, если не считать части CICD, о которой я расскажу в другой статье. Итак, сначала необходимо установить и запустить docker и aws cli в вашей системе. Пожалуйста, убедитесь в этом, прежде чем двигаться дальше.

ECR:

ECR - это реестр, в котором вы сохраняете образы докеров в AWS. Итак, чтобы отправить образ вашего приложения в ECR, нам нужно создать внутри него репозиторий. Перейдите в консоль AWS ECR и нажмите Create.

Введите имя репозитория по вашему выбору. Следует помнить, что ARN вашего аккаунта AWS добавляется в начале по умолчанию. Наш локальный образ приложения будет иметь то же имя, чтобы отправить его в ECR, который будет следующим.

Dockerfile:

Чтобы создать докер-образ вашего приложения, внутри него должен быть файл докера. Создайте его в соответствии с вашей прикладной средой. Ниже приведен образец веб-приложения Nodejs с версией node 10.x.

Здесь следует отметить одну важную вещь: мы используем образ ubuntu из общедоступного реестра AWS вместо docker hub. Поскольку у docker hub есть ограничение на количество загрузок, которые вы можете сделать с него. Таким образом, после нескольких итераций вашей сборки будет выдана ошибка. Поэтому всегда используйте образ из общедоступного реестра AWS.

Также добавьте файл .dockerignore и добавьте в него «node_modules».

Затем создайте образ, используя команду ниже

docker build -t 764244323070.dkr.ecr.us-west-2.amazonaws.com/demo-app:1.

точка в конце приведенной выше команды означает, что наш файл dockerfile находится в том же каталоге, где выполняется команда, если ваш файл находится в другом каталоге, а затем укажите его путь вместо точки.

Обратите внимание, что у нашего изображения то же имя, что и у нашего репозитория в ECR.

Затем нам нужно отправить изображение в ECR, для этого сначала нам нужно войти в ECR с помощью AWS CLI. Убедитесь, что AWS CLI установлен и настроен с вашей учетной записью AWS. Выполните приведенную ниже команду, чтобы войти в ECR. Замените регион AWS и аккаунт ARN на свои.

aws ecr get-login-password - регион us-west-2 | docker login - имя пользователя AWS - пароль-stdin 764244323070.dkr.ecr.us-west-2.amazonaws.com

Вы увидите сообщение «Вход выполнен успешно» при успешном входе в систему. Теперь отправьте изображение в ECR с помощью команды:

docker push 764244323070.dkr.ecr.us-west-2.amazonaws.com/demo-app:1

Это займет некоторое время, в зависимости от размера изображения вашего приложения.

Балансировщик нагрузки:

Затем нам нужно создать балансировщик нагрузки, который будет управлять и направлять трафик в наши задачи службы ECS.

Ваш балансировщик нагрузки будет работать в общедоступных подсетях вашего VPC с подключенным интернет-шлюзом. В то время как задачи ECS будут выполняться в частных подсетях, обеспечивая доступ к балансировщику нагрузки.

Очень важно помнить, что общедоступные подсети балансировщика нагрузки и частные подсети задач ECS должны находиться в одних и тех же зонах доступности. В противном случае ваш балансировщик нагрузки не сможет получить доступ к задачам ECS, и ваши задачи будут останавливаться / запускаться постоянно.

В моем случае я выбрал публичные подсети us-west-2c и us-west-2d.

Обязательно выберите тип цели как IP. По умолчанию выбрана опция Instance, которая используется, когда балансировщик нагрузки используется с EC2.

Затем введите порт, на который балансировщик нагрузки должен направлять трафик. Это тот же порт, на котором работает ваше приложение.

Теперь здесь заключается в том, что путь проверки работоспособности балансировщика нагрузки по умолчанию - это root или '/', и если вы не обработали корневой маршрут в своем приложении, тогда проверки работоспособности балансировщика нагрузки завершатся ошибкой, что приведет к задачи ECS завершаются и запускаются снова и снова.

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

Затем нажмите на регистрацию целей и оставьте все как есть, нажмите «Далее», и ваш балансировщик нагрузки будет создан.

ECS

Теперь перейдем к настройке ECS. ECS состоит из четырех основных компонентов, как показано на рисунке ниже.

Определение контейнера: здесь мы указываем изображение, которое будет использоваться. Тот, который мы запихнули в ECR.

Определение задачи: задача - это не что иное, как работающий экземпляр вашего контейнера. В его определении мы указываем объем памяти и количество процессоров, выделяемых задаче.

Сервис: он служит средой для ваших задач, например vpc, подсетей, групп безопасности.

Кластер: это контейнер для ваших сервисов ECS, в одном кластере может быть несколько сервисов.

Определение задачи

Далее нам нужно настроить определение задачи. Перейдите на вкладку «Определения задач» и нажмите «Создать».

В качестве типа запуска выберите Fargate.

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

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

Нажмите кнопку обновления сбоку от раскрывающегося списка «Роль задачи» и выберите роль. Роль «Выполнение задачи» будет выбрана по умолчанию, оставьте как есть.

Далее вам нужно указать объем памяти и количество процессоров для вашей задачи. Сведите его к минимуму, так как мы добавим к нему автомасштабирование позже в этом руководстве. В нашем случае я установил 2 ГБ и 1 виртуальный ЦП. Обратите внимание, что с вас будет взиматься плата в соответствии с объемом памяти и количеством процессоров, которые вы предоставите для своей задачи.

Затем нажмите Добавить контейнер, здесь мы укажем URI нашего репозитория ECR, мягкое ограничение для нашего контейнера, которое должно напоминать память, которую вы ранее выделили для своей задачи. Добавьте порт в сопоставление портов, на котором ваше приложение работает и отображается в докере.

Нажмите «Добавить», затем нажмите «Далее», и определение вашей задачи готово. Теперь, когда наш контейнер и определение задачи готовы. Следующим шагом является настройка кластера и службы ECS, которые будут выполнять наши определенные задачи ECS.

Кластер

Перейдите в консоль AWS ECS и нажмите на создание кластера. Затем выберите шаблон «Только сеть», который предназначен для fargate.

Дайте имя по вашему выбору, но я предлагаю следовать шаблону, например, «appname-cluster». Нажмите на создать, и кластер готов.

ECS Service

Перейдите на вкладку кластеров, выберите вновь созданный кластер и на дополнительной вкладке «Службы» нажмите «Создать».

Выберите тип запуска как Fargate.

В раскрывающемся списке выберите определение задачи, которое вы создали ранее.

Выберите кластер.

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

Нажмите «Далее» и укажите VPC и подсети, помня о нижеследующем.

Очень важно помнить, что общедоступные подсети балансировщика нагрузки и частные подсети задач ECS должны находиться в одних и тех же зонах доступности. В противном случае ваш балансировщик нагрузки не сможет получить доступ к задачам ECS, и ваши задачи будут останавливаться / запускаться постоянно.

Выберите Auto-assign public ip Disabled, потому что мы получаем доступ к нашему приложению через балансировщик нагрузки.

Выберите балансировщик нагрузки из раскрывающегося списка, который вы создали в начале этого руководства.

Период проверки работоспособности установлен на 15 секунд, что означает, что во время холодного запуска вашего приложения проверки работоспособности балансировщика нагрузки будут игнорироваться, поскольку приложение не готово в это время. Это не позволяет подсистеме балансировки нагрузки остановить вашу задачу, обнаружив ее нездоровой, в то время как в это время ваше приложение фактически запускалось.

Нажмите кнопку «Добавить в балансировщик нагрузки». В раскрывающемся списке выберите порт прослушивателя 80 и целевую группу.

Щелкните «Следующий шаг», чтобы настроить автомасштабирование для этой службы. Укажите минимальное количество задач, которые вы хотите выполнять постоянно, например 1. Желаемое количество задач, которое также равно 1, и максимальное количество задач, которое на самом деле является пределом, до которого ваши задачи могут автоматически масштабироваться, например, 200.

Выберите «Step Scaling» в типе политики масштабирования.

Далее нам нужно настроить масштабирование и масштабирование в правилах. Дайте имя вашей политике и выберите «Создать новый сигнал тревоги». Укажите пороговые значения для обоих ваших сигналов тревоги. Например, для аварийного сигнала горизонтального масштабирования я установил порог средней загрузки ЦП, превышающий или равный 80% в последовательный период в 1 минуту.

Затем выберите действия, которые необходимо выполнить, в случае масштабного масштабирования - Добавить 1 задачу.

Аналогичным образом установите масштаб в политике.

Нажмите "Далее", и ваше приложение наконец развернуто на ECS.

Еще несколько вещей, которые нужно сделать, связанных с группами безопасности вашей службы ECS, балансировщиком нагрузки и RDS. Это позволяет подсистеме балансировки нагрузки получать доступ к задачам службы ECS и разрешать службе ECS доступ к RDS.

Сначала нам нужно отредактировать входящие правила для нашей группы безопасности службы ECS. Перейдите к нему и выберите его.

Добавьте правило для входящего трафика для группы безопасности вашего балансировщика нагрузки. Правила вашей группы безопасности будут выглядеть, как показано ниже.

Затем нам нужно отредактировать входящее правило нашей группы безопасности RDS, добавить правило, разрешающее группе безопасности службы ECS доступ к RDS.

Мы все уверены, что ваше приложение должно работать нормально. Введите DNS-имя вашего балансировщика нагрузки в браузере, и ваше приложение должно работать нормально.

Исправление проблем

Если ваша задача останавливается сама по себе, то, по моему опыту, для этого есть две основные причины.

1- Проверка работоспособности балансировщика нагрузки не выполняется из-за неверного пути или порта для проверки работоспособности. Это делает вашу цель нездоровой, и ваш планировщик балансировщика нагрузки завершает вашу задачу и запускает новую, и он будет продолжать делать, пока проверка работоспособности не будет успешной.

2- Ваша группа безопасности службы не позволяет подсистеме балансировки нагрузки получить к ней доступ. Для этого убедитесь, что вы добавили правило для балансировщика нагрузки в группу безопасности службы ECS. зайдите в сервисные журналы и проверьте наличие ошибок.

Для получения дополнительных сведений перейдите к журналам службы ECS, где можно найти журналы как для запущенных, так и для остановленных задач.

Конец:

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

Спасибо, мир!