Skip to content

如何解決當我嘗試從 Amazon ECR 提取映像檔時,出現的 ResourceInitializationError 錯誤?

2 分的閱讀內容
0

當我的 Amazon Elastic Container Service (Amazon ECS) 任務嘗試從 Amazon Elastic Container Registry (Amazon ECR) 提取映像檔時,我收到 ResourceInitializationError 錯誤。

簡短描述

當您啟動 Amazon ECS 任務時,您可能會收到以下其中一個 ResourceInitializationError 錯誤訊息:

「無法提取密碼或登錄檔驗證: 該任務無法從 Amazon ECR 提取登錄檔驗證: 該任務與 Amazon ECR 之間存在連線問題。請檢查您的任務網路組態。RequestError:傳送請求失敗,原因如下: Post "https://api.ecr.region-code.amazonaws.com/":撥號 tcp ip.xx.xx.xx.xx:443:i/o 逾時」

- 或 -

「無法擷取密碼或登錄檔驗證:執行資源擷取失敗:無法擷取 ecr 登錄檔驗證:服務呼叫已重試 3 次: RequestError:傳送請求失敗,原因如下: Post "https://api.ecr.region-code.amazonaws.com/":撥號 tcp ip.xx.xx.xx.xx:443:i/o 逾時。請檢查您的任務網路組態。」

當您的 Amazon ECS 任務無法提取容器映像檔或從 Amazon ECR 擷取驗證資訊時,就會發生這些錯誤。

解決方法

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本

測試任務連線

使用 AWSSupport-TroubleshootECSTaskFailedToStart 執行手冊測試您的任務連線。您必須在 Amazon ECS 叢集資源所在的相同 AWS 區域中使用執行手冊。另外,請使用最近失敗的任務 ID。如果失敗的任務屬於 Amazon ECS 服務,請在服務中使用最近失敗的任務。失敗的任務必須在 ECS:DescribeTasks 自動化過程中顯示。預設情況下,已停止的任務在進入已停止狀態後會在 1 小時內顯示。

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

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

檢查您部署了 Amazon ECS 任務之子網路的路由表。確保您的任務具有到網際網路的預設路由 (0.0.0.0/0),且任務安全群組允許連接埠 443 上的傳出流量。

公有子網路

如果您的 AWS Fargate 任務位於公用子網路中,則必須為您的任務指派公用 IP 位址。

若要查看任務的彈性網路介面和私用 IP 位址,請執行下列 describe-tasks AWS CLI 命令:

aws ecs describe-tasks --cluster cluster-name --tasks task-arn

**注意:**將 cluster-name 替換為您的叢集名稱,將 task-arn 替換為您的任務 ARN。

若要檢查任務的網路介面是否有附加的公用 IP 位址,請執行下列 describe-network-interfaces 命令:

aws ec2 describe-network-interfaces --network-interface-ids example-eni

**注意:**將 example-eni 替換為您任務的網路介面。

設定 Amazon ECS 以自動為與您任務關聯的網路介面指派公有 IPv4 位址。執行新任務建立新服務時,請將 Turned on (公用 IP) 選取為 Turned on (開啟)。

您無法為現有任務或服務自動指派公用 IP 位址。而若要重新建立服務並啟動自動公用 IP 位址指派,請執行下列 create-service 命令:

aws ecs create-service --cluster cluster-name --service-name service-name --task-definition taskdef:revision --desired-count 1 --launch-type FARGATE --network-configuration "awsvpcConfiguration={subnets=[subnet-aaaaaa,subnet-bbbbbb],securityGroups=[sg-ccccccc],assignPublicIp=ENABLED}"

注意:clustername 替換為您的叢集名稱,將 servicename 替換為您的服務名稱,將 taskdef:revision 替換為您的任務定義。將 subnet-aaaaaasubnet-bbbbbb 替換為您的子網,並將 sg-ccccccc 替換為您的安全群組。

確認您叢集的 Amazon Virtual Private Cloud (Amazon VPC) 連線已啟用 DNS 主機名稱和 DNS 解析

私有子網路

如果您的任務位於私用子網路中,請根據您的網路連線來源檢查以下設定:

  • 如果您使用 NAT 閘道,請將 NAT 閘道置於公用子網路中。
  • 如果您使用 AWS PrivateLink,請確認 VPC 端點的安全群組是否允許來自 VPC CIDR 或服務安全群組連接埠 443 上的傳入流量。

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

確認您的網路存取控制清單 (網路 ACL) 和安全群組允許從子網路對連接埠 443 的傳出存取

**注意:**Fargate 任務必須具有對連接埠 443 的傳出存取權,才能允許傳出流量並存取 Amazon ECS 端點。

(僅限 PrivateLink) 檢查您的 Amazon VPC 端點

如果您使用 PrivateLink,則您必須建立以下必要的端點

  • 如果是 Amazon ECR,請建立 com.amazonaws.region.ecr.dkrcom.amazonaws.region.ecr.api
  • 如果是 Amazon Simple Storage Service (Amazon S3) 閘道,請建立 com.amazonaws.region.s3
  • 如果您使用 Amazon CloudWatch 儲存應用程式日誌,則還需建立 com.amazonaws.region.logs

**注意:**在上述端點中,將 region (區域) 替換為您的區域。

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

如果您的 VPC 沒有網際網路閘道,且您的任務使用 awslogs 日誌驅動程式,請為 CloudWatch Logs 建立 VPC 端點

確認 VPC 端點的安全群組允許來自 Fargate 任務安全群組,或 TCP 連接埠 443 上 VPC CIDR 範圍的流量。

檢查您的 IAM 角色和權限

確認 AWS Identity and Access Management (IAM) 任務執行角色具有 AmazonECSTaskExecutionRolePolicy 或同等權限。

如需角色權限和任務執行角色的詳細資訊,請參閱 Amazon ECS 任務執行 IAM 角色

相關資訊

確認 Amazon ECS 已停止任務的連線