如何解決當我嘗試提取密碼或擷取 ECS 任務的 Amazon ECR 驗證時,出現「ResourceInitializationError」的問題?
當我啟動 Amazon Elastic Container Service (Amazon ECS) 任務時,收到 ResourceInitializationError 訊息。
簡短描述
當您在 Fargate 啟動類型上啟動 Amazon ECS 任務時,您可能會收到以下其中一個錯誤訊息:
- 「ResourceInitializationError:無法提取密碼或登錄檔驗證:提取命令失敗: : 訊號:已終止」
- 「ResourceInitializationError:無法提取密碼或登錄檔驗證:執行資源擷取失敗:無法從 asm 擷取密碼:服務呼叫已重試。」
- 「ResourceInitializationError:無法擷取密碼或登錄檔驗證:執行資源擷取失敗:無法擷取 ecr 登錄檔驗證:服務呼叫已重試 3 次: RequestError:傳送請求失敗,原因如下: 發布 "https://api.ecr..amazonaws.com/":撥號 tcp ... 443:i/o 逾時。請檢查您的任務網路組態。」
- 「ResourceInitializationError:無法提取密碼或登錄檔驗證:執行資源擷取失敗:無法從 asm 擷取密碼:服務呼叫已重試 5 次:無法擷取密碼 arn:aws:secretsmanager…」
- 「ResourceInitializationError:無法提取密碼或登錄檔驗證:執行資源擷取失敗:無法從 asm 擷取密碼:服務呼叫已重試 1 次:無法擷取密碼 arn:aws:secretsmanager:<region>:<accountID>:密碼:<secretName> 來自密碼管理器: InvalidParameter: 發現 1 個驗證錯誤。 – (最小欄位大小為 32/最大欄位大小為 64),GetSecretValueInput.VersionId。」
- 「ResourceInitializationError:無法提取密碼或登錄檔驗證:執行資源擷取失敗:無法從 asm 擷取密碼:服務呼叫已重試 1 次:無法擷取密碼 rn:aws:secretsmanager:<region>:<accountID>:密碼:<secretName> 來自密碼管理器: AccessDeniedException: User: arn:aws:sts::<accountID>::assumed-role/<roleName> 無權在資源:rn:aws:secretsmanager 上執行 secretsmanager:GetSecretValue:<region>:<accountID>:密碼:<secretName> 由於沒有身分型政策允許 secretsmanager:GetSecretValue 動作狀態碼: 400」
AWS Fargate 版本 1.4.0 使用任務彈性網路介面來提取映像檔和密碼。所有網路流量都會流經 Amazon Virtual Private Cloud (Amazon VPC) 內的網路介面。您可以使用 VPC 流程日誌查看流量。但是,該任務將使用您的網路組態,因為 Fargate 將網路介面放在您的 Amazon VPC 中。
Amazon ECS 容器代理程式使用任務執行 AWS Identity and Access Management (IAM) 角色,從 Parameter Store (AWS Systems Manager 的功能) 和 AWS Secrets Manager 取得資訊。
對於使用客戶管理 AWS Key Management Service (KMS) 金鑰加密的資料,請向任務執行 IAM 角色授予下列權限:
- ssm:GetParameters
- secretsmanager:GetSecretValue
- kms:Decrypt
解決方法
注意: 如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,則請參閱對 AWS CLI 進行錯誤疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。
使用 TroubleshootECSTaskFailedToStart 執行手冊
使用 AWSSupport-TroubleshootECSTaskFailedToStart 執行手冊,對無法啟動的 Amazon ECS 任務進行疑難排解。
重要: 在 ECS 叢集資源所在的相同 AWS 區域中使用執行手冊。使用最近失敗的任務 ID,以便任務狀態清理不會中斷分析。如果失敗的任務屬於 Amazon ECS 服務的一部分,請在服務中使用最近失敗的任務。執行自動化時,失敗的任務必須顯示在 ECS:DescribeTasks 中。依預設,停止的 ECS 任務會在任務進入已停止狀態後顯示 1 小時。
若要執行 AWSSupport-TroubleshootECSTaskFailedToStart 執行手冊,請完成下列步驟:
- 開啟 AWS Systems Manager 主控台。
- 在導覽窗格的 Change Management(變更管理)下,選擇Automation(自動化)。
- 選擇 Execute automation(執行自動化)。
- 選擇 Owned by Amazon(Amazon 擁有)索引標籤。
- 在 Automation document (自動化文件) 下,在搜尋列中輸入TroubleshootECSTaskFailedToStart。
- 選取 AWSSupport-TroubleshootECSTaskFailedToStart 卡片。
注意: 請勿選取超連結的自動化名稱。 - 選擇 Next (下一步)。
- 在 Execute automation documen (執行自動化文件),選擇 Simple execution (簡單執行)。
- 在 Input parameters (輸入參數)區段中,對於 AutomationAssumeRole,輸入允許 Automation 執行動作的角色 ARN。
注意: 請確保服務角色或 IAM 使用者或角色具有執行 AWSSupport-TroubleshootECSTaskFailedToStart 執行手冊所需的 IAM 權限。如果您未指定 IAM 角色,則 Automation 會使用可對執行手冊進行執行的 IAM 使用者或角色的權限。有關如何為 Automation 建立服務角色的資訊,請參閱任務 1: 建立服務角色以進行自動化。 - 對於 ClusterName,輸入任務啟動失敗的叢集的名稱。
- 對於 TaskId,輸入最近失敗任務的識別碼。
- 選擇 Execute (執行)。
注意: 執行之後,分析結果會填入 Global output (全域輸出) 區段。但是,請等待文件狀態變為成功。另外,檢查 Output (輸出) 區段是否有任何異常。
您也可以手動解決該問題。
檢查從子網路到網際網路的路由
如果您的 Fargate 任務位於公有子網路中,請驗證您是否為該任務指派了公有 IP 位址。另請確認任務具有連線至網際網路閘道的預設路由 (0.0.0.0/0)。當您啟動新任務或建立新服務時,請開啟 Auto-assign public (自動指派公有)。
如果使用 AWS CloudFormation 堆疊建立 Amazon ECS 服務,請對 AWS::ECS::Service 修改 NetworkConfiguration 內容以更新服務。若要更新現有服務的組態,請使用 CloudFormation 開啟 AssignPublicIp 參數。或者,執行下列 update-service AWS CLI 命令:
aws ecs update-service --service serviceName --region regionName "awsvpcConfiguration={subnets=[subnet-123,subnet-456],securityGroups=[sg-123,sg-456],assignPublicIp=ENABLED}"
注意: 將 regionname 替換為您的區域。
如果您使用下列組態,則請勿使用公有子網路中的網際網路閘道來連線 Secret Manager 或 Systems Manager:
- Secrets Manager 或 Systems Manager VPC 端點位於公有子網路中。
- 您在 Amazon VPC DHCP 設定中開啟了 AmazonProvidedDNS。
而是使用 Amazon VPC 端點。
注意: 您無法為現有任務開啟 Auto-assign public (自動指派公有)。若要重新設定現有服務,請使用 AWS CLI,而不是 AWS 管理主控台。
如果您的 Fargate 任務在私有子網路中,請確認您的任務具有連線至網際網路連線來源的預設路由 (0.0.0.0/0)。
網路連線來源可以是 NAT 閘道、AWS PrivateLink 或自訂名稱網域伺服器。
如果您使用 NAT 閘道,請將 NAT 閘道置於公有子網路中。如需詳細資訊,請參閱使用 AWS Network Firewall 的網際網路閘道和 NAT 閘道的架構。如果您使用 PrivateLink,請確認 Amazon VPC 端點的安全群組是否允許流量傳輸至 Fargate 任務。如果您使用自訂名稱網域伺服器,則請確認 DNS 查詢的設定。查詢必須在連接埠 53 上具有傳出存取權,並使用 UDP 和 TCP 通訊協定。查詢也必須在連接埠 443 上具有 HTTPS 存取權。
檢查您的網路 ACL 和安全群組設定
確認您的網路存取控制清單 (網路 ACL) 和安全群組不會封鎖子網路對連接埠 443 的出埠存取。如需詳細資訊,請參閱使用安全群組控制 AWS 資源的流量。
**注意:**Fargate 任務必須具有連接埠 443 的出埠存取權,以允許送出流量和存取 Amazon ECS 端點。
檢查您的 Amazon VPC 端點
如果您使用 PrivateLink,則必須為 Fargate 平台版本 1.4.0 或更新版本建立以下必要的端點:
- com.amazonaws.region.ecr.dkr
- com.amazonaws.region.ecr.api
- S3 閘道端點
- com.amazonaws.region.logs
如需詳細資訊,請參閱 Amazon Elastic Container Registry (Amazon ECR) VPC 端點考量事項。
注意: 如果您的任務定義使用 Secrets Manager、Parameter Store 或 Amazon CloudWatch Logs,請確保定義端點。如需詳細資訊,請參閱使用 AWS Secrets Manager VPC 端點和為 Amazon ECS 建立 VPC 端點。
對於 PrivateLink,請檢查 Amazon VPC 安全群組是否允許來自 Fargate 任務安全群組,或 TCP 連接埠 443 上 VPC CIDR 範圍的流量。
若要確認 Fargate 基礎架構具有服務存取權限,請檢查 VPC 端點政策和 Amazon Simple Storage Service (Amazon S3) 閘道端點政策。
檢查您的 IAM 角色和權限
任務執行角色向 Amazon ECS 容器和 Fargate 代理程式授予所需的權限,以便對任務進行 API 呼叫。
當您執行以下動作時,Fargate 需要任務執行角色:
- 從 Amazon ECR 中提取容器映像檔。
- 使用 awslogs 日誌驅動程式。
- 使用私有登錄檔驗證。
- 使用 Secret Manager 密碼或 Parameter Store 參數來參考敏感資料。
在上述情況中,請在您的任務執行角色中定義所需的權限。當您存取 Secrets Manager 密碼或 Parameter Store 參數以擷取敏感資料時,請確認您具有所需的 secretsmanager:GetSecretValue 或 ssm:GetParameters 權限。有關所需權限的清單,請參閱 Secrets Manager 或 Systems Manager 權限。
檢查 Amazon ECS 任務定義中的敏感資料
檢查密碼和參數名稱是否與 Amazon ECS 任務定義中的參考名稱相符。然後,檢查容器定義中的值是否與 Amazon ECS 任務定義中的值相符。如需詳細資訊,請參閱如何將密碼或敏感資訊安全地傳遞至 Amazon ECS 任務中的容器?
請確定您使用任務定義中指定的 ARN 或名稱來設定密碼或參數。如果資源存在於不同的區域,則必須提供完整的 ARN。
使用 GetSecretValueInput 中的 VersionId 參數,指定擷取到的秘密值的版本。如果您不需要特定版本,請刪除 VersionId 欄位。Secrets Manager 預設擷取最新版本。
如果 Parameter Store 參數和任務位於相同的區域中,則使用完整的 ARN 或密碼名稱。如果參數存在於不同的「區域」中,則必須指定完整 ARN。
若要檢查參數名稱和 ARN,請完成以下步驟:
- 開啟 AWS Systems Manager 主控台。
- 在導覽窗格中,選擇 Parameter Store,然後確認您的 Parameter Store 名稱。
- 若要取得參數的 ARN,請執行下列 get-parameter AWS CLI 命令:
注意: 將 name\of\parameter\store\secret 替換為您的 Parameter Store 密碼名稱。參考 Secrets Manager 密碼的參數無法使用 Parameter Store 版本或歷史記錄功能。如需詳細資訊,請參閱限制。aws ssm get-parameter --name name_of_parameter_store_secret --with-decryption
相關資訊
Fargate 啟動類型的 Amazon ECS 任務網路選項
- 語言
- 中文 (繁體)

相關內容
- 已提問 1 年前
- 已提問 1 年前
