QuickStart: Elastic Beanstalk に Docker Compose アプリケーションをデプロイする
この QuickStart チュートリアルでは、マルチコンテナ Docker Compose アプリケーションを作成して AWS Elastic Beanstalk 環境にデプロイする手順を説明します。Docker Compose が複数のコンテナのオーケストレーションを簡素化する方法をデモンストレーションするために、nginx リバースプロキシを使用して Flask ウェブアプリケーションを作成します。
本番稼働用ではない
例はデモンストレーションのみを目的としています。サンプルアプリケーションを本番環境で使用しないでください。
セクション
AWS アカウント
まだ AWS をご利用でない場合は、AWS アカウントを作成する必要があります。サインアップすることによって Elastic Beanstalk とその他の AWS のサービスにアクセスできるようになります。
AWS アカウントが既にある場合は、前提条件 に進むことができます。
AWS アカウント へのサインアップ
AWS アカウント がない場合は、以下のステップを実行して作成します。
AWS アカウントにサインアップするには
https://portal.aws.amazon.com/billing/signup
を開きます。 オンラインの手順に従います。
サインアップ手順の一環として、電話またはテキストメッセージを受け取り、電話キーパッドで検証コードを入力します。
AWS アカウント にサインアップすると、AWS アカウントのルートユーザー が作成されます。ルートユーザーには、アカウントのすべての AWS のサービスとリソースへのアクセス権があります。セキュリティのベストプラクティスとして、ユーザーに管理アクセスを割り当て、ルートユーザーのみを使用してルートユーザーアクセスが必要なタスクを実行してください。
サインアップ処理が完了すると、AWS からユーザーに確認メールが送信されます。https://aws.amazon.com/
管理アクセスを持つユーザーを作成する
AWS アカウント にサインアップしたら、AWS アカウントのルートユーザー をセキュリティで保護し、AWS IAM アイデンティティセンター を有効にして、管理ユーザーを作成します。これにより、日常的なタスクにルートユーザーを使用しないようにします。
AWS アカウントのルートユーザーをセキュリティで保護する
-
[ルートユーザー] を選択し、AWS アカウント のメールアドレスを入力して、アカウント所有者として AWS マネジメントコンソール
にサインインします。次のページでパスワードを入力します。 ルートユーザーを使用してサインインする方法については、AWS サインイン ユーザーガイドのルートユーザーとしてサインインするを参照してください。
-
ルートユーザーの多要素認証 (MFA) を有効にします。
手順については、「IAM ユーザーガイド」で AWS アカウントのルートユーザーの仮想 MFA デバイスを有効にする方法 (コンソール) を確認してください。
管理アクセスを持つユーザーを作成する
-
IAM アイデンティティセンターを有効にします。
手順については、「AWS IAM アイデンティティセンター ユーザーガイド」の「AWS IAM アイデンティティセンター の有効化」を参照してください。
-
IAM アイデンティティセンターで、ユーザーに管理アクセスを付与します。
IAM アイデンティティセンターディレクトリ をアイデンティティソースとして使用するチュートリアルについては、「AWS IAM アイデンティティセンター ユーザーガイド」の「 Configure user access with the default IAM アイデンティティセンターディレクトリ」を参照してください。
管理アクセス権を持つユーザーとしてサインインする
-
IAM アイデンティティセンターのユーザーとしてサインインするには、IAM アイデンティティセンターのユーザーの作成時に E メールアドレスに送信されたサインイン URL を使用します。
IAM アイデンティティセンターユーザーを使用してサインインする方法については、「AWS サインイン User Guide」の「Signing in to the AWS access portal」を参照してください。
追加のユーザーにアクセス権を割り当てる
-
IAM アイデンティティセンターで、最小特権のアクセス許可を適用するというベストプラクティスに従ったアクセス許可セットを作成します。
手順については、「AWS IAM アイデンティティセンター ユーザーガイド」の「権限設定を作成する」を参照してください。
-
グループにユーザーを割り当て、そのグループにシングルサインオンアクセス権を割り当てます。
手順については、「AWS IAM アイデンティティセンター ユーザーガイド」の「Add groups」を参照してください。
前提条件
このガイドの手順に従うには、run commands のためのコマンドラインターミナルまたはシェルが必要になります。コマンドは、該当する場合、プロンプト記号 ($) と現在のディレクトリの名前が前に付けられて、リストに示されます。
~/eb-project$ this is a command
this is output
Linux および macOS では、任意のシェルとパッケージ管理者を使用できます。Windows では、Linux 用の Windows サブシステムをインストール
EB CLI
このチュートリアルでは、Elastic Beanstalk コマンドラインインターフェイス (EB CLI) を使用します。EB CLI をインストールおよび設定する手順の詳細については、「セットアップスクリプトを使用して EB CLI をインストールする (推奨)」および「EB CLI の設定」を参照してください。
Docker と Docker Compose
このチュートリアルを実行するには、作業用 Docker と Docker Compose がローカルにインストールされている必要があります。詳細については、Docker ドキュメントウェブサイトの「Docker を取得する
次のコマンドを実行して、Docker と Docker Compose がインストールされ、実行されていることを確認します。
~$ docker info
~$ docker compose version
ステップ 1: Docker Compose アプリケーションを作成する
この例では、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 ファイルを作成します。
例 ~/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 updocker-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 アプリケーションをデプロイするには
-
eb init コマンドを使用して EB CLI リポジトリを初期化します。
~/eb-docker-compose-flask$eb init -p docker docker-compose-tutorial --regionApplication docker-compose-tutorial has been created.us-east-2このコマンドは、
docker-compose-tutorialという名前のアプリケーションを作成し、ローカルリポジトリを設定して最新の Docker プラットフォームバージョンで環境を作成します。 -
(オプション) eb init を再度実行してデフォルトのキーペアを設定し、アプリケーションを実行している EC2 インスタンスに SSH を使用して connect できるようにします。
~/eb-docker-compose-flask$eb initDo you want to set up SSH for your instances? (y/n):ySelect a keypair. 1) my-keypair 2) [ Create new KeyPair ]1 つのキーペアがすでにある場合はそれを選択するか、またはプロンプトに従ってキーペアを作成します。プロンプトが表示されないか設定を後で変更する必要がない場合は、eb init -i を実行します。
-
環境を作成し、eb create を使用してそこにアプリケーションをデプロイします。Elastic Beanstalk は
docker-compose.ymlファイルを自動的に検出し、マルチコンテナアプリケーションをデプロイします。~/eb-docker-compose-flask$eb create docker-compose-tutorialElastic 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 つのインスタンスアプリケーションを作成しました。1 つの EC2 インスタンスを持つ簡単なサンプルアプリケーションとして動作するため、ロードバランシングや自動スケーリングは必要ありません。1 つのインスタンスアプリケーションの場合、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 コンソール
に表示できるテンプレートで定義されます。 -
ドメイン名 – ウェブ・アプリケーションまでのルートとなるドメイン名であり、
subdomain.region.elasticbeanstalk.com の形式です。
Elastic Beanstalk は、これらのリソースをすべて管理します。環境を終了すると、Elastic Beanstalk は含まれているすべてのリソースを終了します。Docker Compose アプリケーションは、1 つの EC2 インスタンスで複数のコンテナを実行し、Elastic Beanstalk がオーケストレーションを自動的に処理するようにします。
次のステップ
アプリケーションを実行する環境を手に入れた後、アプリケーションの新しいバージョンや、異なるアプリケーションをいつでもデプロイできるようになります。新しいアプリケーションバージョンのデプロイは、プロビジョニングや EC2 インスタンスの再開が必要ないため、非常に素早く行えます。Elastic Beanstalk コンソールを使用して新しい環境を調べることもできます。詳細な手順については、このガイドの「開始方法」の章の「環境を探索する」を参照してください。
1 つか 2 つのサンプルアプリケーションをデプロイし、ローカルで Docker Compose アプリケーションを開発して実行する準備が整ったら、「Elastic Beanstalk へのデプロイ用に Docker イメージを準備する」を参照します。
Elastic Beanstalk コンソールでデプロイする
Elastic Beanstalk コンソールを使用して Docker Compose アプリケーションを起動することもできます。docker-compose.yml ファイルと、すべての関連付けられたディレクトリとファイルを含む ZIP ファイルを作成し、新しいアプリケーションを作成するときにアップロードします。詳細な手順については、このガイドの「開始方法」の章の「サンプルアプリケーションを作成する」を参照してください。