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 にアップロードして環境にデプロイするコンテンツが含まれます。

注記

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

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

アプリケーションのルートにこの名前の 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 つのコンテナを定義します。1 つは nginx プロキシが前面にあるPHPウェブサイトです。これらの 2 つコンテナは Elastic Beanstalk 環境の各インスタンスの Docker コンテナで並列に実行され、このファイルで定義されるホストインスタンスのボリュームの共有コンテンツ (ウェブサイトのコンテンツ) にアクセスします。コンテナそのものは、Docker ハブの公式リポジトリでホストされているイメージから作成されます。環境は、次のようになります。

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

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

v2 の形式とそのパラメータの詳細については、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 にアップロードして、環境を作成します。[Platform (プラットフォーム)] で [Docker] を選択します。プラットフォームブランチ でECS64 ビット Amazon Linux 2023 で実行 を選択します。

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

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

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

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

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

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

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

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

次に、Elastic Beanstalk 環境の Amazon EC2インスタンスに接続して、動作しているいくつかの可動部分を確認します。

環境内のインスタンスに接続する最も簡単な方法は、EB を使用することですCLI。これを使用するには、EB をインストールしていない場合はCLIインストールします。また、Amazon EC2SSHキーペアを使用して環境を設定する必要があります。そのためには、コンソールのセキュリティ設定ページまたは EB CLI eb init コマンドを使用します。環境インスタンスに接続するには、EB eb CLI ssh コマンドを使用します。 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 get リクエストでコンテナエージェントのステータスを確認しますhttp://localhost:51678/v1/metadata

[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クラスターの名前と、クラスターインスタンス ARN (接続先の Amazon インスタンス) の (Amazon リソースネーム ) を示しています。 EC2

詳細については、 に 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-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 コンテナをデプロイするために実行されるタスクについて示しています。以下の情報が表示されます。

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

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

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

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

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