Elastic Beanstalkを使ってAWSにWeb アプリをデプロイしよう

スケーラブルなインフラを構築できる AWS を使って Web アプリケーションを公開したい人向けに、 Elastic Beanstalk を使った Web アプリのデプロイ方法を解説します。
今回は、Django のアプリケーションを対象にデプロイしていきます。

Elastic Beanstalk とは

端的に言うと、AWS がオススメするサーバインフラを簡単に構築できるのサービスです。
コマンドラインやマネジメントコンソールから、 サーバの設定を行うことができ、サーバ自体に ssh でログインしてミドルウェアの設定をすることも不要となります。(ssh でログインすることもできます)
ユーザは、Elastic Beanstalk の作法に従ってソースコードをアップロードするだけで、デプロイが可能です。似たようなサービスとしては、Heroku があります。

以下のような開発言語(プラットフォーム)に対応しています。

  • Node.js
  • PHP
  • Python
  • Ruby
  • Tomcat (Java)
  • IIS (.NET)
  • Docker

参考

ハンズオン環境環境の構築

ハンズオンでは Python 製の cli ツールを使うので、Python をインストールしておきます。
pip も使えるようにしましょう。

AWS CLI のインストール

AWS の操作をコマンドラインから行えるように AWS CLI をインストールします。

インストールできているか確認します。

AWS CLI のセットアップ

AWS の IAM の Users 画面を開き、Create New Users からユーザを作っていきます。
取得した Credential を AWS CLI に設定します。

参考

セットアップが完了すると ~/.aws/config~/.aws/credentials が作成されます。

Elastic Beanstalk コマンドラインインターフェイス(EB CLI)のインストール

Elastic Beanstalk 用の CLI があるので、インストールします。

インストールできているか確認します。

デプロイしてみよう

デプロイする Web アプリの確認

今回は、Python で実装された Web アプリケーションフレームワーク「Django」のサンプルアプリを AWS 上にデプロイしています。

まずは、サンプルアプリをローカル環境で動かしています。

django アプリの起動

Docker で実行できるようにしているので、実行しています。

http://localhost:8000/ にアクセスして確認します。

参考

とりあえずデプロイしてみる

さっそくですが、このサンプルアプリをデプロイしてみましょう。

eb init コマンドで EB CLI リポジトリを初期化します。

キーペアの設定

環境を構築する前にサーバに ssh できるようにキーペアを事前に登録します。
自分の SSH 公開鍵をインポートするか、新たにキーペアを作成します。

参考

config.yml の設定を修正

default_region に「ap-northeast-1」を、default_ec2_keyname に作成したキーペア名を設定します。

環境の構築

5 分くらい時間がかかります。

構築した環境のステータスを確認します。

CNAME: django-env.pztawke5hi.ap-northeast-1.elasticbeanstalk.com を composeexample/settings.py に追加します。

変更を加えたファイルをgit addします。
デフォルトで git との連携が有効なので、commit されたファイルのみがデプロイ対象になります。
オプションで git のステージン上グのファイルのデプロイも可能なので、今回はステージングに追加してデプロイを行っていきます 。

ちなみに、git との連携で開発・ステージング・本番環境を eb コマンドで切り分けて構築することも可能です。

参考

デプロイされたアプリが開きます。

管理(admin)サイトをデプロイする

Django の管理(admin)サイトをデプロイしてみます。
コンテナを立ち上げ、docker の中に入ります。

マイグレーションを実行します。

スーパーユーザーを作成します。

静的コンテンツを書き出して、デプロイに含めるようにします。

上記の操作で変更を加えたファイルや新たに追加したファイルをgit addします。

ステージングをデプロイします。

ssh でログインしてみる

構築した環境は Linux サーパなので、ssh で入ることもできます。
eb ssh で入れます。 キーペアは~/.ssh/ 以下に置く必要があるので注意してください。

ssh でログインできました。

RDS の設定

ここまでは、データベースは Django 標準の SQlite3 を使ってきました。
本番運用では、MySQL や PostgreSQL などの RDBMS を使う方が良いので、データベースを切り替えてみます。
またデータベースは、アプリケーションサーバ上にインストールするのではなく、AWS のマネージドリレーショナルデータベースサービスである RDS(今回は、PostgreSQL) を使用してみます。

データベースを作成します。

composeexample/settings.py を環境変数を読むように修正します。

環境変数を設定します。

ステージングをデプロイします。

SSH でログインします。

仮想環境を有効化し、マイグレーションを実行します。

デプロイされたアプリを開きます。

環境の削除

 最後に、作成した環境を削除します。

お疲れ様でした!

参考