AWS Beanstalk(Multi-Container Docker)をPythonで試してみた ！ Web編その１ / 初期設定

かなりご無沙汰です。

BeanstalkのMulti-Container DockerをPython Flaskを使って試してみたので

備忘録もかねての投稿になります。

※備忘録なのでメモレベルの記事なのはご容赦を。

## 連載一覧

- [その1 / 初期設定](https://qiita.com/i_matsui/items/63d9268531f97e348647)
- [その2 / 環境設定](https://qiita.com/i_matsui/items/f2c61015228303df9540)
- [その3 / Dockerrun.aws.json](https://qiita.com/i_matsui/items/042ef74d3f8cb6614d5d)
- [その4 / python-uwsgi環境作成](https://qiita.com/i_matsui/items/b6cee261d1c77d7064ae)
- [その5 / ebextensions](https://qiita.com/i_matsui/items/402808f11ce345b74999)

## Beanstalkとは

BenastalkはAWSのサービスを利用した

Webアプリケーションやバッチアプリケーションの環境を手軽に作ってくれるサービスです。

通常、AWSを利用してアプリケーションを構築する場合は

EC2インスタンスを立て、ミドルウェアやプログラム一式をセットアップし、

ロードバランサー(ELB/ALB)を立てEC2に紐付けを行い、

負荷に応じて自動的にインスタンスを増減する設定を行う・・・など

たくさんの工程が必要になります。

Beanstalkではこれらを手軽にセットアップすることができます。

また、JavaのアプリケーションであればApache/Tomcatは自動で構築され

warファイルをアップロードするだけで動作が可能で、

Python(Flask/django)ではApache/uWGISが自動構築されるので

プログラム一式をアップロードするだけで動きます。

より自由度の高い環境を用意する場合はDockerを利用することで

EC2上に任意のDockerコンテナを複数立ち上げることができます。

今回はそのMulti-Container Docker構成について書いていきます。

## 構成説明


構成としてはBeanstalk上にNginxのコンテナとuWSGIのコンテナを立ち上げます。

ざっくりとした構成イメージは以下。

![AWS構成-メモ.png](https://qiita-image-store.s3.amazonaws.com/0/102999/3b02082d-bb71-4909-1579-8342cccc4d5b.png)

今回はDBは利用しません。BeanstalkはRDSも立ち上げられますが

Beanstalkの環境を終了させるとRDSも終了してしまうようなので

RDSを立ち上げる場合はBeanstalkとは別で立ち上げると良いでしょう。

また、multi container dockerの場合はコンテナを落とすと

ログなども消失してしまうのでCloudWatchLogsと連動させます。

　

今回は基本的にCLIにて構築を進めて行きます。

そのためAWS CLIなどは設定済みの前提。

Benastalk専用のコマンドラインツールは[こちら](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb-cli3.html "こちら")からセットアップしてください。

## Beanstalkの用語や初期設定

Beanstalkでは重要なこととして

【アプリケーション】【環境】という概念があります。

　

一般的なシステム開発では本番(商用)環境、結合試験環境、受入環境・・・など

１つシステム(サブシステム)内に複数のシステムセットがあると思います。

これが【環境】。

　

ですのでそれぞれの環境ごとに上述の絵にあるAWSサービスが存在します。

この環境をグルーピングした単位が【アプリケーション】となります。

　

アプリケーションを作る場合はEBコマンドラインツールを利用しますが

コマンドを実行するカレントディレクトリが重要です。

このディレクトリにあるファイルがBeanstalkのEC2サーバに配備されます。


また、ディレクトリに特定のファイルがあるとアプリケーション初期化時に

自動でその構成のEC2を作成してくれます。以下が一例。

- application.pyはあればPythonの実行環境
- DockerfileであればシングルコンテナのDocker構成
- Dockerrun.aws.jsonがあればマルチコンテナのDocker構成

今回はDockerrun.aws.jsonを利用しますが

このファイルの詳細は次回以降でお伝えします。

## Beanstalkの初期設定手順

> eb init 

を実行します。AWSプロファイルを分ける場合は[--profile matsui]などをしましょう。

対話にていくつか質問されます。

> 9) ap-northeast-1 : Asia Pacific (Tokyo)
>　・
>　・
>　・
> (default is 3): 9

リージョンの設定では東京リージョンを選びます。

> Enter Application Name
> (default is "xxxxxxx"): 

アプリケーションの名前を設定します。

デフォルトでは実行しているディレクトリの名前になりますので

問題ないのであれば空白でEnterを。変更の必要があれば変えてください。

> It appears you are using Multi-container Docker. Is this correct?
> (Y/n): Y

先ほどお伝えしたようにDockerrun.aws.jsonファイルがあるので推測してくれました。

問題ないのでYを設定します。

> Do you want to set up SSH for your instances?
> (Y/n): Y

SSHでEC2(Dockerのホストサーバ)に繋ぐ必要があるか聞かれます。

繋ぎたいのでYとしましょう。すると・・・

> Select a keypair.
> 1) xxxxxx
> 2) \[ Create new KeyPair \]
> (default is 1): 1

SSHのkeypairが聞かれます。AWSアカウントに登録済みのものが出ますので

適切なものを選択してください。ここで設定したkeypairの秘密鍵(pemファイル)は

ローカルに「~/.ssh/」に置いておく必要があります。

ここに置くと環境作成後に「eb ssh」コマンドで自動的にその鍵が選択されて接続することができます。

ここまで行くと環境が出来上がりますのでAWSのWebコンソールからBeanstalkの

東京リージョンの画面を見るとアプリケーションが作成されていることが確認できます。
(左上の「xxxxx」がアプリケーション名)

<img width="1278" alt="Beanstalkコンソール" src="https://qiita-image-store.s3.amazonaws.com/0/102999/5f604bc7-2012-3da6-62f4-b9453a74f235.png">

続きは次回に！