QuickStart: Docker Compose アプリケーションを Elastic Beanstalk にデプロイする - AWS Elastic Beanstalk

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

QuickStart: Docker Compose アプリケーションを Elastic Beanstalk にデプロイする

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

注記

チュートリアルの例は、デモンストレーションを目的としています。本番トラフィックにアプリケーションを使用しないでください。

AWS アカウント

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

AWS アカウントを既にお持ちの場合は、「」に進むことができます前提条件

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

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

にサインアップするには AWS アカウント
  1. https://portal.aws.amazon.com/billing/signup を開きます。

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

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

    にサインアップすると AWS アカウント、 AWS アカウントのルートユーザー が作成されます。ルートユーザーには、アカウントのすべての AWS のサービス とリソースへのアクセス権があります。セキュリティベストプラクティスとして、ユーザーに管理アクセス権を割り当て、ルートユーザーアクセスが必要なタスクの実行にはルートユーザーのみを使用するようにしてください。

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

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

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

を保護する AWS アカウントのルートユーザー
  1. ルートユーザーを選択し、 AWS アカウント E メールアドレスを入力して、アカウント所有者AWS Management Consoleとして にサインインします。次のページでパスワードを入力します。

    ルートユーザーを使用してサインインする方法については、AWS サインイン ユーザーガイドルートユーザーとしてサインインするを参照してください。

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

    手順については、IAM ユーザーガイドの AWS アカウント 「ルートユーザー (コンソール) の仮想 MFA デバイスを有効にする」を参照してください。

管理アクセスを持つユーザーを作成する
  1. IAM アイデンティティセンターを有効にします。

    手順については、「AWS IAM Identity Center ユーザーガイド」の「AWS IAM Identity Centerの有効化」を参照してください。

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

    を ID ソース IAM アイデンティティセンターディレクトリ として使用する方法のチュートリアルについては、AWS IAM Identity Center 「 ユーザーガイド」の「デフォルトを使用してユーザーアクセスを設定する IAM アイデンティティセンターディレクトリ」を参照してください。

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

    IAM Identity Center ユーザーを使用してサインインする方法については、AWS サインイン 「 ユーザーガイド」の AWS 「 アクセスポータルにサインインする」を参照してください。

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

    手順については、「AWS IAM Identity Center ユーザーガイド」の「権限設定を作成するを参照してください

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

    手順については、「AWS IAM Identity Center ユーザーガイド」の「グループの結合」を参照してください。

前提条件

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

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

Linux および macOS では、任意のシェルとパッケージ管理者を使用できます。Windows では、Linux 用の Windows サブシステムをインストールして、Ubuntu および Bash の Windows に統合されたバージョンを入手できます。

EB CLI

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

Docker と Docker Compose

このチュートリアルに従うには、Docker と Docker Compose のローカルインストールが必要です。詳細については、Docker ドキュメントウェブサイトの「Get Docker and Install Docker Compose」を参照してください。

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

~$ docker info ~$ docker compose version

ステップ 1: Docker Compose アプリケーションを作成する

この例では、Flask ウェブアプリケーションと nginx リバースプロキシで構成される Docker Compose を使用してマルチコンテナアプリケーションを作成します。これは、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ファイルを作成します。

~/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 ファイルに次の内容を追加します。

~/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

~/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 が詳細なアプリケーションメトリクスを収集できるようにするヘルスモニタリング設定が含まれています。ヘルスモニタリングログ形式のカスタマイズの詳細については、「」を参照してください拡張ヘルスログ形式

~/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

~/eb-docker-compose-flask/proxy/Dockerfile
FROM public.ecr.aws/nginx/nginx:alpine COPY nginx.conf /etc/nginx/nginx.conf EXPOSE 80

最後に、プラットフォームフックスクリプトを作成して、ヘルスモニタリングに必要なログディレクトリとアクセス許可を設定します。プラットフォームフックを使用すると、デプロイプロセス中にカスタムスクリプトを実行できます。プラットフォームフックの詳細については、「」を参照してくださいプラットフォームフック

~/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: アプリケーションをローカルに実行する

docker compose 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 アプリケーションをデプロイする

次のコマンドを実行して、このアプリケーションの 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 プラットフォームバージョンで環境を作成します。

  2. (オプション) 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 を実行します。

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

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

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

ステップ 4: Elastic Beanstalk でアプリケーションをテストする

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

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

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

ステップ 5:クリーンアップ

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

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

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

AWS アプリケーションの リソース

複数のコンテナを実行する単一のインスタンスアプリケーションを作成しました。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 グループはレスポンスとしてスケールアップまたはダウンを行います。

  • AWS CloudFormation スタック – Elastic Beanstalk は AWS CloudFormation を使用して環境内のリソースを起動し、設定変更を伝達します。リソースは、AWS CloudFormation コンソールに表示できるテンプレートで定義されます。

  • ドメイン名 – ウェブ・アプリケーションまでのルートとなるドメイン名であり、subdomain.region.elasticbeanstalk.com の形式です。

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

次のステップ

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

サンプルアプリケーションを 1 つか 2 つデプロイし、Docker Compose アプリケーションの開発と実行をローカルで開始する準備ができたら、「」を参照してくださいElastic Beanstalk へのデプロイ用に Docker イメージを準備する

Elastic Beanstalk コンソールでデプロイする

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