如何解決 Amazon ECS 中「unable to pull secrets or registry auth」的錯誤?

3 分的閱讀內容
0

當我啟動 Amazon Elastic Container Service (Amazon ECS) 任務時,我收到了下列其中一項錯誤: 「ResourceInitializationError: unable to pull secrets or registry auth: pull command failed: : signal: killed」或「ResourceInitializationError: unable to pull secrets or registry auth: execution resource retrieval failed: unable to retrieve secret from asm: service call has been retried」。

簡短說明

AWS Fargate 平台 1.4.0 版會使用任務彈性網路介面來提取映像檔和密碼。所有網路流量都會流經 Amazon Virtual Private Cloud (Amazon VPC) 內的彈性網路介面。您可以透過 Amazon VPC 流程日誌檢視此流量。但是,該任務使用您的網絡組態,而不是使用 Fargate 擁有的彈性網路介面。這是因為彈性網路介面放置在您的 Amazon VPC 中。

Amazon ECS 容器代理程式使用任務執行 AWS Identity and Access Management (IAM) 角色,以從下列服務取得資訊:

  • AWS Systems Manager Parameter Store
  • AWS Secrets Manager

如果您使用客戶受管的 AWS 金鑰管理服務 (AWS KMS) 金鑰加密資料,請將下列許可授與任務執行 IAM 角色: 

  • ssm:GetParameters
  • secretsmanager:GetSecretValue
  • kms:Decrypt.

使用 AWSSupport-TroubleshootECSTaskFailedToStart 執行手冊,疑難排解無法啟動的 Amazon ECS 任務。此自動化會檢閱下列組態:

  • 已設定容器登錄的網路連線
  • 缺少任務執行角色所需的 IAM 許可
  • 虛擬私有雲端 (VPC) 端點連線
  • 安全群組規則組態
  • AWS Secrets Manager 密碼參照
  • 記錄組態

如果執行手冊的輸出不提供建議,則使用下列區段中的手動疑難排解方法。 

解決方案

重要事項:

  • 在 ECS 叢集資源所在的相同 AWS 區域中使用執行手冊。
  • 使用執行手冊時,您必須使用最近失敗的任務 ID。如果失敗的任務屬於 Amazon ECS 服務的一部分,請在服務中使用最近失敗的任務。失敗的任務在自動化執行期間必須顯示於 ECS:DescribeTasks。依預設,停止的 ECS 任務會在輸入「已停止」狀態後 1 小時內顯示。使用最近失敗的任務 ID 可防止任務狀態清除在自動化期間中斷分析。

若要執行 AWSSupport-TroubleshootECSTaskFailedToStart 執行手冊,請完成下列步驟:

  1. 開啟 AWS Systems Manager 主控台
  2. 在導覽窗格的「變更管理」下,選擇「自動化」。
  3. 選擇「執行自動化」。
  4. 選擇「Amazon 所有」索引標籤。
  5. 在「自動化文件」下,搜尋「TroubleshootECSTaskFailedToStart」。
  6. 選取「AWSSupport-TroubleshootECSTaskFailedToStart」卡片。
    **注意事項:**請確定您選取的是卡片上的選項按鈕,而不是超連結的自動化名稱。
  7. 選擇「下一步」。
    **注意事項:**執行之後,分析結果會填入「全域輸出」區段。但是,請仍等待文件狀態移至「成功」。另外,請注意在「輸出」區段的任何例外情況。
  8. 針對「執行自動化文件」,選擇「簡單執行」。
  9. 針對 AutomationAssumeRole,在輸入參數區段中,輸入允許 Systems Manager Automation 執行動作的角色 ARN。
    **注意事項:**請確定 AutomationAssumeRole 或者 IAM 使用者或角色具有 IAM 需要執行 AWSSupport-TroubleshootECSTaskFailedToStart 執行手冊的許可。如果您未指定 IAM 角色,則 Systems Manager Automation 會使用可對執行手冊進行執行的 IAM 使用者或角色的許可。如需建立 Systems Manager Automation 擔任角色的詳細資訊,請參閱任務 1: 建立服務角色以進行自動化
  10. 針對 ClusterName,輸入任務無法啟動的叢集名稱。
  11. 針對 TaskId,輸入最近失敗的任務身分。
  12. 選擇「執行」。 

根據自動化的輸出,使用下列其中一個手動疑難排解步驟。

檢查從子網路到網際網路的路由

如果您在公有子網路中有 Fargate 任務,請確認您的任務已指派公用 IP 地址。另外,請確認任務具有連線至網際網路閘道的預設路由 (0.0.0.0/0)。當您啟動新任務或建立新服務時,請開啟「公用自動指派」。

如果您使用下列組態,則請勿使用公有子網路中的網際網路閘道來連線 Secret Manager 或 Systems Manager。而是使用 Amazon VPC 端點:

  • Secrets Manager 或 Systems Manager VPC 端點位於公有子網路中。
  • 您在 Amazon VPC DHCP 設定中開啟了「AmazonProvidedDNS」。

**注意事項:**您無法為現有任務開啟「公用自動指派」。針對現有服務,您只能使用 AWS Command Line Interface (AWS CLI) 以重新設定服務。您無法使用 AWS 管理主控台。如果您使用 AWS CloudFormation 堆疊建立您的 Amazon ECS 服務,則請修改 NetworkConfiguration 內容 AWS::ECS::Service 以更新服務。

如果您在私有子網路中有 Fargate 任務,請確認您的任務具有連線至網際網路連線來源的預設路由 (0.0.0.0/0)。網際網路連線來源可以是 NAT 閘道、AWS PrivateLink 或其他來源。

  • 如果您使用 NAT 閘道,請將 NAT 閘道置於公用子網路中。如需詳細資訊,請參閱使用網際網路閘道和 NAT 閘道的架構
  • 如果您使用 PrivateLink,則請確保您的 Fargate 基礎架構可以將安全群組用於 Amazon VPC 端點
  • 如果您使用自訂名稱網域伺服器,則請確認 DNS 查詢的設定。查詢必須對使用 UDP 和 TCP 通訊協定的連接埠 53 具有出埠存取權。此外,它必須對連接埠 443 具有 HTTPS 存取權。 

檢查您的網路 ACL 和安全群組設定

確認您的網路存取控制清單 (網路 ACL) 和安全群組不會封鎖子網路對連接埠 443 的出埠存取權。如需詳細資訊,請參閱使用安全群組控制資源的流量

**注意事項:**Fargate 任務必須具有連接埠 443 的出埠存取權,以允許送出流量和存取 Amazon ECS 端點。

檢查您的 Amazon VPC 端點

如果您使用 PrivateLink,則您必須建立所需的端點。

Fargate 平台 1.4.0 版或更新版本需要下列端點:

  • com.amazonaws.region.ecr.dkr
  • com.amazonaws.region.ecr.api
  • S3 閘道端點
  • com.amazonaws.region.logs

如需詳細資訊,請參閱 Amazon ECR VPC 端點考量事項

注意事項: 如果您的任務定義使用 Secrets Manager、System Manager 參數或 Amazon CloudWatch Logs,則您可能需要定義端點。如需詳細資訊,請參閱下列文件:

如果您使用 PrivateLink,則請檢查 Amazon VPC 的安全群組是否允許正確的流量。該群組必須對 TCP 連接埠 443 允許來自 Fargate 任務安全群組或 Fargate 任務 VPC CIDR 範圍的流量。

若要確認 Fargate 基礎架構具有服務存取權,請檢查 VPC 端點政策Amazon Simple Storage Solution (Amazon S3) 的端點政策

檢查您的 IAM 角色和許可

任務執行角色授予 Amazon ECS 容器和 Fargate 代理程式所需的許可,以便對任務進行 API 呼叫。Fargate 在您執行下列動作時需要此角色:

  • 從 Amazon Elastic Container Registry (Amazon ECR) 中提取容器映像檔。
  • 使用「awslogs」日誌驅動程式。
  • 使用私有登錄身分驗證
  • 使用 Secret Manager 密碼或 Systems Manager Parameter Store 參數來參照機密資料。

如果您的使用案例涉及前述任何範例,則請在任務執行角色中定義所需的許可。如需必要許可的完整清單,請參閱 Amazon ECS 任務執行 IAM 角色

檢查 Amazon ECS 任務定義中參照的機密資訊

檢查密碼和參數名稱是否與 Amazon ECS 任務定義中的參照名稱相符。然後,檢查任務定義中容器定義的值是否與 Amazon ECS 任務定義中的值相符。如需詳細資訊,請參閱如何將密碼或機密資訊安全地傳送至 Amazon ECS 任務中的容器?

如果 Systems Manager Parameter Store 參數和任務位於相同的區域中,則使用完整的 ARN 或密碼名稱。如果參數存在於不同的「區域」中,則必須指定完整 ARN。

若要檢查 Systems Manager 參數名稱和 ARN,請完成以下步驟:

**注意事項:**如果您在執行 AWS CLI 命令時收到錯誤,請確定您使用最新版本的 AWS CLI

  1. 開啟 AWS Systems Manager 主控台
  2. 在導覽窗格中,選擇「Parameter Store」,然後確認您的「Parameter Store 名稱」。
  3. 若要取得參數的 ARN,請使用 AWS CLI 執行下列命令。將 name_of_parameter_store_secret 取代為 Parameter Store 密碼名稱。
$ aws ssm get-parameter —name <name_of_parameter_store_secret> —with-decryption

**注意事項:**參考 Secrets Manager 密碼的參數無法使用 Parameter Store 版本控制或歷史記錄功能。如需詳細資訊,請參閱限制

相關資訊

檢查停止的任務是否出現錯誤

AWS 官方
AWS 官方已更新 1 年前