AWS CloudFormation デザイナーを使用して基本的なウェブサーバーを作成する
注記
CloudFormation コンソールモードの Application Composer は、AWS CloudFormation デザイナーから改良されたものです。可能な限り、デザイナーの代わりに Application Composer を使用することをお勧めします。詳細については、「Application Composer を使用してテンプレートを視覚的に作成する」を参照してください。
AWS CloudFormation デザイナーは、テンプレートをグラフィカルに表示して、テンプレート内のリソースとその接続状況を知るのに役立ちます。統合された JSON および YAML エディタは、AWS CloudFormation コンソールで直接テンプレートを簡単に変更することもできます。これらのコンポーネントを使用する方法のデモを行うために、AWS CloudFormation デザイナーを使用して 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 EC2 ユーザーガイド」の「Amazon EC2 キーペア」を参照してください。
ステップ 1: リソースの追加と接続
AWS CloudFormation デザイナードラッグアンドドロップインターフェースを使用して、Amazon EC2 インスタンスと、VPC、サブネット、ルートテーブル、インターネットゲートウェイのような、ネットワークリソースを追加します。すべてのリソースを追加したら、その間に接続を作成します。たとえば、インターネットゲートウェイと VPC を関連付けます。
リソースをテンプレートに追加するには
-
AWS CloudFormation デザイナー を https://console.aws.amazon.com/cloudformation/designer
で開きます。 -
統合エディタで、ページの下半分にある [編集] (鉛筆のアイコン) をクリックします。
-
テンプレート名を
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 の CIDR ブロックのような VPC プロパティを指定する必要があることに注意してください。これについては、後で行います。これは、追加するすべてのリソースに当てはまります。
-
VPC の名前を変更します。
注記
リソースの名前を変更するときは、論理 ID の名前も変更します。これはテンプレート参照される名前です (CloudFormation がリソースを作成した時に割り当てられる名前ではありません)。詳細については、「Resources」を参照してください。
-
VPC リソースを選択します。
-
統合エディタで、[編集] アイコン (鉛筆のアイコン) をクリックします。
-
名前を
VPC
に変更して、[Enter (入力)] を選択します。
次に、VPC にリソースを追加します。
-
-
VPC リソースの角をドラッグして拡張し、複数の追加リソースに十分な大きさにします。
ウェブサイトをホストする EC2 インスタンスを追加することはできないため、サブネットを VPC に直接追加する必要があります。インスタンスはサブネットになければなりません。
-
[Subnet (サブネット)] リソースタイプを VPC 内に追加して、その名前を
PublicSubnet
に変更します。サブネットを使用して、他の AWS リソースと関連付ける Amazon EC2 インスタンスなどの VPC の IP アドレスの範囲を割り当てます。
VPC 内にサブネットを追加すると、AWS CloudFormation デザイナーは自動的に VPC とサブネットを関連付けます。この関連付けはコンテナモデルで、コンテナ内のリソースがコンテナリソースに自動的に関連付けられます。
-
[Instance (インスタンス)] リソースタイプを
PublicSubnet
リソース内に追加して、その名前をWebServerInstance
に変更します。インスタンスは、基本的なウェブサイトをホストする仮想コンピューティング環境です。サブネットおよび VPC の動作方法と同様に、サブネットにインスタンスを追加すると、サブネットがインスタンスに自動的に関連付けられます。
-
[SecurityGroup] リソースタイプを VPC 内に追加して、その名前を
WebServerSecurityGroup
に変更します。セキュリティグループは、ウェブサーバーインスタンスのインバウンドトラフィックとアウトバウンドトラフィックを制御する仮想ファイアウォールです。また、VPC のインスタンスにも必要です。ここでは、ウェブサーバーのインスタンスとこのセキュリティグループを関連付ける必要があります。これは、後でインスタンスのプロパティを指定するときに行います。
-
[InternetGateway] リソースタイプを VPC 外のいずれかの場所に追加して、その名前を
InternetGateway
に変更します。インターネットゲートウェイは、VPC とインターネット内にあるインスタンス間の通信を有効にします。インターネットゲートウェイがないと、他のウェブサイトにアクセスできなくなります。
VPC 内でインターネットゲートウェイをドラッグすることができますが、これは VPC との連携は作成しません。インターネットゲートウェイはコンテナモデルには従っていません。代わりに、次のステップで説明するインターネットゲートウェイから VPC への接続をドラッグする必要があります。
-
InternetGateway
リソースとVPC
リソース間の接続を作成します。-
InternetGateway
リソースで、インターネットゲートウェイアタッチメント (AWS::EC2::VPCGatewayAttachment
) の上にマウスを移動します。 -
VPC への接続をドラッグします。
有効な対象リソースの境界の色が変わります。この場合、VPC は唯一の有効な対象リソースです。この接続は、VPC とインターネットゲートウェイとを関連付けるアタッチメントリソースを作成します。
-
-
次に、ルートテーブルとルートを追加して、サブネット内からのネットワークトラフィックをルーティングする方法を指定する必要があります。VPC 内に [RouteTable] を追加して、その名前を
PublicRouteTable
に変更します。これにより、VPC に新しいルートテーブルが関連付けられます。
-
ルーティングルールをルートテーブルに追加するには、[Route (ルート)] リソースタイプを
PublicRouteTable
リソース内に追加し、その名前をPublicRoute
に変更します。ルートを使用して、トラフィックをルーティングする場所を指定します。
-
パブリックルートでは、インターネットゲートウェイを宛先とします。
GatewayId
を使用してPublicRoute
リソースからインターネットのゲートウェイへの接続を作成します。これは、インターネットゲートウェイと VPC 間の接続で作成した方法と同様です。CloudFormation は、インターネットゲートウェイを VPC と関連付けなければ、インターネットゲートウェイをルートと関連付けることができません。これは、次のステップで説明するように、インターネットゲートウェイ - VPC アタッチメントに明示的な依存性を作成する必要があることを意味します。詳細については、「DependsOn 属性」を参照してください。
-
PublicRoute
リソースとインターネットゲートウェイ - VPC アタッチメント間に明示依存性を作成します。-
PublicRoute
リソースで、[DependsOn] のドット上にマウスを移動します。 -
インターネットゲートウェイ - VPC アタッチメント (
AWS::EC2::VPCGatewayAttachment
) に接続をドラッグします。DependsOn
接続を介して、AWS CloudFormation デザイナー は発信元リソースが対象リソースに依存する依存関係 (DependsOn
属性) を作成します。この場合、AWS CloudFormation デザイナーはDependsOn
属性をPublicRoute
リソースに追加し、依存性として gateway-VPC アタッチメントを指定します。
-
-
WebServerInstance
リソースからPublicRoute
リソースへの別の依存性を作成します。WebServerInstance
リソースは、パブリックルートに依存してトラフィックをインターネットにルーティングします。パブリックルートがない場合、インスタンスは信号を送信して (cfn-signal ヘルパースクリプトを使用)、CloudFormation に対してインスタンス構成とアプリケーションのデプロイが完了したことを通知できません。 -
ルートテーブルとサブネットを関連付けるには、
PublicRouteTable
リソースからPublicSubnet
リソースへ接続をドラッグしてください。これで、パブリックサブネットはパブリックルートテーブルを使用してトラフィックをルーティングできるようになります。
-
[AWS CloudFormation デザイナー] ツールバーで、[ファイル] メニュー (ファイルアイコン) を使用してテンプレートをローカルへ保存します。
AWS CloudFormation デザイナー は、ハードドライブにテンプレートを保存します。後でテンプレートを使用して、スタックを作成できます。変更内容が失われないよう、テンプレートを定期的に保存することをお勧めします。
このステップでは、テンプレートに 7 つのリソースを追加して、その論理 ID とや一般名を変更しました。また、ほとんどのリソースにビジュアルな接続を確立して、関連付けや依存性を作成しました。ただし、このテンプレートにスタックを作成する前に、いくつかの接続 (セキュリティグループとインスタンスの関連付けなど) を作成して、各リソースにプロパティを指定する必要があります。次のステップでは、AWS CloudFormation デザイナーの統合されたエディタを使用して、入力パラメータのようなテンプレートの他のコンポーネントを変更する方法について説明します。
ステップ 2: のパラメーター、マッピング、出力の追加
リソースプロパティを指定する前に、他のテンプレートコンポーネントを追加して、複数の環境でテンプレートを簡単に再利用する必要があります。このステップでは、AWS CloudFormation デザイナー 統合されたエディタを使用してパラメータ、マッピング、出力を追加します。次に、リソースプロパティを指定するときに、これらのパラメーターやマッピングを参照できます。チュートリアルでは、統合されたエディタ にコピーして貼り付けられるサンプル JSON および YAML が提供されます。
パラメーターを追加するには
パラメーターは、スタックを作成するときに指定する入力値です。これらは、テンプレートにハードコードされた値がない状態で値を渡すのに役立ちます。たとえば、ウェブサーバーのインスタンスタイプをテンプレートでハードコーディングする必要はありません。代わりに、スタックを作成するときに、パラメーターを使用してインスタンスタイプを指定できます。このように、同じテンプレートを使用して、異なるインスタンスタイプを持つ複数のウェブサーバーを作成できます。詳細については、「Parameters」を参照してください。
-
AWS CloudFormation デザイナー キャンバスのオープンエリアをクリックします。
選択した内容により、統合されたエディタ は、編集可能なテンプレートレベルまたはリソースレベルのコンポーネントを表示します。テンプレートレベルでは、テンプレートパラメーター、マッピング、出力など、テンプレートのリソースセクション以外のすべてのセクションを編集できます。リソースレベルでは、リソースプロパティと属性を編集できます。
キャンバスのオープンエリアをクリックすると、テンプレートレベルのコンポーネントを編集することができます。リソースレベルのコンポーネントを編集するには、リソースを選択します。
-
統合されたエディタペインで、[Components] (コンポーネント) ビューの [Parameters] (パラメータ) タブを選択します。
-
次のスニペットのパラメーターをコピーして、統合されたエディタ に貼り付けます。
次の JSON スニペットは、ウェブサーバーのインスタンスタイプ、ウェブサーバーへの SSH アクセスのための Amazon EC2 キーペアの名前、SSH を使用してウェブサーバーにアクセスするのに使用できる IP アドレス範囲を指定するためのパラメータを追加します。
{ "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 コンソールスタックの [Outputs] (出力) タブで使用できる値を宣言します。このウォークスルーでは、作成後に簡単に自分のウェブサイトを見られるように、ウェブサイトの URL を出力します。詳細については、「Outputs」を参照してください。
-
統合されたエディタ ペインで、[出力] タブを選択します。
-
以下の JSON 出力をコピーし、統合されたエディタ に貼り付けます。
出力は
Fn::GetAtt
組込み関数を使用して、ウェブサーバーインスタンスのパブリック 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: リソースプロパティを指定する
多くのリソースで、ウェブサーバーを使用するためのインスタンスタイプのような、構成を定義するプロパティが必要です。前のステップで行ったのと同様に、AWS CloudFormation デザイナー 統合されたエディタを使用してリソースプロパティを指定します。コピーして 統合されたエディタ に貼り付けられるサンプルの JSON および YAML を提供します。
リソースプロパティを指定するには
-
AWS CloudFormation デザイナーキャンバスで、
VPC
リソースを選択します。統合されたエディタ は、リソースプロパティや属性など、編集可能なリソースレベルのコンポーネントを表示します。
-
[統合されたエディタ] ペインで、[Properties (プロパティ)] タブを選択します。
-
次の JSON スニペットをコピーして、統合されたエディタ の [Properties (プロパティ)] 括弧 (
{}
) の間に貼り付けます。この例では、VPC の DNS 設定および CIDR ブロックを指定します。
"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 CloudFormationVPC 内でサブネットがドラッグされると、デザイナーが自動的に VPC ID のプロパティを追加しました。
注記
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
-
どのトラフィックがウェブサーバーインスタンスに到達できるかを決定する、次のインバウンドルールを追加します。このルールは、スタックの作成時にパラメーター値として指定する、すべての 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
-
ウェブサーバーインスタンスの多数のプロパティを指定する必要がありますので、デモのためにそのいくつかを強調表示しています。
InstanceType
プロパティとImageId
プロパティは、前のセクションで指定したパラメーターやマッピング値を使用します。スタックの作成時に、パラメーター値としてインスタンスタイプを指定します。ImageId
値は、スタックのリージョンと指定したインスタンスタイプに基づくマッピングです。NetworkInterfaces
プロパティは、ウェブサーバーのインスタンスで使用できるネットワーク設定を指定します。このプロパティで、インスタンスにセキュリティグループとサブネットを関連付けることができます。AWS CloudFormation デザイナー はSubnetId
プロパティを使用してサブネットとインスタンスを関連付けますが、NetworkInterfaces
を使用する必要があります。それがウェブサーバーにパブリック 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' - |+
-
ウェブサーバー構成メタデータを
WebServerInstance
リソースに追加します。-
WebServerInstance
リソースを選択し、次に 統合されたエディタ ペインの [Metadata (メタデータ)] タブを選択します。 -
JSON でテンプレートを記述する場合:
Metadata
の中括弧 ({}
) の中と、AWS::CloudFormation::Designer
の閉じ括弧の後に、カンマ (,
) を追加します。 -
AWS::CloudFormation::Designer
プロパティの後に次のスニペットを追加します。これは、cfn-init ヘルパースクリプトにウェブサーバーの起動と基本的なウェブページの作成を命令します。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 Designer ツールバーで、[テンプレートを検証] (チェックボックスのアイコン) を選択して、テンプレートに構文エラーがないか確認します。
[Messages (メッセージ)] ペインでエラーを表示して修正し、テンプレートを再度検証します。エラーが表示されない場合、テンプレートの構文は有効です。
-
行ったすべての変更を保持するために、完成したテンプレートを保存します。
これで、完全な CloudFormation テンプレートが完成し、VPC 内で基本的なウェブサーバーを作成するのに使用できます。テンプレートを作成するには、AWS CloudFormation デザイナーキャンバスペインを使用して、最初にテンプレートリソースを追加して接続します。次に、統合されたエディタ を使用して、その他のテンプレートコンポーネントを追加し、リソースプロパティを指定します。次のステップでは、このテンプレートを使用してスタックを作成します。
ステップ 4: リソースのプロビジョニング
スタックを作成するには、AWS CloudFormation デザイナーから CloudFormation [Create Stack Wizard] (スタック作成ウィザード) を起動します。前のステップで作成したテンプレートを使用して、CloudFormation スタックを作成します。CloudFormation がすべてのリソースのプロビジョニングを行った後で、基本的なウェブサイトを起動して実行します。
スタックを作成するには
-
[AWS CloudFormation デザイナー] ツールバーで、[スタックを作成] (雲のアイコン) を選択します。
AWS CloudFormation デザイナーは S3 バケットで開かれたテンプレートを保存し、CloudFormation [Create Stack Wizard] (スタック作成ウィザード) を起動します。CloudFormation は、テンプレートをアップロードするたびに作成される同じ S3 バケットを使用します。
-
CloudFormation が自動的にテンプレート URL を入力します。[Next] (次へ) を選択します。
-
[スタックの詳細を指定] セクションでは、[スタックの名前] フィールドにスタック名を入力します。この例では、
BasicWebServerStack
を使用します。 -
[パラメータ] セクションでは、[KeyName] フィールドに、スタックを作成するのと同じリージョン内の有効な Amazon EC2 キーペアの名前を入力します。
-
他のデフォルトのパラメータ値をそのまま使用し、[次へ] を選択します。
-
このチュートリアルでは、タグの追加も詳細設定の指定も不要です。[次へ] を選択します。
-
スタック名と Amazon EC2 キーペア名が正しいことを確認し、[作成] を選択します。
AWS CloudFormation がスタックを作成するのに、数分かかります。進捗状況を監視するには、スタックイベントを確認します。スタックイベントの表示の詳細については、「CloudFormation コンソールからスタック情報を表示する」を参照してください。スタックが作成されると、スタックの出力を確認し、サンプルウェブサイトの URL に移動してウェブサイトが実行中であることを確認します。詳細については、「CloudFormation コンソールからスタック情報を表示する」を参照してください。
これで、AWS CloudFormation デザイナーを使用してテンプレートを作成し、スタックを起動できました。以下の AWS CloudFormation デザイナーを使用してスタックのテンプレートを変更する のウォークスルーでこのスタックを使用します。ここでは、スケーラブルなウェブサーバーを作成できるように、テンプレートを変更します。