В этом посте я расскажу о том, как развернуть приложение Django (но, например, легко воспроизвести на любую другую структуру Python, такую как Flask), в AWS сэкономил много денег (в зависимости от трафика вашего приложения и какие услуги вы услуги Предназначен для использования внутри AWS, Это может быть бесплатно … навсегда! )
И этот пост будет довольно длинным, извините за это!
В июле я закончил разработку моего образовательного проекта для детей, используя Django, и мой первый вопрос, когда я закончил, было то, как развернуть это приложение в облаке самым дешевым способом.
Моим первым вариантом был Heroku, потому что довольно легко развернуть и реализовать процесс непрерывного развертывания, используя их бесплатно, но если мне придется масштабировать свое приложение по любой причине, Heroku может стать намного дороже, поэтому я решил подумать лучше.
В этом процессе я нашел проект, который изменил правила игры в моем квесте. Проект Zappa , ниже описания проекта, взятого из них, читайте на GitHub:
Zappa делает очень легко создавать и развернуть приложения Python, управляемые сервером (включая веб-приложения WSGI) на WSGI Web Apps) на шлюзе AWS Lambda + API. Это означает Бесконечное масштабирование, нулевое время простоя, нулевое обслуживание – И за долю от стоимости вашего текущего развертывания!
Они выполняют, что, действительно, довольно легко развернуть приложение в AWS, самая сложная часть развертывания-это настроить роли и политики IAM внутри AWS (я думаю, что это самая сложная часть для любого развертывания там:-)). Итак, без лишних слов, позвольте мне показать вам, как мне удалось развернуть мое приложение Django с помощью Zappa.
PS: В результате этой статьи все глубже объясните, как работает службы AWS, я предполагаю, что у вас есть некоторые знания об этом, и я не буду использовать консоль для настройки сервисов AWS, я использую AWS CLI, поэтому Если вы также хотите его использовать, Проверьте здесь, как настроить CLI
PS 2: Настройка AWS CLI для использования некоторого пользователя с доступом к администратору, но никогда не используйте корневую учетную запись! И сохранить доступ к доступу и секретным ключам, например, используя диспетчер паролей
PS 3: Все команды и примеры были сделаны с использованием рабочей станции Linux
1. Создание требуемого ведра AWS S3
Zappa будет использовать ковш S3 для загрузки Lambda-совместимого архива, сгенерированного командой развертывания, которую я покажу дальше для создания ведра, используя CLI:
aws s3api create-bucket --bucket name_of_the_bucket --region region_of_your_choose --create-bucket-configuration LocationConstraint=region_of_your_choose
Параметр региона и LocationConstraint
Конфигурация требуется, если вы создадите ведро снаружи US-EAST-1
Регион, если вы выберете этот регион, вы можете удалить оба из команды.
Помните, что имена ведра уникальны во всем мире, поэтому, если вы получаете ошибку, такую как BucketalReadyExists
, вы должны выбрать новое имя.
Если все пойдет хорошо, вы должны получить этот возврат от команды:
{ "Location": "http://name_of_your_bucket.s3.amazonaws.com/" }
PS 4: Если ваше приложение использует SQLite в качестве базы данных, я рекомендую вам создать еще одно ведро для этого, и если ваше приложение использует статические и медиа -файлы, я также рекомендую вам создать еще одно ведро для этого, мы увидим, как им управлять Внутри AWS
2. Настройка необходимых политик IAM, ролей, группы и пользователей
Для лучшей безопасности (а также лучшей практики) нам нужно настроить некоторые объекты IAM, эксклюзивные для Zappa, чтобы ограничить, какие ресурсы AWS он будет иметь доступ.
2.1 Создание роли
Давайте начнем создавать роль, которая будет передана функции Lambda, которая будет создана Zappa в процессе развертывания.
Для создания роли, используя CLI, нам нужен файл JSON, который будет представлять, какие службы AWS будут разрешены звонить другим службам AWS в имени пользователя Zappa (документ «Политика поля»).
Создайте файл JSON в каком -то каталоге на вашем компьютере с помощью этого контента:
Итак, давайте вернемся к CLI для создания роли:
aws iam create-role --role-name my-role --assume-role-policy-document file:///tmp/zappa_assume_role.json
моя роль
может быть любое имя, которое вы хотите. Файл:///tmp/zappa_assume_role.json
Должен совпадать с пути файла, который вы создали ранее.
Это будет возврат, команды преуспели:
{ "Role": { "Path": "/", "RoleName": "my-role", "RoleId": "AROA3IDJ3HNEWIQZA5IQZ", "Arn": "arn:aws:iam::773316098889:role/my-role", "CreateDate": "2020-08-29T19:24:37Z", "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": [ "apigateway.amazonaws.com", "lambda.amazonaws.com", "events.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] } } }
Сохранить значение, возвращаемое Арн Поле в каком -то месте нам понадобится потом.
2.2 Прикрепление политики к роли
Теперь пришло время присоединиться к политике с ролью, которую мы создали ранее.
Политика AWS также может быть документом JSON, который представляет разрешения, которые будут предоставлены для использования услуг внутри AWS, для той роли, которую мы его прикрепим.
Для этого вам нужно создать файл JSON в каком -то каталоге на вашем компьютере с этим контентом:
Опять же, вернемся к CLI и выполним следующую команду:
aws iam put-role-policy --role-name my-role --policy-name my-policy --policy-document file:///tmp/zappa_policy.json
моя роль
должен соответствовать названию роли, которую мы создали ранее. моя политика
может быть любое имя, которое вы хотите. Файл:///tmp/zappa_policy.json
Должен совпадать с пути файла, который вы создали ранее.
Если команда преуспела, Ничего не будет возвращено
Но если вы хотите подтвердить, если все пойдет хорошо, вы можете запустить эту команду:
aws iam get-role-policy --role-name my-role --policy-name my-policy | head -3
Возврат должен быть:
{ "RoleName": "my-role", "PolicyName": "my-policy",
2.3 Создание группы
В последних 2 шагах мы определили роль и политику, которая будет передана функции Lambda, которая будет создана Zappa во время развертывания.
Теперь мы должны определить группу, пользователя и политики, которые позволят Zappa создать ресурсы внутри AWS (Ex.: Функция Lambda, создать шлюз API, хранить пакет в S3 и т. Д.).
Мы начнем создавать группу, выполнив следующую команду CLI:
aws iam create-group --group-name my-group
Это будет возврат, команды преуспели:
{ "Group": { "Path": "/", "GroupName": "my-group", "GroupId": "AGPA3IDJ3HNEYAXDIXQ5K", "Arn": "arn:aws:iam::773316098889:group/my-group", "CreateDate": "2020-08-29T20:30:14Z" } }
2.4 Прикрепление политики для общих разрешений Zappa к группе
Мы сделаем аналогичную работу, которую мы выполнили на шаге 2.2, но вместо этого создадим только один JSON, мы создадим два JSON, потому что мы должны прикрепить две политики для группы, одна политика для общих разрешений, а другая конкретная для S3 разрешения.
Давайте начнем с General One, создайте файл JSON в каком -то каталоге в вашем компьютере с этим контентом ниже, но на этот раз нам нужно сделать небольшое изменение в JSON, прежде чем использовать внутри CLI.
Найти full_arn_from_created_role
Внутри контента и заменить на Arn
из предыдущей созданной роли.
После этого давайте перейдем к CLI и запустим команду, которая прикрепит политику к группе:
aws iam put-group-policy --group-name my-group --policy-document file:///tmp/zappa_general_policy.json --policy-name my-general-policy
моя группа
Должен совпадать с названием группы, которую мы создали ранее. My General-Policy
Может быть любое имя, которое вы хотите, но не можете быть одинаковым из предыдущей политики, созданной на шаге 2.2. Файл:///tmp/zappa_general_policy.json
Должен совпадать с пути файла, который вы создали ранее.
Если команда преуспела, Ничего не будет возвращено
Но если вы хотите подтвердить, если все пойдет хорошо, вы можете запустить эту команду:
aws iam get-group-policy --group-name my-group --policy-name my-general-policy | head -3
Возврат должен быть:
{ "GroupName": "my-group", "PolicyName": "my-general-policy",
2.5 Прикрепление политики для конкретных разрешений на S3 Zappa к группе
Теперь мы прикрепим конкретную политику S3 к группе, мы повторим те же шаги предыдущего. Но содержание JSON, чтобы применить, будет другим, и мы снова должны сделать небольшое изменение в JSON, прежде чем использовать внутри CLI.
Найти full_arn_from_s3_bucket
Внутри контента и заменить на Arn
ведра S3, созданного на шаге 1.
Арн ведра S3 Следуйте этому шаблону: ARN: AWS: S3::: name_of_your_bucket
Если вы создали более одного ведра на шаге 1, вы также должны добавить ARN из них.
После этого давайте повторим те же команды с предыдущего шага:
aws iam put-group-policy --group-name my-group --policy-document file:///tmp/zappa_s3_policy.json --policy-name my-s3-policy
моя группа
Должен совпадать с названием группы, которую мы создали ранее. My-S3-Policy
Может быть любое имя, которое вы хотите, но не можете быть одинаковыми из предыдущих политик, созданных в шагах 2.2 и 2.4. Файл:///tmp/zappa_s3_policy.json
Должен совпадать с пути файла, который вы создали ранее.
Если команда преуспела, Ничего не будет возвращено
Но если вы хотите подтвердить, если все пойдет хорошо, вы можете запустить эту команду:
aws iam get-group-policy --group-name my-group --policy-name my-s3-policy | head -3
Возврат должен быть:
{ "GroupName": "my-group", "PolicyName": "my-s3-policy",
2.6 Создание пользователя, прикрепите его к группе и создайте секретный ключ
Наконец, мы должны создать пользователя, который будет использоваться эксклюзивным Zappa, прикрепить его к группе, созданной ранее и генерировать ключ доступа пользователя.
Начнем создавать пользователя:
aws iam create-user --user-name my-user
Возврат должен быть:
{ "User": { "UserName": "my-user", "Path": "/", "CreateDate": "2013-06-08T03:20:41.270Z", "UserId": "AIDAIOSFODNN7EXAMPLE", "Arn": "arn:aws:iam::123456789012:user/Bob" } }
Теперь мы прикрепим этого пользователя к группе:
aws iam add-user-to-group --user-name my-user --group-name my-group
Если команда преуспела, Ничего не будет возвращено
Но если вы хотите подтвердить, если все пойдет хорошо, вы можете запустить эту команду:
aws iam get-group --group-name my-group
Возврат должен быть:
{ "Users": [ { "Path": "/", "UserName": "my-user", "UserId": "AIDA3IDJ3HNEVBCYBTCVB", "Arn": "arn:aws:iam::773316098889:user/my-user", "CreateDate": "2020-08-29T21:55:40Z" } ], "Group": { "Path": "/", "GroupName": "my-group", "GroupId": "AGPA3IDJ3HNEYAXDIXQ5K", "Arn": "arn:aws:iam::773316098889:group/my-group", "CreateDate": "2020-08-29T20:30:14Z" } }
Теперь, наконец, давайте сгенерируем ключ доступа пользователя:
aws iam create-access-key --user-name my-user
Возврат должен быть:
{ "AccessKey": { "UserName": "my-user", "Status": "Active", "CreateDate": "2015-03-09T18:39:23.411Z", "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY", "AccessKeyId": "AKIAIOSFODNN7EXAMPLE" } }
Сохраните Secretaccesskey
и Accesskeyid
В безопасном месте (это лучшая практика, сделайте это), они нам понадобятся дальше.
3. Соображения перед установкой и настройкой Zappa
Есть две вещи, которые Zappa не поможет вам внутри AWS: как обрабатывать ваши статические и медиа -файлы и как подключиться к базе данных.
Итак, если вы хотите использовать AWS для этого, вам придется обработать это в вашем приложении Python.
В моем развертывании, чтобы все было просто, я выбрал SQLite в качестве базы данных и сохранял файл базы данных в ковше S3, а также выбрал «Статический и носитель» в другом ведре S3 (из -за этого я согрел вас, чтобы создать дополнительные ведра в шаг 1).
Другие параметры доступны, например, Aurora или RDS в качестве базы данных (но если вы их используете, вам нужно обновить политику IAM, которые мы создали ранее).
Чтобы настроить Django для использования S3 как для хранения базы данных SQLite, так и для хранения статических/медиа -файлов, нам необходимо установить два пакета Python, которые будут нести за это.
Не забудьте активировать свой VirtualENV, если вы используете это или используете пипенв
pip install django-s3-storage # Will handle the static/media files pip install django-s3-sqlite # Will handle the SQLite database
Пример того, как настроить django настройки.py
Для управления статическими/медиа -файлами и базой данных SQLite с использованием S3:
4. Установка и настройка Zappa
Теперь мы будем устанавливать и настроить Zappa, для установки мы будем использовать PIP.
Не забудьте активировать свой VirtualENV, если вы используете это или используете пипенв
pip install zappa
Для настройки Zappa вам нужно создать файл zappa_settings.json
Внутри корня вашего репозитория приложения Django (то же место Manage.py
), ниже примером:
Dev
это имя сцены, которое будет создано внутри шлюза API.
django_settings
должен быть name_of_your_django_project.settings
S3_Bucket
должно быть ведро, которое мы создали на шаге 1
Вы можете проверить Мой проект репо в GitHub за дополнительной информацией.
5. Развертывание приложения
Наконец, мы добрались до того, что важно:-)
Прежде чем запустить команду, чтобы наконец развернуть приложение внутри AWS, нам нужно определить AWS_ACCESS_KEY_ID
и AWS_SECRET_ACCESS_KEY
Переменные среды с ключом доступа и секретным ключом пользователя, который мы создали на шаге 2.6
Не забудьте активировать свой VirtualENV раньше, если вы используете это или если вы используете Pipenv, запустите Pipenv Shell до
export AWS_ACCESS_KEY_ID=access_key_of_the_user_created_before export AWS_SECRET_ACCESS_KEY=secret_key_of_the_user_created_before
Теперь мы можем запустить команду, чтобы в первый раз развернуть наше приложение:
zappa deploy dev
Dev
должно быть имя сцены, которое вы определили в zappa_settings.json
Если все идет хорошо, возвращение должно быть чем -то похожее на:
... Deploying API Gateway... Deployment complete!: https://wf31r9h75a.execute-api.us-west-2.amazonaws.com/dev
И вы можете использовать приведенный выше URL для проверки, если ваше приложение работает должным образом, если нет, вы можете использовать эту команду, чтобы проверить журналы и проверить, что произошло:
zappa tail dev
И чтобы сделать некоторое обновление в вашем приложении, вам не нужно снова запустить команду Deploy, просто запустите:
zappa update dev
Итак, это все люди, ниже я оставляю некоторые ссылки с дополнительной информацией:
Развертывание приложения для флезы
Развертывание с использованием пользовательского домена и Сертификат SSL
Развертывание с использованием Aurora в качестве базы данных
Большое спасибо за терпение! И хорошего дня!
Оригинал: “https://dev.to/ozorest/the-poor-man-s-guide-to-django-deployment-in-the-aws-42bd”