AWS CloudFormation で Amazon Elastic Container Service (Amazon ECS) が安定化に失敗します。「Service arn:aws:ecs:us-east-accountID:service/ServiceName did not stabilize.」というエラーが表示されます。
簡単な説明
Amazon ECS で作成したサービスが AWS CloudFormation テンプレートで指定した状態でない場合、そのサービスは安定化に失敗します。サービスがタスク定義で希望する数のタスクを起動したことを確認するために、AWS CloudFormation は DescribeService API 呼び出しを繰り返します。これらの呼び出しは、状態が要求通りになるまで、サービスのステータス確認を続けます。この呼び出しプロセスには、最大で 3 時間かかります。その後 AWS CloudFormation はタイムアウトし、「Service ARN did not stabilize」というメッセージを返します。AWS CloudFormation がサービスの状態をチェックしている間、そのサービスを含むスタックは CREATE_IN_PROGRESS、または UPDATE_IN_PROGRESS の状態に維持され更新することはできません。
ECS サービスの中で原因となっている問題をすぐに解決できず、DescribeService API が呼び出されタイムアウトするのも待てない場合は、AWS CloudFormation の ECS サービスリソースの状態を、手動で強制的に CREATE_COMPLETE にすることができます。これは、Amazon ECS コンソールでサービスの必要実行回数を手動によってゼロに設定し、実行中のタスクを停止することで行えます。こうすると、0 である必要数とタスクの回数が一致するため、AWS CloudFormation は更新が成功したと認識します。
重要: 本稼働中のサービスについて、AWS CloudFormation を手動で強制的に CREATE_COMPLETE の状態にすることは推奨されていません。これは、すべての実行中のタスクが停止し、実稼働サービスの停止を引き起こすおそれがあるからです。
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください。
解決方法
リソースの作成の確認
1. AWS CloudFormation テンプレートで、 AWS::ECS::Service リソースを作成します。以下はその例です。
Resources:
ECSServiceA:
Type: AWS::ECS::Service
Properties:
DesiredCount: 1
Cluster: awsExampleECSCluster
LaunchType: EC2
ServiceName: "MyNginxService2"
TaskDefinition: NginxTask:1
2. AWS CloudFormation コンソールを開き、スタックを選択します。
3. [Events] (イベント) タブを選択し、リソースが作成中であることを確認します。
サービスの必要数の更新
AWS CLI または Amazon ECS コンソールから、サービスの必要数を希望する値に変更できます。
AWS CLI を使用して、以下の操作を実行します。
1. 次のコマンドを実行し、サービスの詳細とサービスイベントの一覧を表示します。
aws ecs describe-services --cluster awsExampleECSCluster --services MyNginxService2
2. 次のコマンドを実行し、サービスの必要回数を変更します。
aws ecs update-service --cluster awsExampleECSCluster --service MyNginxService2 --desired-count 0
3. --desired-count を希望の値に更新します。
Amazon ECS コンソールの使用:
1. Amazon ECS コンソールを開きます。
2. ナビゲーションペインで、[Clusters] (クラスター) を選択し、作成した Amazon ECS サービスを含むクラスターを選択します。
3. [Clusters] (クラスター) ページで、作成した Amazon ECS サービスを含むクラスターを選択します。
4. 選択したクラスターのページの [Service Name] (サービス名) 列で、サービスを選択します。
5. [Events] (イベント) タブを選択し、[Update] (更新) を選択します。
6. [Configure service] (サービスの設定) ページの [Number of tasks] (タスク数) に 0 と入力します。
7. [Next step] (次のステップ) を選択し、[Update Service] (サービスの更新) ウィザードの最後まで手順を実行し、[Update Service] (サービスの更新) を選択します。
これでサービスが安定し、AWS CloudFormation の Amazon ECS サービスリソースは、CREATE_COMPLETE もしくは UPDATE_COMPLETE の状態に移行します。
重要: 基盤となるタスクに関する問題を修正した後、AWS CloudFormation スタックを Amazon ECS サービスのプロパティと同期させるには、必要数 (DesiredCount) をテンプレートの元の値に手動で戻す必要があります。
関連情報
サービスの更新
update-service
services-stable