3

tdlr; 我想使用“部分系统准备”创建一个 AMI,以便 SSM 在我启动与该 AMI 的原始实例类型不同的实例类型时可以连接,但希望保持其他所有内容相同。它只需要更新元数据/kms 路线。

我最近遇到了一个问题,如果我部署的实例类型不是最初创建 AMI 的实例类型,则无法访问 SSM。原来这是因为不同的实例大小会被启动到不同的可用区,并且连接到 SSM 的路由被保存到指向原始实例类型 AMI 的可用区的映像中。

对此的解决方案是在创建 AMI 之前使用 sysprep 关闭。但是,这引发了其他问题: 1- 从 sysprep 的 AMI 启动系统需要 2 分钟以上才能使 SSM 可用,而不是在不使用 sysprep 时立即可用。但更重要的是:2-我的启动脚本的一部分将 exe 下载到桌面并使用 SSM RunPowershellScript 安装它。这部分现在失败了,我相信是因为在我 RDP 进入新实例之前,不会创建桌面等。我已经测试了 15 分钟的睡眠,结果相同。在我 rdp'd 进入实例后,这部分代码运行良好。

我有: 1. 当 AMI 未进行系统准备时,确认 exe 安装程序运行良好。但是,在这种模式下,我只能使用为其创建原始 AMI 的实例类型。

  1. 使用 sysprep 时,在下载/运行安装程序之前尝试了 15 分钟睡眠。这没有用。

  2. 确认在 sysprep'd 映像上,如果我已 rdp'd 进入实例以初始化桌面等,安装程序将下载并运行。

这与页面底部描述的元数据/KMS 路由有关:https ://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/ec2launch.html#ec2launch-inittasks

如果在不使用 sysprep 的情况下创建 AMI,则如果实例将该 AMI 启动到不同的可用区,则 SSM 将无法访问,并且日志中会出现以下错误:

2019-08-28 22:39:12 错误 [func1 @ coremanager.go.245] [instanceID=i-0d6c57bbfe2db46af] 尝试启动核心模块时发生错误。插件名称:启动处理器。错误:启动处理器发生内部错误:运行时错误:无效的内存地址或 nil 指针取消引用 2019-08-28 22:39:27 错误 [SetWebSocket @ controlchannel.go.89] [MessageGatewayService] 无法获取控制通道令牌,错误: CreateControlChannel 失败并出现错误:createControlChannel 请求失败:来自服务未授权请求的意外响应。

预期的行为是能够从 AMI 启动实例,并预先配置所有内容(包括桌面等,在使用 sysprep 时需要完全重新初始化),并让新实例更新元数据/kms 路由,以便可以访问 SSM。

4

0 回答 0