AWS Command Line Interface (AWS CLI) または API を使用して、Amazon Elastic Container Service (Amazon ECS) クラスターのキャパシティープロバイダーを削除すると、エラーが発生します。
簡単な説明
AWS CLI または API を使用してクラスターのキャパシティープロバイダーを削除しようとすると、次のいずれかのエラーを受け取ることがあります。
- "updateStatus": "DELETE_FAILED"
- 「updateStatusReason」:「キャパシティープロバイダーはクラスター (your-cluster-name) に関連付けられているため、キャパシティープロバイダーを削除できません。クラスターからキャパシティープロバイダーを削除して、もう一度やり直してください」。
このエラーは次の原因で発生する可能性があります。
- 削除しようとしているキャパシティープロバイダーは、キャパシティープロバイダー戦略で Amazon ECS サービスで使用されています。AWS マネジメントコンソールでは、Amazon ECS サービスで使用されているキャパシティープロバイダーを削除することはできません。このシナリオでは、コンソールで「指定されたキャパシティープロバイダーは使用中のため、削除できません」というエラーメッセージが表示されます。既存のキャパシティープロバイダーとクラスターの関連付けを解除できるのは、それが既存のタスクで使用されていない場合のみです。AWS CLI の DeleteCapacityProvider コマンドを実行すると、キャパシティープロバイダーは DELETE_FAILED ステータスに移行します。この問題を解決するには、「キャパシティープロバイダーがキャパシティープロバイダー戦略で Amazon ECS サービスによって使用されているかどうかを確認する」セクション中の手順を実行します。
- デフォルトの戦略では、キャパシティープロバイダーが使用されます。タスクの実行時またはサービスの作成時にキャパシティープロバイダー戦略または起動タイプを選択しない場合、デフォルトでキャパシティープロバイダー戦略がクラスターに関連付けられます。ただし、関連付けは、キャパシティープロバイダーがクラスターの既定のキャパシティープロバイダー戦略として設定されている場合にのみ発生します。削除できるのは、クラスターに関連付けられていないキャパシティープロバイダーのみです。この問題を解決するには、「クラスターの既定のキャパシティープロバイダー戦略でキャパシティープロバイダーが設定されているかどうかを確認する」セクションの手順を実行します。
注: AWS CLI コマンドの実行時にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください。
解決方法
キャパシティープロバイダー戦略で Amazon ECS サービスによってキャパシティープロバイダーが使用中かどうかを確認する
1. クラスター内に複数のサービスがある場合は、次のスクリプトを使用して、キャパシティープロバイダーを使用しているサービスを確認します。
スクリプトを実行する前に、次の操作を実行します。
クラスターとキャパシティープロバイダーのパラメータを値に設定します。AWS CLI 認証情報をお客様の AWS リージョンに設定します。jq のウェブサイトから jq をインストールします。
#! /bin/bash
cluster=clustername
capacityprovider=capacityprovidername
services=$(aws ecs list-services --cluster ${cluster} | jq --raw-output '.serviceArns[]')
aws ecs describe-services \
--cluster ${cluster} \
--services ${services} \
| jq -r --arg capacityprovider "${capacityprovider}" \
'.services[] | select(.capacityProviderStrategy[]?.capacityProvider == $capacityprovider) | .serviceName'
注: スクリプトが空白の出力を返す場合、クラスター内のどのサービスもキャパシティープロバイダーを使用していません。「キャパシティープロバイダーがクラスターのデフォルトのキャパシティープロバイダー戦略で設定されているかどうかを確認する」セクションにスキップします。
2. スクリプトからの出力で返されるサービスを新しいキャパシティープロバイダーで更新します。
3. 古いキャパシティープロバイダーを削除します。
重要: キャパシティープロバイダー戦略または起動タイプを使用してサービスを更新することはできません。別のキャパシティープロバイダーでサービスを更新する必要があります。
キャパシティープロバイダーが、クラスターのデフォルトのキャパシティープロバイダー戦略で設定されているかどうかを確認します。
1. クラスターのデフォルトキャパシティープロバイダーを検索するには、次のコマンドを実行します。
$ aws ecs describe-clusters --cluster mycluster | jq '.clusters[].defaultCapacityProviderStrategy'
[
{
"capacityProvider": "oldCP",
"weight": 0,
"base": 0
}
]
2. キャパシティープロバイダーを削除するには、Amazon ECS コンソールまたは AWS CLI を使用して、クラスターのデフォルトのキャパシティープロバイダー戦略を変更する必要があります。
Amazon ECS コンソールを使用して:
1. Amazon ECS コンソールを開きます。
2. ナビゲーションペインで [クラスター] を選択してから、使用するクラスターを選択します。
3. [クラスターの更新] を選択します。
AWS CLI を使用して:
$ aws ecs put-cluster-capacity-providers \
--cluster mycluster \
--capacity-providers newCP \
--default-capacity-provider-strategy capacityProvider=newCP \
--region us-east-1
$ aws ecs delete-capacity-provider --capacity-provider oldCP
$ aws ecs describe-capacity-providers --capacity-provider oldCP
注: 前のコード例では、mycluster をお使いのクラスターに置き換えています。NewCP は、追加する新しいキャパシティープロバイダーに置き換えます。OldCP は、削除するキャパシティープロバイダーに置き換えます。
4. 古いキャパシティープロバイダーを削除します。
PutClusterCapacityProviders API コールから除外されたクラスターに関連付けられている既存のキャパシティープロバイダーは、クラスターとの関連付けが解除されています。クラスターのデフォルトのキャパシティープロバイダー戦略にも同じルールが適用されます。