メニュー
AWS CloudFormation
ユーザーガイド (API Version 2010-05-15)

ウォークスルー: AWS CloudFormation デザイナー を使用してスタックのテンプレートを変更します。

AWS CloudFormation デザイナー を使用して、スタックのテンプレートを簡単に変更し、それらを AWS CloudFormation に送信してスタックを更新します。通常は、スタックを変更する際に、テンプレートのコピーを取得してテキストエディタでテンプレートを変更してから、AWS CloudFormation を使用してスタックを更新する必要があります。AWS CloudFormation デザイナー を使用すると、実行中の任意のスタックのテンプレートをすぐに取得して変更し、コンソールを残さないでスタックを更新できます。

このウォークスルーでは、基本的なウェブサーバースタックから開始し、それを変更してスケーラブルで堅牢なウェブサーバーを実現します。ウォークスルーが終わるころには、次の例のようなテンプレートが完成します: https://console.aws.amazon.com/cloudformation/designer/home?templateUrl=https://s3.amazonaws.com/cloudformation-examples/sample-as-vpc.template&region=us-east-1

このウォークスルーでは、次のステップを実行します:

  1. スタックテンプレートの取得

    ここでは、実行されているスタックのテンプレートのコピーを取得します。以下のウォークスルーと同じ基本なウェブサーバーのスタックです: ウォークスルー: AWS CloudFormation デザイナー を使用して基本的なウェブサーバーを作成します。

  2. テンプレートの変更

    AWS CloudFormation デザイナー を使用してスタックのテンプレートを変更し、ウェブサイトがグループ、EC2 インスタンスを Auto Scaling グループと Elastic Load Balancing ロードバランサーに置き換えることで、ウェブサイトをスケーラブルで耐久性の高いものにします。

  3. スタックを更新します。

    変更を保存した後、変更済みのテンプレートを使用して基本的なウェブサーバーのスタックを更新します。

    注記

    AWS CloudFormation は無料サービスです。ただし、スタックに追加する AWS リソースには現在の料金が課金されます。AWS の料金の詳細については、http://aws.amazon.com で各製品の詳細ページを参照してください。

  4. スタックを削除します。

    スタックを削除して、すべてのリソースをクリーンアップします。

前提条件

このウォークスルーは、Amazon Virtual Private Cloud (Amazon VPC)、Auto Scaling、Elastic Load Balancing、および AWS CloudFormation に精通されていることが前提となります。コンテキストでは、それぞれの手順でリソースに関する基本情報について説明します。

さらに、次のウォークスルーも完了するものとします:「ウォークスルー: AWS CloudFormation デザイナー を使用して基本的なウェブサーバーを作成します。」。このウォークスルーでは、BasicWebServerStack という名前の実行中スタックを使用します。

ステップ 1: スタックのテンプレートの取得

このステップでは、AWS CloudFormation デザイナー を使用して実行中のスタックのテンプレートのコピーを取得して開きます。

実行中スタックのテンプレートのコピーを取得するには

  1. AWS CloudFormation コンソール (https://console.aws.amazon.com/cloudformation/) を開きます。

  2. スタックのリストから BasicWebServerStack を選択します。

  3. [Actions] を選択して、[View/Edit template in Designer] を選択します。

AWS CloudFormation は BasicWebServerStack スタックのテンプレートを取得して、それを AWS CloudFormation デザイナー で表示します。そこで、テンプレートのリソースとそれらの関係を確認できます。次のステップでは、AWS CloudFormation デザイナー を使用してテンプレートを変更します。

ステップ 2: テンプレートの変更

AWS CloudFormation デザイナー のドラッグアンドドロップインターフェイスと 統合された JSON および YAML エディタ を使用して、基本的なウェブサーバーのテンプレートを変更し、単一の Amazon EC2 インスタンスを Auto Scaling グループとロードバランサーに置き換えて、ウェブサイトをスケーラブルなものにします。ウェブサイトのトラフィックが突発的に増加した場合は、Auto Scaling が直ちにウェブサーバーの数を増やします。ロードバランサーは、インスタンス間でトラフィックを均等に分散します。

スタックテンプレートを変更するには

  1. WebServerInstance リソースの削除

    1. WebServerInstance リソースを右クリックします。

    2. [リソース] メニューから [Delete] ( )をクリックします。

    3. [OK] を選択して確定します。

  2. [Resource types] ペインから、次のリソースを PublicSubnet リソースに追加します: [AutoScalingGroup]、[LaunchConfiguration]、[LoadBalancer]。リソースを追加する前に、すべてのリソースを含めるためにサブネットを拡張しなければならない場合があります。

    リソースは、リソースのカテゴリに整理されます。Auto Scaling グループと起動設定は、[AutoScaling] のカテゴリーにあり、ロードバランサーは [ElasticLoadBalancing] のカテゴリーにあります。

    注記

    これらのリソースはコンテナモデルには従いません。したがって、AWS CloudFormation デザイナー がそれらをサブネットに自動的に関連付けすることはありません。このステップの後半で、接続を作成します。

  3. [Resource types] ペイン ([EC2] カテゴリ) で、[SecurityGroup] リソースをサブネット以外の VPC のいずれかの場所に追加します。

    このセキュリティグループは、ロードバランサーのインバウンドトラフィックおよびアウトバウンドトラフィックを制御します。

  4. それらの特定する簡単にするために、リソースの名前を変更します:

    • [AutoScalingGroup] の名前を WebServerFleet

    • [LaunchConfiguration] の名前を WebServerLaunchConfig

    • [LoadBalancer] の名前を PublicElasticLoadBalancer

    • [SecurityGroup] の名前を PublicLoadBalancerSecurityGroup に変更します。

  5. 追加されたリソースの関連付けを作成します。

    1. ロードバランサーと Auto Scaling グループのリソースをパブリックサブネットに関連付けます。

      • PublicElasticLoadBalancer リソースから、AWS::EC2::Subnet (Property: Subnets) 接続を PublicSubnet リソースにドラッグします。

      • WebServerFleet リソースから、AWS::EC2::Subnet (Property: VPCZoneIdentifier) 接続を PublicSubnet リソースにドラッグします。

    2. ロードバランサーとセキュリティグループを関連付けます。

      • PublicElasticLoadBalancer リソースから、AWS::EC2::SecurityGroup (Property: SecurityGroups) 接続を PublicLoadBalancerSecurityGroup リソースにドラッグします。

    3. Auto Scaling グループをロードバランサーと起動設定に関連付けます。

      • WebServerFleet リソースから、AWS::ElasticLoadBalancing::LoadBalancer (Property: LoadBalancerNames) 接続を PublicElasticLoadBalancer リソースにドラッグします。

      • WebServerFleet リソースから、AWS::ElasticLoadBalancing::LaunchConfiguration (Property: LaunchConfigurationName) 接続を WebServerLaunchConfig リソースにドラッグします。

    4. 起動設定をセキュリティグループに関連付けます。

      • WebServerLaunchConfig リソースから、AWS::EC2::SecurityGroup (Property: SecurityGroups) 接続を WebServerSecurityGroup リソースにドラッグします。

    5. Auto Scaling グループのパブリックルートへの依存関係を定義します。

      • WebServerFleet リソースから、DependsOn 接続を PublicRoute リソースにドラッグします。

      この依存関係により、AWS CloudFormation は、パブリックルーティングが完了するまで WebServerFleet リソースを作成しません。それ以外の場合、ウェブサーバーインスタンスの起動時にパブリックルートを使用できない場合、ウェブサーバーインスタンスは cfn-signal ヘルパースクリプトを使用して信号を送信し、設定とアプリケーションのデプロイが完了したときに、それを AWS CloudFormation に通知することができません。

  6. 追加したリソースのプロパティを指定します。

    1. AWS CloudFormation デザイナー キャンバスで、PublicElasticLoadBalancer リソースを選択します。

    2. 統合されたエディタ ペインで、[Properties] タブを選択し、次のスニペットをコピーして、[Properties] の括弧 ({}) の中に貼り付けます。

      AWS CloudFormation デザイナー はセキュリティグループとサブネットの関連付けを自動的に追加します。したがって、自分で追加する必要があるのは Listeners プロパティと HealthCheck プロパティだけです。Listeners プロパティは、リッスンするトラフィックの場所とタイプを指定し、HealthCheck プロパティはロードバランサーの状態を判断する設定を記述します。

      JSON

      Copy
      "Listeners": [ { "LoadBalancerPort": "80", "InstancePort": "80", "Protocol": "HTTP" } ], "HealthCheck": { "Target": "HTTP:80/", "HealthyThreshold": "3", "UnhealthyThreshold": "5", "Interval": "90", "Timeout": "60" }, "SecurityGroups": [ { "Ref": "PublicLoadBalancerSecurityGroup" } ], "Subnets": [ { "Ref": "PublicSubnet" } ]

      YAML

      Copy
      Listeners: - LoadBalancerPort: '80' InstancePort: '80' Protocol: HTTP HealthCheck: Target: 'HTTP:80/' HealthyThreshold: '3' UnhealthyThreshold: '5' Interval: '90' Timeout: '60' SecurityGroups: - !Ref PublicLoadBalancerSecurityGroup Subnets: - !Ref PublicSubnet
    3. 次のリソースでこのプロセスを繰り返します。

      WebServerFleet

      MaxSize プロパティ、MinSize プロパティ、DesiredCapacity プロパティを追加します。これらのプロパティは、Auto Scaling グループで起動するインスタンスの最大数と最小数、および起動するインスタンスの最初の数を指定します。必要な容量の値には、この手順で後半で追加する新しいパラメーターが考慮されています。

      JSON

      Copy
      "MinSize": "1", "MaxSize": "10", "DesiredCapacity": { "Ref": "WebServerCount" }, "VPCZoneIdentifier": [ { "Ref": "PublicSubnet" } ], "LaunchConfigurationName": { "Ref": "WebServerLaunchConfig" }, "LoadBalancerNames": [ { "Ref": "PublicElasticLoadBalancer" } ]

      YAML

      Copy
      MinSize: '1' MaxSize: '10' DesiredCapacity: !Ref WebServerCount VPCZoneIdentifier: - !Ref PublicSubnet LaunchConfigurationName: !Ref WebServerLaunchConfig LoadBalancerNames: - !Ref PublicElasticLoadBalancer
      PublicLoadBalancerSecurityGroup

      達することができますし、次のインバウンドルールおよびアウトバウンドルールを追加します。これらは、ロードバランサーに到達しそこから出るトラフィックを決定します。このルールは、すべての HTTP トラフィックがロードバランサーに到達しロードバランサーから出ることを許可します。

      JSON

      Copy
      "GroupDescription": "Public Elastic Load Balancing security group with HTTP access on port 80 from the Internet", "SecurityGroupIngress": [ { "IpProtocol": "tcp", "FromPort": "80", "ToPort": "80", "CidrIp": "0.0.0.0/0" } ], "SecurityGroupEgress": [ { "IpProtocol": "tcp", "FromPort": "80", "ToPort": "80", "CidrIp": "0.0.0.0/0" } ], "VpcId": { "Ref": "VPC" }

      YAML

      Copy
      GroupDescription: >- Public Elastic Load Balancing security group with HTTP access on port 80 from the Internet SecurityGroupIngress: - IpProtocol: tcp FromPort: '80' ToPort: '80' CidrIp: 0.0.0.0/0 SecurityGroupEgress: - IpProtocol: tcp FromPort: '80' ToPort: '80' CidrIp: 0.0.0.0/0 VpcId: !Ref VPC
      WebServerSecurityGroup

      ロードバランサーからのトラフィックのみを許可する HTTP のインバウンドルールを変更します。

      JSON

      Copy
      "GroupDescription": "Allow access from load balancer and SSH traffic", "SecurityGroupIngress": [ { "IpProtocol": "tcp", "FromPort": "80", "ToPort": "80", "SourceSecurityGroupId": { "Ref": "PublicLoadBalancerSecurityGroup" } }, { "IpProtocol": "tcp", "FromPort": "22", "ToPort": "22", "CidrIp": { "Ref": "SSHLocation" } } ], "VpcId": { "Ref": "VPC" }

      YAML

      Copy
      VpcId: !Ref VPC GroupDescription: Allow access from load balancer and SSH traffic SecurityGroupIngress: - IpProtocol: tcp FromPort: '80' ToPort: '80' SourceSecurityGroupId: !Ref PublicLoadBalancerSecurityGroup - IpProtocol: tcp FromPort: '22' ToPort: '22' CidrIp: !Ref SSHLocation
      WebServerLaunchConfig

      起動設定には指定する必要があるさまざまプロパティがあるため、そのいくつかを強調表示しています。InstanceType プロパティと ImageId プロパティは、テンプレートですでに指定されたパラメーターやマッピング値を使用します。スタックの作成時に、パラメーター値としてインスタンスタイプを指定します。ImageId 値は、スタックのリージョンと指定したインスタンスタイプに基づくマッピングです。

      UserData プロパティで、インスタンスが稼働したら実行する設定スクリプトを指定します。すべての設定情報は、次のステップで追加するインスタンスのメタデータに定義されます。

      JSON

      Copy
      "InstanceType": { "Ref": "InstanceType" }, "ImageId": { "Fn::FindInMap": [ "AWSRegionArch2AMI", { "Ref": "AWS::Region" }, { "Fn::FindInMap": [ "AWSInstanceType2Arch", { "Ref": "InstanceType" }, "Arch" ] } ] }, "KeyName": { "Ref": "KeyName" }, "AssociatePublicIpAddress": "true", "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 WebServerLaunchConfig ", " --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 WebServerFleet ", " --region ", { "Ref": "AWS::Region" }, "\n" ] ] } }, "SecurityGroups": [ { "Ref": "WebServerSecurityGroup" } ]

      YAML

      Copy
      InstanceType: !Ref InstanceType ImageId: !FindInMap - AWSRegionArch2AMI - !Ref 'AWS::Region' - !FindInMap - AWSInstanceType2Arch - !Ref InstanceType - Arch KeyName: !Ref KeyName AssociatePublicIpAddress: 'true' 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 WebServerLaunchConfig ' - ' --configsets All ' - ' --region ' - !Ref 'AWS::Region' - |+ - | # Signal the status from cfn-init - '/opt/aws/bin/cfn-signal -e $? ' - ' --stack ' - !Ref 'AWS::StackName' - ' --resource WebServerFleet ' - ' --region ' - !Ref 'AWS::Region' - |+ SecurityGroups: - !Ref WebServerSecurityGroup
  7. 起動設定メタデータを WebServerLaunchConfig リソースに追加します。このリソースは、cfn-init ヘルパースクリプトにウェブサーバーの起動と基本的なウェブページを作成を命令します。

    1. WebServerLaunchConfig リソースを選択し、次に 統合されたエディタ の [Metadata] タブを選択します。

    2. JSON でテンプレートを記述する場合: Metadata の中括弧 ({}) 内の、AWS::CloudFormation::Designer の閉じ括弧の後に、カンマ (,) を追加します。

    3. AWS::CloudFormation::Designer プロパティの後に、cfn-init ヘルパースクリプトにウェブサーバーの起動と基本的なウェブページの作成を命令する、次のスニペットを追加します。

      JSON

      Copy
      "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

      Copy
      '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'
  8. WebServerCount パラメーターを追加します。このパラメーターは、AWS CloudFormation が Auto Scaling グループを作成するときに作成するインスタンスの数を指定します。

    1. AWS CloudFormation デザイナー キャンバスのオープンエリアをクリックします。

    2. 統合されたエディタ ペインで、[Parameters] タブを選択します。

    3. 統合されたエディタ に次のパラメータを追加します。JSON でテンプレートを記述する場合は、カンマを必要に応じて追加します。

      JSON

      Copy
      "WebServerCount": { "Description": "Number of Amazon EC2 instances to launch for the WebServer server", "Type": "Number", "Default": "1" }

      YAML

      Copy
      WebServerCount: Description: Number of Amazon EC2 instances to launch for the WebServer server Type: Number Default: '1'
  9. テンプレートの出力を変更して、ロードバランサーの DNS 名を表示します。

    1. 統合されたエディタ ペインで、[Outputs] タブを選択します。

    2. 次のコードスニペットに示すように、ロードバランサーの DNS 名を使用するように JSON を変更します.

      JSON

      Copy
      { "Outputs": { "URL": { "Value": { "Fn::GetAtt": [ "PublicElasticLoadBalancer", "DNSName" ] }, "Description": "Newly created application URL" } } }

      YAML でテンプレートを記述する場合は、次のスニペットを使用します。

      Copy
      Outputs: URL: Value: !GetAtt - PublicElasticLoadBalancer - DNSName Description: Newly created application URL
  10. [AWS CloudFormation デザイナー] ツールバーで、[Validate template] ( ) を選択して、テンプレートに構文エラーがないか確認します。

    [Messages] ペインでエラーを表示して修正し、テンプレートを再度検証します。エラーが表示されない場合、テンプレートの構文は有効です。

  11. [AWS CloudFormation デザイナー] ツールバーで、[File] ( ) を選択し、[Save] を選択してローカルに保存します。

これで、AWS CloudFormation テンプレートを、基本的なウェブサーバーのスタック更新に使用できるように変更できました。次のステップでは、このテンプレートを使用して基本的なウェブサーバーのスタックを更新します。

ステップ 3: スタックの更新

テンプレートの変更内容を実装するには、基本的なウェブサーバーのスタックを更新する必要があります。AWS CloudFormation スタック更新ウィザードは、 AWS CloudFormation デザイナー から直接起動できます。

スタックを更新するには

  1. [AWS CloudFormation デザイナー] ツールバーで、[Create Stack] ( )をクリックします。

    AWS CloudFormation デザイナー は S3 バケットで開かれたテンプレートを保存し、AWS CloudFormation スタック更新ウィザードを起動します。BasicWebServerStack スタックのテンプレートが変更されているため、AWS CloudFormation はそのスタックのスタック更新ウィザードを起動します。

  2. AWS CloudFormation が自動的にテンプレート URL を入力します。[Next] を選択します。

  3. [Stack] セクション ([Name] フィールド) で、スタック名が BasicWebServerStack になっていることを確認します。

  4. [Parameters] セクションで、既存の値を使用して [Next] を選択します。

  5. このチュートリアルでは、タグの追加も詳細設定の指定も不要です。[Next] を選択します。

  6. スタックの名前が正しいことを確認し、[Update] を選択します。

AWS CloudFormation がスタックを更新するのに、数分かかります。進捗状況を監視するには、スタックイベントを確認します。詳細については、「スタックのデータとリソースの表示」を参照してください。スタックが更新されると、スタックの出力を確認し、ウェブサイト URL に移動してウェブサイトが実行中であることを確認します。詳細については、「スタックのデータとリソースの表示」を参照してください。これで、AWS CloudFormation デザイナー を使用してテンプレートとスタックを更新しました。

不要なサービスに対して課金されないように、このスタックは削除することができます。

ステップ 4: リソースをクリーンアップする

不要なサービスに対して課金されないようにするには、スタックとそのリソースを削除します。

スタックを削除するには

  1. AWS CloudFormation コンソールから、[BasicWebServerStack] スタックを選択します。

  2. [Delete Stack] を選択します。

  3. 確認メッセージで、[Yes, Delete] を選択します。

AWS CloudFormation がスタックを削除するのに、数分かかります。進捗状況を監視するには、スタックイベントを確認します。スタックの削除後に、作成したすべてのリソースが削除されます。これで AWS CloudFormation デザイナー の使用方法が理解できたので、これを使用して独自のテンプレートの作成と変更ができます。