在 Amazon EC2 上部署應用程式 - AWS CloudFormation

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

在 Amazon EC2 上部署應用程式

您可以使用 CloudFormation 在 Amazon EC2 執行個體上自動安裝、設定和啟動應用程式。這樣可讓您輕鬆地重複部署和更新現有安裝,無需直接連接到執行個體,為您節省了許多時間和精力。

CloudFormation 包含一組以 cfn-init為基礎的協助程式指令碼 (cfn-get-metadata、、 cfn-signalcfn-hup)cloud-init。您從 CloudFormation 範本呼叫這些協助程式指令碼,在相同範本中的 Amazon EC2 執行個體上安裝、設定和更新應用程式。如需詳細資訊,請參閱《 範本參考指南》中的 CloudFormation 協助程式指令碼參考。 AWS CloudFormation

入門教學課程中,您使用 UserData搭配基本 bash 指令碼來建立簡單的 Web 伺服器。雖然這適用於簡單的「Hello World」頁面,但真正的應用程式通常需要更複雜的組態,包括:

  • 以正確的順序安裝多個軟體套件。

  • 使用特定內容建立的複雜組態檔案。

  • 服務已啟動並設定為自動執行。

  • 設定程序的錯誤處理和驗證。

相較於 中的基本 bash 指令碼,CloudFormation 的協助程式指令碼提供更強大且可維護的方式來設定 EC2 執行個體UserDatacfn-init 協助程式指令碼會從範本的中繼資料讀取組態資料,並以系統化的方式將其套用至執行個體。

在本教學課程中,您將了解如何使用cfn-init協助程式指令碼並監控引導程序。

注意

CloudFormation 是免費的,但您需要為建立的 Amazon EC2 資源付費。不過,如果您是新手 AWS,則可以利用 免費方案,在此學習過程中將成本降至最低或消除。

先決條件

  • 您必須完成建立您的第一個堆疊教學課程,或具有 CloudFormation 基本概念的同等經驗。

  • 您必須具有 IAM 使用者或角色 AWS 帳戶 的 存取權,該角色具有使用 Amazon EC2 和 CloudFormation 的許可,或管理使用者存取權。

  • 您必須擁有可存取網際網路的 Virtual Private Cloud (VPC)。此教學範本需要預設 VPC,它會自動隨附較新的 AWS 帳戶。如果您沒有預設 VPC,或已刪除 VPC,請參閱建立您的第一個堆疊教學課程中的疑難排解一節以取得替代解決方案。

了解引導概念

讓我們先了解讓引導運作的關鍵概念,再建立範本。

cfn-init helper 指令碼

CloudFormation 提供 Python 協助程式指令碼,可用於在 Amazon EC2 執行個體上安裝軟體和啟動服務。cfn-init 指令碼會從範本讀取資源中繼資料,並將組態套用至執行個體。

程序的運作方式如下:

  1. 您可以在 EC2 資源的 Metadata區段中定義組態。

  2. 您可以從UserData指令碼呼叫 cfn-init

  3. cfn-init 會讀取中繼資料並套用組態。

  4. 您的執行個體是根據您的規格設定。

中繼資料結構

組態是在 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

啟動堆疊範本
  1. 登入 AWS Management Console 並在 https://https://console.aws.amazon.com/cloudformation 開啟 AWS CloudFormation 主控台。

  2. 選擇 Create stack (建立堆疊)With new resources (standard) (使用新資源 (標準))

  3. 指定範本下,選擇上傳範本檔案,然後選擇選擇檔案以上傳 samplelinux2stack.template 檔案。

  4. 選擇下一步

  5. 指定堆疊詳細資訊頁面上,輸入 BootstrapTutorialStack做為堆疊名稱。

  6. 參數下,執行下列動作。

    • LatestAmiId:保留預設值。

    • InstanceType:為 EC22 執行個體類型選擇 t2.microt3.micro。

    • MyIP:使用尾碼輸入您的公有 IP /32 地址。

  7. 選擇下一步兩次,然後選擇提交以建立堆疊。

監控引導程序

引導程序需要比簡單的 EC2 啟動更長的時間,因為安裝和設定了額外的軟體。

監控引導進度
  1. 在 CloudFormation 主控台中,選取您的堆疊並開啟事件索引標籤。

  2. 請留意WebServer CREATE_IN_PROGRESS事件。引導程序會在執行個體啟動後開始。

  3. 引導程序通常需要幾分鐘的時間。完成後,您會看到 WebServer CREATE_COMPLETE

如果您想要查看引導程序期間發生的情況,您可以檢查執行個體日誌。

檢視引導日誌 (選用)
  1. 開啟 EC2 主控台並尋找您的執行個體。

  2. 選取執行個體,然後選擇動作監控和疑難排解取得系統日誌以查看引導進度。

  3. 如果您沒有立即看到日誌,請等待並重新整理頁面。

測試引導的 Web 伺服器

當您的堆疊顯示 時CREATE_COMPLETE,請測試您的 Web 伺服器。

測試 Web 伺服器
  1. 在 CloudFormation 主控台中,前往堆疊的輸出索引標籤。

  2. 按一下 WebsiteURL 值,在新索引標籤中開啟您的 Web 伺服器。

  3. 您應該會看到包含訊息 的自訂網頁Congratulations, you have successfully launched the AWS CloudFormation sample

注意

如果頁面未立即載入,請等待一分鐘,然後再試一次。即使堆疊顯示 ,引導程序仍可能正在完成CREATE_COMPLETE

對引導問題進行故障診斷

如果您的引導程序失敗或 Web 伺服器無法運作,以下是常見問題和解決方案。

常見問題

  • 堆疊建立失敗 – 檢查事件索引標籤是否有特定錯誤訊息。

  • 無法存取 Web 伺服器 – 在 MyIP 參數中確認您的 IP 地址是否正確。請記得/32在結尾包含 。

  • 引導程序失敗 – 執行個體可能會啟動但cfn-init失敗。如監控章節所述檢查系統日誌。

清除資源

若要避免持續收費,您可以透過刪除堆疊及其資源來清除 。

刪除堆疊及其資源
  1. 開啟 CloudFormation 主控台

  2. 堆疊頁面上,選取您所建立堆疊名稱旁的選項 (BootstrapTutorialStack),然後選擇刪除

  3. 出現確認提示時,請選擇刪除

  4. 事件索引標籤上監控堆疊刪除程序的進度。BootstrapTutorialStack 的狀態會變更為 DELETE_IN_PROGRESS。當 CloudFormation 完成刪除堆疊時,它會從清單移除堆疊。

後續步驟

恭喜您!您已成功了解如何使用 CloudFormation 啟動 EC2 執行個體。您現在了解:

  • 如何使用cfn-init協助程式指令碼

  • 如何建構用於引導的中繼資料

  • 如何安裝套件、建立檔案、執行命令和管理 服務

  • 如何監控引導問題

若要繼續學習:

  • 了解如何引導Windows堆疊。如需詳細資訊,請參閱引導 Windows型 CloudFormation 堆疊

  • 探索具有多個組態集的更複雜引導案例。如需詳細資訊,請參閱《 AWS CloudFormation 範本參考指南》中的 cfn-initAWS::CloudFormation::Init

  • 了解如何cfn-signal報告引導完成狀態。如需詳細資訊,請參閱《 AWS CloudFormation 範本參考指南》中的 cfn-signal