本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 Amazon EC2 上部署應用程式
您可以使用 CloudFormation 在 Amazon EC2 執行個體上自動安裝、設定和啟動應用程式。這樣可讓您輕鬆地重複部署和更新現有安裝,無需直接連接到執行個體,為您節省了許多時間和精力。
CloudFormation 包含一組以 cfn-init
為基礎的協助程式指令碼 (cfn-get-metadata
、、 cfn-signal
和 cfn-hup
)cloud-init
。您從 CloudFormation 範本呼叫這些協助程式指令碼,在相同範本中的 Amazon EC2 執行個體上安裝、設定和更新應用程式。如需詳細資訊,請參閱《 範本參考指南》中的 CloudFormation 協助程式指令碼參考。 AWS CloudFormation
在入門教學課程中,您使用 UserData
搭配基本 bash 指令碼來建立簡單的 Web 伺服器。雖然這適用於簡單的「Hello World」頁面,但真正的應用程式通常需要更複雜的組態,包括:
-
以正確的順序安裝多個軟體套件。
-
使用特定內容建立的複雜組態檔案。
-
服務已啟動並設定為自動執行。
-
設定程序的錯誤處理和驗證。
相較於 中的基本 bash 指令碼,CloudFormation 的協助程式指令碼提供更強大且可維護的方式來設定 EC2 執行個體UserData
。cfn-init
協助程式指令碼會從範本的中繼資料讀取組態資料,並以系統化的方式將其套用至執行個體。
在本教學課程中,您將了解如何使用cfn-init
協助程式指令碼並監控引導程序。
注意
CloudFormation 是免費的,但您需要為建立的 Amazon EC2 資源付費。不過,如果您是新手 AWS,則可以利用 免費方案
先決條件
了解引導概念
讓我們先了解讓引導運作的關鍵概念,再建立範本。
cfn-init
helper 指令碼
CloudFormation 提供 Python 協助程式指令碼,可用於在 Amazon EC2 執行個體上安裝軟體和啟動服務。cfn-init
指令碼會從範本讀取資源中繼資料,並將組態套用至執行個體。
程序的運作方式如下:
-
您可以在 EC2 資源的
Metadata
區段中定義組態。 -
您可以從
UserData
指令碼呼叫cfn-init
。 -
cfn-init
會讀取中繼資料並套用組態。 -
您的執行個體是根據您的規格設定。
中繼資料結構
組態是在 EC2 執行個體中的特定結構中定義。
Resources: EC2Instance: Type: AWS::EC2::Instance Metadata: # Metadata section for the resource AWS::CloudFormation::Init: # Required key that cfn-init looks for config: # Configuration name (you can have multiple) packages: # Install packages files: # Create files commands: # Run commands services: # Start/stop services
cfn-init
指令碼會以特定順序處理這些區段:套件、群組、使用者、來源、檔案、命令,然後是 服務。
從簡單的引導範例開始
讓我們從安裝和啟動 Apache 的最低引導範例開始。
Resources: EC2Instance: Type: AWS::EC2::Instance Metadata: AWS::CloudFormation::Init: config: packages: # Install Apache web server yum: httpd: [] services: # Start Apache and enable it to start on boot sysvinit: httpd: enabled: true ensureRunning: true Properties: ImageId: !Ref LatestAmiId InstanceType: !Ref InstanceType UserData: !Base64 # Script that runs when instance starts Fn::Sub: | #!/bin/bash yum install -y aws-cfn-bootstrap /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource EC2Instance --region ${AWS::Region}
這個簡單的範例示範了核心概念:
-
packages
區段會使用 安裝httpd
套件yum。這適用於 Amazon Linux 和使用 的其他 Linux 發行版本yum。 -
services
區段可確保 自動httpd
啟動和執行。 -
UserData
安裝最新的引導工具和呼叫cfn-init
。
新增檔案和命令
現在,讓我們透過在 EC2 執行個體的 /var/log
目錄中新增自訂網頁和日誌檔案來增強我們的範例。
建立檔案
files
本節可讓您在具有特定內容的執行個體上建立檔案。垂直管道 (|
) 可讓您傳遞文字區塊 (HTML 程式碼) 做為檔案 () 的內容/var/www/html/index.html
。
files: /var/www/html/index.html: content: | <body> <h1>Congratulations, you have successfully launched the AWS CloudFormation sample.</h1> </body>
執行命令
commands
區段可讓您在引導程序期間執行 shell 命令。此命令會在 EC2 執行個體/var/log/welcome.txt
上的 建立日誌檔案。若要檢視它,您需要 Amazon EC2 金鑰對來用於 SSH 存取,以及可用於 SSH 到執行個體的 IP 地址範圍 (此處未涵蓋)。
commands: createWelcomeLog: command: "echo 'cfn-init ran successfully!' > /var/log/welcome.txt"
新增網路安全
由於我們正在設定 Web 伺服器,我們需要允許 Web 流量 (HTTP) 連接我們的 EC2 執行個體。為此,我們會建立一個安全群組,允許連接埠 80 上從您的 IP 地址傳入流量。EC2 執行個體也需要將流量傳送到網際網路,例如安裝套件更新。根據預設,安全群組允許所有傳出流量。然後,我們將使用 SecurityGroupIds
屬性將此安全群組與 EC2 執行個體建立關聯。
WebServerSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Allow HTTP access from my IP address SecurityGroupIngress: - IpProtocol: tcp Description: HTTP FromPort: 80 ToPort: 80 CidrIp: !Ref MyIP
完整的引導範本
現在,讓我們將所有部分放在一起。以下是結合我們討論的所有概念的完整範本。
AWSTemplateFormatVersion: 2010-09-09 Description: Bootstrap an EC2 instance with Apache web server using cfn-init Parameters: LatestAmiId: Description: The latest Amazon Linux 2 AMI from the Parameter Store Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>' Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2' InstanceType: Description: EC2 instance type Type: String Default: t2.micro AllowedValues: - t3.micro - t2.micro ConstraintDescription: must be a valid EC2 instance type. MyIP: Description: Your IP address in CIDR format (e.g. 203.0.113.1/32) Type: String MinLength: 9 MaxLength: 18 Default: 0.0.0.0/0 AllowedPattern: '^(\d{1,3}\.){3}\d{1,3}\/\d{1,2}$' ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x. Resources: WebServerSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Allow HTTP access from my IP address SecurityGroupIngress: - IpProtocol: tcp Description: HTTP FromPort: 80 ToPort: 80 CidrIp: !Ref MyIP WebServer: Type: AWS::EC2::Instance Metadata: AWS::CloudFormation::Init: config: packages: yum: httpd: [] files: /var/www/html/index.html: content: | <body> <h1>Congratulations, you have successfully launched the AWS CloudFormation sample.</h1> </body> commands: createWelcomeLog: command: "echo 'cfn-init ran successfully!' > /var/log/welcome.txt" services: sysvinit: httpd: enabled: true ensureRunning: true Properties: ImageId: !Ref LatestAmiId InstanceType: !Ref InstanceType SecurityGroupIds: - !Ref WebServerSecurityGroup UserData: !Base64 Fn::Sub: | #!/bin/bash yum install -y aws-cfn-bootstrap /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource WebServer --region ${AWS::Region} Tags: - Key: Name Value: Bootstrap Tutorial Web Server Outputs: WebsiteURL: Value: !Sub 'http://${WebServer.PublicDnsName}' Description: EC2 instance public DNS name
使用主控台建立堆疊
下列程序涉及從檔案上傳範例堆疊範本。在本機電腦上開啟文字編輯器並新增範本。儲存檔案,並將其命名為 samplelinux2stack.template
。
啟動堆疊範本
-
登入 AWS Management Console 並在 https://https://console.aws.amazon.com/cloudformation
開啟 AWS CloudFormation 主控台。 -
選擇 Create stack (建立堆疊)、With new resources (standard) (使用新資源 (標準))。
-
在指定範本下,選擇上傳範本檔案,然後選擇選擇檔案以上傳
samplelinux2stack.template
檔案。 -
選擇下一步。
-
在指定堆疊詳細資訊頁面上,輸入
BootstrapTutorialStack
做為堆疊名稱。 -
在參數下,執行下列動作。
-
LatestAmiId:保留預設值。
-
InstanceType:為 EC22 執行個體類型選擇 t2.micro 或 t3.micro。
-
MyIP:使用尾碼輸入您的公有 IP
/32
地址。
-
-
選擇下一步兩次,然後選擇提交以建立堆疊。
監控引導程序
引導程序需要比簡單的 EC2 啟動更長的時間,因為安裝和設定了額外的軟體。
監控引導進度
-
在 CloudFormation 主控台中,選取您的堆疊並開啟事件索引標籤。
-
請留意
WebServer CREATE_IN_PROGRESS
事件。引導程序會在執行個體啟動後開始。 -
引導程序通常需要幾分鐘的時間。完成後,您會看到
WebServer CREATE_COMPLETE
。
如果您想要查看引導程序期間發生的情況,您可以檢查執行個體日誌。
檢視引導日誌 (選用)
-
開啟 EC2 主控台
並尋找您的執行個體。 -
選取執行個體,然後選擇動作、監控和疑難排解、取得系統日誌以查看引導進度。
-
如果您沒有立即看到日誌,請等待並重新整理頁面。
測試引導的 Web 伺服器
當您的堆疊顯示 時CREATE_COMPLETE
,請測試您的 Web 伺服器。
測試 Web 伺服器
-
在 CloudFormation 主控台中,前往堆疊的輸出索引標籤。
-
按一下 WebsiteURL 值,在新索引標籤中開啟您的 Web 伺服器。
-
您應該會看到包含訊息 的自訂網頁
Congratulations, you have successfully launched the AWS CloudFormation sample
。
注意
如果頁面未立即載入,請等待一分鐘,然後再試一次。即使堆疊顯示 ,引導程序仍可能正在完成CREATE_COMPLETE
。
對引導問題進行故障診斷
如果您的引導程序失敗或 Web 伺服器無法運作,以下是常見問題和解決方案。
常見問題
-
堆疊建立失敗 – 檢查事件索引標籤是否有特定錯誤訊息。
-
無法存取 Web 伺服器 – 在
MyIP
參數中確認您的 IP 地址是否正確。請記得/32
在結尾包含 。 -
引導程序失敗 – 執行個體可能會啟動但
cfn-init
失敗。如監控章節所述檢查系統日誌。
清除資源
若要避免持續收費,您可以透過刪除堆疊及其資源來清除 。
刪除堆疊及其資源
-
在堆疊頁面上,選取您所建立堆疊名稱旁的選項 (
BootstrapTutorialStack
),然後選擇刪除。 -
出現確認提示時,請選擇刪除。
-
在事件索引標籤上監控堆疊刪除程序的進度。
BootstrapTutorialStack
的狀態會變更為DELETE_IN_PROGRESS
。當 CloudFormation 完成刪除堆疊時,它會從清單移除堆疊。
後續步驟
恭喜您!您已成功了解如何使用 CloudFormation 啟動 EC2 執行個體。您現在了解:
-
如何使用
cfn-init
協助程式指令碼 -
如何建構用於引導的中繼資料
-
如何安裝套件、建立檔案、執行命令和管理 服務
-
如何監控引導問題
若要繼續學習:
-
了解如何引導Windows堆疊。如需詳細資訊,請參閱引導 Windows型 CloudFormation 堆疊。
-
探索具有多個組態集的更複雜引導案例。如需詳細資訊,請參閱《 AWS CloudFormation 範本參考指南》中的 cfn-init 和 AWS::CloudFormation::Init。
-
了解如何
cfn-signal
報告引導完成狀態。如需詳細資訊,請參閱《 AWS CloudFormation 範本參考指南》中的 cfn-signal。