本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
引導 Windows型 CloudFormation 堆疊
本主題說明如何引導Windows堆疊並疑難排解堆疊建立問題。
EC2 執行個體中的使用者資料
使用者資料是一種 Amazon EC2 功能,可讓您在啟動時將指令碼或組態資訊傳遞給 EC2 執行個體。
對於 Windows EC2 執行個體:
-
您可以使用批次指令碼 (使用
<script>
標籤) 或PowerShell指令碼 (使用<powershell>
標籤)。 -
指令碼執行由 處理EC2Launch。
重要
如果您要建立自己的 Windows AMI 以搭配 CloudFormation 使用,請確定 EC2Launch v2 已正確設定。CloudFormation 引導工具需要 EC2Launch v2,才能在堆疊建立期間正確初始化和設定Windows執行個體。如需詳細資訊,請參閱《Amazon EC2 EC2 使用者指南》中的使用 EC2Launch v2 代理程式在 EC2 Windows 執行個體啟動期間執行任務EC2。
如需 AMIs的詳細資訊 AWS Windows,請參閱 AWSWindows AMI 參考。
CloudFormation 協助程式指令碼
協助程式指令碼是在引導程序期間設定執行個體的公用程式。與 Amazon EC2 使用者資料搭配使用,可提供強大的組態選項。
CloudFormation 提供下列 Python 協助程式指令碼,可用於在堆疊中建立的 Amazon EC2 執行個體上安裝軟體和啟動服務:
-
cfn-init
– 使用 擷取和解譯資源中繼資料、安裝套件、建立檔案和啟動服務。 -
cfn-signal
– 使用 向 發出訊號CreationPolicy
,以便在先決條件資源或應用程式就緒時同步堆疊中的其他資源。 -
cfn-get-metadata
– 使用 擷取特定金鑰之資源或路徑的中繼資料。 -
cfn-hup
– 用來檢查中繼資料的更新,並在偵測到變更時執行自訂掛鉤。
您可以直接從範本呼叫指令碼。指令碼會搭配同一個範本中定義的資源中繼資料使用。指令碼會在堆疊建立程序期間於 Amazon EC2 執行個體上執行。
如需詳細資訊,請參閱《 範本參考指南》中的 CloudFormation 協助程式指令碼參考。 AWS CloudFormation
引導Windows堆疊的範例
讓我們檢查範本中Windows Server執行下列動作的範例程式碼片段:
-
TestInstance
從 2022 AMI 啟動名為 的 EC2 執行個體。 Windows Server -
建立簡單的測試檔案以驗證
cfn-init
是否正常運作。 -
設定
cfn-hup
以進行持續的組態管理。 -
使用
CreationPolicy
來確保執行個體發出成功完成的訊號。
cfn-init
協助程式指令碼用於根據範本中AWS::CloudFormation::Init
資源的資訊執行這些動作。
AWS::CloudFormation::Init
區段名為 TestInstance
,開頭為下列宣告。
TestInstance: Type: AWS::EC2::Instance Metadata: AWS::CloudFormation::Init: configSets: default: - create_files - start_services
之後,AWS::CloudFormation::Init
會宣告 的 files
區段。
create_files: files: c:\cfn\test.txt: content: !Sub | Hello from ${AWS::StackName} c:\cfn\cfn-hup.conf: content: !Sub | [main] stack=${AWS::StackName} region=${AWS::Region} interval=2 c:\cfn\hooks.d\cfn-auto-reloader.conf: content: !Sub | [cfn-auto-reloader-hook] triggers=post.update path=Resources.TestInstance.Metadata.AWS::CloudFormation::Init action=cfn-init.exe -v -s ${AWS::StackName} -r TestInstance -c default --region ${AWS::Region}
在此建立三個檔案,並放置在伺服器執行個體的 C:\cfn
目錄中:
-
test.txt
,一種簡單的測試檔案,可驗證cfn-init
是否正常運作,並可建立具有動態內容的檔案。 -
cfn-hup.conf
,具有cfn-hup
2 分鐘檢查間隔的 組態檔案。 -
cfn-auto-reloader.conf
,當中繼資料AWS::CloudFormation::Init
變更時cfn-hup
, 用來啟動更新 (呼叫cfn-init
) 的掛鉤組態檔案。
接下來是設定 Windows服務的 start_services
區段。
start_services: services: windows: cfn-hup: enabled: true ensureRunning: true files: - c:\cfn\cfn-hup.conf - c:\cfn\hooks.d\cfn-auto-reloader.conf
本節可確保cfn-hup
服務已啟動,並在修改組態檔案時自動重新啟動。服務會監控 CloudFormation 中繼資料的變更,並在偵測到更新cfn-init
時重新執行。
接下來是 Properties
區段。
TestInstance: Type: AWS::EC2::Instance CreationPolicy: ResourceSignal: Timeout: PT20M Metadata: AWS::CloudFormation::Init: # ... metadata configuration ... Properties: InstanceType: t2.large ImageId: '{{resolve:ssm:/aws/service/ami-windows-latest/Windows_Server-2022-English-Full-Base}}' SecurityGroupIds: - !Ref InstanceSecurityGroup KeyName: !Ref KeyPairName UserData: Fn::Base64: !Sub | <powershell> cfn-init.exe -v -s ${AWS::StackName} -r TestInstance -c default --region ${AWS::Region} cfn-signal.exe -e $lastexitcode --stack ${AWS::StackName} --resource TestInstance --region ${AWS::Region} </powershell>
在本節中, UserData
屬性包含將由 執行的PowerShell指令碼EC2Launch,由<powershell>
標籤包圍。指令碼cfn-init
使用 default
configSet 執行,然後使用 cfn-signal
向 CloudFormation 回報結束碼。CreationPolicy
用於確保執行個體在堆疊建立視為完成之前已正確設定。
ImageId
屬性使用 Systems Manager 參數存放區公有參數自動擷取最新的 Windows Server 2022 AMI ID。這種方法不需要區域特定的 AMI 映射,並確保您始終取得最新的 AMI。針對 AMI IDs 使用 Systems Manager 參數是維護目前 AMI 參考的最佳實務。如果您計劃連線到執行個體,請確定 SecurityGroupIds
屬性參考允許 RDP 存取的安全群組。
CreationPolicy
會宣告為資源屬性的一部分,並指定逾時期間。執行個體組態完成時,使用者資料中的 cfn-signal
命令會發出訊號:
TestInstance: Type: AWS::EC2::Instance CreationPolicy: ResourceSignal: Timeout: PT20M Properties: # ... other properties ...
由於引導程序最少,而且只會建立檔案並啟動服務,因此 會CreationPolicy
等待 20 分鐘 (PT20M),再逾時。逾時是使用 ISO 8601 持續時間格式來指定。請注意,Windows執行個體啟動所需的時間通常比 Linux 執行個體長,因此請徹底測試 ,以判斷符合您需求的最佳逾時值。
如果一切順利, 會CreationPolicy
成功完成,而且您可以使用其公有 IP 地址存取Windows Server執行個體。堆疊建立完成後,執行個體 ID 和公有 IP 地址會顯示在 CloudFormation 主控台的輸出索引標籤中。
Outputs: InstanceId: Value: !Ref TestInstance Description: Instance ID of the Windows Server PublicIP: Value: !GetAtt TestInstance.PublicIp Description: Public IP address of the Windows Server
您也可以手動驗證引導是否正常運作,方法是透過 RDP 連線至執行個體,並檢查檔案C:\cfn\test.txt
是否存在並包含預期的內容。如需連線至Windows執行個體的詳細資訊,請參閱《Amazon EC2 使用者指南》中的使用 RDP 連線至Windows執行個體。
Windows 檔案路徑中的逸出反斜線
在 CloudFormation 範本中參考Windows路徑時,請務必記得根據您使用的範本格式正確逸出反斜線 (\
)。
-
對於 JSON 範本,您必須在Windows檔案路徑中使用雙反斜線,因為 JSON 會將反斜線視為逸出字元。第一個反斜線會逸出第二個斜線,導致解譯單一常值反斜線。
"commands" : { "1-extract" : { "command" : "C:\\SharePoint\\SharePointFoundation2010.exe /extract:C:\\SharePoint\\SPF2010 /quiet /log:C:\\SharePoint\\SharePointFoundation2010-extract.log" } }
-
對於 YAML 範本,單一反斜線通常就足夠了。
commands: 1-extract: command: C:\SharePoint\SharePointFoundation2010.exe /extract:C:\SharePoint\SPF2010 /quiet /log:C:\SharePoint\SharePointFoundation2010-extract.log
管理 Windows 服務
您以與 Linux Windows服務相同的方式管理 服務,但您使用 windows
金鑰而非 sysvinit
。下列範例會啟動cfn-hup
服務、將其設定為自動,並在 cfn-init
修改 c:\cfn\cfn-hup.conf
或 c:\cfn\hooks.d\cfn-auto-reloader.conf
組態檔案時重新啟動服務。
services: windows: cfn-hup: enabled: true ensureRunning: true files: - c:\cfn\cfn-hup.conf - c:\cfn\hooks.d\cfn-auto-reloader.conf
您可以使用名稱而非顯示名稱來參考Windows服務,以相同的方式管理其他 服務。
對堆疊建立問題進行故障診斷
如果您的堆疊在建立期間失敗,預設行為是在失敗時轉返。雖然這樣的預設行為一般而言是好的,因其可避免不必要的額外費用,但卻會對堆疊建立失敗原因進行除錯時造成困難。
若要在使用 CloudFormation 主控台建立或更新堆疊時關閉此行為,請選擇堆疊失敗選項下的保留成功佈建的資源選項。 如需詳細資訊,請參閱選擇佈建資源時如何處理失敗。這可讓您登入執行個體並檢視日誌檔案,以找出執行啟動指令碼時遇到的問題。
要查看的重要日誌如下:
-
EC2 組態日誌,位於
%ProgramData%\Amazon\EC2Launch\log\agent.log
-
的cfn-init日誌
C:\cfn\log\cfn-init.log
(檢查特定故障點的結束代碼和錯誤訊息)
如需更多日誌,請參閱《Amazon EC2 使用者指南》中的下列主題:
如需有關對引導問題進行疑難排解的詳細資訊,請參閱如何使用Windows執行個體對 CloudFormation 堆疊中不會引導的協助程式指令碼進行疑難排解?