Рубрики
Без рубрики

Django полный CI-C-CD поток к AWS с Действиями GitHub и S3

Это руководство охватывает все шаги, необходимые для настройки вашего рабочего процесса CI-C CD для проекта Django с Amazon … Помечено Django, AWS, DevOps, Python.

Это руководство охватывает все шаги, необходимые для настройки рабочего процесса CI-CD для проекта Django с Amazon Beanstalk и действиями GitHub под капотом.

Ссылка на пример проекта: https://github.com/vlntsolo/django-cicd

Ток

  1. AWS Beanstalk Среда
  2. Конфигурация S3
  3. IAM Доступ пользователя
  4. Настройки рабочего процесса Github
  5. Подготовка настроек Django
  6. Первый забег
  7. Составление команды 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”