當我使用 AWS 命令列界面 (AWS CLI) 或 API 刪除 Amazon 彈性容器服務 (Amazon ECS) 叢集的容量提供者時,出現錯誤訊息。
簡短說明
如果您嘗試使用 AWS CLI 或 API 刪除叢集的容量提供者,可能會收到下列其中一個錯誤:
- 「updateStatus」: 「DELETE_FAILED」
- 「updateStatusReason」: 「無法刪除容量提供者,因為它與叢集相關聯:您的叢集名稱。從叢集移除容量提供者,然後再試一次。」
您可能會收到這些錯誤的原因如下:
- 您嘗試刪除的容量提供者正由 Amazon ECS 服務在容量提供者策略中使用。AWS 管理主控台不允許您刪除 Amazon ECS 服務正在使用的容量供應商。在這個案例中,您會收到這個錯誤訊息︰ 主控台中的「指定的容量提供者正在使用中,無法移除」。只有當現有的任何現有未使用現有的容量提供者時,您才可以將其與叢集取消關聯。如果您執行 DeleteCapacityProvider AWS CLI 命令,則容量提供者會轉換為 DELETE_FAILED 狀態。若要解決此問題,請完成檢查容量提供者策略裡 Amazon ECS 服務是否使用容量提供者一節裡的步驟。
- 預設策略會使用您的容量提供者。如果您在執行任務或建立服務時未選擇容量提供者策略或啟動類型,則依預設,容量提供者策略會與叢集相關聯。不過,只有在容量提供者設定為叢集的預設容量提供者策略時,才會發生關聯。您只能刪除與叢集沒有關聯的容量提供者。若要解決此問題,請完成檢查叢集的預設容量提供者策略裡是否設定容量提供者一節裡的步驟。
**注意:**如果您在執行 AWS CLI 命令時收到錯誤訊息,請確認您使用的是最新版本的 AWS CLI。
解決方法
在容量提供者策略中,檢查 Amazon ECS 服務是否正在使用您的容量提供者
- 如果叢集中有多個服務,請使用下列指令碼來驗證使用容量提供者的服務。
執行指令碼之前,請執行下列動作:
將叢集和容量提供者參數設定為您的值。將您的 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'
注意:如果指令碼傳回空白輸出,則叢集中沒有任何服務正在使用容量提供者。跳至檢查叢集的預設容量提供者策略裡是否設定容量提供者一節。
-
在指令碼傳回的輸出中以新的容量提供者來更新服務。
-
刪除舊的容量提供者。
**重要事項:**您無法使用容量提供者策略或啟動類型來更新服務。您必須使用其他容量提供者更新服務。
檢查您的容量提供者是否已在叢集的預設容量提供者策略中設定
- 若要尋找叢集的預設容量提供者,請執行下列命令:
$ aws ecs describe-clusters --cluster mycluster | jq '.clusters[].defaultCapacityProviderStrategy'
[
{
"capacityProvider": "oldCP",
"weight": 0,
"base": 0
}
]
- 若要刪除容量提供者,您必須使用 Amazon ECS 主控台或 AWS CLI 修改叢集的預設容量提供者策略。
開啟 Amazon ECS 主控台:
-
開啟 Amazon ECS 主控台。
-
在瀏覽窗格中,選擇叢集,然後選擇您的叢集。
-
選擇更新叢集。
使用 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 取代為您要刪除的容量提供者。
- 刪除舊的容量提供者。
任何與叢集關聯的現有容量提供者 (從 PutClusterCapacityProviders API 呼叫中省略) 都會與叢集取消關聯。相同的規則適用於叢集的預設容量提供者策略。