« 【AWS発表】 AWS Marketplace - クラウドソフトウェアの検索、購入、比較、起動までマーケットプレイスで | メイン | 【AWS発表】 AWS Elastic Beanstalkが東京リージョンで利用可能に。Java、PHPをすぐにクラウドで動かそう! »

【AWS発表】CloudFormationがスタック内のリソースを更新可能に 「サークルオブライフ: パート1」

AWS CloudFormationを使えば、予測可能な方法でAWSのリソースを簡単に作成、更新、管理することができます。今日は、AWS CloudFormationの新しい機能についてお知らせします。新機能は運用中のスタックからリソースを追加したり削除したりできるようになるというものです。これにより、時間とともに変わる要件にあわせて、スタックを進化させることができるようにりました。AWS CloudFormationを使うことにより、アプリケーションを動かしているAWSリソースの完全なライフサイクルを管理できるようになりました。

アプリケーションのためのAWSインフラストラチャ作成
CloudFormationのテンプレートはAWSのリソースとそれらに関する一連の依存関係を宣言型の方法で定義します。CloudFormationのテンプレートはアプリケーションを動作させるのに必要なものを描写する青写真と考えることができます。 このように、CloudFormationサービスは自動組立ラインのように振舞い、一貫して予想どおりに必要とするリソースとすべての依存関係を構築します。 CloudFormationはほとんど全てのAWSサービスを含む広い範囲のリソースを定義することができます。 まずは、CloudFormationを利用するのに、それぞれのAWSのサービスを理解するのに必要とされるコンセプト以上のことを学ぶ必要はないことを確認したいと思います。 テンプレート内で宣言されたおのおののリソースは論理名、タイプ、リソースタイプに適用されるプロパティのセットを持っています。 テンプレートは(パラメータという形式の)入力を受けとり、出力を生成します。 入力パラメータを使うことで、ひとつのテンプレートで設定が異なるリソースを使うことができるようになります。例えば、Amazon EC2インスタンスの数や、Amazon RDS データベースインスタンスのパスワードの設定などに使えます。 テンプレートはリージョンを意識することができるので、違うAWSリージョンにおいても、同じ方法でリソースを設定するために、同じテンプレートを使うことができます。

EC2インスタンスの設定とアプリケーションコードのデプロイ
AWSリソースに加えて、テンプレートには、起動時のEC2インスタンスの設定を定義することができます。 インストールされるソフトウェアパッケージ、作成されるべき追加のファイル、必要なOSのユーザーとグループ、スタート時に必要なサービス、実行する必要がある追加のコマンドなどをテンプレートで定義することができます。

リソースのプロパティの変更
これで、アプリケーションが起動し、走りはじめますが、いくつかのパラメータを調整する必要があるかもしれません。 例えば、Amazon CloudWatchのアラームのひとつの閾値を変更したいかもしれませんし、AutoScalingグループのEC2インスタンスの上限値を増やしたいかもしれません。CloudFormationはテンプレート内のリソースのプロパティを更新することができます。単にテンプレートを変更して、スタックをアップデートするだけです。CloudFormationはダウンタイムを減らす最も最適な方法でアップデートを行います。アラームの設定を修正するようなちょっとした変更は利用者に負担の少ない方法で行えます。 例えば、EC2インスタンスにデプロイされるAmazon Machine Image (AMI) を変更することができたりと、CloudFormationはフルコントロールが行えます。 このような変更によって、既存のリソースを新しいリソースへ置き換えられます。 ひとつの例として、ダウンタイムを避けるために、新しいEC2インスタンスを作成し、その後、古いインスタンスを終了することができます。 CloudFormationは依存したリソースに対してすべての必要な変更を行うことによって、アップデートプロセスを完了します。つまり、もしElasticIPアドレスが古いEC2インスタンスを参照していたら、自動的に新しいインスタンスを参照するよう更新されます。

アプリケーションのソフトウェアの更新
CloudFormationを使えば、リソースを更新するのと同じような方法で、ソフトウェアパッケージやアプリケーションを最新の状態に保つことができます。 デプロイするソフトウェアを定義する際、必要なすべてのパッケージのバージョンを指定することができます。 シンプルにテンプレート内のパッケージのバージョンまたは、複数のインスタンスにまたがった依存関係のある変更のセットを変更することで、スタックを更新できます。 CloudFormationはテンプレート内で指定した任意のファイルや任意の追加されたユーザー、グループ、サービスまたはインスタンスに配置する必要のある他の成果物の内容の変更を見つけて、更新時にそれらを適用します。 この機能を活用するためには、インスタンス起動時にcfn-hupプロセスが起動することを確認する必要があります。 cfn-hupデーモンはバックグラウンドで実行され、インスタンスへの変更を適用するためにCloudFormationと共に調整を行います。

アプリケーションで必要なリソースの拡張または変更
サービスが成長し、ソフトウェアが進化するにつれて、アプリケーションに必要とされるAWSのリソースセットは変化していきます。 CloudFormationは時と共にスタック内のリソースを変更できます。 最初は1台のインスタンスでサービスをスタートしますが、リクエストを満たすために負荷分散された、自動スケーリンググループに移行する必要があることに気づくかもしれません。 しかし心配はいりません。単純にテンプレートで新しいリソースを定義して、後はCloudFormationに任せてしまえばいいのです。 必要な全ての新しいリソースがスピンアップしアプリケーションを動かしている既存のリソースに組みこまれます。例えば、自動スケールにより新しく追加されたインスタンスはAmazon RDSのデータベースインスタンスに接続する必要があるかもしれません。 もう必要ない全てのリソースは削除され、廃止されます。 既存のリソースをプロパティを更新するのと同じように、CloudFormationは変更が必要なリソースのみに影響を与えるように更新を最適化します。


AWS CloudFormation User Guideは、次のシナリオをカバーするような、新しいスタックを作成し、更新するチュートリアルを含んでいます。

  • EC2インスタンス上のソフトウェアを更新する。(ソフトウェアアップデード)
  • 垂直スケールするためにEC2インスタンスタイプを更新する。(スタックの変更。EC2インスタンスタイプをt1.microからm1.smallへ)
  • スタック内のEC2インスタンスのAmazon Machine Image (AMI)を更新する。
  • 鍵を持っていない誰かがSSHでログインできるよう、EC2インスタンスにキーペアを追加する。
  • IAMポリシーのような既存リソースのプロパティを更新する。

AWS CloudFormationの最新のリリースでは、スタックを構成する一連のリソースを変更することができるようになりました。 デモとして、チュートリアルからシングルインスタンスのアプリケーションをもってきて、スタックを更新するためにAWS CloudFormationを使い、自動スケーリングし、負荷分散されたアプリケーションにコンバートしてみます。

まずはAWS CloudFormation User Guideのチュートリアルに従って、次のテンプレートを使ってスタックを作成するところからスタートします。 https://s3.amazonaws.com/cloudformation-templates-us-east-1/UpdateTutorialPart3.template

このテンプレートはElasticIPアドレスを使ったシンプルなシングルインスタンスのPHPアプリケーションを作成します。 このアプリケーションを可用性が高く、自動スケーリングし、負荷分散されたアプリケーションに生まれかわらせるためには、テンプレートに以下の変更を加えます。

  1. テンプレートからElasticIPアドレスを削除します。:
        "Endpoint" : {
          "Type" : "AWS::EC2::EIP",
          "Properties" : {
            "InstanceId" : { "Ref" : "WebServerHost" }
          }
        },
  2. Elastic Load Balancerのリソースを追加します。:
        "ElasticLoadBalancer" : {
          "Type" : "AWS::ElasticLoadBalancing::LoadBalancer",
          "Properties" : {
            "AvailabilityZones" : { "Fn::GetAZs" : "" },
            "Listeners" : [ {
              "LoadBalancerPort" : "80",
              "InstancePort" : "80",
              "Protocol" : "HTTP"
            } ],
            "HealthCheck" : {
              "Target" : "HTTP:80/",
              "HealthyThreshold" : "3",
              "UnhealthyThreshold" : "5",
              "Interval" : "30",
              "Timeout" : "5"
            }
          }
        },
  3. テンプレート内のEC2インスタンスをAuto Scaling Launch Configurationに書き換えます。 プロパティは同じなので、タイプ名を変更するだけでOKです。

    From:

        "WebServerHost": {
          "Type" : "AWS::EC2::Instance",

    To:

        "WebServerConfig": {
          "Type" : "AWS::AutoScaling::LaunchConfiguration",

    テンプレート内で明確にするために、リソース名もWebServerHostからWebServerConfigに変更していますので、cfn-initとcfn-hupによって参照されるリソース名も更新する必要があります。(WebServerHostという文字列を探して、全てWebServerConfigに置き換えればOKです。)

  4. Auto Scaling Group リソースを追加します。:
        "WebServerGroup" : {
          "Type" : "AWS::AutoScaling::AutoScalingGroup",
          "Properties" : {
            "AvailabilityZones" : { "Fn::GetAZs" : ""},
            "LaunchConfigurationName" : { "Ref" : "WebServerConfig" },
            "MinSize" : "1",
            "MaxSize" : "3",
            "LoadBalancerNames" : [ { "Ref" : "ElasticLoadBalancer" } ]
          }
        },
  5. ロードバランサーからインスタンスへのトラフィックをロックダウンするために、セキュリティグループの定義を更新します。:
        "WebServerSecurityGroup" : {
          "Type" : "AWS::EC2::SecurityGroup",
          "Properties" : {
            "GroupDescription" : "Enable SSH access and HTTP from the load balancer only",
            "SecurityGroupIngress" : [{
              "IpProtocol" : "tcp",
              "FromPort" : "22",
              "ToPort" : "22",
              "CidrIp" : "0.0.0.0/0"
            }, {
              "IpProtocol" : "tcp",
              "FromPort" : "80",
              "ToPort" : "80",
              "SourceSecurityGroupOwnerId" : {"Fn::GetAtt" :      
                 ["ElasticLoadBalancer", "SourceSecurityGroup.OwnerAlias"]},
              "SourceSecurityGroupName" : {"Fn::GetAtt" :  
                 ["ElasticLoadBalancer", "SourceSecurityGroup.GroupName"]}
            }]
          }
        },
  6. アプリケーションのロケーションとしてElastic Load BalancerのDNS名を返すよう、Outputsを更新します。:

    From:

        "WebsiteURL" : {
          "Value" : { "Fn::Join" : ["", ["https://", {"Ref":"Endpoint" }]] },
          "Description" : "Application URL"
        }

    To:

        "WebsiteURL" : {
          "Value" :  { "Fn::Join" : [ "", [ "https://",
              { "Fn::GetAtt" : [ "ElasticLoadBalancer", "DNSName" ]}]]},
          "Description" : "Application URL"
        }

変更を適用済みのテンプレートは以下からダウンロードまたは参照可能です。: https://s3.amazonaws.com/cloudformation-templates-us-east-1/UpdateTutorialPart5.template

このテンプレートをスタックを更新するために使えば、シンプルでシングルインスタンスのアプリケーションを、可用性が高く、multi-AZで、自動スケーラブル、さらに負荷分散されたアプリケーションに変換することができます。 更新が必要なリソースのみ変更されますので、このアプリケーションのために何かデータが保存されていた場合も、データはそのまま残ります。 さあこれで今からすぐにでも要求の変化に応じてスタックを拡大したり、拡張したりするためにCloudFormationを使うことができるようになりました!

まとめ
リソースおよびソフトウェアコンポーネントを作成したり更新したりする一連のメカニズムを提供することで、CloudFormationはアプリケーションのインフラの継続的な管理を可能にします。 CloudFormationテンプレートはアプリケーションと一緒にバージョンコントロールされるので、変更管理のプロセスは包括的なアプローチを取ることを保証します。つまり開発、試作、本番スタックが同じ方法でデプロイされ、設定されていることが保証されますし、本番環境に反映する前にテストしたあらゆる変更も、ステージング環境で行われたのと同じ方法で実行されることが保証されます。

 堀内康弘(@horiuchi)

コメント

トラックバック

この記事のトラックバックURL:
https://www.typepad.com/services/trackback/6a00d8341c534853ef0168ea235d8f970c

【AWS発表】CloudFormationがスタック内のリソースを更新可能に 「サークルオブライフ: パート1」を参照しているブログ:

Featured Event

2016年3 月

    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31