本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 AWS CloudFormation 設計工具建立基本 Web 伺服器
注意
CloudFormation 主控台模式中的基礎設施編譯器是 AWS CloudFormation Designer 的改進。我們建議您盡可能使用 Infrastructure Composer 而非 Designer。如需詳細資訊,請參閱使用 Infrastructure Composer 以視覺化方式建立範本。
AWS CloudFormation 設計工具以圖形方式代表您的範本,協助您查看範本中的資源及其連線方式。整合式 JSON和 YAML 編輯器可讓您直接在 AWS CloudFormation 主控台中修改範本。若要示範如何使用這兩個元件,我們將使用 AWS CloudFormation 設計工具在 中建置基本 Web 伺服器VPC。然後,我們將儲存範本,並使用它來建立 CloudFormation 堆疊。
在演練期間,您將完成下列步驟:
-
第一次開啟 AWS CloudFormation 設計工具時,您會從空白範本開始。我們將使用 AWS CloudFormation 設計工具,透過將 資源,例如 VPC和 EC2執行個體,拖曳到範本中來開始填入範本。我們也會建立資源之間的連結。例如,我們將使用 AWS CloudFormation 設計工具在網際網路閘道與 之間建立連線VPC。
-
我們將使用 AWS CloudFormation 設計工具整合編輯器來新增其他範本元件,讓範本更實用。例如,我們會將參數新增至範本,以便您在建立堆疊時可以指定輸入值。如此一來,您就不用為了可能會經常變更的屬性值而持續編輯範本。
-
我們要再次使用 整合式編輯器 來為資源指定組態設定。
-
在您建立堆疊之後,才會啟動與執行範本資源。我們將使用您剛建立的範本來啟動 CloudFormation 堆疊,這會佈建範本中定義的所有資源。
注意
CloudFormation 是一項免費服務;但是,您需要按照每個服務的最新費率,支付堆疊中包含 AWS 的資源費用。如需有關 AWS 定價的詳細資訊,請參閱 http://aws.amazon.com
上各項產品的詳細資訊頁面。
必要條件
本演練假設您具備 Amazon Virtual Private Cloud (Amazon VPC)、Amazon Elastic Compute Cloud (Amazon EC2) 和 的工作知識 CloudFormation。在內容方面,每個程序都提供各項資源的一些基本資訊。
此外,在開始之前,請確定您在建立堆疊的區域中有 Amazon EC2金鑰對。如需詳細資訊,請參閱 Amazon 使用者指南 中的 Amazon EC2金鑰對。 EC2
步驟 1:新增並連線資源
我們會使用 AWS CloudFormation 設計 drag-and-drop工具介面來新增 Amazon EC2執行個體和網路資源,例如 VPC、子網路、路由表和網際網路閘道。新增所有資源之後,我們會建立資源之間的連線。例如,我們會將網際網路閘道與 建立關聯VPC。
將資源新增至範本
-
在 AWS CloudFormation 設計工具 開啟https://console.aws.amazon.com/cloudformation/設計工具。
-
在頁面下半部的整合編輯器中,選擇編輯 (鉛筆圖示)。
-
將範本名稱變更為
BasicWebServerInVPC
,然後按 Enter。目前,我們有一個無效的空白範本。在接下來的步驟中,我們會新增資源以讓該範本有效。
-
在資源類型窗格中,從 EC2 類別中,將VPC資源類型拖曳至 Canvas 窗格中。
資源會依資源類別來組織。我們新增的所有資源都位於 EC2類別中。
AWS CloudFormation 設計工具會立即修改您的範本以包含VPC資源,其結果看起來與下列JSON程式碼片段類似。
"Resources": { "VPC431KO": { "Type": "AWS::EC2::VPC", "Properties": {}, "Metadata": { "AWS::CloudFormation::Designer": { "id": "445730ea-0d11-45ba-b6ac-12345EXAMPLE" } } } }
YAML 程式碼片段看起來類似以下內容。
Resources: VPC431KO: Type: 'AWS::EC2::VPC' Properties: {} Metadata: 'AWS::CloudFormation::Designer': id: 9430b008-7a03-41ed-b63e-12345EXAMPLE
請注意,我們仍然需要指定 VPC 屬性,例如 VPC的CIDR區塊。我們稍後會執行此作業。針對我們新增的所有資源,都要這樣做。
-
重新命名 VPC。
注意
當您重新命名資源時,會重新命名其邏輯 ID,這是範本中參考的名稱 (而不是 CloudFormation 建立資源時指派的名稱)。如需詳細資訊,請參閱Resources。
-
選擇 VPC 資源。
-
在整合編輯器中,選擇編輯圖示 (鉛筆圖示)。
-
將名稱變更為
VPC
,然後選擇 Enter。
接下來,我們會將資源新增至 VPC。
-
-
拖曳VPC資源的一角以將其展開,使其足夠大,以容納更多資源。
我們需要新增子網路,因為您無法將託管網站的EC2執行個體直接新增至 VPC;執行個體必須位於子網路中。
-
在 內新增子網路資源類型,VPC並將其重新命名為
PublicSubnet
。我們將使用子網路在 中配置一系列 IP 地址VPC,您可以與其他 AWS 資源建立關聯,例如 Amazon EC2執行個體。
當您在 內新增子網路時VPC, AWS CloudFormation Designer 會自動將子網路與 建立關聯VPC。此關聯是一種容器模型,在此模型容器內的資源會自動與容器資源建立關聯。
-
在
PublicSubnet
資源內部新增一個 Instance (執行個體) 資源類型,並將其重新命名為WebServerInstance
。執行個體是一種虛擬運算環境,您可在其中託管基本網站。與使用子網路和 的方式類似VPC,在子網路中新增執行個體會自動將執行個體與子網路建立關聯。
-
在 內新增SecurityGroup資源類型,VPC並將其重新命名為
WebServerSecurityGroup
。安全群組是一種虛擬防火牆,可控制 Web 伺服器執行個體的傳入和傳出流量。對於 中的執行個體也是必要的VPC。我們需要將 Web 伺服器執行個體與此安全群組建立關聯,並於稍後指定執行個體的屬性時進行此作業。
-
在 以外的任何地方新增InternetGateway資源類型,VPC並將其重新命名為
InternetGateway
。網際網路閘道可啟用 內部執行個體VPC與網際網路之間的通訊。如果沒有網際網路閘道,就沒有人可以存取您的網站。
雖然您可以在 內拖曳網際網路閘道VPC,但這不會建立與 的關聯VPC。網際網路閘道不遵循容器模型;而是必須將連線從網際網路閘道拖曳至 VPC,如下一個步驟所述。
-
建立
InternetGateway
資源和VPC
資源之間的連線。-
在
InternetGateway
資源上,將滑鼠的游標移至網際網路閘道附件 (AWS::EC2::VPCGatewayAttachment
) 上。 -
將連線拖曳至 VPC。
有效目標資源的邊界會變更顏色。在這種情況下, VPC是唯一有效的目標資源。此連線會建立連接資源,將網際網路閘道與 建立關聯VPC。
-
-
接著,我們需要新增路由表和路由來指定如何引導子網路的網路流量。在 RouteTable內新增 ,VPC並重新命名
PublicRouteTable
。這會將新的路由表與 建立關聯VPC。
-
若要將路由規則新增至路由表,請在
PublicRouteTable
資源內部新增一個 Route (路由) 資源類型,並將其重新命名為PublicRoute
。我們會使用該路由來指定要將流量引導到何處。
-
針對公有路由,我們要讓網際網路閘道成為目的地目標。使用
GatewayId
建立從PublicRoute
資源到網際網路閘道的連線,類似於您在網際網路閘道與 之間建立連線的方式VPC。CloudFormation 在您將網際網路閘道與 建立關聯之前,無法將路由與網際網路閘道建立關聯VPC。這表示我們需要建立網際網路閘道VPC連接上的明確相依性,如下一個步驟所述。如需詳細資訊,請參閱DependsOn 屬性。
-
在
PublicRoute
資源與網際網路閘道連接VPC之間建立明確相依性。-
在
PublicRoute
資源上,將滑鼠游標移至DependsOn點上。 -
將連線拖曳至網際網路閘道附件 VPC(
AWS::EC2::VPCGatewayAttachment
)。透過
DependsOn
連線, AWS CloudFormation Designer 會建立相依性 (DependsOn
屬性),其中原始資源取決於目標資源。在此情況下, AWS CloudFormation Designer 會將DependsOn
屬性新增至PublicRoute
資源,並將閘道VPC連接指定為相依性。
-
-
建立
WebServerInstance
資源到PublicRoute
資源的另一個相依性。WebServerInstance
資源會仰賴公有路由以將流量路由到網際網路。如果沒有公有路由,執行個體就無法傳送訊號 (使用 cfn-signal 協助程式指令碼) 來通知執行個體組態和應用程式部署完成 CloudFormation 。 -
將連線從
PublicRouteTable
資源拖曳至PublicSubnet
資源,以建立路由表和子網路之間的關聯。現在,公有子網路會使用公有路由表來引導流量。
-
從 AWS CloudFormation 設計工具工具列中,使用檔案功能表 (檔案圖示) 在本機儲存範本。
AWS CloudFormation 設計工具會將範本儲存在您的硬碟上。您可以稍後使用範本來建立堆疊。建議您定期儲存範本,以免遺失變更。
在此步驟中,我們將七個資源新增至您的範本,並以IDs易記的名稱重新命名其邏輯。此外,我們已為大部分的資源建立視覺化連線,以建立關聯性和相依性。不過,我們還必須多建立幾個連線 (例如將執行個體與安全群組建立關聯),並指定每個資源的屬性,之後才可以使用此範本來建立堆疊。在下一個步驟中,我們將使用 AWS CloudFormation 設計工具整合式編輯器,逐步修改範本的其他元件,例如輸入參數。
步驟 2:新增範本參數、映射和輸出
在指定資源屬性之前,我們需要新增其他範本元件以在多個環境中重複使用範本。在此步驟中,我們將使用 AWS CloudFormation 設計工具整合式編輯器來新增參數、映射和輸出。然後,我們可以在指定資源屬性時參閱這些參數和映射。逐步解說提供範例JSONYAML,您可以用來複製並貼入整合式編輯器。
新增參數
您在建立堆疊時指定的輸入值即為參數。參數對傳遞值來說非常實用,可讓您不需要將值寫死在範本中。例如,您不需要在範本中寫死您的 Web 伺服器執行個體類型;反之,您可以在建立堆疊時使用參數來指定執行個體類型。這樣一來,您即可使用相同的範本,建立多個含不同執行個體類型的 Web 伺服器。如需詳細資訊,請參閱Parameters。
-
按一下 AWS CloudFormation 設計工具畫布中的開放區域。
整合式編輯器 會根據您所選取的項目顯示範本層級或資源層級的元件,以供您編輯。若是範本層級,您可以編輯範本的 Resources (資源) 區段以外的所有其他區段,例如範本參數、映射和輸出。在資源層級,您可以編輯資源屬性 (resource property) 和屬性 (attribute)。
按一下畫布的開放區域可讓您編輯範本層級的元件。若要編輯資源層級的元件,請選取資源。
-
在整合式編輯器窗格中,選擇 Components (元件) 檢視中的 Parameters (參數) 索引標籤。
-
複製下列程式碼片段的參數並貼入 整合式編輯器。
下列JSON程式碼片段會新增參數,以指定 Web 伺服器的執行個體類型、Amazon EC2金鑰對名稱以SSH存取 Web 伺服器,以及可用於使用 存取 Web 伺服器的 IP 地址範圍SSH。
{ "Parameters": { "InstanceType" : { "Description" : "WebServer EC2 instance type", "Type" : "String", "Default" : "t2.small", "AllowedValues" : [ "t1.micro", "t2.nano", "t2.micro", "t2.small", "t2.medium", "t2.large", "m1.small", "m1.medium", "m1.large", "m1.xlarge", "m2.xlarge", "m2.2xlarge", "m2.4xlarge", "m3.medium", "m3.large", "m3.xlarge", "m3.2xlarge", "m4.large", "m4.xlarge", "m4.2xlarge", "m4.4xlarge", "m4.10xlarge", "c1.medium", "c1.xlarge", "c3.large", "c3.xlarge", "c3.2xlarge", "c3.4xlarge", "c3.8xlarge", "c4.large", "c4.xlarge", "c4.2xlarge", "c4.4xlarge", "c4.8xlarge", "g2.2xlarge", "g2.8xlarge", "r3.large", "r3.xlarge", "r3.2xlarge", "r3.4xlarge", "r3.8xlarge", "i2.xlarge", "i2.2xlarge", "i2.4xlarge", "i2.8xlarge", "d2.xlarge", "d2.2xlarge", "d2.4xlarge", "d2.8xlarge", "hi1.4xlarge", "hs1.8xlarge", "cr1.8xlarge", "cc2.8xlarge", "cg1.4xlarge" ], "ConstraintDescription" : "must be a valid EC2 instance type." }, "KeyName": { "Description": "Name of an EC2 KeyPair to enable SSH access to the instance.", "Type": "AWS::EC2::KeyPair::KeyName", "ConstraintDescription": "must be the name of an existing EC2 KeyPair." }, "SSHLocation": { "Description": " The IP address range that can be used to access the web server using SSH.", "Type": "String", "MinLength": "9", "MaxLength": "18", "Default": "0.0.0.0/0", "AllowedPattern": "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})", "ConstraintDescription": "must be a valid IP CIDR range of the form x.x.x.x/x." } } }
以下是 中的相同程式碼片段YAML。
Parameters: InstanceType: Description: WebServer EC2 instance type Type: String Default: t2.small AllowedValues: - t1.micro - t2.nano - t2.micro - t2.small - t2.medium - t2.large - m1.small - m1.medium - m1.large - m1.xlarge - m2.xlarge - m2.2xlarge - m2.4xlarge - m3.medium - m3.large - m3.xlarge - m3.2xlarge - m4.large - m4.xlarge - m4.2xlarge - m4.4xlarge - m4.10xlarge - c1.medium - c1.xlarge - c3.large - c3.xlarge - c3.2xlarge - c3.4xlarge - c3.8xlarge - c4.large - c4.xlarge - c4.2xlarge - c4.4xlarge - c4.8xlarge - g2.2xlarge - g2.8xlarge - r3.large - r3.xlarge - r3.2xlarge - r3.4xlarge - r3.8xlarge - i2.xlarge - i2.2xlarge - i2.4xlarge - i2.8xlarge - d2.xlarge - d2.2xlarge - d2.4xlarge - d2.8xlarge - hi1.4xlarge - hs1.8xlarge - cr1.8xlarge - cc2.8xlarge - cg1.4xlarge ConstraintDescription: must be a valid EC2 instance type. KeyName: Description: Name of an EC2 KeyPair to enable SSH access to the instance. Type: 'AWS::EC2::KeyPair::KeyName' ConstraintDescription: must be the name of an existing EC2 KeyPair. SSHLocation: Description: ' The IP address range that can be used to access the web server using SSH.' Type: String MinLength: '9' MaxLength: '18' Default: 0.0.0.0/0 AllowedPattern: '(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})' ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
新增映射
映射是指與名稱值對相關聯的金鑰組。若要依據輸入參數值來指定值,這就非常實用。針對此演練,我們將使用映射,根據您建立堆疊的EC2執行個體類型和區域指定執行個體的 AMI ID。如需詳細資訊,請參閱Mappings。
-
在整合式編輯器窗格中,選擇 Mappings (映射) 標籤。
-
複製下列JSON映射並將其貼到整合編輯器中。
{ "Mappings" : { "AWSInstanceType2Arch" : { "t1.micro" : { "Arch" : "HVM64" }, "t2.nano" : { "Arch" : "HVM64" }, "t2.micro" : { "Arch" : "HVM64" }, "t2.small" : { "Arch" : "HVM64" }, "t2.medium" : { "Arch" : "HVM64" }, "t2.large" : { "Arch" : "HVM64" }, "m1.small" : { "Arch" : "HVM64" }, "m1.medium" : { "Arch" : "HVM64" }, "m1.large" : { "Arch" : "HVM64" }, "m1.xlarge" : { "Arch" : "HVM64" }, "m2.xlarge" : { "Arch" : "HVM64" }, "m2.2xlarge" : { "Arch" : "HVM64" }, "m2.4xlarge" : { "Arch" : "HVM64" }, "m3.medium" : { "Arch" : "HVM64" }, "m3.large" : { "Arch" : "HVM64" }, "m3.xlarge" : { "Arch" : "HVM64" }, "m3.2xlarge" : { "Arch" : "HVM64" }, "m4.large" : { "Arch" : "HVM64" }, "m4.xlarge" : { "Arch" : "HVM64" }, "m4.2xlarge" : { "Arch" : "HVM64" }, "m4.4xlarge" : { "Arch" : "HVM64" }, "m4.10xlarge" : { "Arch" : "HVM64" }, "c1.medium" : { "Arch" : "HVM64" }, "c1.xlarge" : { "Arch" : "HVM64" }, "c3.large" : { "Arch" : "HVM64" }, "c3.xlarge" : { "Arch" : "HVM64" }, "c3.2xlarge" : { "Arch" : "HVM64" }, "c3.4xlarge" : { "Arch" : "HVM64" }, "c3.8xlarge" : { "Arch" : "HVM64" }, "c4.large" : { "Arch" : "HVM64" }, "c4.xlarge" : { "Arch" : "HVM64" }, "c4.2xlarge" : { "Arch" : "HVM64" }, "c4.4xlarge" : { "Arch" : "HVM64" }, "c4.8xlarge" : { "Arch" : "HVM64" }, "g2.2xlarge" : { "Arch" : "HVMG2" }, "g2.8xlarge" : { "Arch" : "HVMG2" }, "r3.large" : { "Arch" : "HVM64" }, "r3.xlarge" : { "Arch" : "HVM64" }, "r3.2xlarge" : { "Arch" : "HVM64" }, "r3.4xlarge" : { "Arch" : "HVM64" }, "r3.8xlarge" : { "Arch" : "HVM64" }, "i2.xlarge" : { "Arch" : "HVM64" }, "i2.2xlarge" : { "Arch" : "HVM64" }, "i2.4xlarge" : { "Arch" : "HVM64" }, "i2.8xlarge" : { "Arch" : "HVM64" }, "d2.xlarge" : { "Arch" : "HVM64" }, "d2.2xlarge" : { "Arch" : "HVM64" }, "d2.4xlarge" : { "Arch" : "HVM64" }, "d2.8xlarge" : { "Arch" : "HVM64" }, "hi1.4xlarge" : { "Arch" : "HVM64" }, "hs1.8xlarge" : { "Arch" : "HVM64" }, "cr1.8xlarge" : { "Arch" : "HVM64" }, "cc2.8xlarge" : { "Arch" : "HVM64" } }, "AWSRegionArch2AMI" : { "us-east-1" : {"HVM64" : "ami-0ff8a91507f77f867", "HVMG2" : "ami-0a584ac55a7631c0c"}, "us-west-2" : {"HVM64" : "ami-a0cfeed8", "HVMG2" : "ami-0e09505bc235aa82d"}, "us-west-1" : {"HVM64" : "ami-0bdb828fd58c52235", "HVMG2" : "ami-066ee5fd4a9ef77f1"}, "eu-west-1" : {"HVM64" : "ami-047bb4163c506cd98", "HVMG2" : "ami-0a7c483d527806435"}, "eu-west-2" : {"HVM64" : "ami-f976839e", "HVMG2" : "NOT_SUPPORTED"}, "eu-west-3" : {"HVM64" : "ami-0ebc281c20e89ba4b", "HVMG2" : "NOT_SUPPORTED"}, "eu-central-1" : {"HVM64" : "ami-0233214e13e500f77", "HVMG2" : "ami-06223d46a6d0661c7"}, "ap-northeast-1" : {"HVM64" : "ami-06cd52961ce9f0d85", "HVMG2" : "ami-053cdd503598e4a9d"}, "ap-northeast-2" : {"HVM64" : "ami-0a10b2721688ce9d2", "HVMG2" : "NOT_SUPPORTED"}, "ap-northeast-3" : {"HVM64" : "ami-0d98120a9fb693f07", "HVMG2" : "NOT_SUPPORTED"}, "ap-southeast-1" : {"HVM64" : "ami-08569b978cc4dfa10", "HVMG2" : "ami-0be9df32ae9f92309"}, "ap-southeast-2" : {"HVM64" : "ami-09b42976632b27e9b", "HVMG2" : "ami-0a9ce9fecc3d1daf8"}, "ap-south-1" : {"HVM64" : "ami-0912f71e06545ad88", "HVMG2" : "ami-097b15e89dbdcfcf4"}, "us-east-2" : {"HVM64" : "ami-0b59bfac6be064b78", "HVMG2" : "NOT_SUPPORTED"}, "ca-central-1" : {"HVM64" : "ami-0b18956f", "HVMG2" : "NOT_SUPPORTED"}, "sa-east-1" : {"HVM64" : "ami-07b14488da8ea02a0", "HVMG2" : "NOT_SUPPORTED"}, "cn-north-1" : {"HVM64" : "ami-0a4eaf6c4454eda75", "HVMG2" : "NOT_SUPPORTED"}, "cn-northwest-1" : {"HVM64" : "ami-6b6a7d09", "HVMG2" : "NOT_SUPPORTED"} } } }
以下是 中的相同映射YAML。
Mappings: AWSInstanceType2Arch: t1.micro: Arch: HVM64 t2.nano: Arch: HVM64 t2.micro: Arch: HVM64 t2.small: Arch: HVM64 t2.medium: Arch: HVM64 t2.large: Arch: HVM64 m1.small: Arch: HVM64 m1.medium: Arch: HVM64 m1.large: Arch: HVM64 m1.xlarge: Arch: HVM64 m2.xlarge: Arch: HVM64 m2.2xlarge: Arch: HVM64 m2.4xlarge: Arch: HVM64 m3.medium: Arch: HVM64 m3.large: Arch: HVM64 m3.xlarge: Arch: HVM64 m3.2xlarge: Arch: HVM64 m4.large: Arch: HVM64 m4.xlarge: Arch: HVM64 m4.2xlarge: Arch: HVM64 m4.4xlarge: Arch: HVM64 m4.10xlarge: Arch: HVM64 c1.medium: Arch: HVM64 c1.xlarge: Arch: HVM64 c3.large: Arch: HVM64 c3.xlarge: Arch: HVM64 c3.2xlarge: Arch: HVM64 c3.4xlarge: Arch: HVM64 c3.8xlarge: Arch: HVM64 c4.large: Arch: HVM64 c4.xlarge: Arch: HVM64 c4.2xlarge: Arch: HVM64 c4.4xlarge: Arch: HVM64 c4.8xlarge: Arch: HVM64 g2.2xlarge: Arch: HVMG2 g2.8xlarge: Arch: HVMG2 r3.large: Arch: HVM64 r3.xlarge: Arch: HVM64 r3.2xlarge: Arch: HVM64 r3.4xlarge: Arch: HVM64 r3.8xlarge: Arch: HVM64 i2.xlarge: Arch: HVM64 i2.2xlarge: Arch: HVM64 i2.4xlarge: Arch: HVM64 i2.8xlarge: Arch: HVM64 d2.xlarge: Arch: HVM64 d2.2xlarge: Arch: HVM64 d2.4xlarge: Arch: HVM64 d2.8xlarge: Arch: HVM64 hi1.4xlarge: Arch: HVM64 hs1.8xlarge: Arch: HVM64 cr1.8xlarge: Arch: HVM64 cc2.8xlarge: Arch: HVM64 AWSRegionArch2AMI: us-east-1: HVM64: ami-0ff8a91507f77f867 HVMG2: ami-0a584ac55a7631c0c us-west-2: HVM64: ami-a0cfeed8 HVMG2: ami-0e09505bc235aa82d us-west-1: HVM64: ami-0bdb828fd58c52235 HVMG2: ami-066ee5fd4a9ef77f1 eu-west-1: HVM64: ami-047bb4163c506cd98 HVMG2: ami-0a7c483d527806435 eu-west-2: HVM64: ami-f976839e HVMG2: NOT_SUPPORTED eu-west-3: HVM64: ami-0ebc281c20e89ba4b HVMG2: NOT_SUPPORTED eu-central-1: HVM64: ami-0233214e13e500f77 HVMG2: ami-06223d46a6d0661c7 ap-northeast-1: HVM64: ami-06cd52961ce9f0d85 HVMG2: ami-053cdd503598e4a9d ap-northeast-2: HVM64: ami-0a10b2721688ce9d2 HVMG2: NOT_SUPPORTED ap-northeast-3: HVM64: ami-0d98120a9fb693f07 HVMG2: NOT_SUPPORTED ap-southeast-1: HVM64: ami-08569b978cc4dfa10 HVMG2: ami-0be9df32ae9f92309 ap-southeast-2: HVM64: ami-09b42976632b27e9b HVMG2: ami-0a9ce9fecc3d1daf8 ap-south-1: HVM64: ami-0912f71e06545ad88 HVMG2: ami-097b15e89dbdcfcf4 us-east-2: HVM64: ami-0b59bfac6be064b78 HVMG2: NOT_SUPPORTED ca-central-1: HVM64: ami-0b18956f HVMG2: NOT_SUPPORTED sa-east-1: HVM64: ami-07b14488da8ea02a0 HVMG2: NOT_SUPPORTED cn-north-1: HVM64: ami-0a4eaf6c4454eda75 HVMG2: NOT_SUPPORTED cn-northwest-1: HVM64: ami-6b6a7d09 HVMG2: NOT_SUPPORTED
新增輸出
輸出會宣告您想要可供describe stacks
API呼叫或透過 CloudFormation 主控台堆疊輸出索引標籤使用的值。對於此演練,我們將輸出網站,URL以便在建立網站之後輕鬆檢視網站。如需詳細資訊,請參閱Outputs。
-
在整合式編輯器窗格中,選取 Outputs (輸出) 標籤。
-
複製下列JSON輸出並將其貼到整合編輯器中。
輸出會使用
Fn::GetAtt
內部函數來取得 Web 伺服器執行個體的公有 IP。{ "Outputs": { "URL": { "Value": { "Fn::Join": [ "", [ "http://", { "Fn::GetAtt": [ "WebServerInstance", "PublicIp" ] } ] ] }, "Description": "Newly created application URL" } } }
以下是 中的相同輸出YAML。
Outputs: URL: Value: !Join - '' - - 'http://' - !GetAtt - WebServerInstance - PublicIp Description: Newly created application URL
-
再次儲存您的範本,才不會遺失變更。您可以安全地將變更儲存到上一節所建立相同的檔案。
現在,範本參數、映射和輸出都已就緒,我們即可指定資源屬性。
步驟 3:指定資源屬性
許多資源都具備必要屬性以定義組態或設定,例如 Web 伺服器要使用哪種執行個體類型。與上一個步驟中所做的類似,我們將使用 AWS CloudFormation 設計工具整合編輯器來指定資源屬性。我們提供範例JSONYAML,您可以複製並貼到整合編輯器中。
指定資源屬性
-
在 AWS CloudFormation 設計工具畫布上,選擇
VPC
資源。整合式編輯器 會顯示資源層級的元件 (例如資源屬性),以供您編輯。
-
在整合式編輯器窗格中,選擇 Properties (屬性) 標籤。
-
複製下列JSON程式碼片段,並將其貼到屬性括號 () 之間的整合式編輯器中
{}
。此程式碼片段會指定 DNS的設定和CIDR區塊VPC。
"EnableDnsSupport": "true", "EnableDnsHostnames": "true", "CidrBlock": "10.0.0.0/16"
對於 YAML,在 之後輸入新的行,
Properties:
然後貼上下列程式碼片段。EnableDnsSupport: 'true' EnableDnsHostnames: 'true' CidrBlock: 10.0.0.0/16
注意
為了提高效率,我們提供JSON和YAML片段供您複製和貼上。不過,請注意,編輯器都有一個自動完成功能,可讓您手動指定每個屬性。如需詳細資訊,請參閱整合JSON和YAML編輯器。
-
針對下列資源重複這個程序:
PublicSubnet
-
在 VPC ID 屬性之後新增下列CIDR區塊屬性。當您在 內拖曳子網路時, AWS CloudFormation Designer 會自動新增 VPC ID 屬性VPC。
注意
您將看到 AWS CloudFormation 設計者自動為您建立的幾個其他關聯。您只要新增新的屬性 (粗體) 即可。
JSON
"VpcId": { "Ref": "VPC" }, "CidrBlock": "10.0.0.0/24"
YAML
VpcId: !Ref VPC CidrBlock: 10.0.0.0/24
PublicRoute
-
新增下列目的地CIDR區塊屬性,此屬性會將所有流量導向網際網路閘道:
JSON
"DestinationCidrBlock": "0.0.0.0/0", "RouteTableId": { "Ref": "PublicRouteTable" }, "GatewayId": { "Ref": "InternetGateway" }
YAML
DestinationCidrBlock: 0.0.0.0/0 RouteTableId: !Ref PublicRouteTable GatewayId: !Ref InternetGateway
WebServerSecurityGroup
-
新增下列傳入規則,判斷哪些流量可以到達 Web 伺服器執行個體。這些規則允許所有 HTTP和某些SSH流量,您在建立堆疊時將其指定為參數值。
JSON
"VpcId": { "Ref": "VPC" }, "GroupDescription" : "Allow access from HTTP and SSH traffic", "SecurityGroupIngress": [ { "IpProtocol": "tcp", "FromPort": 80, "ToPort": 80, "CidrIp": "0.0.0.0/0" }, { "IpProtocol": "tcp", "FromPort": 22, "ToPort": 22, "CidrIp": { "Ref": "SSHLocation" } } ]
YAML
VpcId: !Ref VPC GroupDescription: Allow access from HTTP and SSH traffic SecurityGroupIngress: - IpProtocol: tcp FromPort: 80 ToPort: 80 CidrIp: 0.0.0.0/0 - IpProtocol: tcp FromPort: 22 ToPort: 22 CidrIp: !Ref SSHLocation
WebServerInstance
-
您需要為 Web 伺服器執行個體指定多個屬性,因此我們僅反白幾個項目以作示範用途。
InstanceType
和ImageId
屬性會使用我們在上一節中指定的參數和映射值。在建立堆疊時,您可以將執行個體類型指定為參數值。ImageId
值為對應項目,其會以您的堆疊區域及您指定的執行個體類型為依據。NetworkInterfaces
屬性可指定 Web 伺服器執行個體的網路設定。此屬性可讓我們為安全群組、子網路與執行個體建立關聯。雖然 AWS CloudFormation Designer 使用SubnetId
屬性將執行個體與子網路建立關聯,但我們需要使用NetworkInterfaces
屬性,因為這是為 Web 伺服器提供公有 IP 的唯一方法。此外,當您指定NetworkInterfaces
屬性時,您必須在該屬性內指定子網路和安全群組。在
UserData
屬性中,我們會指定要在執行個體啟動與執行之後執行的組態指令碼。執行個體的中繼資料定義所有組態資訊;我們會在下一個步驟中新增此中繼資料。使用下列程式碼片段來取代所有屬性:
重要
請不要將此程式碼片段附加到現有的屬性。
JSON
"InstanceType": { "Ref": "InstanceType" }, "ImageId": { "Fn::FindInMap": [ "AWSRegionArch2AMI", { "Ref": "AWS::Region" }, { "Fn::FindInMap": [ "AWSInstanceType2Arch", { "Ref": "InstanceType" }, "Arch" ] } ] }, "KeyName": { "Ref": "KeyName" }, "NetworkInterfaces": [ { "GroupSet": [ { "Ref": "WebServerSecurityGroup" } ], "AssociatePublicIpAddress": "true", "DeviceIndex": "0", "DeleteOnTermination": "true", "SubnetId": { "Ref": "PublicSubnet" } } ], "UserData": { "Fn::Base64": { "Fn::Join": [ "", [ "#!/bin/bash -xe\n", "yum install -y aws-cfn-bootstrap\n", "# Install the files and packages from the metadata\n", "/opt/aws/bin/cfn-init -v ", " --stack ", { "Ref": "AWS::StackName" }, " --resource WebServerInstance ", " --configsets All ", " --region ", { "Ref": "AWS::Region" }, "\n", "# Signal the status from cfn-init\n", "/opt/aws/bin/cfn-signal -e $? ", " --stack ", { "Ref": "AWS::StackName" }, " --resource WebServerInstance ", " --region ", { "Ref": "AWS::Region" }, "\n" ] ] } }
YAML
InstanceType: !Ref InstanceType ImageId: !FindInMap - AWSRegionArch2AMI - !Ref 'AWS::Region' - !FindInMap - AWSInstanceType2Arch - !Ref InstanceType - Arch KeyName: !Ref KeyName NetworkInterfaces: - GroupSet: - !Ref WebServerSecurityGroup AssociatePublicIpAddress: 'true' DeviceIndex: '0' DeleteOnTermination: 'true' SubnetId: !Ref PublicSubnet UserData: !Base64 'Fn::Join': - '' - - | #!/bin/bash -xe - | yum install -y aws-cfn-bootstrap - | # Install the files and packages from the metadata - '/opt/aws/bin/cfn-init -v ' - ' --stack ' - !Ref 'AWS::StackName' - ' --resource WebServerInstance ' - ' --configsets All ' - ' --region ' - !Ref 'AWS::Region' - |+ - | # Signal the status from cfn-init - '/opt/aws/bin/cfn-signal -e $? ' - ' --stack ' - !Ref 'AWS::StackName' - ' --resource WebServerInstance ' - ' --region ' - !Ref 'AWS::Region' - |+
-
將 Web 伺服器組態中繼資料新增至
WebServerInstance
資源。-
選擇
WebServerInstance
資源,然後選擇整合式編輯器窗格中的 Metadata (中繼資料) 標籤。 -
如果您要在 中撰寫範本JSON:在支架 (
{}
)Metadata
內,並在AWS::CloudFormation::Designer
關閉支架之後,新增逗號 (,
)。 -
將下列程式碼片段新增至
AWS::CloudFormation::Designer
屬性之後,以指示 cfn-init 協助程式指令碼啟動 Web 伺服器並建立基本網頁。JSON
"AWS::CloudFormation::Init" : { "configSets" : { "All" : [ "ConfigureSampleApp" ] }, "ConfigureSampleApp" : { "packages" : { "yum" : { "httpd" : [] } }, "files" : { "/var/www/html/index.html" : { "content" : { "Fn::Join" : ["\n", [ "<h1>Congratulations, you have successfully launched the AWS CloudFormation sample.</h1>" ]]}, "mode" : "000644", "owner" : "root", "group" : "root" } }, "services" : { "sysvinit" : { "httpd" : { "enabled" : "true", "ensureRunning" : "true" } } } } }
YAML
'AWS::CloudFormation::Init': configSets: All: - ConfigureSampleApp ConfigureSampleApp: packages: yum: httpd: [] files: /var/www/html/index.html: content: !Join - |+ - - >- <h1>Congratulations, you have successfully launched the AWS CloudFormation sample.</h1> mode: '000644' owner: root group: root services: sysvinit: httpd: enabled: 'true' ensureRunning: 'true'
-
-
在 AWS CloudFormation 設計工具工具列上,選擇驗證範本 (核取方塊圖示) 以檢查範本中的語法錯誤。
在 Messages (訊息) 窗格中檢視並修復錯誤,接著再次驗證範本。如果您沒有看到錯誤,表示該範本的語法有效。
-
儲存完成的範本,以保留您做的所有變更。
您現在擁有完整的 CloudFormation 範本,可用來在 中建立基本 Web 伺服器VPC。為了建立範本,我們已先使用 AWS CloudFormation 設計工具畫布窗格來新增並連線範本資源。接著,我們使用 整合式編輯器 來新增其他範本元件,並指定資源屬性。在接下來的步驟中,我們將使用此範本來建立堆疊。
步驟 4:佈建資源
若要建立堆疊,您可以從 AWS CloudFormation 設計工具啟動 CloudFormation 建立堆疊精靈。我們將使用我們在先前步驟中建立的範本來建立 CloudFormation 堆疊。 CloudFormation 佈建所有資源後,您將啟動並執行基本網站。
建立堆疊
-
在 AWS CloudFormation 設計工具工具列上,選擇建立堆疊 (雲端圖示)。
AWS CloudFormation 設計器會將開啟的範本儲存在 S3 儲存貯體中,然後啟動 CloudFormation建立堆疊精靈 。 會在每次上傳範本時, CloudFormation 使用相同的 S3 儲存貯體。
-
CloudFormation 會自動填入範本 URL;選擇下一步 。
-
在指定堆疊詳細資訊區段中,在堆疊名稱欄位中輸入堆疊名稱。在此範例中,使用
BasicWebServerStack
。 -
在參數區段中,針對 KeyName欄位,在您要建立堆疊的相同區域中,輸入有效 Amazon EC2金鑰對的名稱。
-
保留其他預設參數值,然後選擇 Next (下一步)。
-
在此逐步解說中,您不需要新增標籤或指定進階設定,因此請選擇 Next (下一步)。
-
確保堆疊名稱和 Amazon EC2金鑰對名稱正確,然後選擇建立 。
AWS CloudFormation 建立堆疊可能需要幾分鐘的時間。若要監控進度,請檢視堆疊事件。如需如何檢視堆疊事件的詳細資訊,請參閱 從 CloudFormation 主控台檢視堆疊資訊。建立堆疊之後,請檢視堆疊輸出,然後前往範例網站URL,以確認網站是否正在執行。如需詳細資訊,請參閱從 CloudFormation 主控台檢視堆疊資訊。
現在您已成功建立範本並使用 AWS CloudFormation 設計工具啟動堆疊,您可以在下列逐步解說中使用堆疊:使用 AWS CloudFormation 設計工具修改堆疊的範本,修改範本以建立可擴展的 Web 伺服器。