跳至內容

如何解決 Fargate 上 Amazon ECS 任務的 "cannotpullcontainererror" 錯誤?

3 分的閱讀內容
0

我想要解決 "cannotpullcontainererror" 錯誤,以在 AWS Fargate 上啟動 Amazon Elastic Container Service (Amazon ECS) 任務。

簡短描述

"cannotpullcontainererror" 可能會導致您的 Amazon ECS Fargate 任務無法啟動。對於這些任務,您的 Amazon Virtual Private Cloud (Amazon VPC) 網路組態必須允許 ECS 存取儲存映像檔的儲存庫。如果沒有正確的網路,Amazon ECS 在 Fargate 上將無法提取映像檔,容器也無法啟動。

解決方法

若要解決 "cannotpullcontainererror" 錯誤,請完成以下任務。

確認您的 VPC 允許 Amazon ECS 基礎結構存取映像檔儲存庫

您任務所建立的子網路所關聯的路由表,必須允許您的 Amazon ECS 基礎架構連線到儲存庫端點。該端點可以透過網際網路閘道、NAT 閘道或 VPC 端點進行連線。

對於未使用 AWS PrivateLink 的組態,請完成以下步驟:

  1. 開啟 Amazon VPC console (Amazon VPC 主控台)。
  2. 在導覽窗格中,選擇 Subnets (子網路)。
  3. 選取您的 ECS Fargate 任務所使用的子網路。
  4. 選擇 Route Table (路由表) 索引標籤。
  5. Destination (目的地) 列中,確認路由表的預設路由 (0.0.0.0/0) 允許公共網際網路。此存取可以透過 NAT 閘道或網際網路閘道進行。
    **重要:**NAT 閘道或網際網路閘道必須是預設路由的目標。有關路由表的範例,請參閱路由選項範例。如果您未使用 NAT 閘道或網際網路閘道,請確保您的自訂組態允許存取公共網際網路。

如果您使用網際網路閘道 (公有子網路),請確認該任務已指派公有 IP。建立任務或服務時,請於 VPC and security groups (VPC 和安全群組) 區段,將 Auto-assign public IP (自動指派公有 IP) 設為 Enabled (已啟用)。

對於使用 PrivateLink 的組態,請確認您 VPC 端點的安全群組允許 Fargate 基礎結構使用這些端點。

**注意:**使用 1.3.0 或更舊版本於 Fargate 上託管的 Amazon ECS 任務,需使用 com.amazonaws.region.ecr.dkr 這個 Amazon Elastic Container Registry (Amazon ECR) VPC 端點。這些任務也需要 Amazon Simple Storage Service (Amazon S3) 閘道端點。使用 1.4.0 或更新版本於 Fargate 上託管的 Amazon ECS 任務,需要使用 com.amazonaws.region.ecr.dkrcom.amazonaws.region.ecr.api 這兩個 Amazon ECR VPC 端點。這些任務也需要 Amazon S3 閘道端點。

對於使用 PrivateLink 的組態,請完成以下步驟:

  1. 開啟 Amazon VPC console (Amazon VPC 主控台)。
  2. 在導覽窗格中,選擇 Endpoints (端點)。
  3. 從端點清單選取端點,然後選擇 Subnets (子網路) 索引標籤。Amazon ECR 的 VPC 端點 com.amazonaws.region.ecr.dkrcom.amazonaws.region.ecr.api 會顯示在子網路清單中,並與 Fargate 子網路建立關聯。Amazon S3 閘道也會顯示在子網路清單中。
    **注意:**若未列出子網路,請選擇 Manage Subnets (管理子網路)。接下來,根據 Availability Zone (可用區域) 選取子網路。然後,選擇 Modify Subnets (修改子網路)。
  4. 選擇 Policy (政策) 索引標籤,然後確認已滿足正確的政策要求
  5. 確認附加到 com.amazonaws.region.ecr.apicom.amazonaws.region.ecr.dkr VPC 端點的安全群組,允許來自 Amazon ECS Fargate 任務在連接埠 443 上的傳入連線。若要確認此設定,請從清單中選取端點。
  6. 選擇 Security Groups (安全群組) 索引標籤。
  7. 對於 Group ID (群組 ID),請選擇安全群組 ID。
  8. 選擇 Inbound rules (傳入規則) 索引標籤,然後確認您可以看到允許來自 Fargate 上 ECS 任務的連接埠 443 連線的規則。

檢查 VPC 的 DHCP 選項集

請完成下列步驟:

  1. 開啟 Amazon VPC console (Amazon VPC 主控台)。
  2. 在導覽窗格,選擇 Your VPCs (您的 VPC)。
  3. 選取包含您 Fargate 任務的 VPC。
  4. Details (詳細資料) 索引標籤上,記下 DHCP 選項集的設定。
  5. 在導覽窗格中,選擇 DHCP Options Sets (DHCP 選項集)。
  6. 選取您記下的 DHCP 選項集。
  7. 選擇 Actions (動作),然後選擇 View details (檢視詳細資訊)。
  8. 確認網域名稱伺服器已設定為 AmazonProvidedDNS。如果未設定為 AmazonProvidedDNS,則設定條件 DNS 轉送

檢查任務執行角色權限

請完成下列步驟:

  1. 開啟 AWS Identity and Access Management (IAM) 主控台
  2. 在導覽窗格中,選擇 Roles (角色)。
  3. 請選取 Fargate 任務所使用的任務執行角色。
  4. 確認任務執行角色具備從 Amazon ECR 提取映像檔的權限

請確認映像檔是否存在

請完成下列步驟:

  1. 開啟 Amazon ECR console (Amazon ECR 主控台)。
  2. 選取 Fargate 任務從中提取映像檔的 Amazon ECR 儲存庫。
  3. 請確認 Amazon ECR 中的 URI 和索引標籤與任務定義中指定的相符。如果映像檔缺失,請檢查是否有生命週期政策在管理該映像檔

**注意:**如果您未使用 Amazon ECR,請確保您在指定的映像檔儲存庫中看到 image:tag

檢查分配給 Fargate 任務的 ephemeralStorage

預設情況下,Fargate 任務會分配 20GiB 的暫時性儲存空間。如果您的映像檔大小過大,您可能會看到類似以下的錯誤訊息:

"CannotPullContainerError: ref pull has been retried 1 time(s): failed to extract layer no space left on device: unknown"

**注意:**由於此儲存空間用於暫存檔案、日誌和其他程序,因此即使映像檔本身較小,您仍可能遇到此錯誤。

若要解決此問題,請編輯任務定義中的分配設定。如需了解更多資訊,請參閱適用於 Amazon ECS 的 Fargate 任務暫時性儲存空間

**注意:**使用平台版本 1.4.0 或更新版本的 Fargate 任務,將獲得至少 20 GiB 的暫時性儲存空間。暫時性儲存空間總量最多可增加至 200 GiB。

AWS 官方已更新 1 年前