Dockerrun.aws.json v2 ファイルの設定 - AWS Elastic Beanstalk

Dockerrun.aws.json v2 ファイルの設定

Dockerrun.aws.json v2 は、Elastic Beanstalk 環境の ECS クラスターでホストされる一連の Docker コンテナをデプロイする方法を記述する Elastic Beanstalk 設定ファイルです。Elastic Beanstalk プラットフォームは、ECS コンテナ定義を含む ECS タスク定義を作成します。これらの定義は Dockerrun.aws.json 設定ファイルに記述されます。

Dockerrun.aws.json ファイル内のコンテナ定義は、ECS クラスター内の各 Amazon EC2 インスタンスにデプロイするコンテナを記述します。この場合、Amazon EC2 インスタンスは Docker コンテナをホストするため、ホストコンテナインスタンスとも呼ばれます。設定ファイルは、Docker コンテナがマウントするホストコンテナインスタンス上に作成するデータボリュームも記述します。Elastic Beanstalk 上の ECS マネージド Docker 環境のコンポーネントの詳細と図については、この章の前半の「ECS マネージド Docker プラットフォームの概要」を参照してください。

Dockerrun.aws.json ファイルは単独で使用するか、1 つのアーカイブに追加のソースコードとともに圧縮できます。Dockerrun.aws.json でアーカイブされるソースコードは Amazon EC2 コンテナインスタンスにデプロイされ、/var/app/current/ ディレクトリでアクセスできます。

Dockerrun.aws.json v2

Dockerrun.aws.json ファイルには次のセクションが含まれています。

AWSEBDockerrunVersion

ECS マネージド Docker 環境のバージョン番号として値 2 を指定します。

executionRoleArn

アカウントに関連付けられた、さまざまな目的とサービスのタスク実行 IAM ロールを指定します。アプリケーションがシークレットとして保存されている Elastic Beanstalk 環境変数を使用するには、必要なアクセス許可を付与するタスク実行ロールの ARN を指定する必要があります。その他の一般的なユースケースでも、このパラメータが必要になる場合があります。詳細については、「実行ロール ARN 形式」を参照してください。

ボリューム

Amazon EC2 コンテナインスタンスのフォルダから、またはソースバンドル (/var/app/current にデプロイ) からボリュームを作成します。containerDefinitions セクションで mountPoints を使用している Docker コンテナ内のパスにこれらのボリュームをマウントします。

containerDefinitions

コンテナ定義の配列。

認証 (オプション)

プライベートリポジトリの認証データが含まれる .dockercfg ファイルの Amazon S3 内の場所です。

Dockerrun.aws.json の「containerDefinitions」と「volumes」のセクションは、Amazon ECS タスク定義ファイルの対応するセクションと同じ形式を使用します。タスク定義の形式およびタスク定義パラメータの完全な一覧については、「Amazon Elastic Container Service デベロッパーガイド」の「Amazon ECS タスク定義」を参照してください。

ボリュームフォーマット

volume パラメータは、Amazon EC2 コンテナインスタンス内のフォルダ、またはソースバンドル (/var/app/current にデプロイされている) のいずれかからボリュームを作成します。

ボリュームは次の形式で指定します:

"volumes": [ { "name": "volumename", "host": { "sourcePath": "/path/on/host/instance" } } ],

コンテナ定義の mountPoints を使用して、これらのボリュームを Docker コンテナ内のパスにマウントします。

Elastic Beanstalk は、コンテナごとにログ用の追加のボリュームを設定します。これらのボリュームは、ホストインスタンスにログを書き込むために、Docker コンテナによってマウントされる必要があります。

詳細については、次の「コンテナ定義の形式」セクションの「mountPoints」フィールドを参照してください。

実行ロール ARN 形式

アプリケーションがシークレットとして保存されている Elastic Beanstalk 環境変数を使用するには、タスク実行 IAM ロールを指定する必要があります。ロールは、機密データを参照する AWS Secrets Manager シークレットまたは AWS Systems Manager Parameter Store パラメータを使用してユーザーに代わって AWS API コールを行うアクセス許可を Amazon ECS コンテナに付与する必要があります。アカウントに必要なアクセス許可を持つタスク実行 IAM ロールを作成する手順については、「Amazon Elastic Container Service デベロッパーガイド」の「Amazon ECS タスク実行 IAM ロール」を参照してください。

{ "AWSEBDockerrunVersion": 2, "executionRoleArn": "arn:aws:iam::111122223333:role/ecsTaskExecutionRole",

Amazon ECS マネージド Docker プラットフォームに必要な追加のアクセス許可

EC2 インスタンスプロファイルが iam:PassRole を ECS に付与する

EC2 インスタンスプロファイルがこのロールを ECS コンテナに付与できるようにするには、次の例に示す iam:PassRole アクセス許可を含める必要があります。iam:PassRole は、EC2 インスタンスのアクセス許可がタスク実行ロールを ECS コンテナに渡すことができるようにします。

この例では、ロールを ECS サービスにのみ渡すように EC2 インスタンスを制限しています。この条件は必須ではありませんが、ベストプラクティスに従って共有されたアクセス許可の範囲を減らすために追加します。これを行うには、Condition 要素を使用します。

注記

ECS IAM タスク実行ロールを使用するには、iam:PassRole アクセス許可が必要です。ECS タスク実行マネージドサービスロールを必要とするその他の一般的なユースケースがあります。詳細については、「Amazon Elastic Container Service デベロッパーガイド」の「Amazon ECS タスク実行 IAM ロール」を参照してください。

iam:PassRole アクセス許可を持つポリシー
JSON
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iam:PassRole", "Resource": [ "arn:aws:iam::123456789012:role/ecs-task-execution-role" ], "Condition": { "StringLike": { "iam:PassedToService": "ecs-tasks.amazonaws.com" } } } ] }

Amazon ECS コンテナエージェントにシークレットとパラメータへのアクセス権を付与する

Amazon ECS タスク実行 IAM ロールには、シークレットとパラメータストアにアクセスするアクセス許可も必要です。EC2 インスタンスプロファイルロールの要件と同様に、ECS コンテナエージェントには、必要な Secrets Manager または Systems Manager リソースをプルするアクセス許可が必要です。詳細については、「Amazon Elastic Container Service デベロッパーガイド」の「Secrets Manager または Systems Manager のアクセス許可」を参照してください

Elastic Beanstalk EC2 インスタンスにシークレットとパラメータへのアクセス権を付与する

環境変数として設定されたシークレットをサポートするには、EC2 インスタンスプロファイルにアクセス許可を追加する必要もあります。詳細については、「Elastic Beanstalk 環境変数へのシークレットとパラメータのフェッチ」および「Secrets Manager で必要な IAM アクセス許可」を参照してください。

次の例では、前の iam:PassRole 例と、参照先の Secrets Manager で必要な IAM アクセス許可 で提供されている例を組み合わせています。EC2 インスタンスが AWS Secrets Manager および AWS Systems Manager ストアにアクセスしてシークレットとパラメータデータを取得して、シークレット用に設定された Elastic Beanstalk 環境変数を初期化するために必要なアクセス許可を追加します。

iam:PassRole アクセス許可と組み合わせた Secrets Manager ポリシー
JSON
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iam:PassRole", "Resource": [ "arn:aws:iam::123456789012:role/ecs-task-execution-role" ], "Condition": { "StringLike": { "iam:PassedToService": "ecs-tasks.amazonaws.com" } } }, { "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue", "kms:Decrypt" ], "Resource": [ "arn:aws:secretsmanager:us-east-1:111122223333:secret:my-secret", "arn:aws:kms:us-east-1:111122223333:key/my-key" ] } ] }
iam:PassRole アクセス許可と組み合わせた Systems Manager ポリシー
JSON
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iam:PassRole", "Resource": [ "arn:aws:iam::123456789012:role/ecs-task-execution-role" ], "Condition": { "StringLike": { "iam:PassedToService": "ecs-tasks.amazonaws.com" } } }, { "Effect": "Allow", "Action": [ "ssm:GetParameter", "kms:Decrypt" ], "Resource": [ "arn:aws:ssm:us-east-1:111122223333:parameter/my-parameter", "arn:aws:kms:us-east-1:111122223333:key/my-key" ] } ] }

コンテナの定義形式

次の例は、[containerDefinitions] セクションで一般的に使用されるパラメータのサブセットを示しています。そのほかのオプションパラメータも使用可能です。

Beanstalk プラットフォームは、ECS コンテナ定義を含む ECS タスク定義を作成します。Beanstalk は、ECS コンテナ定義のパラメータのサブセットをサポートします。詳細については、「Amazon Elastic Container Service デベロッパーガイド」の「コンテナ定義」を参照してください。

Dockerrun.aws.json ファイルには、次のフィールドとともに 1 つ以上のコンテナ定義オブジェクトの配列が含まれます。

name

コンテナの名前。最大長と使用できる文字については、「標準のコンテナ定義のパラメータ」を参照してください。

イメージ

Docker コンテナの構築元となるオンライン Docker リポジトリの Docker イメージの名前。次の規則があります。

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

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

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

環境

コンテナに渡す環境変数の配列。

たとえば、次のエントリでは、Container という名前と PHP という値を使用して環境変数を定義しています。

"environment": [ { "name": "Container", "value": "PHP" } ],
essential

コンテナが失敗した場合にタスクを停止する場合は True。重要でないコンテナは、インスタンスで他のコンテナに影響を与えることなく、終了またはクラッシュできます。

メモリ

コンテナ用に予約するコンテナインスタンスのメモリの量。コンテナ定義で memorymemoryReservation パラメータの一方または両方に 0 以外の整数を指定します。

memoryReservation

コンテナ用に予約するメモリのソフト制限 (MiB 単位)。コンテナ定義で memorymemoryReservation パラメータの一方または両方に 0 以外の整数を指定します。

mountPoints

マウントする Amazon EC2 コンテナインスタンスのボリュームと、それらをマウントする Docker コンテナファイルシステム上の場所。アプリケーションコンテンツを含むボリュームをマウントすると、コンテナはソースバンドルにアップロードしたデータを読み取ることができます。ログデータを書き込むためのログボリュームをマウントすると、Elastic Beanstalk は、これらのボリュームからログデータを収集することができます。

Elastic Beanstalk はコンテナインスタンスにログボリュームを作成します。Docker コンテナごとに 1 つ、場所は /var/log/containers/containername です。これらのボリュームの名前は awseb-logs-containername で、ログが書き込まれるコンテナファイル構造内の場所にマウントします。

たとえば、次のマウントポイントは、コンテナの nginx ログの場所を、nginx-proxy コンテナ用に Elastic Beanstalk が生成したボリュームにマッピングします。

{ "sourceVolume": "awseb-logs-nginx-proxy", "containerPath": "/var/log/nginx" }
portMappings

コンテナのネットワークポートをホストのポートにマッピングします。

links

リンク先のコンテナのリスト。リンクされたコンテナはお互いを検出し、安全に通信できます。

volumesFrom

別コンテナからのボリュームをすべてマウントします。たとえば、web という名前のコンテナからボリュームをマウントするには、次の手順を実行します。

"volumesFrom": [ { "sourceContainer": "web" } ],

認証形式 – プライベートリポジトリからのイメージを使用

authentication セクションには、プライベートリポジトリの認証データが含まれています。このエントリはオプションです。

認証ファイルを authentication ファイルの Dockerrun.aws.json パラメータ内に含む Amazon S3 バケットに関する情報を追加します。authentication パラメータに有効な Amazon S3 バケットとキーが含まれていることを確認します。Amazon S3 バケットは、バケットを使用している環境と同じリージョンでホストする必要があります。Elastic Beanstalk は、他のリージョンでホストされている Amazon S3 バケットからファイルをダウンロードしません。

以下の形式が使用されます。

"authentication": { "bucket": "amzn-s3-demo-bucket", "key": "mydockercfg" },

認証ファイルの作成とアップロードについては、「イメージリポジトリを使用した認証」を参照してください。

Dockerrun.aws.json v2 の例

以下のスニペットは、2 つのコンテナを持つインスタンスの Dockerrun.aws.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", "environment": [ { "name": "Container", "value": "PHP" } ], "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" } ] } ] }