Elastic Beanstalk コンソールを使用した複数コンテナの Docker 環境
Elastic Beanstalk コンソールを使用して、単一インスタンスまたはスケーラブルな Elastic Beanstalk 環境で複数コンテナインスタンスのクラスターを起動できます。このチュートリアルでは、2 つのコンテナを使用する環境用のコンテナの設定、およびソースコードの準備について説明します。
コンテナ、PHP アプリケーション、および nginx プロキシは、Elastic Beanstalk 環境の各 Amazon Elastic Compute Cloud (Amazon EC2) インスタンスで並列に実行されます。環境を作成し、アプリケーションが実行中であることを確認したら、コンテナインスタンスに接続して、それらの状態を確認できます。
Docker コンテナの定義
新しい Docker 環境作成の最初のステップは、アプリケーションデータ用のディレクトリの作成です。このフォルダはローカルマシンの任意の場所に配置でき、任意の名前を付けることができます。コンテナ設定ファイルに加えて、このフォルダには、Elastic Beanstalk にアップロードして環境にデプロイするコンテンツが含まれます。
このチュートリアルのすべてのコードは、GitHub (https://github.com/awslabs/eb-docker-nginx-proxy
Amazon EC2 インスタンスのコンテナの設定に Elastic Beanstalk が使用するファイルは、Dockerrun.aws.json
という名前の JSON 形式のテキストファイルです。アプリケーションのルートでこの名前のテキストファイルを作成し、次のテキストを追加します。
{
"AWSEBDockerrunVersion": 2,
"volumes": [
{
"name": "php-app",
"host": {
"sourcePath": "/var/app/current/php-app"
}
},
{
"name": "nginx-proxy-conf",
"host": {
"sourcePath": "/var/app/current/proxy/conf.d"
}
}
],
"containerDefinitions": [
{
"name": "php-app",
"image": "php:fpm",
"essential": true,
"memory": 128,
"mountPoints": [
{
"sourceVolume": "php-app",
"containerPath": "/var/www/html",
"readOnly": true
}
]
},
{
"name": "nginx-proxy",
"image": "nginx",
"essential": true,
"memory": 128,
"portMappings": [
{
"hostPort": 80,
"containerPort": 80
}
],
"links": [
"php-app"
],
"mountPoints": [
{
"sourceVolume": "php-app",
"containerPath": "/var/www/html",
"readOnly": true
},
{
"sourceVolume": "nginx-proxy-conf",
"containerPath": "/etc/nginx/conf.d",
"readOnly": true
},
{
"sourceVolume": "awseb-logs-nginx-proxy",
"containerPath": "/var/log/nginx"
}
]
}
]
}
この例の設定では、2 つのコンテナ、PHP ウェブサイトとその前面の nginx プロキシを定義します。これらの 2 つコンテナは Elastic Beanstalk 環境の各インスタンスの Docker コンテナで並列に実行され、このファイルで定義されるホストインスタンスのボリュームの共有コンテンツ (ウェブサイトのコンテンツ) にアクセスします。コンテナそのものは、Docker ハブの公式リポジトリでホストされているイメージから作成されます。環境は、次のようになります。

設定で定義されるボリュームは、アプリケーションソースバンドルの一部として次に作成し、アップロードするコンテンツに対応します。コンテナは、コンテナ定義の mountPoints
セクションでボリュームをマウントすることで、ホストのコンテンツにアクセスします。
Dockerrun.aws.json
の形式とそのパラメータの詳細については、「コンテナの定義形式」を参照してください。
コンテンツの追加
次に、PHP サイトで閲覧者に表示するコンテンツと、nginx プロキシ用の設定ファイルを追加します。
php-app/index.php
<h1>Hello World!!!</h1>
<h3>PHP Version <pre><?= phpversion()?></pre></h3>
php-app/static.html
<h1>Hello World!</h1>
<h3>This is a static HTML page.</h3>
proxy/conf.d/default.conf
server {
listen 80;
server_name localhost;
root /var/www/html;
index index.php;
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
if (!-f $document_root$fastcgi_script_name) {
return 404;
}
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_pass php-app:9000;
fastcgi_index index.php;
}
}
Elastic Beanstalk にデプロイする
アプリケーションフォルダーには以下のファイルが含まれます。
├── Dockerrun.aws.json
├── php-app
│ ├── index.php
│ └── static.html
└── proxy
└── conf.d
└── default.conf
Elastic Beanstalk 環境を作成するために必要なのは、これだけです。上記のファイルとフォルダの .zip
アーカイブを作成します (最上位プロジェクトフォルダを含みません)。Windows エクスプローラーでアーカイブを作成するには、プロジェクトフォルダの内容を選択し、右クリックして
送る を選択し、圧縮 (zip 形式) フォルダ をクリックします。
必要なファイル構造の詳細、および他の環境でアーカイブを作成する手順については、「アプリケーションソースバンドルを作成する」を参照してください。
次に、ソースバンドルを Elastic Beanstalk にアップロードして、環境を作成します。[Platform (プラットフォーム)] で [Docker] を選択します。[プラットフォームブランチ (Platform branch)] では、[Multi-container Docker running on 64bit Amazon Linux (64 ビットの Amazon Linux で実行されているマルチコンテナの Docker)] を選択します。
環境を起動するには(コンソール)
-
次の事前に設定されたリンクで、Elastic Beanstalk コンソールを開きます: console.aws.amazon.com/elasticbeanstalk/home#/newApplication?applicationName=tutorials&environmentType=LoadBalanced
-
[プラットフォーム] で、アプリケーションで使用される言語に一致するプラットフォームとプラットフォームブランチか、コンテナベースアプリケーション用の Docker プラットフォームを選択します。
-
[アプリケーションコード] で、[コードのアップロード] を選択します。
-
ローカルファイル を選択し、[Choose file (ファイルの選択)] を選択して、ソースバンドルを開きます。
-
確認と起動 を選択します。
-
使用できる設定を確認し、アプリの作成 を選択します。
Elastic Beanstalk コンソールにより、新しい環境の管理ダッシュボードにリダイレクトされます。この画面には、環境の状態ステータスと、Elastic Beanstalk サービスによって出力されたイベントが表示されます。状態が緑色になったら、環境名の横の URL をクリックして新しいウェブサイトを表示します。
コンテナインスタンスへの接続
次に、Elastic Beanstalk 環境で Amazon EC2 インスタンスに接続し、いくつかの可動部分を動かしてみます。
環境内のインスタンスに接続するための最も簡単な方法は、EB CLI を使用することです。これを使用するには、EB CLI をインストールします (まだ行っていない場合)。また、Amazon EC2 SSH キーペアを使用して環境を設定する必要があります。コンソールの セキュリティ設定ページまたは EB CLI の eb init コマンドを使用して、この操作を行います。環境のインスタンスに接続するには、EB CLI の eb ssh コマンドを使用します。
これで、Docker コンテナをホストする Amazon EC2 インスタンスに接続したので、設定を確認できます。ls
で /var/app/current
を実行します。
[ec2-user@ip-10-0-0-117 ~]$ ls /var/app/current
Dockerrun.aws.json php-app proxy
このディレクトリには、環境の作成中に Elastic Beanstalk にアップロードしたソースバンドルからのファイルが含まれます。
[ec2-user@ip-10-0-0-117 ~]$ ls /var/log/containers
nginx nginx-proxy-ffffd873ada5-stdouterr.log rotated
nginx-66a4fd37eb63-stdouterr.log php-app
nginx-proxy php-app-b894601a1364-stdouterr.log
ここでは、コンテナインスタンスにログが作成され、Elastic Beanstalk によって収集されます。Elastic Beanstalk は、各コンテナ用にこのディレクトリでボリュームを作成します。このボリュームは、ログが書き込まれるコンテナの場所にマウントします。
Docker を確認し、docker
ps
で実行中のコンテナを表示することもできます。
[ec2-user@ip-10-0-0-117 ~]$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ffffd873ada5 nginx:1.7 "nginx -g 'daemon of About an hour ago Up About an hour 443/tcp, 0.0.0.0:80->80/tcp ecs-eb-dv-example-env-ycmk5geqrm-2-nginx-proxy-90fce996cc8cbecb2800
b894601a1364 php:5-fpm "php-fpm" About an hour ago Up About an hour 9000/tcp ecs-eb-dv-example-env-ycmk5geqrm-2-php-app-cec0918ed1a3a49a8001
09fb19828e38 amazon/amazon-ecs-agent:latest "/agent" About an hour ago Up About an hour 127.0.0.1:51678->51678/tcp ecs-agent
デプロイした 2 つの実行中のコンテナと、デプロイを調整した Amazon ECS コンテナエージェントが表示されます。
Amazon ECS コンテナエージェントを検査する
Elastic Beanstalk の複数コンテナの Docker 環境の Amazon EC2 インスタンスは、Docker コンテナでエージェントプロセスを実行します。このエージェントは、コンテナのデプロイを調整するために、Amazon
ECS サービスに接続します。これらのデプロイは Amazon ECS でタスクとして実行され、タスク定義ファイルで設定されます。Elastic Beanstalk
は、ソースバンドルでアップロードする Dockerrun.aws.json
に基づいて、これらのタスク定義ファイルを作成します。
http://localhost:51678/v1/metadata
への HTTP GET リクエストで、コンテナエージェントの状態を確認します。
[ec2-user@ip-10-0-0-117 ~]$ curl http://localhost:51678/v1/metadata
{
"Cluster":"eb-dv-example-env-qpoxiguye24",
"ContainerInstanceArn":"arn:aws:ecs:us-east-2:123456789012:container-instance/6a72af64-2838-400d-be09-3ab2d836ebcd"
}
この構造は、Amazon ECS クラスター名、およびクラスターインスタンス (接続先の Amazon EC2 インスタンス) の ARN (Amazon リソースネーム) を示します。
詳細については、HTTP GET リクエストを行ってください。その方法については、http://localhost:51678/v1/tasks
を参照してください。
[ec2-user@ip-10-0-0-117 ~]$ curl http://localhost:51678/v1/tasks
{
"Tasks":[
{
"Arn":"arn:aws:ecs:us-east-2:123456789012:task/3ff2bf0f-790d-4f6d-affb-5b127b3b6e4a",
"DesiredStatus":"RUNNING",
"KnownStatus":"RUNNING",
"Family":"eb-dv-example-env-qpoxiguye24",
"Version":"2",
"Containers":[
{
"DockerId":"b894601a1364a438156a239813c77cdef17040785bc4d5e49349470dc1556b15",
"DockerName":"ecs-eb-dv-example-env-qpoxiguye24-2-php-app-cec0918ed1a3a49a8001",
"Name":"php-app"
},
{
"DockerId":"ffffd873ada5f537c88862cce4e1de7ec3edf962645982fb236961c833a5d0fe",
"DockerName":"ecs-eb-dv-example-env-qpoxiguye24-2-nginx-proxy-90fce996cc8cbecb2800",
"Name":"nginx-proxy"
}
]
}
]
}
この構造は、このチュートリアルのサンプルプロジェクトから 2 つの Docker コンテナをデプロイするために実行されるタスクについて示しています。以下の情報が表示されます。
-
[KnownStatus] –
RUNNING
ステータスは、コンテナがまだアクティブであることを示します。 -
ファミリー – Elastic Beanstalk が
Dockerrun.aws.json
から作成したタスク定義の名前。 -
[Version] – タスク定義のバージョン。これは、タスク定義ファイルを更新するたびに増えていきます。
-
[Containers] – インスタンスで実行されるコンテナに関する情報。
さらに多くの情報が、Amazon ECS サービス自体から使用できます。このサービスは AWS コマンドラインインターフェイスを使用して呼び出すことができます。AWS CLI と Amazon ECS の使用方法、および Amazon ECS の全般的な情報については、Amazon ECS ユーザーガイドを参照してください。