Развертывание на AWS ECS стало еще удобнее благодаря действиям GitHub

Действия GitHub позволяют автоматизировать рабочие процессы от создания приложения до его развертывания и публикации сообщения на канале Slack вашего сообщества при повышении PR. Вы можете автоматизировать различные рабочие процессы, используя действия из их постоянно расширяющихся каталогов торговых площадок.

Одна из самых интересных особенностей действий GitHub - это CI / CD. Он поддерживает все языки и все основные платформы. Это означает, что вы можете запускать тесты и сборки во всех поддерживаемых операционных системах (Linux, Windows и macOS) - и это тоже параллельно. И все это по нулевой цене, по крайней мере, для проектов с открытым исходным кодом. Хватит разговоров, перейдем к делу.

Все, что вам нужно для выполнения этого руководства, - это учетная запись AWS и проект Spring Boot, размещенный на Github.

Следующие моменты будут рассмотрены в рамках этого руководства. Не стесняйтесь пропустить первые два, если ваша инфраструктура ECS уже настроена:

  • Настроить репозиторий в AWS ECR
  • Настроить кластер, сервис и задачу в AWS ECS
  • Настройте рабочий процесс развертывания AWS ECS с помощью действий GitHub

Настройка репозитория в AWS ECR

Создать репозиторий в репозитории AWS Elastic довольно просто.

Шаг 1. Перейдите на страницу AWS ECR Service и нажмите Create Repository.

Шаг 2. Дайте имя по вашему выбору и нажмите "Создать репозиторий".

Выполнено.

Но для загрузки изображения в ECR вам также понадобится роль IAM. Шаги по его созданию следующие:

Шаг 1. Перейдите в AWS IAM Service и нажмите Добавить пользователя.

Шаг 2. На странице добавления пользователя укажите любое имя пользователя и выберите «Программный доступ».

Шаг 3. На следующей странице вам нужно будет либо выбрать существующую группу, либо создать новую группу. Убедитесь, что у группы достаточно прав для выполнения всех действий. Если вы только новичок, начните с предоставления прав доступа администратора, а затем, когда вы лучше понимаете эти разрешения, вы можете настроить их соответствующим образом.

Шаг 4. На последней странице просмотрите свойства пользователя и нажмите "Создать пользователя". После этого вам будет представлен ключ доступа и секретный ключ. Обязательно сохраните их в безопасном месте на вашем компьютере, так как вы больше не сможете просмотреть секретный ключ.

Теперь вы готовы загрузить свое изображение на ECR. Чтобы это работало, убедитесь, что на вашем компьютере запущен Docker и у вас есть образ приложения Spring Boot в реестре Docker. Кроме того, вы не можете напрямую отправить образ в реестр Elastic. Вам нужно будет сначала аутентифицировать свой клиент Docker с помощью эластичного реестра.

Шаг 1. (Только для Windows) Сначала вам нужно будет установить инструменты AWS CLI на свой компьютер. Откройте Power Shell в режиме администратора и запустите Install-Module -name AWSPwerShell.NetCore.

Шаг 2. (Только для Windows) Затем выполните следующую команду, чтобы сохранить ключ доступа и секретный ключ на вашем компьютере.

Set-AWSCredential -AccessKey ACCESS_KEY -SecretKey SECRET_KEY -StoreAs STORE_NAME

Шаг 3. (Только для Windows) Затем выполните следующую команду, чтобы установить регион по умолчанию Set-DefaultAWSRegion -Region ap-south-1. Замените ap-south-1 регионом по умолчанию.

Шаг 4. (Только для Windows). Теперь выполните следующую команду, чтобы получить токен аутентификации и аутентифицировать ваш клиент Docker.

(Get-ECRLoginCommand).Password | docker login --username AWS --password-stdin YOUR_REPOSITORY_URL

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

Если вы получили сообщение «Вход выполнен успешно», все готово. Здесь вы можете заметить, что я использовал Set-AWSCredential -ProfileName Ecrmark вместо команды на шаге 2, причина в том, что после того, как вы настроили свой профиль, вам нужно будет вспомнить только в следующий раз.

Шаг 5. Наконец, выполните следующие две команды по порядку.

ps> docker tag learn:latest 497654570788.dkr.ecr.ap-south-1.amazonaws.com/learn:latest
ps> docker push 497654570788.dkr.ecr.ap-south-1.amazonaws.com/learn:latest

Здесь learn:latest - это имя моего изображения с тегом, а следующий за ним URL-адрес - это URL-адрес эластичного репозитория. Теперь перейдите в свой ECR, и вы найдете загруженное там изображение. Кстати, вы можете получить все вышеперечисленные команды для своего репозитория, нажав кнопку «Просмотреть push-команды» на странице репозитория.

Настройка кластера, сервиса и задачи в AWS ECS

AWS ECS - это сервис оркестрации контейнеров. Он позволяет легко размещать, управлять и масштабировать ваши контейнеры. Начнем с создания кластера.

Шаг 1. Перейдите на страницу службы ECS и нажмите «Создать новый кластер».

Вам нужно будет выбрать один из этих трех вариантов. Мы будем использовать опцию EC2 Linux + Networking. Если вы хотите подробно узнать, что означают эти параметры, перейдите на страницу AWS Elastic Container Service.

Шаг 2. На следующей странице дайте кластеру название по своему вкусу и выберите тип инстанса EC2. Если вы используете Free Tier, используйте t2.micro; в противном случае вы можете выбрать любой. Заполните остальные данные и, наконец, нажмите «Создать».

Выполнено!

Далее мы создадим определение задачи, которое будем использовать в нашем сервисе.

Шаг 1. Нажмите "Определение задачи" на левой панели навигации.

Шаг 2. Выберите совместимость запуска EC2.

Шаг 3. Введите необходимые данные. Некоторые важные моменты, о которых следует помнить:

  • Обязательно выберите сетевой режим «Мост», если вы хотите использовать другой хост и порт контейнера.
  • Убедитесь, что для вашей задачи достаточно памяти и ЦП. В случае EC2 это необязательно, но если вы все же решите установить эти значения, помните о максимальном количестве ЦП и памяти вашего экземпляра EC2.

Шаг 4. Перейдите в раздел "Добавить контейнер". Вставьте URI своего последнего изображения из AWS ECR, установите лимит памяти и выполните сопоставление портов хоста. Кроме того, не забудьте включить ведение журнала, если вы хотите проверять журналы в своей службе.

Выполнено!

Наконец, мы создадим сервис для запуска нашей задачи.

Шаг 1. Вернитесь в кластер ›Перейдите на вкладку Services› Нажмите Create.

Шаг 2. Выберите тип запуска EC2. Выберите определение задачи с последней версией, выберите кластер и введите количество экземпляров задачи, которые вы хотите запустить. Вы можете оставить минимальный процент здоровых и максимальный процент как есть или изменить их, как я сделал здесь. Причина, по которой я выбрал 0 и 100, заключается в том, что при развертывании обновленной задачи сначала будет завершена старая задача, а затем будет размещена только новая задача.

Шаг 3. Заполните данные на оставшейся странице. Наконец, просмотрите свои конфигурации на последней странице. После этого нажмите Create Service.

Ваша служба будет создана, а ваше приложение будет размещено на общедоступном IP-адресе, который вы можете получить, щелкнув текущую задачу на вкладке «Задачи».

Ваше приложение должно работать нормально, если ваша база данных - это H2 или указывает на любую общедоступную базу данных. Если это не так, возможно, вам также потребуется разместить базу данных. Это довольно просто с сервисом AWS RDS.

Шаг 1. Просто перейдите на страницу службы RDS ›Нажмите" Создать базу данных ".

Шаг 2. Выберите свою базу данных и заполните остальные данные. Обязательно сделайте доступность общедоступной, чтобы вы также могли подключиться к ней с локального компьютера. Кроме того, не забудьте добавить правило для входящего трафика с IP-адресом вашего компьютера.

Для большей безопасности вы можете хранить учетные данные своей базы данных в AWS Secrets Manager.

Это шаги по быстрой настройке вашей инфраструктуры в AWS. Теперь вы можете перейти к настройке конвейера CI / CD с помощью действий GitHub.

Настройка рабочего процесса развертывания AWS ECS с помощью действий GitHub

Это последняя и, наверное, самая простая часть. Чтобы это сработало, вам нужно кое-что поставить на свои места. Начнем с самого простого.

Шаг 1. Добавьте ключ доступа и секретный ключ пользователей IAM в секреты репозитория GitHub. Вы найдете страницу секретов во вкладке настроек.

Шаг 2. Убедитесь, что в вашем репозитории зафиксированы файлы JSON с определениями Docker и задач. Чтобы получить определение задачи в формате JSON, просто перейдите на страницу определения задачи. Вы найдете там JSON на вкладке JSON. Скопируйте и зафиксируйте то же самое в своем репозитории. Вот мои файлы JSON для Docker и определения задач для вашей справки.

Когда вы закончите с этим, останется только настроить рабочий процесс AWS ECS из GitHub Actions.

Шаг 1. Перейдите на вкладку Действия в вашем репозитории. Там вы найдете кнопку «Новый рабочий процесс». Нажмите здесь.

Шаг 2. В разделе непрерывной интеграции вы найдете действие «Развернуть на AWS ECS». Нажмите «Настроить этот рабочий процесс». Вы будете перенаправлены в редактор, где сможете заполнить необходимые данные в вашем aws.ymlworkflow файле.

Шаг 3. В aws.yml вы найдете набор инструкций вверху. Как видите, мы уже создали репозиторий ECR, определение задачи ECS, кластер и службу. Следуйте инструкциям и замените заполнители фактическими именами вашего репозитория, кластера и службы.

Шаг 4. В шаблоне отсутствует важное действие: создание приложения. Вам нужно будет вручную добавить это в свой рабочий процесс. Вы можете проверить мой aws.yml файл, где в строке номер 43 я добавил команду Maven для создания приложения.

Шаг 5. Зафиксируйте файл. Вы найдете свой рабочий процесс на вкладке «Действия».

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

on:  
  release:    
    types: [published] <-- In template it's created

Рабочий процесс может запускаться множеством событий. Вы можете найти полный список событий здесь. Я решил запускать свою сборку по событию выпуска, в частности, когда выпуск публикуется, чтобы рабочий процесс AWS ECS запускался, когда я публикую выпуск в моем репозитории. Вы можете использовать это событие или любое другое по вашему выбору. Кстати, вы также можете запускать рабочий процесс по нескольким событиям.

Второе изменение - в команде Docker.

docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG --build-arg ACCESS_ARG=${{ secrets.AWS_ACCESS_KEY_ID }} --build-arg SECRET_ARG=${{ secrets.AWS_SECRET_ACCESS_KEY }} .

У команды в шаблоне нет аргументов сборки. Как вы можете видеть здесь, я передал свой ключ доступа и секретный ключ в качестве аргумента сборки. Затем значения этих аргументов передаются в переменные среды в файле Docker. Проверьте файл Docker выше. Вы спросите, для чего это нужно? Ответ - защитить мои учетные данные базы данных AWS RDS. Позвольте мне объяснить, как это сделать.

Чтобы подключить наше приложение Spring Boot к базе данных, нам необходимо указать строку подключения, имя пользователя и пароль нашей базы данных в файле свойств. Это нормально, когда мы работаем на нашей локальной машине или в среде разработки. Но вы, возможно, не захотите раскрывать всем свои учетные данные производственной базы данных. Очевидно, вы не можете указать то же самое в свойствах своего проекта.

Теперь есть несколько способов решить эту проблему. Тот, который я выбрал, предполагает использование AWS Secrets и библиотеки AWS под названием aws-secretsmanager-jdbc. Это оболочка над драйверами базы данных. Он извлекает для вас учетные данные базы данных из AWS Secrets. Чтобы это сработало, сначала вам нужно добавить его зависимость Maven в ваш pom файл.

<dependency>
    <groupId>com.amazonaws.secretsmanager</groupId>
    <artifactId>aws-secretsmanager-jdbc</artifactId>
    <version>1.0.5</version>
</dependency>

Затем вам необходимо обновить файл свойств до следующего:

Как видите, вместо драйвера Postgres я использовал его оболочку AWS JDBC. Кроме того, вместо имени пользователя я упомянул свое имя AWS Secret. Также для работы требуются ключ доступа, секретный ключ и регион. Вы можете установить те же значения в переменных среды вашей системы.

Отсюда и наличие переменной окружения в файле Docker.

Ух! Мы сделали. Единственный оставшийся шаг - запустить рабочий процесс. Выполните событие, которое вы упомянули в своем файле YML. Это запустит рабочий процесс, и, если все пойдет хорошо, вы увидите все зеленые галочки на странице сведений о рабочем процессе.

Поздравляем с первым рабочим процессом на GitHub! Вы также можете проверить мой проект, если считаете, что я пропустил какую-либо конфигурацию. Спасибо за прочтение.

использованная литература