AWS - 对于从自定义图像创建的实例,不执行 UserData

AWS - UserData is not executed for instance created from custom image

我使用简单的 PowerShell 脚本进行了测试 mkdir C:\tempdir 当我将其指定为从 Amazon 图像启动的实例时,一切正常。如果我使用指定的 UserData 启动实例并制作该实例的图像,则不会为从我的自定义图像创建的实例执行 UserData。 有趣的是,"C:\Program Files\Amazon\Ec2ConfigService\Scripts\UserScript.ps1" 包含初始启动的用户数据(在创建图像之前),尽管它应该包含上次启动期间指定的数据。 更有趣的是,即使 UserScript.ps1 存在,它也不会被执行(它应该创建文本文件但文本文件不存在)。 这是第二次启动时的 UserData

<powershell>
  mkdir C:\tempdir
</powershell>

用户数据脚本仅在实例启动时 运行 一次(创建而非启动)。然后在实例上禁用它们。因此,当您从该实例获取 AMI 并启动新的 AMI 时,用户数据已被禁用。

启用用户数据

要在从您创建的 AMI 启动新 AMI 时再次允许它 运行,您必须通过选中 UserData 框(在获取 AMI 之前)在 EC2ConfigService 设置实用程序中重新打开用户数据支持。

坚持启用用户数据

现在,如果您再次重启实例,UserData 将 运行 并再次禁用自身。要禁用此功能,您还需要将 <persist>true</persist> 添加到实例的 UserData 中,这将使复选框保持相同状态(如果您打开它,则打开)。

更多信息:

我遇到了同样的问题。这是解决问题的方法

  1. 如果您还没有从您的图像启动一个实例
  2. 加入 RDP
  3. 打开powershell,然后运行这个C:\ProgramData\Amazon\EC2-Windows\Launch\Scripts\InitializeInstance.ps1 –Schedule
  4. 如果您有实例的自定义密码,它会在上一步中重置。如果你想要它回来,打开 powershell 和 运行 以下内容(假设你的用户名是 Administrator net user Administrator "your_new_password" (如果你没有自定义密码,并且只是使用由 .pem文件,则可以忽略这一步)
  5. 现在进入 AWS 控制台(即在浏览器中)并从实例创建 AMI
  6. 确保您的用户数据具有以下格式(persist/true 部分必不可少)。
<powershell>
# Some powershell code here
</powershell>
<persist>true</persist>

就是这样。下次启动您的实例时,您的 userdata powershell 脚本现在将 运行。