Это руководство охватывает все шаги, необходимые для настройки рабочего процесса CI-CD для проекта Django с Amazon Beanstalk и действиями GitHub под капотом.
Ссылка на пример проекта: https://github.com/vlntsolo/django-cicd
Ток
- AWS Beanstalk Среда
- Конфигурация S3
- IAM Доступ пользователя
- Настройки рабочего процесса Github
- Подготовка настроек Django
- Первый забег
- Составление команды postdeploy (крючки)
Прежде чем начать, что такое поток CI-CD в первую очередь?
Несмотря на то, что код Django не требует какого-либо шага сборки по сравнению с составленными приложениями, вы можете обнаружить его довольно расстраивающим, чтобы повторить ручную перезагрузку каждый раз, когда вам нужно развернуть новую функцию или исправить ошибку. Из-за этого было изобретено CI-CD (непрерывная интеграция и непрерывная доставка) рабочих процессов.
Рабочие процессы или трубопроводы CI-CD позволяют нам безопасно создавать, тестировать и развертывать веб-приложения в относительно коротком периоде времени (обычно, в считанные минуты). Так как насчет Джанго? Если у вас есть кодовая база приложения Python, размещена на GitHub, было бы удобно установить его в среду хостинга сразу после обновления репозитория. И это именно то, что мы собираемся сделать использование действий GitHub, которое публично доступно бесплатно с конца 2019 года.
Давайте погрузимся в!
1. AWS Beanstalk Среда
Прежде чем мы начнем настроить все, мы должны быть уверены, что у нас есть окружающая среда, тепло и готова.
Если у вас уже есть учетная запись AWS, перейдите к консоли и найдите Beebstalk. Если нет, Создать один здесь Отказ Вам будет предложено добавить информацию счетов для продолжения.
В панели инструментов Beanstalk убедитесь, что вы выбрали наиболее подходящий регион (где сервисы будут развертываться) в правом верхнем углу. Проверьте [Среды] и выберите [Создать новую среду]. Затем на странице диалога выберите [Web Server Environment].
Заполните детали и сосредоточиться на разделе платформы. Здесь нам нужно выбрать Python Platform (последнюю версию) и последнюю доступную Amazon Linux 2.
Оставьте приложение образца и нажмите [Создать среду] Отказ Через несколько мгновений вы сможете открыть адрес URL окружающей среды и увидеть образец.
Скопируйте имя приложения и среды, отображаемую в верхнем левом углу, если вы открываете страницу среды.
Последнее, что нужно сделать здесь – настроить базу данных для Django.
Перейти к [Конфигурация] → [База данных] и выберите предпочтительные опции:
Это этот пример я выбрал PostgreSQL с этого моего обычного выбора, но вы можете придерживаться MySQL или даже Oracle, если хотите.
! Оповещение: Сервер базы данных создан таким образом, подходит только для целей тестирования. Это будет строго прикреплено к окружающей среде. База данных будет удалена, если вы удалите или воссоздаете среду Beanstalk. В производстве вы должны использовать RDS или ARORA, автономные серверы внутри вашего VPC Отказ
Теперь, когда у нас есть управляемая среда Python и база данных, нам нужно подготовить хранилище файлов для наших будущих сборных приложений.
2. Конфигурация S3 🪣.
Нам нужно настроить пользовательское ведро S3 в качестве временного хранения для наших сборки до того, как они будут толкаться в Beanstalk.
Поиск S3 в консоли AWS или переключите его в меню. Затем выберите [Создать ведро] Отказ Введите уникальное имя и выберите свой регион.
Оставьте флажок на «Блокировать весь публичный доступ» и продолжить [Применить] Отказ
Следующее, что нам нужно сделать, это генерировать программные учетные данные доступа, которые будут использоваться действием GitHub для развертывания нашего приложения Django.
3. IAM Доступ пользователя 🔐
Поиск пользователей IAM в консоли AWS и выберите [Добавить пользователя] Отказ
На странице разрешений выберите [Прикрепить существующую политику непосредственно]. Поиск s3fullaccess * и выберите флажок. Повторите те же шаги для АдминистраторCcess-awselazerBeanstalk * И ударил [Добавить пользователя] Отказ
Наконец, копировать идентификатор ключа доступа и секрет с последнего шага. Обязательно сохраните эту информацию где-то в безопасности, так как пользовательский секрет будет показан только один раз.
Похоже, мы закончили с AWS и готовы продолжить GitHub!
4. Настройки рабочего процесса GitHub 🔡
Вернитесь к вашему проекту Django и создайте папку под названием ..github.
. И еще одна папка внутри него называется рабочие процессы. Действия GitHub Config должны быть размещены внутрь и отформатированы с синтаксисом YAML. Смотрите мой пример ниже:
#Location: .github/workflows/custom_config.yml name: CI-CD pipeline to AWS env: EB_S3_BUCKET_NAME: "YOUR BUCKET NAME FROM Step 2" EB_APPLICATION_NAME: "YOUR APP NAME FROM Step 1" EB_ENVIRONMENT_NAME: "YOUR ENVIRONMENT NAME FROM Step 1" DEPLOY_PACKAGE_NAME: "django-app-${{ github.sha }}.zip" AWS_REGION_NAME: "YOUR AWS REGION ("us-east-1"/"eu-central-1" etc.)" on: push: branches: - master #Use your own branch here (Might be staging or testing) jobs: build: runs-on: ubuntu-latest steps: - name: Git clone on our repo uses: actions/checkout@v2 - name: Create zip deployment package run: zip -r ${{ env.DEPLOY_PACKAGE_NAME }} ./ -x *.git* - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v1 with: aws-access-key-id: ${{ secrets.aws_access_key_id }} aws-secret-access-key: ${{ secrets.aws_secret_access_key }} aws-region: ${{ env.AWS_REGION_NAME }} - name: Copying file to S3 run: aws s3 cp ${{ env.DEPLOY_PACKAGE_NAME }} s3://${{ env.EB_S3_BUCKET_NAME }}/ - name: Print nice message on success finish run: echo "CI part finished successfuly" deploy: runs-on: ubuntu-latest needs: [build] steps: - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v1 with: aws-access-key-id: ${{ secrets.aws_access_key_id }} aws-secret-access-key: ${{ secrets.aws_secret_access_key }} aws-region: ${{ env.AWS_REGION_NAME }} - name: Create new EBL app ver run: | aws elasticbeanstalk create-application-version \ --application-name ${{ env.EB_APPLICATION_NAME }} \ --source-bundle S3Bucket="${{ env.EB_S3_BUCKET_NAME }}",S3Key="${{ env.DEPLOY_PACKAGE_NAME }}" \ --version-label "${{ github.sha }}" - name: Deploy new app run: aws elasticbeanstalk update-environment --environment-name ${{ env.EB_ENVIRONMENT_NAME }} --version-label "${{ github.sha }}" - name: Print nice message on success finish run: echo "CD part finished successfuly"
Давайте пройдем по поверхности блоков конфигурации и проверьте их цели. Более подробную информацию можно найти здесь.
1) [env] Блок служит списком ярлыков для переменных внутри конфига. Мы определяем наши нечувствительные данные здесь.
2) [Работа] Блок определяет, что на самом деле будет сделано.
3) [построить] Блок – это просто имя работы и включает в себя список «шагов» для выполнения в нашем процессе здания. Для чистого приложения Django это означает, что только заставляет рабочее каталог и нажатие в ведро S3.
4) [Шаги] Блокировка списков имен и фактические команды для выполнения на виртуальной машине.
Вы можете легко добавить другое имя задания, называемое тестированием и запуском ./Manage.py Test Step в нем.
5) [НУЖНО] Блок является обязательным условием для дальнейшего выполнения. В нашем случае мы уверены, что наша передача файлов была успешно завершена, прежде чем отправлять команды на Beanstalk.
6) [на] Блок указывает событие триггера, как и наш «толчок», а также целевой ветвь.
Если вы придумаете несколько сред Beebstalk (QA, тестирование, постановку, производство и т. Д.), Вам нужно для них установить новые файлы config.yml и изменять env vars и ветви соответственно.
Вы также можете заметить, что мы не определяли secrets.aws_access_key_id
или secrets.aws_secret_access_key
пока что. 🧊 Давайте исправить это!
Откройте Github Repo или создайте один для своего проекта и перейдите в [Настройки] → [Секреты] → [Секрет нового репозитория] Отказ Вставьте свой ключ пользователя IAM и секрет там, как это:
Повторите тот же шаг для aws_secret_access_key. и
Это ценность. Вот и все!
5. Подготовка настроек Django 📦
Помните, что мы подключили реляционную базу данных к нашей среде Beanstalk на шаге 1? Но где параметры подключения и пользовательские учетные данные DB?
Со встроенной базой данных Beanstalk обнаруживает переменные ENV, которые могут быть использованы сразу:
# main_django_app settings.py import os ALLOWED_HOSTS = ['YOUR_ENVIRONMENT_HOST'] DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': os.environ['RDS_DB_NAME'], 'USER': os.environ['RDS_USERNAME'], 'PASSWORD': os.environ['RDS_PASSWORD'], 'HOST': os.environ['RDS_HOSTNAME'], 'PORT': os.environ['RDS_PORT'], } } # rest of the settings
Не забудьте добавить свою среду URL-адрес и основной домен для разрешенного списка хостов.
На данный момент нам необходимо убедиться, что платформа Beanstalk Python будет готова установить соединение с PostgreSQL. Давайте скажем, чтобы это установить некоторые дополнения для нас.
Создайте папку в вашем Корень проекта называется .ebextensions
и поместите там файл 01_packages.config.
:
packages: yum: amazon-linux-extras: [] commands: 01_postgres_activate: command: sudo amazon-linux-extras enable postgresql10 02_postgres_install: command: sudo yum install -y postgresql-devel
Теперь нам нужно добавить django config для информирования сервера wsgi beanstalk о нашем основном приложении и настройках. Создайте другой файл внутри .ebextensions
Папка называется django.config
:
option_settings: aws:elasticbeanstalk:container:python: WSGIPath: main_django_app.wsgi:application aws:elasticbeanstalk:application:environment: DJANGO_SETTINGS_MODULE: main_django_app.settings "PYTHONPATH": "/var/app/current:$PYTHONPATH" aws:elasticbeanstalk:environment:proxy:staticfiles: /static: static
Изменить main_django_app Ваше имя приложения Django.
Последний ряд AWS: ELASICBEANSTALK: Окружающая среда: Proxy: StaticFiles0:
Сообщает, какую папку служить через обратный прокси, и какой относительный URL для использования.
Наконец, заморозить местную среду Python с PIP Freeze> требования .txt
(Это будет основной источник для Beanstalk для настройки среды EC2).
6. Первый запуск 🔥.
Нажмите любые изменения в указанную табличку и посетите вкладку Действия. Если ваши действия успешно завершены, вы увидите зеленую марку. Если что-то пошло не так, откройте журналы и разрешите ошибки внутри.
Получил ошибки после успешного GitHub Действия? Посетите эластичную среду Beanstalk и проверьте журналы.
Надеюсь, вы увидите что-то вроде этого:
7. Составление команды postdeploy (крючки) 🔌
Есть еще несколько команд, которые должны быть выполнены после развертывания.
1) Нам нужно перенести наши изменения в базу данных Beanstalk (файлы миграции, созданные командой Makemigrations, должны быть частью вашей кодовой базы).
2) Нам нужно собирать статические файлы (не нужно держать ваши статические файлы в кодовой базе).
Эта проблема может быть решена с Beanstalk Postdeploy крючками. Имена файлов могут быть полностью настраиваемыми, но расширение файла важно. Все файлы .sh будут выполнены в буквенно-цифре.
В вашем корне проекта создайте папку .platform
со следующей структурой:
.platform/ └───hooks/ └───postdeploy/ -01_django.sh
#!/bin/bash source /var/app/venv/*/bin/activate && { # collecting static files python manage.py collectstatic --noinput; # log which migrations have already been applied python manage.py showmigrations; # migrate the rest python manage.py migrate --noinput; # another command to create a superuser (write your own) }
У тебя есть идея! Теперь вы можете понять, как создать учетную запись Superuser.
⚠️ Важные примечания:
– Review IAM Политика доступа пользователей Отказ Для учебной цели я предоставил полный доступ к S3 и Beanstalk. Убедитесь, что вы предоставляете только необходимые разрешения для клиента Действия GitHub, чтобы предотвратить неприятные последствия в случае утечки секретного ключа.
– Добавить правила жизненного цикла К ведрам S3 и прикладных версиях хранения. По умолчанию S3 не удаляет версии приложений или любые другие файлы из ведра. Используйте правила жизненного цикла в S3 и Beanstalk, чтобы сохранить только необходимые версии приложений.
– Система проверки здоровья AWS Beanstalk может не работать должным образом (серьезный статус здоровья) из-за ограничения Django Burfion_Hosts в заголовках. Я не знаю правильного способа обработки этой проблемы (вы можете либо игнорировать предупреждения о состоянии, либо установить Prowner_Hosts = ['*']
на свой страх и риск).
– Если вы собираетесь использовать PostgreSQL, не забудьте установить пакет с помощью PIP Установите PSYCOPG2-BINARY
и заморозить требования. atxt.
Полезные ссылки:
Как разделить настройки Django для разных условий Как настроить Django Q с руководителем на AL2 Beanstalk Развертывание приложения Django для эластичного Beanstalk Синтаксис рабочего процесса для действий GitHub
Надеюсь, вам понравилось после этого руководства. Будьте настроенными и в следующий раз, когда я смогу настроить, как настроить Pull-Stack Django на основе проекта на основе Django с действительно бесшовным опытом Dev.
Эта статья была первоначально опубликована В моем блоге пост Отказ
Оригинал: “https://dev.to/vlntsolo/django-full-ci-cd-flow-to-aws-with-github-actions-and-s3-2enp”