如何在 Amazon ECS 中解決錯誤「CannotPullContainerError: 您已達到您的提取率限制」?

3 分的閱讀內容
0

當我嘗試從 Docker Hub 提取映像時,我的 Amazon Elastic Container Service (Amazon ECS) 任務失敗,並出現以下錯誤: 「CannotPullContainerError:檢查映像已被重試 5 次:httpReaderSeeker:開啟失敗:非預期的狀態碼 https://registry-1.docker.io/v2/manifests/sha256:2bb501e6429 太多請求 – 伺服器訊息:toomanyrequests: 您已達到您的提取率限制。您可以透過驗證和升級來增加限制:https://www.docker.com/increase-rate-limit」

簡短描述

在嘗試從公有 Docker Hub 儲存庫 (在 Docker Hub 網站上) 提取映像時,達到 Docker 提取率限制 (從 Docker Hub 網站) 後,則會發生此錯誤。超過您的速率限制會傳回 429 的 HTTP 狀態碼。Docker Hub 使用 IP 地址對使用者進行身分驗證,並且根據個別 IP 地址提取率限制。對於匿名使用者,速率限制設定為每個 IP 地址每 6 小時 100 次提取。對於具有 Docker ID 的已驗證使用者,提取率設定為每 6 小時期間 200 次提取。如果您的映像提取請求超過這些限制,Amazon ECS 會拒絕這些請求,直到 6 小時的時段過去為止。如果您正在執行 Amazon ECS 或 Amazon Elastic Kubernetes Service (Amazon EKS) 工作負載,則會透過具有固定 IP 地址的 NAT 閘道提取資料。在這種情況下,當您超過提取限制時,會限制請求。

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

  • 已設定容器登錄檔的網路連線
  • 遺失執行角色所需的 AWS Identity and Access Management (IAM) 許可
  • 虛擬私有雲端 (VPC) 端點連線
  • 安全群組規則組態
  • AWS Secrets Manager 機密參照
  • 記錄組態

解決方法

重要:

  • 在與 ECS 叢集資源位置相同的 AWS 區域中使用 AWSSupport-TroubleshootECSTaskFailedToStart 執行手冊。
  • 使用執行手冊時,您必須使用最近失敗的任務 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 使用者或角色具有執行 AWSSupport-TroubleshootECSTaskFailedToStart 執行手冊所需的 IAM 許可。如果您未指定 IAM 角色,則 Systems Manager Automation 會使用實行執行手冊的 IAM 使用者或角色許可。如需有關建立 Systems Manager Automation 擔任角色的資訊,請參閱任務 1: 建立服務角色以進行自動化

10.    針對 ClusterName,輸入任務無法啟動的叢集名稱。

11.    針對 TaskId,輸入最近失敗的任務識別碼。

12.    選擇執行

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

將公有映像複製到 Amazon ECR 私有登錄檔

建立 Amazon Elastic Container Registry (Amazon ECR) 儲存庫,然後將映像推送到這個新的儲存庫。當您從 Amazon ECR 儲存庫提取映像時,可能要避免超過 Docker Hub 提取限制。

1.    執行類似下列的命令,從 Docker Hub 提取映像:

docker pull example-image

2.    執行類似於下列的命令,對 Docker 用戶端進行身分驗證,以存取 Amazon ECR 登錄檔:

aws ecr get-login-password --region eu-west-1 | docker login --username AWS --password-stdin 1111222233334444.dkr.ecr.eu-west-1.amazonaws.com

3.    執行類似下列的命令來標記要推送至儲存庫的映像:

docker tag myrepository:latest 1111222233334444.dkr.ecr.eu-west-1.amazonaws.com/myrepository:latest

4.    執行類似下列的命令,將 Docker 映像推送至 Amazon ECR 登錄檔:

docker push 1111222233334444.dkr.ecr.eu-west-1.amazonaws.com/myrepository:latest

5.    執行類似下列的命令來更新 Docker 檔案,以使用新推送的 Amazon ECR 映像作為基礎映像:

FROM 1111222233334444.dkr.ecr.eu-west-1.amazonaws.com/myrepository:tag

在上述命令中,將下列值取代為您的值:

  • example-image 取代為要推送的公有映像的名稱
  • 1111222233334444 取代為您的帳戶 ID
  • myrepository:latest 取代為您的 Amazon ECR 登錄檔名稱
  • eu-west-1 取代為您選擇的區域

對 Docker Hub 提取進行身分驗證

對 Docker Hub 進行身分驗證時,您作為經過身分驗證的使用者有更多的速率限制,並且根據 Docker 使用者名稱進行速率限制。將 Docker Hub 使用者名稱和密碼作為機密儲存在 AWS Secrets Manager 中,然後使用此機密對 Docker Hub 進行身分驗證。

為 Docker Hub 憑證建立 Secrets Manager 機密

若要為 Docker Hub 憑證建立機密,請使用開啟私有登錄檔身分驗證建立基本機密區段下的指示。

更新您的任務執行 IAM 角色

若要授與 Amazon ECS 任務存取機密,請手動將所需許可作為內嵌政策新增至任務執行角色。

1.    開啟 IAM 主控台

2.    在導覽窗格中,選擇角色

3.    搜尋 ecsTaskExecutionRole 的角色清單,然後選擇要檢視附加政策的角色。

4.    在許可標籤上,選擇新增許可,然後選擇建立內嵌政策

5.    在建立政策頁面中,選擇 JSON,然後複製並貼上下列政策:

{
	"Version": "2012-10-17",
	"Statement": [{
		"Effect": "Allow",
		"Action": [
			"secretsmanager:GetSecretValue",
			"kms:Decrypt"
		],
		"Resource": [
			"arn:aws:secretsmanager:eu-west-1:1111222233334444:secret:dockerhub-0knT",
			"arn:aws:kms:eu-west-1:1111222233334444:key/mykey"
		]
	}]
}

在上述政策中,將下列值取代為您的值:

  • 1111222233334444 取代為您的帳戶 ID
  • eu-west-1 取代為您選擇的區域
  • mykey 取代為您的 AWS KMS 金鑰

**注意:**僅在金鑰使用自訂 AWS Key Management Service (KMS) 時才包含 kms:Decrypt。將自訂金鑰的 ARN 新增為資源。

6.    選擇檢閱政策

7.    在名稱中,輸入政策的名稱 (ECSSecrets)。

8.    選擇建立政策

建立使用 Docker 身分驗證機密的任務定義

遵循使用傳統主控台建立任務定義中的指示建立您的 Amazon ECS 任務定義。對於任務執行角色,選取您在上一節中更新的任務執行 IAM 角色。

容器定義區段中,完成下列步驟:

1.     選擇新增容器

2.    在容器名稱中,輸入容器的名稱。

3.     在映像中,輸入映像的名稱,或包含私有映像的路徑 (範例:repository-url/image.tag)。

4.    選擇私有儲存庫身分驗證

5.    在 Secrets Manager ARN 或名稱中,輸入您建立的機密的 ARN。

6.    選擇新增

建立 Amazon ECS 叢集並執行 Amazon ECS 任務

建立 Amazon ECS 叢集。然後,使用您建立的任務定義來執行任務

將 Amazon ECR Public 登錄檔用於公有容器映像

識別您在 Docker 檔案中使用的公有映像。使用適當的搜尋篩選條件,在 Amazon ECR Public Gallery 中搜尋這些映像。您不需要進行身分驗證即可瀏覽公有儲存庫並提取映像。Amazon ECR Public 包含常用的基礎映像,包括作業系統、AWS 發佈的映像、Kubernetes 附加元件和成品。從 Amazon ECR Public 登錄檔中提取映像,以避免達到 Docker Hub 的速率限制。

使用以下映像作為任務定義中容器映像的來源:

ContainerDefinitions: [
 {
 ...
 Image: 'public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest'
 ...
 }
 ]

您也可以選擇使用這些映像作為 Docker 檔案中的基礎映像:

Docker File  
FROM public.ecr.aws/amazonlinux/amazonlinux:latest

升級到 Docker Pro 或 Team 訂閱

如果您需要更多的提取次數,請將您的計畫升級為 Docker Pro團隊訂閱,該訂閱可在 24 小時內提供 50,000 次提取。如需有關訂價計畫的詳細資訊,請參閱定價和訂閱 (來自 Docker Hub 網站)。

相關資訊

Amazon ECR 定價

Amazon ECR Public 服務配額

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