當我的 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-aaaaaa 和 subnet-bbbbbb 替換為您的子網,並將 sg-ccccccc 替換為您的安全群組。
確認您叢集的 Amazon Virtual Private Cloud (Amazon VPC) 連線已啟用 DNS 主機名稱和 DNS 解析。
私有子網路
如果您的任務位於私用子網路中,請根據您的網路連線來源檢查以下設定:
檢查您的網路 ACL 和安全群組設定
確認您的網路存取控制清單 (網路 ACL) 和安全群組允許從子網路對連接埠 443 的傳出存取。
**注意:**Fargate 任務必須具有對連接埠 443 的傳出存取權,才能允許傳出流量並存取 Amazon ECS 端點。
(僅限 PrivateLink) 檢查您的 Amazon VPC 端點
如果您使用 PrivateLink,則您必須建立以下必要的端點:
- 如果是 Amazon ECR,請建立 com.amazonaws.region.ecr.dkr 和 com.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 已停止任務的連線