AWS CloudFormation デザイナーを使用してスタックのテンプレートを変更する - AWS CloudFormation

AWS CloudFormation デザイナーを使用してスタックのテンプレートを変更する

注記

CloudFormation コンソールモードの Infrastructure Composer は、AWS CloudFormation デザイナーからの改良版です。可能な限り、デザイナーではなく Infrastructure Composer を使用することをお勧めします。詳細については、「Infrastructure Composer を使用してテンプレートを視覚的に作成」を参照してください。

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

このウォークスルーでは、基本的なウェブサーバースタックから開始し、それを変更してスケーラブルで堅牢なウェブサーバーを実現します。

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

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

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

  2. テンプレートの変更。

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

  3. スタックの更新。

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

    注記

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

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

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

前提条件

このチュートリアルは、お客様が Amazon Virtual Private Cloud (Amazon VPC)、Auto Scaling、Elastic Load Balancing、および CloudFormation に精通していることを想定しています。コンテキストでは、それぞれの手順でリソースに関する基本情報について説明します。

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

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

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

実行中スタックのテンプレートのコピーを取得する
  1. CloudFormation コンソール (https://console.aws.amazon.com/cloudformation/) を開きます。

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

  3. [アクション] を選択して、[デザイナーで表示] を選択します。

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

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

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

スタックテンプレートを変更するには
  1. WebServerInstance リソースの削除

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

    2. リソースメニューから、[削除] (ゴミ箱のアイコン) を選択します。

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

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

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

    注記

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

  3. [リソースタイプ] ペイン ([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 リソースにドラッグします。

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

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

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

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

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

      JSON

      "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

      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

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

      YAML

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

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

      JSON

      "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

      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

      "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

      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

      "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

      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

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

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

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

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

      JSON

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

      YAML

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

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

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

      JSON

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

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

      Outputs: URL: Value: !GetAtt - PublicElasticLoadBalancer - DNSName Description: Newly created application URL
  10. AWS CloudFormation Designer ツールバーで、[テンプレートを検証] (チェックボックスのアイコン) を選択して、テンプレートに構文エラーがないか確認します。

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

  11. AWS CloudFormation Designer ツールバーで、[ファイル] メニュー (ファイルのアイコン) を選択してテンプレートをローカルへ保存し、[保存] します。

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

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

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

スタックを更新するには
  1. AWS CloudFormation Designer ツールバーで、[スタックを作成] (雲のアイコンと上矢印) を選択します。

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

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

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

  4. [パラメータ] セクションで、既存の値を使用して [次へ] を選択します。

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

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

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

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

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

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

スタックを削除するには
  1. CloudFormation コンソールから、BasicWebServerStack スタックを選択します。

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

  3. 確認メッセージで、[はい、削除する] を選択します。

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