AWS Elastic Beanstalk
開発者ガイド

AWS マネジメントコンソール を使用した複数コンテナの Docker 環境

AWS マネジメントコンソール を使用して、1 つのインスタンスまたはオートスケーリングの 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) の awslabs レポジトリで入手できます。

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 にアップロードして環境を作成します。プラットフォームの選択を求められたら、マルチコンテナ Docker を選択します。

環境を起動するには(コンソール)

  1. 次の事前に設定されたリンクを使用して、Elastic Beanstalk コンソール を開きます。console.aws.amazon.com/elasticbeanstalk/home#/newApplication?applicationName=tutorials&environmentType=LoadBalanced

  2. プラットフォーム として、アプリケーションで使用される言語に一致するプラットフォームを選択します。

  3. App code として、アップロード を選択します。

  4. ローカルファイル を選択し、参照 を選択して、ソースバンドルを開きます。

  5. [アップロード] を選択します。

  6. 確認と起動 を選択します。

  7. 使用できる設定を確認し、アプリの作成 を選択します。

AWS マネジメントコンソール により、新しい環境の管理ダッシュボードにリダイレクトされます。この画面には、環境の状態ステータスと、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 コンテナをデプロイするために実行されるタスクについて示しています。以下の情報が表示されます。

  • KnownStatusRUNNING ステータスは、コンテナがまだアクティブであることを示します。

  • ファミリー – Elastic Beanstalk が Dockerrun.aws.json から作成したタスク定義の名前。

  • バージョン – タスク定義のバージョン。これは、タスク定義ファイルを更新するたびに増えていきます。

  • コンテナ – インスタンスで実行されるコンテナに関する情報。

さらに多くの情報が、Amazon ECS サービス自体から入手できます。このサービスは AWS Command Line Interface を使用して呼び出すことができます。AWS CLI と Amazon ECS の使用方法、および Amazon ECS の全般的な情報については、Amazon ECS ユーザーガイドを参照してください。