Elastic Beanstalk コンソールを使用した ECS マネージド Docker 環境の作成 - AWS Elastic Beanstalk

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Elastic Beanstalk コンソールを使用した ECS マネージド Docker 環境の作成

このチュートリアルでは、2 つのコンテナを使用する ECS マネージド Docker 環境用のコンテナの設定およびソースコードの準備について説明します。

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

ECS マネージド Docker コンテナの定義

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

注記

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

Amazon EC2 インスタンスのコンテナの設定に Elastic Beanstalk が使用するファイルは、Dockerrun.aws.json v2 という名前の JSON 形式のテキストファイルです。ECS マネージド Docker プラットフォームバージョンは、このファイルのバージョン 2 形式を使用します。この形式は、ECS 管理の Docker プラットフォームでのみ使用できます。ECS によって管理されていない Docker プラットフォームブランチをサポートする他の設定ファイルバージョンとは大きく異なるためです。

アプリケーションのルートで Dockerrun.aws.json v2 テキストファイルを作成し、次のテキストを追加します。

{ "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 ハブの公式リポジトリでホストされているイメージから作成されます。環境は、次のようになります。

Elastic Beanstalk environment with load balancer, auto scaling group, and two instances running Nginx and PHP-FPM.

設定で定義されるボリュームは、アプリケーションソースバンドルの一部として次に作成し、アップロードするコンテンツに対応します。コンテナは、コンテナ定義の mountPoints セクションでボリュームをマウントすることで、ホストのコンテンツにアクセスします。

Dockerrun.aws.json v2 の形式とそのパラメータの詳細については、「コンテナの定義形式」を参照してください。

コンテンツの追加

次に、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 アプリケーションソースバンドルを作成する

次に、ソースバンドルを Elastic Beanstalk にアップロードして、環境を作成します。[Platform (プラットフォーム)] で [Docker] を選択します。[プラットフォームブランチ] では、[64 ビット版 Amazon Linux 2023 で動作する ECS] を選択します。

環境を起動するには (コンソール)
  1. この事前に設定されたリンク: console.aws.amazon.com/elasticBeanstalk/home#/newApplication?applicationName=tutorials&environmentType=LoadBalanced を使用して、Elastic Beanstalk コンソールを開きます。

  2. [プラットフォーム] で、アプリケーションで使用される言語に一致するプラットフォームとプラットフォームブランチか、コンテナベースアプリケーション用の Docker プラットフォームを選択します。

  3. [アプリケーションコード] で、[コードのアップロード] を選択します。

  4. ローカルファイル を選択し、[Choose file (ファイルの選択)] を選択して、ソースバンドルを開きます。

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

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

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-proxy nginx-proxy-4ba868dbb7f3-stdouterr.log php-app php-app-dcc3b3c8522c-stdouterr.log rotated

ここでは、コンテナインスタンスにログが作成され、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 4ba868dbb7f3 nginx "/docker-entrypoint.…" 4 minutes ago Up 4 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp ecs-awseb-Tutorials-env-dc2aywfjwg-1-nginx-proxy-acca84ef87c4aca15400 dcc3b3c8522c php:fpm "docker-php-entrypoi…" 4 minutes ago Up 4 minutes 9000/tcp ecs-awseb-Tutorials-env-dc2aywfjwg-1-php-app-b8d38ae288b7b09e8101 d9367c0baad6 amazon/amazon-ecs-agent:latest "/agent" 5 minutes ago Up 5 minutes (healthy) ecs-agent

デプロイした 2 つの実行中のコンテナと、デプロイを調整した Amazon ECS コンテナエージェントが表示されます。

Amazon ECS コンテナエージェントを検査する

Elastic Beanstalk 上の ECS マネージド 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":"awseb-Tutorials-env-dc2aywfjwg", "ContainerInstanceArn":"arn:aws:ecs:us-west-2:123456789012:container-instance/awseb-Tutorials-env-dc2aywfjwg/db7be5215cd74658aacfcb292a6b944f", "Version":"Amazon ECS Agent - v1.57.1 (089b7b64)" }

この構造は、Amazon ECS クラスター名、およびクラスターインスタンス (接続先の Amazon EC2 インスタンス) の ARN (Amazon リソースネーム) を示します。

詳細については、http://localhost:51678/v1/tasks への HTTP GET リクエストを行ってください。

[ec2-user@ip-10-0-0-117 ~]$ curl http://localhost:51678/v1/tasks { "Tasks":[ { "Arn":"arn:aws:ecs:us-west-2:123456789012:task/awseb-Tutorials-env-dc2aywfjwg/bbde7ebe1d4e4537ab1336340150a6d6", "DesiredStatus":"RUNNING", "KnownStatus":"RUNNING", "Family":"awseb-Tutorials-env-dc2aywfjwg", "Version":"1", "Containers":[ { "DockerId":"dcc3b3c8522cb9510b7359689163814c0f1453b36b237204a3fd7a0b445d2ea6", "DockerName":"ecs-awseb-Tutorials-env-dc2aywfjwg-1-php-app-b8d38ae288b7b09e8101", "Name":"php-app", "Volumes":[ { "Source":"/var/app/current/php-app", "Destination":"/var/www/html" } ] }, { "DockerId":"4ba868dbb7f3fb3328b8afeb2cb6cf03e3cb1cdd5b109e470f767d50b2c3e303", "DockerName":"ecs-awseb-Tutorials-env-dc2aywfjwg-1-nginx-proxy-acca84ef87c4aca15400", "Name":"nginx-proxy", "Ports":[ { "ContainerPort":80, "Protocol":"tcp", "HostPort":80 }, { "ContainerPort":80, "Protocol":"tcp", "HostPort":80 } ], "Volumes":[ { "Source":"/var/app/current/php-app", "Destination":"/var/www/html" }, { "Source":"/var/log/containers/nginx-proxy", "Destination":"/var/log/nginx" }, { "Source":"/var/app/current/proxy/conf.d", "Destination":"/etc/nginx/conf.d" } ] } ] } ] }

この構造は、このチュートリアルのサンプルプロジェクトから 2 つの Docker コンテナをデプロイするために実行されるタスクについて示しています。以下の情報が表示されます。

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

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

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

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

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