

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

# QuickStart: Elastic Beanstalk に Docker Compose アプリケーションをデプロイする
<a name="docker-compose-quickstart"></a>

この QuickStart チュートリアルでは、複数コンテナの Docker Compose アプリケーションを作成し、 AWS Elastic Beanstalk 環境にデプロイするプロセスについて説明します。Docker Compose が複数のコンテナのオーケストレーションを簡素化する方法をデモンストレーションするために、nginx リバースプロキシを使用して Flask ウェブアプリケーションを作成します。

**本番稼働用ではない**  
例はデモンストレーションのみを目的としています。サンプルアプリケーションを本番環境で使用しないでください。

**Topics**
+ [AWS アカウント](#docker-compose-quickstart-aws-account)
+ [前提条件](#docker-compose-quickstart-prereq)
+ [ステップ 1: Docker Compose アプリケーションを作成する](#docker-compose-quickstart-create-app)
+ [ステップ 2: アプリケーションをローカルに実行する](#docker-compose-quickstart-run-local)
+ [ステップ 3: EB CLI を使用して Docker Compose アプリケーションをデプロイする](#docker-compose-quickstart-deploy)
+ [ステップ 4: Elastic Beanstalk でアプリケーションをテストする](#docker-compose-quickstart-run-eb-ap)
+ [ステップ 5：クリーンアップ](#docker-compose-quickstart-cleanup)
+ [AWS アプリケーションの リソース](#docker-compose-quickstart-eb-resources)
+ [次の手順](#docker-compose-quickstart-next-steps)
+ [Elastic Beanstalk コンソールでデプロイする](#docker-compose-quickstart-console)

## AWS アカウント
<a name="docker-compose-quickstart-aws-account"></a>

まだ AWS のお客様でない場合は、 AWS アカウントを作成する必要があります。サインアップすると、Elastic Beanstalk やその他の必要な AWS サービスにアクセスできます。

 AWS アカウントを既にお持ちの場合は、「」に進むことができます[前提条件](#docker-compose-quickstart-prereq)。

### AWS アカウントを作成する
<a name="docker-compose-quickstart-aws-account-procedure"></a>

#### にサインアップする AWS アカウント
<a name="sign-up-for-aws"></a>

がない場合は AWS アカウント、次の手順を実行して作成します。

**にサインアップするには AWS アカウント**

1. [https://portal.aws.amazon.com/billing/signup](https://portal.aws.amazon.com/billing/signup) を開きます。

1. オンラインの手順に従います。

   サインアップ手順の一環として、電話またはテキストメッセージを受け取り、電話キーパッドで検証コードを入力します。

   にサインアップすると AWS アカウント、 *AWS アカウントのルートユーザー* が作成されます。ルートユーザーには、アカウントのすべての AWS のサービス とリソースへのアクセス権があります。セキュリティベストプラクティスとして、ユーザーに管理アクセス権を割り当て、[ルートユーザーアクセスが必要なタスク](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)の実行にはルートユーザーのみを使用するようにしてください。

AWS サインアッププロセスが完了すると、 から確認メールが送信されます。[https://aws.amazon.com/](https://aws.amazon.com/) の **[マイアカウント]** をクリックして、いつでもアカウントの現在のアクティビティを表示し、アカウントを管理することができます。

#### 管理アクセスを持つユーザーを作成する
<a name="create-an-admin"></a>

にサインアップしたら AWS アカウント、日常的なタスクにルートユーザーを使用しないように AWS アカウントのルートユーザー、 を保護し AWS IAM アイデンティティセンター、 を有効にして管理ユーザーを作成します。

**を保護する AWS アカウントのルートユーザー**

1.  **ルートユーザー**を選択し、 AWS アカウント E メールアドレスを入力して、アカウント所有者[AWS マネジメントコンソール](https://console.aws.amazon.com/)として にサインインします。次のページでパスワードを入力します。

   ルートユーザーを使用してサインインする方法については、「*AWS サインイン ユーザーガイド*」の「[ルートユーザーとしてサインインする](https://docs.aws.amazon.com/signin/latest/userguide/console-sign-in-tutorials.html#introduction-to-root-user-sign-in-tutorial)」を参照してください。

1. ルートユーザーの多要素認証 (MFA) を有効にします。

   手順については、*IAM* [ユーザーガイドの AWS アカウント 「ルートユーザー (コンソール) の仮想 MFA デバイス](https://docs.aws.amazon.com/IAM/latest/UserGuide/enable-virt-mfa-for-root.html)を有効にする」を参照してください。

**管理アクセスを持つユーザーを作成する**

1. IAM アイデンティティセンターを有効にします。

   手順については、「*AWS IAM アイデンティティセンター ユーザーガイド*」の「[AWS IAM アイデンティティセンターの有効化](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-set-up-for-idc.html)」を参照してください。

1. IAM アイデンティティセンターで、ユーザーに管理アクセスを付与します。

   を ID ソース IAM アイデンティティセンターディレクトリ として使用する方法のチュートリアルについては、「 *AWS IAM アイデンティティセンター ユーザーガイド*」の[「デフォルトを使用してユーザーアクセスを設定する IAM アイデンティティセンターディレクトリ](https://docs.aws.amazon.com//singlesignon/latest/userguide/quick-start-default-idc.html)」を参照してください。

**管理アクセス権を持つユーザーとしてサインインする**
+ IAM アイデンティティセンターのユーザーとしてサインインするには、IAM アイデンティティセンターのユーザーの作成時に E メールアドレスに送信されたサインイン URL を使用します。

  IAM Identity Center ユーザーを使用してサインインする方法については、*AWS サインイン 「 ユーザーガイド*[」の AWS 「 アクセスポータルにサインイン](https://docs.aws.amazon.com/signin/latest/userguide/iam-id-center-sign-in-tutorial.html)する」を参照してください。

**追加のユーザーにアクセス権を割り当てる**

1. IAM アイデンティティセンターで、最小特権のアクセス許可を適用するというベストプラクティスに従ったアクセス許可セットを作成します。

   手順については、「*AWS IAM アイデンティティセンター ユーザーガイド*」の「[アクセス許可セットを作成する](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-started-create-a-permission-set.html)」を参照してください。

1. グループにユーザーを割り当て、そのグループにシングルサインオンアクセス権を割り当てます。

   手順については、「*AWS IAM アイデンティティセンター ユーザーガイド*」の「[グループを追加する](https://docs.aws.amazon.com//singlesignon/latest/userguide/addgroups.html)」を参照してください。

## 前提条件
<a name="docker-compose-quickstart-prereq"></a>

このガイドの手順に従うには、run commands のためのコマンドラインターミナルまたはシェルが必要になります。コマンドは、該当する場合、プロンプト記号 ($) と現在のディレクトリの名前が前に付けられて、リストに示されます。

```
~/eb-project$ this is a command
this is output
```

Linux および macOS では、任意のシェルとパッケージ管理者を使用できます。Windows では、[Linux 用の Windows サブシステムをインストール](https://docs.microsoft.com/en-us/windows/wsl/install-win10)して、Ubuntu および Bash の Windows に統合されたバージョンを入手できます。

### EB CLI
<a name="docker-compose-quickstart-prereq.ebcli"></a>

このチュートリアルでは、Elastic Beanstalk コマンドラインインターフェイス (EB CLI) を使用します。EB CLI をインストールおよび設定する手順の詳細については、「[セットアップスクリプトを使用して EB CLI をインストールする (推奨)](eb-cli3.md#eb-cli3-install)」および「[EB CLI の設定](eb-cli3-configuration.md)」を参照してください。

### Docker と Docker Compose
<a name="docker-compose-quickstart-prereq.runtime"></a>

このチュートリアルを実行するには、作業用 Docker と Docker Compose がローカルにインストールされている必要があります。詳細については、Docker ドキュメントウェブサイトの「[Docker を取得する](https://docs.docker.com/get-docker/)」と「[Docker Compose をインストールする](https://docs.docker.com/compose/install/)」を参照してください。

次のコマンドを実行して、Docker と Docker Compose がインストールされ、実行されていることを確認します。

```
~$ docker info
~$ docker compose version
```

## ステップ 1: Docker Compose アプリケーションを作成する
<a name="docker-compose-quickstart-create-app"></a>

この例では、Docker Compose を使用して、Flask ウェブアプリケーションと nginx リバースプロキシで構成されるマルチコンテナアプリケーションを作成します。これは、Docker Compose が、連携する複数のコンテナのオーケストレーションを簡素化する方法を示しています。

アプリケーションには、Elastic Beanstalk が nginx プロキシから詳細なアプリケーションメトリクスを収集できるようにするヘルスモニタリング設定が含まれています。

アプリケーションは、次の構造で構成されています。

```
~/eb-docker-compose-flask/
|-- docker-compose.yml
|-- web/
|   |-- Dockerfile
|   |-- app.py
|   `-- requirements.txt
|-- proxy/
|   |-- Dockerfile
|   `-- nginx.conf
`-- .platform/
    `-- hooks/
        `-- postdeploy/
            `-- 01_setup_healthd_permissions.sh
```

ディレクトリ構造を作成し、以下のファイルを追加します。

まず、サービスとその関係を定義するメイン `docker-compose.yml` ファイルを作成します。

**Example `~/eb-docker-compose-flask/docker-compose.yml`**  

```
services:
  web:
    build: ./web
    expose:
      - "5000"

  nginx-proxy:
    build: ./proxy
    ports:
      - "80:80"
    volumes:
      - "/var/log/nginx:/var/log/nginx"
    depends_on:
      - web
```

`web` ディレクトリで、Flask ウェブアプリケーションを作成します。`app.py` ファイルに次の内容を追加します。

**Example `~/eb-docker-compose-flask/web/app.py`**  

```
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
    return 'Hello Elastic Beanstalk! This is a Docker Compose application'
```

ウェブサービス `Dockerfile` に次の内容を追加します。

**Example `~/eb-docker-compose-flask/web/Dockerfile`**  

```
FROM public.ecr.aws/docker/library/python:3.12
COPY . /app
WORKDIR /app
RUN pip install Flask==3.1.1
EXPOSE 5000
CMD [ "python3", "-m" , "flask", "run", "--host=0.0.0.0"]
```

`proxy` ディレクトリで、nginx リバースプロキシを作成します。`nginx.conf` ファイルに次の内容を追加します。

この設定には、Elastic Beanstalk が詳細なアプリケーションメトリクスを収集できるようにするヘルスモニタリングのセットアップが含まれています。ヘルスモニタリングログ形式のカスタマイズの詳細については、「[拡張ヘルスログ形式](health-enhanced-serverlogs.md)」を参照してください。

**Example `~/eb-docker-compose-flask/proxy/nginx.conf`**  

```
events {
    worker_connections 1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    map $http_upgrade $connection_upgrade {
        default       "upgrade";
    }

    # Health monitoring log format for Elastic Beanstalk
    log_format healthd '$msec"$uri"$status"$request_time"$upstream_response_time"$http_x_forwarded_for';
    
    upstream flask_app {
        server web:5000;
    }

    server {
        listen 80 default_server;
        root /usr/share/nginx/html;

        # Standard access log
        access_log /var/log/nginx/access.log;
        
        # Health monitoring log for Elastic Beanstalk
        if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2})") {
            set $year $1;
            set $month $2;
            set $day $3;
            set $hour $4;
        }
        access_log /var/log/nginx/healthd/application.log.$year-$month-$day-$hour healthd;
        
        location / {
            proxy_pass http://flask_app;
            proxy_http_version    1.1;

            proxy_set_header    Connection             $connection_upgrade;
            proxy_set_header    Upgrade                $http_upgrade;
            proxy_set_header    Host                   $host;
            proxy_set_header    X-Real-IP              $remote_addr;
            proxy_set_header    X-Forwarded-For        $proxy_add_x_forwarded_for;
        }
    }
}
```

プロキシサービス `Dockerfile` に次の内容を追加します。

**Example `~/eb-docker-compose-flask/proxy/Dockerfile`**  

```
FROM public.ecr.aws/nginx/nginx:alpine
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
```

最後に、プラットフォームフックスクリプトを作成して、ヘルスモニタリングに必要なログディレクトリとアクセス許可をセットアップします。プラットフォームフックにより、デプロイプロセス中にカスタムスクリプトを実行できるようになります。プラットフォームフックの詳細については、「[プラットフォームフック](platforms-linux-extend.hooks.md)」を参照してください。

**Example `~/eb-docker-compose-flask/.platform/hooks/postdeploy/01_setup_healthd_permissions.sh`**  

```
#!/bin/bash
set -ex

NGINX_CONTAINER=$(docker ps --filter "name=nginx-proxy" -q)

if [ -z "$NGINX_CONTAINER" ]; then
    echo "Error: No nginx-proxy container found running"
    exit 1
fi

NGINX_UID=$(docker exec ${NGINX_CONTAINER} id -u nginx)
NGINX_GID=$(docker exec ${NGINX_CONTAINER} id -g nginx)

mkdir -p /var/log/nginx/healthd
chown -R ${NGINX_UID}:${NGINX_GID} /var/log/nginx
```

## ステップ 2: アプリケーションをローカルに実行する
<a name="docker-compose-quickstart-run-local"></a>

[docker compose up](https://docs.docker.com/compose/reference/up/) コマンドを使用して、マルチコンテナアプリケーションをローカルで構築して実行します。Docker Compose は両方のコンテナイメージを構築し、`docker-compose.yml` ファイルで定義されたサービスを開始します。

```
~/eb-docker-compose-flask$ docker compose up --build
```

**--build** オプションにより、Docker Compose はサービスを開始する前にコンテナイメージを構築することが保証されます。ウェブサービスと nginx-proxy サービスの両方が起動中であることを示す出力が表示されます。

ブラウザで `http://localhost` にアクセスします。次のテキストが表示されます。「Hello Elastic Beanstalk\! これは Docker Compose アプリケーションです」。nginx プロキシは、ポート 80 でリクエストを受信し、ポート 5000 で実行されている Flask アプリケーションに転送します。

テストが終了したら、ターミナルで **Ctrl\+C** を押してアプリケーションを停止するか、別のターミナルで次のコマンドを実行します。

```
~/eb-docker-compose-flask$ docker compose down
```

## ステップ 3: EB CLI を使用して Docker Compose アプリケーションをデプロイする
<a name="docker-compose-quickstart-deploy"></a>

次のコマンドを実行して、このアプリケーションの Elastic Beanstalk 環境を作成します。

 

**環境を作成し、Docker Compose アプリケーションをデプロイするには**

1. **eb init** コマンドを使用して EB CLI リポジトリを初期化します。

   ```
   ~/eb-docker-compose-flask$ eb init -p docker docker-compose-tutorial --region {{us-east-2}}
   Application docker-compose-tutorial has been created.
   ```

   このコマンドは、`docker-compose-tutorial` という名前のアプリケーションを作成し、ローカルリポジトリを設定して最新の Docker プラットフォームバージョンで環境を作成します。

1. (オプション) **eb init** を再度実行してデフォルトのキーペアを設定し、アプリケーションを実行している EC2 インスタンスに SSH を使用して connect できるようにします。

   ```
   ~/eb-docker-compose-flask$ eb init
   Do you want to set up SSH for your instances?
   (y/n): y
   Select a keypair.
   1) my-keypair
   2) [ Create new KeyPair ]
   ```

   1 つのキーペアがすでにある場合はそれを選択するか、またはプロンプトに従ってキーペアを作成します。プロンプトが表示されないか設定を後で変更する必要がない場合は、**eb init -i** を実行します。

1. 環境を作成し、**eb create** を使用してそこにアプリケーションをデプロイします。Elastic Beanstalk は `docker-compose.yml` ファイルを自動的に検出し、マルチコンテナアプリケーションをデプロイします。

   ```
   ~/eb-docker-compose-flask$ eb create docker-compose-tutorial
   ```

   Elastic Beanstalk が環境を作成してマルチコンテナアプリケーションをデプロイするのに約 5 分かかります。

## ステップ 4: Elastic Beanstalk でアプリケーションをテストする
<a name="docker-compose-quickstart-run-eb-ap"></a>

環境を作成するプロセスが完了したら、**eb open** でウェブサイトを開きます。

```
~/eb-docker-compose-flask$ eb open
```

素晴らしい！Elastic Beanstalk でマルチコンテナ Docker Compose アプリケーションをデプロイしました\! これにより、アプリケーション用に作成されたドメイン名を使用してブラウザ Window が開きます。nginx リバースプロキシを介して機能する Flask アプリケーションからのメッセージが表示されます。

## ステップ 5：クリーンアップ
<a name="docker-compose-quickstart-cleanup"></a>

アプリケーションでの作業が終了したら、環境を終了できます。Elastic Beanstalk は、環境に関連付けられているすべての AWS リソースを終了します。

EB CLI を使用して Elastic Beanstalk 環境を終了するには、次のコマンドを実行します。

```
~/eb-docker-compose-flask$ eb terminate
```

## AWS アプリケーションの リソース
<a name="docker-compose-quickstart-eb-resources"></a>

複数のコンテナを実行している 1 つのインスタンスアプリケーションを作成しました。1 つの EC2 インスタンスを持つ簡単なサンプルアプリケーションとして動作するため、ロードバランシングや自動スケーリングは必要ありません。単一インスタンスアプリケーションの場合、Elastic Beanstalk は次の AWS リソースを作成します。
+ **EC2 インスタンス** – 選択したプラットフォームでウェブアプリケーションを実行するよう設定された Amazon EC2 仮想マシン。

  各プラットフォームは、それぞれ特定の言語バージョン、フレームワーク、ウェブコンテナ、またはそれらの組み合わせをサポートするための、さまざまなソフトウェア、設定ファイル、スクリプトを実行します。ほとんどのプラットフォームでは、ウェブアプリケーションの前にウェブトラフィックを処理するリバースプロキシとして Apache または nginx のいずれかを使用します。そのプロキシがリクエストをアプリケーションに転送し、静的アセットを提供して、アクセスログとエラーログを生成します。
+ **インスタンスセキュリティグループ** – ポート 80 上の受信トラフィックを許可するよう設定された Amazon EC2 セキュリティグループ。このリソースでは、ロードバランサーからの HTTP トラフィックが、ウェブ・アプリケーションを実行している EC2 インスタンスに達することができます。デフォルトでは、トラフィックは他のポート上で許可されません。
+ **Amazon S3 バケット** – Elastic Beanstalk の使用時に作成されるソースコード、ログ、その他のアーティファクトの保存場所。
+ **Amazon CloudWatch アラーム** – 環境内のインスタンスの負荷を監視する 2 つの CloudWatch アラーム。負荷が高すぎる、または低すぎる場合にトリガーされます。アラームがトリガーされると、Auto Scaling グループはレスポンスとしてスケールアップまたはダウンを行います。
+ **CloudFormation スタック** – Elastic Beanstalk は CloudFormation を使用して環境内のリソースを起動し、設定変更を伝達します。リソースは、[CloudFormation コンソール](https://console.aws.amazon.com/cloudformation)に表示できるテンプレートで定義されます。
+  **ドメイン名** – ウェブ・アプリケーションまでのルートとなるドメイン名であり、*{{subdomain}}.{{region}}.elasticbeanstalk.com* の形式です。

Elastic Beanstalk は、これらのリソースをすべて管理します。環境を終了すると、Elastic Beanstalk は含まれているすべてのリソースを終了します。Docker Compose アプリケーションは、1 つの EC2 インスタンスで複数のコンテナを実行し、Elastic Beanstalk がオーケストレーションを自動的に処理するようにします。

## 次の手順
<a name="docker-compose-quickstart-next-steps"></a>

アプリケーションを実行する環境を手に入れた後、アプリケーションの新しいバージョンや、異なるアプリケーションをいつでもデプロイできるようになります。新しいアプリケーションバージョンのデプロイは、プロビジョニングや EC2 インスタンスの再開が必要ないため、非常に素早く行えます。Elastic Beanstalk コンソールを使用して新しい環境を調べることもできます。詳細な手順については、このガイドの「*開始方法*」の章の「[環境を探索する](GettingStarted.md#GettingStarted.Explore)」を参照してください。

1 つか 2 つのサンプルアプリケーションをデプロイし、ローカルで Docker Compose アプリケーションを開発して実行する準備が整ったら、「[Elastic Beanstalk へのデプロイ用に Docker イメージを準備する](single-container-docker-configuration.md)」を参照します。

## Elastic Beanstalk コンソールでデプロイする
<a name="docker-compose-quickstart-console"></a>

Elastic Beanstalk コンソールを使用して Docker Compose アプリケーションを起動することもできます。`docker-compose.yml` ファイルと、すべての関連付けられたディレクトリとファイルを含む ZIP ファイルを作成し、新しいアプリケーションを作成するときにアップロードします。詳細な手順については、このガイドの「*開始方法*」の章の「[サンプルアプリケーションを作成する](GettingStarted.md#GettingStarted.CreateApp)」を参照してください。