如何解決 Amazon ECS 中的 Amazon ECR 錯誤 "CannotPullContainerError: API error" (CannotPullContainerError: API 錯誤)?

2 分的閱讀內容
0

如果我使用 Amazon Elastic Container Registry (Amazon ECR) 提取映像檔,我會收到以下錯誤訊息: "CannotPullContainerError: API error" (CannotPullContainerError: API 錯誤)

簡短說明

基於下列其中一個問題,您可能會收到此錯誤:

  • 您的啟動類型無法存取 Amazon ECR 端點
  • 您的 Amazon ECR 儲存庫政策限制存取儲存庫映像檔
  • 您的 AWS Identity and Access Management (IAM) 角色沒有提取或推送映像檔的正確權限
  • 找不到映像檔
  • 您的 Amazon Virtual Private Cloud (Amazon VPC) 閘道端點政策拒絕 Amazon Simple Storage Service (Amazon S3) 存取

若要提取映像檔,Amazon ECS 必須與 Amazon ECR 端點通訊。

若要疑難排解無法啟動 Amazon ECS 任務的錯誤,請使用 AWSSupport-TroubleshootECSTaskFailedToStart 執行手冊。然後,請參閱針對問題的相關疑難排解步驟。

解決方案

重要事項:

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

如需有關如何啟動執行手冊的說明,請參閱 AWSSupport-TroubleshootECSTaskFailedToStart。根據自動化的輸出,使用下列其中一個手動疑難排解步驟。

您的啟動類型無法存取 Amazon ECR 端點

1.    您可能正在使用 Amazon Elastic Compute Cloud (Amazon EC2) 啟動類型執行任務,而您的容器執行個體位於私有子網路中。或者,您可能正在私有子網路中使用 AWS Fargate 啟動類型執行任務。在上述任一情況下,請確認您的子網路在路由表中具有通往 NAT 閘道的路由。

2.    如果您的任務具有 EC2 啟動類型,且容器執行個體位於公有子網路中,則執行個體必須具有公用 IP 地址。

- 或 -

如果您正在公有子網路中使用 Fargate 啟動類型執行任務,請在您啟動任務時選擇已啟用自動指派公有 IP。這可讓您的任務具備傳出網路存取權以提取映像檔。

3.    在您的 VPC 中設定 NAT 閘道,以將請求路由至網際網路。
**注意事項:**您可以使用 AWS PrivateLink 作為 NAT 閘道的替代方案。

4.    如果您正在使用 AWS PrivateLink for Amazon ECR,請檢查與 Amazon ECR VPC 端點相關聯的安全群組組態。您必須允許來自 VPC CIDR、容器執行個體或 Fargate 任務或服務的安全群組內透過 HTTPS (連接埠 443) 的傳入流量。

5.    確認連接至執行個體和 Fargate 任務的安全群組允許下列傳出存取權: 連接埠 443 上的 HTTPS、連接埠 53 上的 DNS (UDP 和 TCP),以及您子網路的網路存取控制清單 (network ACL)。

您的 Amazon ECR 儲存庫政策限制存取儲存庫映像檔

檢查您的 Amazon ECR 儲存庫政策,了解存取儲存庫的限制。下列儲存庫政策範例允許 IAM 使用者推送和提取映像檔:

{  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowPushPull",
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::123456789012:user/push-pull-user-1",
          "arn:aws:iam::123456789012:user/push-pull-user-2"
        ]
      },
      "Action": [
        "ecr:GetDownloadUrlForLayer",
        "ecr:BatchGetImage",
        "ecr:BatchCheckLayerAvailability",
        "ecr:PutImage",
        "ecr:InitiateLayerUpload",
        "ecr:UploadLayerPart",
        "ecr:CompleteLayerUpload"
      ]
    }
  ]
}

您的 IAM 角色沒有提取映像檔的正確權限

如果您使用 EC2 啟動類型執行任務,請檢查與執行個體設定檔相關的執行個體 IAM 角色權限。必須具有存取 Amazon ECR 儲存庫的權限。

**注意事項:**AWS 受管政策 AmazonEC2ContainerRegistryReadOnly 提供提取映像檔所需的最低權限。

如果您正在使用 Fargate 啟動類型執行任務,請確認 AmazonECSTaskExecutionRolePolicy 具備所需權限

找不到映像檔

若要確認 URI 中的正確映像檔名稱,請檢查任務定義中容器定義區段的映像檔參數

**注意事項:**若要按標籤提取,請使用以下映像檔名稱格式:registry/repository[:tag]。若要按摘要提取,請使用 registry/repository[@digest] 格式。

您的 Amazon VPC 閘道端點政策拒絕 Amazon S3 存取

如果您在路由表中具備適用於 Amazon S3 的 Amazon VPC 閘道端點的路由,請完成以下步驟:

1.    驗證 Amazon VPC 閘道端點的存取政策

2.    確認 Amazon VPC 閘道端點具備存取 S3 儲存貯體的正確政策

相關資訊

CannotPullContainer 任務錯誤

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