簡體   English   中英

Amazon EC2 自定義 AMI 未運行引導程序(用戶數據)

[英]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.

2017 年 4 月 15 日更新:對於 EC2Launch 和 Windows Server 2016 AMI

根據 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 的實例的用戶數據執行日志。


原始答案:對於 EC2Config 和舊版本的 Windows Server

用戶數據執行在初始啟動后自動禁用。 創建映像時,很可能已禁用執行。 這可以在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>
  • 從 EC2Config 版本 2.1.10 開始,您可以使用<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 任務和執行用戶數據,如持久標記所做的那樣。

這是一個快速的分步說明:

  1. 使用 AWS Windows AMI 之一(Windows Server 2016 Nano Server 不支持 Sysprep)創建一個實例並傳遞您所需的用戶數據(這可能是可選的,但有助於確保 AWS 連接設置腳本正確處理用戶數據)。
  2. 根據需要自定義您的實例。
  3. 使用 Sysprep 關閉您的實例。 只需打開 EC2LaunchSettings 應用程序並單擊“使用 Sysprep 關閉”。 完整說明在這里
  4. 從您剛剛關閉的實例創建您的自定義 AMI。
  5. 使用您的自定義 AMI 創建其他實例,在創建實例時傳遞用戶數據。 用戶數據將在實例啟動時執行。 就我而言,我使用了 Spot 請求屏幕,其中有一個用戶數據文本框。

希望這可以幫助!

在初始引導程序 (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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM