Zappa で Django をデプロイする

AWS運用自動化サービス「Cloud Automator」



はじめに

Python の Web フレームワークである Django を AWS に Zappa を用いてデプロイします。
今回は Amazon Linux 2 上で Guide to using Django with Zappa に沿って進めてみます。

Django とは

Django とは、 Python 用の Web フレームワークの中で最も人気のあるフレームワークの 1 つです。
Flask と違い、Django は Web アプリケーションの実装に必要となると予測される多くの機能の提供してくれるフルスタックフレームワークです。

環境のセットアップ

Setup your Environment – Guide to using Django with Zappa に従い、環境のセットアップを行います。
本ブログでは pyenvpyenv-virtualenv を使って仮想環境を用意します。
※ Zappa が Python の 3.7 系ではまだ利用できないため今回は 3.6 系で環境を作成します。

続いて、ディレクトリを作成し Django と Zappa をインストールします。

※もしインストール中に UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 2339: ordinal not in range(128) のエラーが発生した場合は、以下を実行後再度インストールを行ってください。

Django のセットアップ

Core Django Setup – Guide to using Django with Zappa に従い、 Django のセットアップを行います。

IAM 権限の設定

Minimum AWS policies for example. を参考に必要な権限を持った IAM Role をデプロイ用インスタンスにアタッチします。

Django プロジェクトの作成

デモ用 Django プロジェクト frankie を作成します。

実際に動かしてテストしてみましょう。
以下を実行して、ブラウザから http://[EC2 の IP アドレス]:8000 にアクセスしてください。

以下のような画面がでるはずです。

Django が持つセキュリティ機能によってアクセスが弾かれているので frankie/settings.pyALLOWED_HOSTS に EC2 の IP アドレスを追加して上げる必要があります。
詳しい内容は Security in Django | Django documentation | Django を見てみてください。

修正後にもう一度 runserver を実行しブラウザにアクセスすると以下画面が表示されるはずです。

Zappa のセットアップ

デフォルトのリージョンを指定していない場合は、先に以下を実行しデフォルトリージョンの設定を行ってください。

続いて以下に従い、 Zappa のセットアップを行います。

デプロイ

Zappa でデプロイしてみましょう。
自動的に Lambda 上で稼働する Django プロジェクトへ HTTP リクエストを送るための API Gateway を作成してくれます。

作成されたエンドポイント https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev へブラウザからアクセスしてみると、

前回同様アクセスできないので、 xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com を追加し再デプロイします。

修正後に内容を反映させるため update コマンドを実行します。

もう一度 https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev へアクセスすると以下画面が表示されるはずです。

この 404 レスポンスは Django アプリケーションが正しく動いていることを示しています。

静的ファイルのホスティング

Hosting Static Files – Guide to using Django with Zappa に従い、 Django で提供されている静的ファイルを S3 に配置しホスティングを行っていきます。

S3 のセットアップ

バケットの作成

今回は S3 に静的ファイルを配置しホスティングを行うため、ホスティング用のバケットを作成してください。
本ブログ上ではバケット名を zappa-static とします。

CORS の設定

Lambda から S3 のオブジェクトへクロスオリジンアクセスを可能にするために CORS の設定を行います。
バケットの設定から Permissions タブを選び、 CORS configuration ボタンをクリックし以下を入力します。
※今回はサンプルとしてシンプルな設定にしていますが、実際の本番環境等で利用する際はスコープを狭めるなど考慮が必要です。

パブリックアクセス設定の変更

バケットの設定から Permissions タブを選び、 Manage public access control lists の項目を以下のように False に変更します。

Django プロジェクトの設定

まず、静的ファイルを S3 とやり取りするために django-s3-storage をインストールします。

次に、 settings.pyDjango-S3-Storage を追加します。

更に末尾に Django-S3-Storage の設定を追加します。

静的ファイルを S3 へ配置します。

アクセスしてみる

早速アクセスしてみましょう!
ブラウザを開き、 https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/admin にアクセスしてみてください、以下が表示され S3 に配置した CSS ファイルが読み込まれています!

おわりに

今回はドキュメントに沿って、 Django を Zappa でデプロイする手順をまとめてみました。(まだまだやることはありますが…
手順は多いですが、これならサクサク作れそうですね!

AWS運用自動化サービス「Cloud Automator」