メニュー
AWS Elastic Beanstalk
開発者ガイド (API Version 2010-12-01)

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

AWS マネジメントコンソール を使用して、1 つのインスタンスまたはオートスケーリングの Elastic Beanstalk 環境で複数コンテナインスタンスのクラスターを起動できます。このチュートリアルでは、2 つのコンテナを使用する環境用のコンテナの設定、およびソースコードの準備について説明します。

コンテナ、PHP アプリケーション、および nginx プロキシは、Amazon EC2 環境の各 Elastic Beanstalk インスタンスで並列に実行されます。環境を作成し、アプリケーションが実行中であることを確認したら、コンテナインスタンスに接続して、それらの状態を確認できます。

Docker コンテナの定義

新しい Docker 環境作成の最初のステップは、アプリケーションデータ用のディレクトリの作成です。このフォルダーはローカルマシンの任意の場所に配置でき、任意の名前を付けることができます。コンテナ設定ファイルに加えて、このフォルダーには、Elastic Beanstalk にアップロードして環境にデプロイするコンテンツが含まれます。

注記

このチュートリアルのすべてのコードは、GitHub (https://github.com/awslabs/eb-docker-nginx-proxy) の awslabs レポジトリで入手できます。

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.config の形式とそのパラメータの詳細については、「コンテナ定義形式」を参照してください。

コンテンツの追加

次に、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 へのデプロイ

アプリケーションフォルダーには以下のファイルが含まれます。

php-app\index.php
php-app\static.html
proxy\conf.d\default.conf
Dockerrun.aws.json

これは、Elastic Beanstalk 環境を作成するのに必要なすべてです。上記のファイルとフォルダの .zip アーカイブを作成します (最上位プロジェクトフォルダを含みません)。Windows エクスプローラーでアーカイブを作成するには、プロジェクトフォルダーの内容を選択し、右クリックして [Send To] を選択します。次に、[Compressed (zipped) Folder] をクリックします。

注記

必要なファイル構造の詳細、および他の環境でアーカイブを作成する手順については、「アプリケーションソースバンドルを作成する」を参照してください。

次に、ソースバンドルを Elastic Beanstalk にアップロードして環境を作成します。プラットフォームの選択を求められたら、[Multi-container Docker] を選択します。

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

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

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

  3. [App code] で、[Upload] を選択します。

  4. [Local file] で [Browse] を選択し、ソースバンドルを開きます。

  5. [Upload] を選択します。

  6. [Review and launch] を選択します。

  7. 使用できる設定を確認し、[Create app] を選択します。

AWS マネジメントコンソール により、新しい環境の管理ダッシュボードにリダイレクトされます。この画面には、環境の状態ステータスと、Elastic Beanstalk サービスによって出力されたイベントが表示されます。状態が緑色になったら、環境名の横の URL をクリックして新しいウェブサイトを表示します。

コンテナインスタンスへの接続

これはどのような仕組みなのでしょうか。次に、Elastic Beanstalk 環境で EC2 インスタンスに接続し、いくつかの可動部分を動かしてみます。

最初に、インスタンスを特定し、パブリック IP アドレスをメモします。IP アドレスは Amazon EC2 コンソール (https://console.aws.amazon.com/ec2/) で入手できます。複数のインスタンスを実行中で、環境に属しているインスタンスの特定に問題がある場合は、環境ダッシュボードのイベントでインスタンス ID を見つけます。この ID は、Elastic Beanstalk が EC2 インスタンスを起動したときに、イベントのリストに表示されます。Amazon EC2 コンソールでインスタンス ID を探し、その詳細を確認してパブリック IP アドレスを見つけます。

次に、SSH クライアントとプライベートキーファイルを使用してインスタンスに接続します。以下の設定を使用します。

SSH の設定

  • [Address] – EC2 インスタンスのパブリック IP アドレスまたは DNS 名。

  • [Port] – 22。このポートは、環境設定中に Amazon EC2 キーペアを選択すると、Elastic Beanstalk Beanstalk によって進入用に開かれます。

  • [User Name] – ec2-user。これは、Amazon Linux を実行中の EC2 インスタンスのデフォルトのユーザー名です。

  • [Private Key] – プライベートキーファイル。

SSH を使用した EC2 インスタンスへの接続の詳細な手順については、『Linux インスタンス用 Amazon EC2 ユーザーガイド』の「SSH を使用した Linux インスタンスへの接続」を参照してください。

これで、Docker コンテナをホストする EC2 インスタンスに接続したので、設定を確認できます。/var/app/currentls を実行します。

[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 環境の 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 クラスター名、およびクラスターインスタンス(接続先の 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 ステータスは、コンテナがまだアクティブであることを示します。

  • [Family] – Dockerrun.aws.json から Elastic Beanstalk によって作成されたタスク定義の名前。

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

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

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