如何解决 Image Builder 中的映像构建管道执行错误“无法引导 TOE”?

上次更新日期:2022 年 7 月 25 日

我的映像构建管道执行失败,在 EC2 Image Builder 中出现错误“无法引导 TOE”。如何解决此问题?

简短描述

在映像构建管道的构建阶段,Amazon Elastic Compute Cloud (Amazon EC2) 会生成实例安装并运行 AWS 任务编排工具和执行器 (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 机器映像 (AMI) 经过 CIS 加强,默认的 /tmp 目录使用 noexec 装载。

解决方法

要解决此问题,请使用错误消息中的 SSM 自动化执行 ID。

  1. 打开 EC2 Image Builder 控制台
  2. 选择失败的构建管道。
  3. 记下错误消息中的 SSM 自动化执行 ID。前面示例错误消息的 ID 为 7729e837-22d4-49dd-bb60-cc2c835a2625
  4. 打开 AWS Systems Manager 控制台
  5. 在导航窗格中,选择 Automations(自动化)。
  6. 选择与 SSM 自动化执行 ID 关联的自动化。
  7. 选择 RunBuildScriptsWithoutLogging 步骤的 ID,以获取有关引导脚本失败的更多详细信息。

构建实例没有访问 Amazon S3 的权限

RunBuildScriptsWithoutLogging 步骤中,您会收到以下错误消息,提示没有此类文件或目录

{"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 功能。有关更多信息,请参阅 Access an AWS service using an interface VPC endpoint

另外,请确保端点的策略允许从 Image Builder S3 桶 ec2imagebuilder-toe-REGION-prod 执行 GetObjects 操作。默认情况下,该策略具有完全访问权限。

/tmp 目录使用 noexec 装载(仅适用于 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。

这篇文章对您有帮助吗?


您是否需要账单或技术支持?