[英]Amazon EC2 custom AMI not running bootstrap (user-data)
我在 EC2 實例上創建自定義 AMI(映像)時遇到問題。 如果我使用自定義引導程序/用戶數據腳本啟動 Windows 默認 2012 服務器實例,例如;
<powershell>
PowerShell "(New-Object System.Net.WebClient).DownloadFile('http://download.microsoft.com/download/3/2/2/3224B87F-CFA0-4E70-BDA3-3DE650EFEBA5/vcredist_x64.exe','C:\vcredist_x64.exe')"
</powershell>
它將按預期工作並轉到 URL 並下載文件,並將其存儲在 C: 驅動器上。
但是,如果我設置一個 Windows Server 實例,然后從中創建一個映像,並將其存儲為自定義 AMI,然后使用完全相同的自定義用戶數據腳本部署它,它將無法工作。 但是,如果我轉到實例 url ( http://169.254.169.254/latest/user-data
),它將顯示腳本已成功導入但尚未執行。
檢查錯誤日志后,我經常注意到這一點:
Failed to fetch instance metadata http://169.254.169.254/latest/user-data with exception The remote server returned an error: (404) Not Found.
根據 EC2Launch 的 AWS 文檔,Windows Server 2016 用戶可以繼續使用 EC2Config 2.1.10 中引入的持久標簽:
對於 EC2Config 版本 2.1.10 及更高版本,或者對於 EC2Launch,您可以在用戶數據中使用 true 以在用戶數據執行后啟用插件。
用戶數據示例:
<powershell>
insert script here
</powershell>
<persist>true</persist>
對於后續引導:
Windows Server 2016 用戶必須另外啟用配置和啟用 EC2Launch而不是 EC2Config。 EC2Config 在 Windows Server 2016 AMI 上已棄用,轉而支持 EC2Launch。
運行以下 powershell 以安排將在下次啟動時運行用戶數據的 Windows 任務:
C:\ProgramData\Amazon\EC2-Windows\Launch\Scripts\InitializeInstance.ps1 –Schedule
按照設計,此任務在第一次運行后被禁用。 但是,使用 persist 標簽會導致 Invoke-UserData 通過 Register-FunctionScheduler 安排一個單獨的任務,以便在后續啟動時保留您的用戶數據。 您可以在C:\\ProgramData\\Amazon\\EC2-Windows\\Launch\\Module\\Scripts\\Invoke-Userdata.ps1
親自查看。
進一步的故障排除:
如果您的用戶數據腳本有其他問題,您可以在C:\\ProgramData\\Amazon\\EC2-Windows\\Launch\\Log\\UserdataExecution.log
找到來自 WS 2016 基礎 AMI 的實例的用戶數據執行日志。
用戶數據執行在初始啟動后自動禁用。 創建映像時,很可能已禁用執行。 這可以在C:\\Program Files\\Amazon\\Ec2ConfigService\\Settings\\Config.xml
手動配置。
“使用 EC2Config 服務配置 Windows 實例”的文檔提出了幾個選項:
使用schtasks.exe /Create
以編程方式創建要在系統啟動時運行的計划任務,並將計划任務指向C:\\Program Files\\Amazon\\Ec2ConfigServer\\Scripts\\UserScript.ps1
處的用戶數據腳本(或其他腳本)。
以編程方式啟用 Config.xml 中的用戶數據插件。
示例,來自文檔:
<powershell>
$EC2SettingsFile="C:\Program Files\Amazon\Ec2ConfigService\Settings\Config.xml"
$xml = [xml](get-content $EC2SettingsFile)
$xmlElement = $xml.get_DocumentElement()
$xmlElementToModify = $xmlElement.Plugins
foreach ($element in $xmlElementToModify.Plugin)
{
if ($element.name -eq "Ec2SetPassword")
{
$element.State="Enabled"
}
elseif ($element.name -eq "Ec2HandleUserData")
{
$element.State="Enabled"
}
}
$xml.Save($EC2SettingsFile)
</powershell>
<persist>true</persist>
在用戶數據執行后啟用插件。示例,來自文檔:
<powershell>
insert script here
</powershell>
<persist>true</persist>
另一個對我有用的解決方案是使用 EC2Launch 運行 Sysprep 。
問題是 AWS 不會在您的自定義 AMI 中重新建立到配置文件服務 (169.254.169.254) 的路由。 請參閱 SanjitPatel 在這篇文章中的回復。 因此,當我嘗試使用我的自定義 AMI 創建 Spot 請求時,我的新實例無法找到用戶數據。
使用 Sysprep 關閉,實質上是強制 AWS 在實例上重新執行所有設置工作,就好像它是第一次運行一樣。 因此,當您創建實例時,使用 Sysprep 將其關閉,然后創建您的自定義 AMI,AWS 將為新實例正確設置配置文件服務路由並執行您的用戶數據。 這也避免了在后續啟動時手動更改 Windows 任務和執行用戶數據,如持久標記所做的那樣。
這是一個快速的分步說明:
希望這可以幫助!
在初始引導程序 (UserData) 腳本的末尾,只需附加持久標記,如下所示。 完美運行。
<powershell>
insert script here
</powershell>
<persist>true</persist>
對於那些從 Google 來到這里並運行 Server 2016 實例的人來說,這似乎不再可能。
Server2016 沒有 ec2config 服務,因此您不能使用持久標志。
<persist>true</persist>
Anthony Neace 的帖子中對此進行了描述。
Server 2016 使用EC2Launch ,我還沒有看到如何在每次啟動時運行腳本。 您可以在第一次啟動時運行腳本,但后續啟動不會運行它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.