ビジネスアプリケーションをスケーリンググループ内の Elastic Compute Service (ECS) インスタンスに継続的にデプロイ (継続的デプロイメント) するには、Auto Scaling のアプリケーション公開機能を使用します。この機能は、アプリケーションのリリースを自動化し、ライフサイクルフックと統合することで、自動公開とグレースフルシャットダウンを可能にします。
概要
Auto Scaling のアプリケーション公開機能は、アプリケーションのソースファイルと起動/停止スクリプトをデプロイメントアーティファクトにカプセル化します。その後、システムはこのアーティファクトを標準化されたリリースプロセスを通じてスケーリンググループ内のインスタンスにデプロイします。
サポートされるデプロイメントアーティファクトタイプ
アプリケーションのソースファイルがどこに保存されているかに基づいて、デプロイメントアーティファクトのタイプを選択します。
|
タイプ |
説明 |
ユースケース |
|
OSS ファイル |
JAR や ZIP パッケージなどのアプリケーションファイルは Object Storage Service (OSS) に保存されます。リリース中に、システムは自動的にファイルをダウンロードし、スクリプトを実行します。 |
Java アプリケーションなどの従来のアプリケーションデプロイメント。 |
|
ECS イメージ |
アプリケーションは ECS イメージにプリインストールされています。リリース中に、システムはインスタンスのシステムディスクを置き換えます。 |
高速な起動や複雑な環境を必要とするアプリケーション。 |
|
Docker イメージ |
アプリケーションイメージは Container Registry (ACR) に保存されます。リリース中に、システムは自動的にイメージをプルし、コンテナが起動します。 |
コンテナ化されたアプリケーションのデプロイメント。 |
|
コマンド実行のみ |
ソースファイルを指定せずに、シェルスクリプトのみを実行します。 |
柔軟なスクリプトによるデプロイメントや、サードパーティのソースを使用するデプロイメント。 |
公開機能
-
リリースモード:すべてのインスタンスへのフルリリースと、検証のために手動で選択したインスタンスへのカナリアリリースをサポートします。
-
バッチ制御:リリースバッチを定義し、バッチ間に一時停止を構成して、リリースリスクを低減できます。
-
Auto Scaling との統合:
-
スケールアウト時の自動公開:スケールアウトイベント中に作成された新しいインスタンスは、最新のアプリケーションバージョンを自動的にデプロイして一貫性を確保します。
-
スケールイン時のグレースフルシャットダウン:スケールインイベントの前に、停止スクリプトが実行され、インスタンスがリリースされる前にビジネスプロセスが完了することを確認します。
-
制限事項
-
インスタンスのオペレーティングシステム:Linux ECS インスタンスのみがサポートされています。
-
スクリプト言語:起動スクリプトと停止スクリプトでは、シェルスクリプトのみがサポートされています。
-
デプロイメントフロー:プロセスは停止してから開始の原則に従います。各デプロイメントでは、まず停止スクリプトが実行され、以前のアプリケーションバージョンが適切に停止されたことを確認してから、起動スクリプトが実行されます。
-
データリスク:「ECS イメージ」デプロイメントタイプを使用する場合、システムはインスタンスのシステムディスクを置き換えます。続行する前に、重要なデータをバックアップする必要があります。
デプロイメントアーティファクトの作成
-
Auto Scaling コンソールにログインします。
左側のナビゲーションウィンドウで、[スケーリンググループ] をクリックします。
上部のナビゲーションバーで、Auto Scaling が有効化されているリージョンを選択します。
-
[スケーリンググループ ID] をクリックしてスケーリンググループの詳細ページを開き、 に移動します。
-
ユースケースに基づいてデプロイメントアーティファクトのタイプを選択し、構成します。
OSS ファイル
このタイプは、JAR、WAR、ZIP ファイルなどのアプリケーションパッケージが OSS に保存されている場合に使用します。リリース中に、システムは指定された作業ディレクトリにファイルを自動的にダウンロードします。その後、アプリケーション停止スクリプトを実行して以前のアプリケーションバージョン (もしあれば) を停止し、次にアプリケーション起動スクリプトを実行して新しいアプリケーションを起動します。
-
パラメーター:
-
OSS 情報: [OSS リージョン] と [OSS バケット] を選択します。OSSファイル フィールドに、
apps/sample-spring-1.0-SNAPSHOT.jarのように、バケット内のファイルへのパスを入力します。 -
内部ネットワーク経由でダウンロード:ご利用の ECS インスタンスと OSS バケットが同じリージョンにある場合は、ダウンロード速度を向上させるためにこのオプションを有効にすることを推奨します。
-
-
起動/停止スクリプトの例:
アプリケーション起動スクリプト:
start_application() { set -e yum install -y maven-3.5.4 java -jar ./sample-spring-1.0-SNAPSHOT.jar & } start_applicationアプリケーション停止スクリプト:
重要停止操作が不要な場合は、停止スクリプトを空のままにすることができます。その場合、システムはデプロイメント中に停止スクリプトをスキップします。
### アプリケーションを停止します (もしあれば)。 stop_application() { PID=$(ps -ef | grep "sample-spring-1.0-SNAPSHOT.jar" | grep -v "grep" | awk '{print $2}') if [ -n "$PID" ]; then kill -9 $PID fi } stop_application
ECS イメージ
このタイプは、複雑な環境を持つアプリケーションや、非常に高速な起動を必要とするアプリケーションに使用します。リリース中に、システムはスケーリンググループ内のインスタンスのシステムディスクを指定されたイメージに置き換えます。
ECSイメージ デプロイメントアーティファクトタイプを選択した場合、[追加] をクリックし、スケーリンググループと同じリージョンからイメージを選択します。
-
パラメーター:
-
リージョン:スケーリンググループと同じリージョンを選択します。
-
イメージ ID:スケーリンググループと同じリージョンにあり、デプロイされたアプリケーションを含むカスタムイメージを選択します。
-
重要ECSイメージ デプロイメントアーティファクトは、アプリケーションの起動/停止スクリプトをサポートしていません。アプリケーションを自動的に起動するには、アプリケーションを起動時に開始するように構成するか、手動でライフサイクルフックを構成する必要があります。
Docker イメージ
このタイプは、コンテナ化されたアプリケーションに使用します。リリース中に、システムは ACR からイメージを自動的にプルします。その後、アプリケーション停止スクリプトを実行して以前のコンテナバージョン (もしあれば) を停止し、次にアプリケーション起動スクリプトを実行して新しいコンテナを起動します。
重要Container Registry (ACR) Enterprise Edition の Docker イメージのみがサポートされています。ACR Personal Edition またはサードパーティのイメージリポジトリからのイメージについては、コマンド実行のみのデプロイメントタイプを使用してください。
-
パラメーター:
-
Docker イメージ情報: [Container Registry リージョン]、[Container Registry インスタンス ID]、ネームスペース、レジストリ名、および ミラーバージョン を設定します。
-
内部ネットワーク経由でプル:内部エンドポイントを使用してイメージをプルするには、イメージリポジトリと ECS インスタンスが同じ VPC にあることを確認してください。詳細については、「VPC のアクセス制御の設定」をご参照ください。
-
-
起動/停止スクリプト:
アプリケーション起動スクリプト:
重要-
ターゲットマシンに Docker がインストールされていることを確認してください。
-
スクリプトが実行される前に、システムは Docker イメージを ECS インスタンスに自動的にプルするため、スクリプトにイメージのプル操作を含める必要はありません。
### リリース中に、Docker イメージは自動的に ECS インスタンスにプルされます。コンテナを直接起動できます。 ### 現在のバージョンのコンテナを起動します。 ### このスクリプトを使用する際は、<image_name> を実際のイメージアドレスに置き換えてください。 start_application() { image_name="<image_name>" container_name="my-container" docker run -d -p 8080:8080 --name ${container_name} ${image_name} } start_applicationアプリケーション停止スクリプト:
重要停止操作が不要な場合は、停止スクリプトを空のままにすることができます。その場合、システムはデプロイメント中に停止スクリプトをスキップします。
stop_application() { # 名前でコンテナを検索します。存在する場合は削除します。 container_name="my-container" container_id=$(docker ps -aq -f name=${container_name}) if [ -n "$container_id" ]; then docker rm -f $container_id fi } stop_application -
コマンド実行のみ
このタイプは、サードパーティのソースからコードをダウンロードするなど、特定のソースファイルを必要とせず、シェルスクリプトのみを必要とするデプロイメントに使用します。リリース中に、システムはアプリケーション停止スクリプトを実行して以前のアプリケーションバージョン (もしあれば) を停止し、次にアプリケーション起動スクリプトを実行して新しいアプリケーションを起動します。
-
パラメーター:デプロイメントソースを構成する必要はありません。作業ディレクトリ を指定するだけです。
-
起動/停止スクリプトの例 (パブリックイメージのプル):
アプリケーション起動スクリプト:
### 現在のバージョンのアプリケーションを起動します。 start_application() { repo="<repo>" image="<image>" container_name="my-container" docker login --username=${username} --password=${password} $repo docker pull $image docker run -d -p 8080:8080 --name $container_name $image } start_applicationアプリケーション停止スクリプト:
重要停止操作が不要な場合は、停止スクリプトを空のままにすることができます。その場合、システムはデプロイメント中に停止スクリプトをスキップします。
### コンテナを停止します (もしあれば)。 stop_application() { # 名前でコンテナを検索し、存在する場合は削除します。 container_name="my-container" container_id=$(docker ps -aq -f name=${container_name}) if [ -n "$container_id" ]; then docker rm -f $container_id fi } stop_application
-
-
構成が完了したら、作成と公開 または 作成のみ をクリックします。
作成と公開 をクリックすると、デプロイメントのリリース の構成画面に移動します。
デプロイメントアーティファクトのリリース
-
アプリのリリース タブで、 の順に選択します。
-
公開したいアーティファクトの デプロイメントID を選択します。
-
リリースポリシーを構成します:
-
リリースモード:
-
フルリリース:グループ内のすべてのインスタンスにアーティファクトを公開します。
-
カナリアリリース:手動で選択したインスタンスにアーティファクトを公開します。
-
-
バッチポリシー:実行バッチ の数 (例:2) を設定し、[バッチモード] (一時停止なし、最初のバッチで一時停止、または各バッチで一時停止) を選択します。
-
弾力性シナリオ:[スケールアウト時の自動公開] と [スケールイン時のグレースフルシャットダウン] を有効にしておくことを推奨します。
-
スケールアウト時の自動公開:有効にすると、このオプションはスケールアウト中に作成された新しい ECS インスタンスにアプリケーションを自動的に公開します。公開プロセス中に、スケールアウトの ライフサイクルフックが自動的に構成されます。
-
スケールイン時のグレースフルシャットダウン:有効にすると、このオプションはスケールイン中に ECS インスタンス上でデプロイメントアーティファクトの停止スクリプトを実行してから操作を完了します。公開プロセス中に、スケールインの ライフサイクルフックが自動的に構成されます。
-
-
-
[OK] をクリックして公開を開始します。リストの [詳細] をクリックすると、実行ステータスと出力ログを表示できます。
本番環境での利用
本番環境での安定性を確保するために、以下のベストプラクティスに従ってください:
-
リリースリスクの低減:
-
まず、カナリアリリースを使用して、少数のインスタンスで新しいバージョンを検証します。
-
フルリリースを実行する際は、バッチリリースを使用し、最初のバッチ実行完了時に一時停止 を選択することを推奨します。最初のバッチが正常にリリースされ、検証された後、残りのバッチを続行できます。
-
-
業務継続性の確保:[スケールイン時のグレースフルシャットダウン] を有効にし、デプロイメントアーティファクトに包括的な停止スクリプトを記述します。例えば、スクリプトはリクエストの処理が完了するのを待ち、接続を閉じることで、スケールインイベント中のサービス中断を防ぐことができます。
-
バージョンの一貫性の確保:[スケールアウト時の自動公開] を有効にして、スケーリンググループによって自動的に作成された新しいインスタンスが古いアプリケーションバージョンを実行するのを防ぎます。
よくある質問
-
Windows インスタンスのサポート
いいえ。Linux ECS インスタンスのみがサポートされています。
-
公開中のスケーリング
はい。アプリケーションの公開プロセスは、スケーリングアクティビティをブロックしません。
-
リリースログと結果の表示
リリースタスクが開始された後、実行ID リストの デプロイメントのリリース をクリックすると、各インスタンスの実行ステータスと詳細なスクリプト出力ログを表示できます。
-
デプロイメント失敗の影響
スクリプトの実行に失敗した場合、システムはそのインスタンスのリリースステータスを失敗としてマークします。各バッチ実行完了時に一時停止 または 最初のバッチ実行完了時に一時停止 が有効になっている バッチリリースでは、後続のバッチは実行されません。これにより影響が限定されます。フルリリースを実行する前に、まず カナリアリリースを使用して少数のインスタンスでデプロイメントを検証することを推奨します。
-
スクリプトの実行ディレクトリ
システムは、デプロイメントアーティファクトを作成する際に指定した作業ディレクトリでスクリプトを実行します。