如何解決 Image Builder 的映像組建管道執行錯誤「無法啟動 TOE 程序」?

2 分的閱讀內容
0

我的映像組建管道執行失敗,並在 EC2 Image Builder 顯示「無法啟動 TOE 程序」錯誤。如何解決此錯誤?

簡短描述

在映像組建管道的組建階段,Amazon Elastic Compute Cloud (Amazon EC2) 組建執行個體安裝並執行 AWS Task Orchestrator and Executor (AWS TOE) 啟動程序指令碼 bootstrap.sh。如果 Amazon EC2 組建執行個體無法安裝或啟動程式指令碼,則會在 EC2 Image Builder 主控台收到錯誤訊息。

錯誤訊息範例:

SSM execution '7729e837-22d4-49dd-bb60-cc2c835a2625' failed for image arn: 'arn:aws:imagebuilder:us-west-2:account-ID:image/test/1.0.0/1' with 
status= 'Failed' in state = 'BUILDING' and failure message = 'Unable to bootstrap TOE'

Image Builder 使用 AWS Systems Manager Automation 來建立客製化映像。自動化通常在 RunBuildScriptsWithLoggingRunBuildScriptsWithoutLogging 時失敗。

以下是啟動程序指令碼失敗的常見原因:

  • EC2 組建執行個體無法存取 Amazon Simple Storage Service (Amazon S3)。
  • 基礎 Amazon Machine Image (AMI) 經過 CIS 強化,利用 noexec 掛載預設 /tmp 目錄。

解決方式

疑難排解問題,請使用錯誤訊息的 SSM Automation 執行 ID。

  1. 開啟 EC2 Image Builder 主控台
  2. 選擇失敗的組建管道。
  3. 請注意來自錯誤訊息的 SSM Automation 執行 ID。上述範例錯誤訊息的識別碼是 7729e837-22d4-49dd-bb60-cc2c835a2625
  4. 開啟 AWS Systems Manager 主控台
  5. 在導覽窗格選擇 Automations (自動化)。
  6. 選擇關聯 SSM Automation 執行 ID 的自動化。
  7. 選擇 RunBuildScriptsWithoutLogging 步驟 ID,取得啟動程序指令碼失敗的詳細資訊。

組建執行個體無法存取 Amazon S3

RunBuildScriptsWithoutLogging 步驟,您會收到以下錯誤訊息,No such file or directory (沒有這個檔案或目錄)︰

{"Status":"Failed","ResponseCode":1,"Output":"Waiting for Cloud-init to initialize ...
Cloud-init fails to initialize ... waiting another 5 minutes for the instance to stabilize
/var/lib/amazon/ssm/i-0ad513xxxxxxx/document/orchestration/bb0d8b53-994f-4c47-8297-e852a484501d/awsrunShellScript/0.awsrunShellScript/_script.sh: 
line 49: /tmp/imagebuilder/TaskOrchestratorAndExecutor/bootstrap.sh: No such file or directory
{\"failureMessage\":\"Unable to bootstrap TOE\"}

上述錯誤代表 bootstrap.sh 檔案不存在於組建執行個體。當組建執行執行個體位於私人子網且無法下載 AWS TOE 啟動程序指令碼時會發生此錯誤。

要解決此問題,請檢查 Amazon S3 閘道端點 com.amazonaws.region.s3 是否與管道的基礎設施設定相同的 Amazon Virtual Private Cloud (Amazon VPC)。如果端點位於相同的 Amazon VPC,請驗證此端點關聯正確的路由表。端點必須針對由基礎設施組態指定的子網路關聯其所使用的路由表。

此外,請確認連接組建執行個體的安全群組是否允許輸出 HTTPS (連接埠 443) 連線 S3 公用 IP 地址。組建執行個體必須允許輸出 HTTPS 連線,才能從 Image Builder S3 儲存貯體下載啟動程序指令碼。驗證管道對應的 AWS 區域 S3 公用 IP 地址範圍

**注意:**Amazon S3 介面端點不支援私人 DNS 功能。如需詳細資料,請參閱利用介面 VPC 端點存取 AWS 服務

此外,請確定端點的政策允許來自 Image Builder S3 儲存貯體 ec2imagebuilder-toe-REGION-prodGetObjects 動作。依預設,政策具有完整存取權限。

/tmp 目錄會以非執行方式掛載 (僅適合 Linux AMI 版本)

RunBuildScriptsWithoutLogging 步驟期間,您會收到以下錯誤訊息,包含權限遭拒

{"Status":"Failed","ResponseCode":1,"Output":"Waiting for Cloud-init to initialize ...
/var/lib/amazon/ssm/i-0ad513xxxxxxx/document/orchestration/634699d5-3b04-4152-aab3-33d6981524cd/awsrunShellScript/0.awsrunShellScript/_script.sh:
line 49: /tmp/imagebuilder/TaskOrchestratorAndExecutor/bootstrap.sh: Permission denied
{\"failureMessage\":\"Unable to bootstrap TOE\"}

上述錯誤表示組建執行個體因為作業系統權限問題而無法執行 bootstrap.sh 指令碼。當利用 noexec 選項掛載預設 /tmp 目錄時,便會發生這個錯誤。noexec 掛載選項可避免二進位檔案在掛載的檔案系統執行。

要檢查 /tmp 目錄是否利用 noexec 掛載,請從映像配方指定的基礎 AMI 啟動測試執行個體。

執行下列命令:

sudo mount | grep -E '/tmp.*noexec'

輸出:

dev/xvdf on /tmp type ext4 (rw,noexec,relatime,data=ordered)

上述輸出會確認 /tmp 目錄已掛載為 noexec。若要解決此問題,請變更映像配方的工作目錄,或從基礎 AMI 的目錄移除 noexec 選項。

若要修改映像配方的工作目錄參數,請建立新映像配方版本。然後,編輯管道以便利用新版本。請確定新目錄已存在 AMI,而且未設定為利用 noexec 選項掛載。

若要從 /tmp 目錄移除 noexec 選項,請執行以下動作:

  1. 從映像配方指定的基礎 AMI 手動啟動執行個體。
  2. /etc/fstab 檔案,從關聯 /tmp 或工作目錄的項目移除 noexec 選項。
  3. 從執行個體建立新 AMI,做為映像配方的基礎 AMI。

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