AWS Elastic Beanstalk
開発者ガイド

複数コンテナの Docker 環境

Elastic Beanstalk 用のマルチコンテナ Docker プラットフォームで、Amazon EC2 インスタンスごとに複数のコンテナをサポートする Docker 環境を作成できます。

Elastic Beanstalk は Amazon Elastic Container Service (Amazon ECS) を使用して、マルチコンテナ Docker 環境へのコンテナのデプロイを調整します。Amazon ECS には、Docker コンテナを実行するインスタンスのクラスターを管理するためのツールが用意されています。Elastic Beanstalk は、クラスターの作成やタスクの定義と実行などの Amazon ECS タスクを処理します。

注記

一部リージョンでは、Amazon ECS を使用できない場合があります。これらのリージョンでは、マルチコンテナの Docker 環境はサポートされていません。

各リージョンで提供されている AWS サービスの詳細については、「リージョンテーブル」を参照してください。

複数コンテナの Docker プラットフォーム

Elastic Beanstalk の標準的な汎用の事前設定済み Docker プラットフォームは、Elastic Beanstalk 環境ごとに 1 つの Docker コンテナのみをサポートします。Docker を最大限に活用するため、Elastic Beanstalk では、Amazon EC2 インスタンスが複数の Docker コンテナを並行して実行できる環境を作成することができます。

次の図は、Auto Scaling グループ内の各 Amazon EC2 インスタンスで実行される 3 つの Docker コンテナで設定された Elastic Beanstalk 環境の例を示しています。

Dockerrun.aws.json ファイル

コンテナインスタンス — Elastic Beanstalk 環境でマルチコンテナ Docker を実行する Amazon EC2 インスタンス — には、Dockerrun.aws.json という名前の設定ファイルが必要です。このファイルは Elastic Beanstalk に固有であり、単独で、またはソースバンドル内のソースコードやコンテンツと組み合わせて使用して、Docker プラットフォーム上に環境を作成することができます。

注記

バージョン 1 の Dockerrun.aws.json 形式は、Elastic Beanstalk 環境で 1 つの Docker コンテナを起動するために使用されます。バージョン 2 では Amazon EC2 インスタンスごとに複数のコンテナのサポートが追加され、複数コンテナの Docker プラットフォームとの組み合わせでのみ使用できます。この形式は、以前のバージョンとは大きく異なります。詳細については、単一コンテナの Docker の設定を参照してください。

更新された形式とサンプルファイルについては、Dockerrun.aws.json v2を参照してください。

Docker イメージ

Elastic Beanstalk の複数コンテナの Docker プラットフォームでは、イメージを事前に作成し、パブリックまたはプライベートのオンラインイメージリポジトリに保存する必要があります。

注記

デプロイ時の Dockerfile によるカスタムイメージの構築は、Elastic Beanstalk のマルチコンテナ Docker プラットフォームではサポートされません。イメージを構築して、Elastic Beanstalk 環境を作成する前にオンラインレポジトリにデプロイします。

Dockerrun.aws.json で名前によってイメージを指定します。次の規則があります。

  • Docker ハブの公式リポジトリのイメージでは、1 つの名前 (例: ubuntumongo) を使用します。

  • Docker ハブの他のリポジトリのイメージは、組織名で修飾されます (例: amazon/amazon-ecs-agent)。

  • 他のオンラインレジストリのイメージは、ドメイン名でさらに修飾されます(例: quay.io/assemblyline/ubuntu)。

プライベートレポジトリを認証するように Elastic Beanstalk を設定するには、Dockerrun.aws.json ファイルに authentication パラメータを含めます。

コンテナインスタンスロール

Elastic Beanstalk は、Docker コンテナで実行される Amazon ECS コンテナエージェントで、Amazon ECS 最適化 AMI を使用します。エージェントは、Amazon ECS と通信してコンテナのデプロイを調整します。Amazon ECS と通信するためには、各 Amazon EC2 インスタンスに IAM に対応するアクセス許可が必要です。これらのアクセス許可は、管理コンソールで Elastic Beanstalk 環境を作成すると、デフォルトのインスタンスプロファイルにアタッチされます。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "ECSAccess", "Effect": "Allow", "Action": [ "ecs:Poll", "ecs:StartTask", "ecs:StopTask", "ecs:DiscoverPollEndpoint", "ecs:StartTelemetrySession", "ecs:RegisterContainerInstance", "ecs:DeregisterContainerInstance", "ecs:DescribeContainerInstances", "ecs:Submit*" ], "Resource": "*" } ] }

独自のインスタンスプロファイルを作成する場合は、AWSElasticBeanstalkMulticontainerDocker 管理ポリシーをアタッチして、アクセス許可が最新であることを確認することができます。IAM でのポリシーとロールの作成手順については、IAM ユーザーガイドの「IAM ロールの作成」を参照してください。

Elastic Beanstalk によって作成された Amazon ECS リソース

マルチコンテナ Docker プラットフォームを使用して環境を作成すると、Elastic Beanstalk は各 Amazon EC2 インスタンスに必要なコンテナを作成するために、環境の構築中に、いくつかの Amazon Elastic Container Service リソースを自動的に作成し、設定します。

  • Amazon ECS クラスター – Amazon ECS 内のコンテナインスタンスは、クラスターに整理されます。Elastic Beanstalk とともに使用すると、1 つのクラスターは常に各複数コンテナの Docker 環境用に作成されます。

  • Amazon ECS タスク定義 – Elastic Beanstalk はプロジェクトの Dockerrun.aws.json ファイルを使用して、環境内のコンテナインスタンスを設定するための Amazon ECS タスク定義を生成します。

  • Amazon ECS タスク – Elastic Beanstalk は Amazon ECS と通信して、環境内の各インスタンスでタスクを実行し、コンテナのデプロイを調整します。オートスケーリング環境では、Elastic Beanstalk はインスタンスがクラスターに追加されるたびに新しいタスクを開始します。まれに、コンテナとイメージ用に予約した容量を増やす必要が生じることがあります。詳細については、「Docker 環境の設定」セクションを参照してください。

  • Amazon ECS コンテナエージェント – エージェントは環境内のインスタンスの Docker コンテナで実行されます。エージェントは Amazon ECS サービスをポーリングし、タスクの実行を待ちます。

  • Amazon ECS データボリューム – Elastic Beanstalk は、ログ収集を容易にするために、(Dockerrun.aws.json で定義したボリュームに加えて) ボリューム定義をタスク定義に挿入します。

    Elastic Beanstalk は、/var/log/containers/containername に、コンテナごとに 1 つずつ、コンテナインスタンスにログボリュームを作成します。これらのボリュームの名前は awseb-logs-containername で、マウントするコンテナごとに指定されます。このマウント方法の詳細については、コンテナ定義形式を参照してください。

複数の Elastic Load Balancing リスナーの使用

デフォルトの HTTP ポートで実行されないプロキシまたは他のサービス用の受信トラフィックをサポートするため、複数コンテナの Docker 環境で、複数の Elastic Load Balancing リスナーを設定できます。

ソースバンドルで .ebextensions フォルダを作成し、ファイル拡張子が .config のファイルを追加します。次の例では、ポート 8080 で Elastic Load Balancing リスナーを作成する設定ファイルを示します。

.ebextensions/elb-listener.config

option_settings: aws:elb:listener:8080: ListenerProtocol: HTTP InstanceProtocol: HTTP InstancePort: 8080

お客様が作成したカスタム Amazon Virtual Private Cloud (Amazon VPC) で環境を実行している場合、Elastic Beanstalk が残りを引き受けます。デフォルトの VPC では、インスタンスのセキュリティグループを設定して、ロードバランサーからの着信を許可する必要があります。進入ルールを追加する第 2 の設定ファイルをセキュリティグループに追加します。

.ebextensions/elb-ingress.config

Resources: port8080SecurityGroupIngress: Type: AWS::EC2::SecurityGroupIngress Properties: GroupId: {"Fn::GetAtt" : ["AWSEBSecurityGroup", "GroupId"]} IpProtocol: tcp ToPort: 8080 FromPort: 8080 SourceSecurityGroupName: { "Fn::GetAtt": ["AWSEBLoadBalancer", "SourceSecurityGroup.GroupName"] }

設定ファイルの形式の詳細については、Elastic Beanstalk 環境リソースの追加とカスタマイズおよびオプション設定を参照してください。

Elastic Load Balancing 設定にリスナーを追加し、セキュリティグループでポートを開くことに加えて、Dockerrun.aws.json ファイルの containerDefinitions セクションで、Docker コンテナのポートにホストインスタンスのポートをマッピングする必要があります。例を以下に示します。

"portMappings": [ { "hostPort": 8080, "containerPort": 8080 } ]

Dockerrun.aws.json ファイル形式の詳細については、Dockerrun.aws.json v2を参照してください。

失敗したコンテナのデプロイ

Amazon ECS タスクが失敗した場合、Elastic Beanstalk 環境の 1 つ以上のコンテナが開始されません。Elastic Beanstalk は、Amazon ECS タスクが失敗しても、マルチコンテナ環境をロールバックしません。環境でコンテナの開始が失敗した場合は、AWS マネジメントコンソール から現在のバージョンまたは以前の機能するバージョンを再デプロイします。

既存のバージョンをデプロイするには

  1. ご使用の環境のリージョンで Elastic Beanstalk コンソールを開きます。

  2. アプリケーション名の右側の アクション をクリックし、アプリケーションバージョンの表示 をクリックします。

  3. アプリケーションのバージョンを選択し、デプロイ をクリックします。