

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

# Elastic Beanstalk コンソールを使用した ECS マネージド Docker 環境の作成
<a name="create_deploy_docker_ecstutorial"></a>

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

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

**Topics**
+ [ECS マネージド Docker コンテナの定義](#create_deploy_docker_ecstutorial_config)
+ [コンテンツの追加](#create_deploy_docker_ecstutorial_code)
+ [Elastic Beanstalk にデプロイする](#create_deploy_docker_ecstutorial_deploy)
+ [コンテナインスタンスへの接続](#create_deploy_docker_ecstutorial_connect)
+ [Amazon ECS コンテナエージェントを検査する](#create_deploy_docker_ecstutorial_connect_inspect)

## ECS マネージド Docker コンテナの定義
<a name="create_deploy_docker_ecstutorial_config"></a>

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

**注記**  
このチュートリアルのすべてのコードは、GitHub ([https://github.com/awslabs/eb-docker-nginx-proxy](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.\]](http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/images/aeb-multicontainer-tutorial.png)


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

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

## コンテンツの追加
<a name="create_deploy_docker_ecstutorial_code"></a>

次に、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 にデプロイする
<a name="create_deploy_docker_ecstutorial_deploy"></a>

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

```
├── Dockerrun.aws.json
├── php-app
│   ├── index.php
│   └── static.html
└── proxy
    └── conf.d
        └── default.conf
```

Elastic Beanstalk 環境を作成するために必要なのは、これだけです。上記のファイルとフォルダの `.zip` アーカイブを作成します (最上位プロジェクトフォルダを含みません)。Windows エクスプローラーでアーカイブを作成するには、プロジェクトフォルダの内容を選択し、右クリックして **送る** を選択し、**圧縮 (zip 形式) フォルダ** をクリックします。

**注記**  
必要なファイル構造の詳細、および他の環境でアーカイブを作成する手順については、「」を参照してください[Elastic Beanstalk アプリケーションソースバンドルを作成する](applications-sourcebundle.md) 

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

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

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

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

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

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

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

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

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

## コンテナインスタンスへの接続
<a name="create_deploy_docker_ecstutorial_connect"></a>

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

環境内のインスタンスに接続するための最も簡単な方法は、EB CLI を使用することです。これを使用するには、[EB CLI をインストールします](eb-cli3.md#eb-cli3-install) (まだ行っていない場合)。また、Amazon EC2 SSH キーペアを使用して環境を設定する必要があります。コンソールの [セキュリティ設定ページ](using-features.managing.security.md)または EB CLI の [eb init](eb3-init.md) コマンドを使用して、この操作を行います。環境のインスタンスに接続するには、EB CLI の [eb ssh](eb3-ssh.md) コマンドを使用します。

これで、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 コンテナエージェントを検査する
<a name="create_deploy_docker_ecstutorial_connect_inspect"></a>

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 リソースネーム](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html)) を示します。

詳細については、`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 Amazon ECS AWS CLI で を使用する手順、および Amazon ECS 全般の詳細については、[「Amazon ECS ユーザーガイド](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ECS_GetStarted.html)」を参照してください。