AWS CloudFormation AWS Black Belt Tech Webinar 2014 (旧マイスターシリーズ) アマゾンデータサービスジャパン株式会社 技術本部 エンタープライズソリューション部 ソリューションアーキテクト ⼩小林林正⼈人 アジェンダ • CloudFormationの概要 • スタック • テンプレート • CloudFormer • CloudFormationによる運⽤用 • まとめ アジェンダ • CloudFormationの概要 • スタック • テンプレート • CloudFormer • CloudFormationによる運⽤用 • まとめ AWS CloudFormation • EC2やELBといったAWSリソースの環境構築を、設定ファイル(テ ンプレート)を元に⾃自動化できるサービス • テンプレートを⾃自由に作成できるため、⾃自分好みのシステム構成を ⾃自動的に構築できる • テンプレートには起動すべきリソースの情報をJSONフォーマット のテキスト形式で記述する • AWS Test Driveでも環境構築にCloudFormationを利利⽤用している – http://aws.amazon.com/jp/testdrive/japan/ AWS CloudFormationのイメージ テンプレートに基づき 各リソースが起動 スタック Elastic Load Balancing テンプレート S3 Cloud Formation SNS EC2 EC2 Auto Scaling CloudWatch 利利⽤用シーンと利利点 • ⼀一度度テンプレートを作成すれば、同じ構成を再現できる – 開発環境の構築 – Blogシステム、Webシステム、ゲームプラットフォームなど、同じ仕組み でアプリやデータが異異なるようなもの • ベストプラクティスが盛り込まれたテンプレートが使⽤用可能 – 複数のAZを跨いでリソースを配置する可⽤用性の⾼高い構成 – セキュリティ要件を満たす上で必須のソフト・設定が⼊入った構成 • 起動時にパラメータを渡せる – 例例えばDBのエンドポイントをEC2に渡せる 利利⽤用料料⾦金金 • CloudFormationの利利⽤用⾃自体は無料料 • テンプレートに従って構築された各AWSサービスに対して課⾦金金 – EC2インスタンス、ELB、RDSなど起動したリソースの費⽤用が請求される AWSのデプロイ⾃自動化サービスの中での位置づけ 導⼊入の容易易さ Elastic Beanstalk OpsWorks フレキシビリティ CloudFormation CloudFormationに適した場⾯面 • 多種多様なリソースを使い環境構築する場合 – エンタープライズアプリケーション – 他の⾃自動化サービスではサポートされないリソースを使うとき • 他のデプロイメントサービスと組み合わせて構築する場合 – CloudFormationで制御可能なリソースとして、OpsWorksやElasticBeanstalk をサポート。CloudFormationでアプリケーション実⾏行行環境を簡単に⽤用意できる • DRサイトの構築を⾏行行う場合 – 事前にデータを他リージョンに転送しておき、有事の際にCloudFormationを利利 ⽤用してリソースを⽴立立ち上げることでDRサイトを素早く起動できる CloudFormationによるDR事例例 アステラス製薬株式会社様 http://aws.amazon.com/jp/solutions/case-studies/astellas/ 最近の主なアップデート • 1/2 ParametersとOutputsの上限数をそれぞれ60に引き上げ • 1/29 SQSのDead letter queueをサポート • 2/10 Redshiftをサポート • 3/19 ELBのLoggingとConnection drainingをサポート • 4/2 CloudTrailでCloudFormationの利利⽤用ログ記録に対応 • 5/5 Amazon S3のバケットポリシーサポートを強化 • 5/6 Amazon Kinesisをサポート • 6/17 EBS暗号化ボリューム、VPC Peering等の新機能をサポート http://aws.amazon.com/releasenotes/AWS-CloudFormation/1755579460043566 アジェンダ • CloudFormationの概要 • スタック • テンプレート • CloudFormer • CloudFormationによる運⽤用 • まとめ スタック • テンプレートからプロビジョニングされるリソースの集合のことを スタックと呼ぶ • スタック単位でリソースの管理理が可能。スタック破棄を実⾏行行すると、 スタックにひもづくリソースを破棄することが可能 • 使⽤用するリソースおよびリソースの構築順は、テンプレートの依存 関係からCloudFormationが⾃自動的に決定 スタック これらを⼀一度度に⽣生成・破棄可能 App Server Web Server スタックの起動⽅方法 • AWS Management Consoleから起動 • コマンドラインツールも利利⽤用可能 – AWS Command Line Tool:http://aws.amazon.com/cli/ • 各種SDKでもサポート – Java : http://aws.amazon.com/jp/sdkforjava/ – .NET : http://aws.amazon.com/jp/sdkfornet/ – PHP : http://aws.amazon.com/jp/sdkforphp/ – Ruby : http://docs.aws.amazon.com/AWSSdkDocsRuby/latest/DeveloperGuide/ruby-‐‑‒dg-‐‑‒ setup.html – JavaScript : http://aws.amazon.com/documentation/sdkforjavascript/ – Python : http://docs.pythonboto.org/en/latest/ AWS Management Consoleによる起動-‐‑‒1 AWS Management Consoleによる起動-‐‑‒2 スタックの名前を⼊入⼒力力 テンプレートを指定する。 3種類の⽅方法から選択 サンプルを使う場合はこちら ⼿手持ちのテンプレートを使う場合 はこちらを選択しファイルを指定 S3に配置済みのテンプレートを 指定する場合はこちら AWS Management Consoleによる起動-‐‑‒3 テンプレートによってはパラ メータの入力が必要(後述) AWS Management Consoleによる起動-‐‑‒4 タグをつけることでリ ソースの管理が可能 AWS Management Consoleによる起動-‐‑‒5 起動されるスタックのコ スト見積もりを参照可能 AWS Management Consoleによる起動-‐‑‒6 クリックするとスタックの 起動処理が開始される AWS Management Consoleによる起動-‐‑‒7 ステータス「CREATE_IN_PROGRESS」は スタックが起動中であることを意味する 「Events」タブでは各リソースが 順次起動されることを確認できる AWS Management Consoleによる起動-‐‑‒8 スタック起動が完了するとステータスが 「CREATE_COMPLETE」に変化する テンプレートによっては「Outputs」 タブにDNS名やEIPの情報などが 出力される場合がある(後述) AWS Management Consoleによる起動-‐‑‒9 エラーが起きるとスタックはロールバックさ れる。起動したリソースはすべて削除される ロールバックの原因は「Events」タブから 参照できるので、問題を修正し再実行する アジェンダ • CloudFormationの概要 • スタック • テンプレート • CloudFormer • CloudFormationによる運⽤用 • まとめ テンプレート { "AWSTemplateFormatVersion" : "2010-09-09", "Description" : “Sample", "Parameters" : { "KeyName" : { "Description" : “Sample key, "Type" : "String" } }, "Mappings" : { }, • CloudFormationの⼼心臓部 • スタック構築の設計図 "Resources" : { "Ec2Instance" : { "Type" : "AWS::EC2::Instance", "Properties" : { "SecurityGroups" : [ { "Ref" : "InstanceSecurityGroup" } ], "KeyName" : { "Ref" : "KeyName" }, "ImageId" : { "Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "AMI" ]} } }, – どのリソースをどう起動するかが すべて記述されている "InstanceSecurityGroup" : { "Type" : "AWS::EC2::SecurityGroup", "Properties" : { "GroupDescription" : "Enable SSH access via port 22", "SecurityGroupIngress" : [ { "IpProtocol" : "tcp", "FromPort" : "22", "ToPort" : "22", "CidrIp" : "0.0.0.0/0" }] } } • JSONフォーマットで記述 } } サンプルテンプレート • テンプレートのサンプルを利利⽤用可能 http://aws.amazon.com/jp/cloudformation/aws-‐‑‒cloudformation-‐‑‒ templates/ テンプレートの要素 テンプレートのバージョン (最新は2010-‐‑‒09-‐‑‒09) { "AWSTemplateFormatVersion" : “2010-09-09", "Description" : "Valid JSON strings up to 4K", "Parameters" : { set of parameters }, "Mappings" : { set of mappings }, “Conditions" : { set of conditions }, "Resources" : { set of resources }, "Outputs" : { set of outputs } } テンプレートの詳細(説明⽂文) CloudFormation実⾏行行時にユーザ⼊入⼒力力を求める パラメータを定義する (KeyPairの名前や、DBのユーザ名など) Hashtableのようなもの キーに応じて値を特定出来る (例例:リージョンに応じたAMI-‐‑‒IDなど) 条件名と条件判断内容を登録する。この条件名は Resourcesなどでリソース作成時に利利⽤用できる。 EC2やRDSなど、スタックを構成する リソースを定義 スタック構築後にCloudFormationから出⼒力力させ る値(例例:DNS名やEIPの値など) Parameters { "AWSTemplateFormatVersion" : “2010-09-09", "Description" : "Valid JSON strings up to 4K", "Parameters" : { set of parameters }, "Mappings" : { set of mappings }, “Conditions" : { set of conditions }, "Resources" : { set of resources }, "Outputs" : { set of outputs } } CloudFormation実⾏行行時にユーザ⼊入⼒力力を求める パラメータを定義する (KeyPairの名前や、DBのユーザ名など) Parametersとは • スタック構築時に値を定義することができる • データ型、デフォルト値、最⼤大最⼩小値など型が設定可能 "Parameters": { "Age":{ "Type":"Number", "Default" : "30", "MinValue": "20", "MaxValue": "60", "Description":"input your age." }, "FirstName":{ "Type":"String", "Description":"input your first name." }, "MyKeyName": { "Description" : "Input your key pair.", "Type" : "String" } }, Parametersのプロパティ • 以下のプロパティが利利⽤用可能 プロパティ 内容 Type データ型 “String” “Number” “CommaDelimitedList” Default デフォルト値 NoEcho 入力時に*****となる(パスワードなどに使用) AllowedValues 入力可能値の一覧指定 (例:[“true”,”false”] ) AllowedPattern 正規表現で入力可能パターンを指定(例:[a-zA-Z]*) MaxLength 最大文字数 MinLength 最小文字数 MaxValue 最大値 MinValue 最小値 Description プロパティの詳細説明 ConstraintDescription 入力した値がAllowedPatternやMaxLengthなどの制約に引っかかった時に表示する説明 (どのような制約があるかの説明を記述) Parametersの参照 • パラメータの値は、テンプレート中で”Ref”により参照可能 • ユーザ名やパスワードなど、ユーザ⼊入⼒力力させたい項⽬目に便便利利 “Ref”を使うとパラメータの “Resources” : { 値を参照することができる “MyServer”:{ “Type":“AWS::EC2::Instance", “Properties” : { “KeyName”: { “Ref” : “MyKeyName”}, "Tags": [ { “Key”: “OwnerAge”,“Value”: { “Ref”: “Age” } }, { “Key": “OwnerName",“Value”: { “Ref”: “FirstName” } } ], }}} Function • パラメータの参照やMapの参照などの際はFunctionを利利⽤用する • Parameterの取得に利利⽤用した”Ref”もFunctionのひとつ • ⼤大別して8種類が⽤用意されている – Ref → パラメータを参照する – Fn::Base64 → ⽂文字列列をBase64エンコードする – Fn::FindInMap → Mapから値を取り出す – Fn::GetAtt → リソースに付随する値を取得する。例例)"Fn::GetAtt" : [ "MyELB" , "DNSName"] – Fn::GetAZs → 指定したリージョンのアベイラビリティゾーンを取得する – Fn::Join → ⽂文字列列を結合する。例例)“Fn::Join” : [ “:”, [ “a”, “b”] ] は 「a:b」を返す – Fn::Select → Index値に応じた値をListから選択する。 例例) { “Fn::Select” : [ “1”, [ “Jan”, “Feb”, “Mar”, “Apr”, “Jun” ] ] } は”Feb”を返す – Condition Functions → Fn::IfやFn::Orなどの条件分岐関連Function群 http://docs.amazonwebservices.com/AWSCloudFormation/latest/UserGuide/ index.html?intrinsic-‐‑‒function-‐‑‒reference.html Pseudo Parameter • あらかじめ定義された擬似パラメータ群で“Ref”により参照できる • 利利⽤用可能なパラメータは下記の通り “Resources" : { “MyServer":{ “Type":“AWS::EC2::Instance", “Properties” : { “KeyName”: { “Ref” : “AWS::StackName”}, “Tags” : { “Ref” : “AWS::Region”} }}} – AWS::Region → リージョン名を取得 – AWS::StackId → スタックIDを取得 – AWS::StackName → スタック名を取得 – AWS::AccountId → AWSアカウントIDを取得 – AWS::NotificationARNs → notification Amazon Resource Names(ARNs)を取得 – AWS::NoValue → 指定されたプロパティを無視するようCloudFormationに伝える 例例) "DBSnapshotIdentifier" : { "Fn::If" : [ "UseDBSnapshot", {"Ref" : "DBSnapshotName"}, {"Ref" : "AWS::NoValue"} ]} Ø UseDBSnapshotがTrueのとき 「DBSnapshotIdentifier」としてDBSnapshotNameの値を使う Ø UseDBSnapshotがFalseのとき CloudFormationはプロパティ「DBSnapshotIdentifier」が定義され ていないものとして動作する(=DBSnapshotIdentifierを無視する) http://docs.aws.amazon.com/AWSCloudFormation/latest/ UserGuide/pseudo-‐‑‒parameter-‐‑‒reference.html Mappings { "AWSTemplateFormatVersion" : “2010-09-09", "Description" : "Valid JSON strings up to 4K", "Parameters" : { set of parameters }, "Mappings" : { set of mappings }, “Conditions" : { set of conditions }, "Resources" : { set of resources }, "Outputs" : { set of outputs } } Hashtableのようなもの キーに応じて値を特定出来る (例例:リージョンに応じたAMI-‐‑‒IDなど) Mappingsとは • キーと値のマッピングテーブルを管理理できる • リージョンやユーザ⼊入⼒力力パラメータによって、値が変わるものに利利⽤用 • Mappingsを利利⽤用することでテンプレートの再利利⽤用性が向上 "Mappings" : { "RegionTable" : { "us-east-1" : { "AMI" : "ami-8c1fece5“, “KeyPair” : “myKey-east” }, "us-west-1" : { "AMI" : "ami-3bc9997e“, “KeyPair” : “myKey-west” }, "ap-northeast-1" : { "AMI" : "ami-300ca731“, “KeyPair” : “myKey-japan” }}}, Mappingsにテーブルの定義を⾏行行う (この例例の場合、”RegionTable”という 名称でMappingを定義) Regionが”us-‐‑‒west-‐‑‒1”であれば、AMI ID は”ami-‐‑‒3bc9997e”でキーペアの名前 は”myKey-‐‑‒west”とする Regionが”ap-‐‑‒northeast-‐‑‒1”であれば、 AMI IDは”ami-‐‑‒300ca731”でキーペアの 名前は”myKey-‐‑‒japan”とする Mappingsの使い⽅方 • Functionの”Find::InMap”を使って値を取得 例例)"Fn::FindInMap" : [ "MapName", "Key", "Value"] • MapName,key,Valueには”Ref”が利利⽤用可能 "Mappings" : { "RegionTable" : { "us-east-1" : { "AMI" : "ami-8c1fece5“, “KeyPair” : “myKey-east” }, “us-west-1” : { “AMI” : “ami-3bc9997e“, “KeyPair” : “myKey-west” }, "ap-northeast-1" : { "AMI" : "ami-300ca731“, “KeyPair” : “myKey-japan” } } }, リージョン名はユーザ⼊入⼒力力 "Parameters": { “region":{ "Type":"String", "Description":”input your region selection." }} “Resources" : { ⼊入⼒力力されたリージョンに合致す “MyServer":{ るAMIの値を取得する “Type":“AWS::EC2::Instance", “Fn::FindInTemplate” “Properties” : { “ImageId”: { “Fn:FindInMap” : [ “RegionTable” , { “Ref” : “region” },“AMI” ] }, } } ユーザ⼊入⼒力力が”ap-‐‑‒northeast-‐‑‒1”の場合、最 } 終的な戻り値は”ami-‐‑‒300ca731”となる Conditions { "AWSTemplateFormatVersion" : “2010-09-09", "Description" : "Valid JSON strings up to 4K", "Parameters" : { set of parameters }, "Mappings" : { set of mappings }, “Conditions" : { set of conditions }, "Resources" : { set of resources }, "Outputs" : { set of outputs } } 条件名と条件判断内容を登録する。この条件名は Resourcesなどでリソース作成時に利利⽤用できる。 Conditionsとは • 条件名と成⽴立立条件を列列挙 • Resourcesセクションなどで、『ある条件が成⽴立立しているときのみリ ソースを起動』といった条件ベースの制御が可能 • 本番環境と検証環境で構成が異異なる場合に便便利利 "Parameters" : { パラメータEnvTypeの値は、『production』 "EnvType" : { 『test』のいずれかをユーザが⼊入⼒力力する "Description" : "Environment type.", "Default" : "test", "Type" : "String", "AllowedValues" : [“production", "test"], EnvTypeパラメータの値が”production”であれ "ConstraintDescription" : "must specify prod or test." ば、CreateProdResources条件が成⽴立立 } }, "Conditions" : { "CreateProdResources" : {"Fn::Equals" : [{"Ref" : "EnvType"}, “production"]} }, Conditionsとは • Resourcesで”Condition”を指定すると、指定した条件が成⽴立立している 場合に限り、そのリソースが起動されるようになる。 "Resources" : { "EC2Instance" : { "Type" : "AWS::EC2::Instance", "Properties" : { "ImageId" : { "Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "AMI" ]} }}, "NewVolume" : { CreateProdResourcesが成⽴立立している "Type" : "AWS::EC2::Volume", "Condition" : "CreateProdResources", ときに限り、本番環境のみで利利⽤用する "Properties" : { EBSボリュームをプロビジョニング "Size" : "100", "AvailabilityZone" : { "Fn::GetAtt" : [ "EC2Instance", "AvailabilityZone" ]} }}, “MountPoint” : { “Type” : “AWS::EC2::VolumeAttachment”, “Condition” : “CreateProdResources”, “Properties” : { “InstanceId” : { “Ref” : “EC2Instance” }, CreateProdResourcesが成⽴立立している “VolumeId” : { “Ref” : “NewVolume” }, ときに限り、本番環境のみに存在する “Device” : “/dev/sdh” EBSをアタッチする }}} Resources { "AWSTemplateFormatVersion" : “2010-09-09", "Description" : "Valid JSON strings up to 4K", "Parameters" : { set of parameters }, "Mappings" : { set of mappings }, “Conditions" : { set of conditions }, "Resources" : { set of resources }, "Outputs" : { set of outputs } } EC2やRDSなど、スタックを構成する リソースを定義 Resourcesとは • EC2やELB, RDSなど、起動するサービスを指定 • リソースごとに決められたプロパティを設定する “Resources" : { リソースタイプの定義 "MyInstance": { "Type": "AWS::EC2::Instance", "Properties": { "DisableApiTermination": "FALSE", "ImageId": "ami-a1b6fda0", リソースごとのプロパティ “InstanceType": "t1.micro", "KeyName": { "Ref": "MyKeyName" } , "Monitoring": "false", } } } リソースタイプ • CloudFormationで利利⽤用可能なリソースタイプ • 最新のリストはWebを参照 http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-‐‑‒template-‐‑‒ resource-‐‑‒type-‐‑‒ref.html Attributes • リソースの振る舞いや関係を制御する • DeletionPolicy – スタック削除時のリソースの扱い(Delete (Default) / Retain / Snapshot) • DependsOn – リソース間の依存関係を明⽰示的に記述 • Metadata • UpdatePolicy – AWS::AutoScaling::AutoScalingGroupリソースのみ – Auto ScalingのRolling Updateでの挙動を制御 • MaxBatchSize、MinInstancesInService、PauseTime Outputs { "AWSTemplateFormatVersion" : “2010-09-09", "Description" : "Valid JSON strings up to 4K", "Parameters" : { set of parameters }, "Mappings" : { set of mappings }, “Conditions" : { set of conditions }, "Resources" : { set of resources }, "Outputs" : { set of outputs } } スタック構築後にCloudFormationから出⼒力力させ る値(例例:DNS名やEIPの値など) Outputsとは • スタック構築後に取得・表⽰示したい情報の定義 • 例例えばアクセスURLや、DBの通信先情報、作ったIAMユーザー名など、 あとで使⽤用するもの • マネジメントコンソールから確認できるので、スタックに関する情報 を出⼒力力すると便便利利(キーペア名、AZ、インスタンスIDなど) Outputsの定義 出⼒力力データの名称を定義 "Outputs" : { "InstanceId" : { 説明 "Description" : "InstanceId of the newly created EC2 instance", "Value" : { "Ref" : "Ec2Instance" } }, 値の指定 "AZ" : { "Description" : "Availability Zone of the newly created EC2 instance", "Value" : { "Fn::GetAtt" : [ "Ec2Instance", "AvailabilityZone" ] } }, "ApplicationURL" : { Functionを使って⽂文字列列を加⼯工 "Description" : "URL of running web application", "Value" : { "Fn::Join": ["", [ "http://", { "Fn::GetAtt": [ "Ec2Instance" , "PublicIp"] } , "/index.html"] ] } } } テンプレートのTips • リソース定義にEC2インスタンスが必須ではない – DB構築だけ、オートスケールだけ、アラーム設定だけでもOK • 参照関係があると、依存関係があるとみなされる。相互参照や循環参 照はエラーとなる • 参照関係がある部分は、参照の整合性が取れるよう起動順を CloudFormationが決定(Depends onで明⽰示的に指定も可) • スタックを破棄すると、スタックにひもづくリソースは破棄される – ただし”DeletionPolicy”を”Retain”にすると破棄されない "Resources" : { "myS3Bucket" : { "Type" : "AWS::S3::Bucket", "DeletionPolicy" : "Retain" }} テンプレートのTips • CloudFormationで⽣生成されたリソースには⾃自動でスタック名などの タグが付与される • 管理理者がリソースを識識別できるよう、明⽰示的なタグの付与を推奨 • テンプレートは⼊入れ⼦子にすることが可能。あるテンプレートから、別 のテンプレートを呼ぶことができる – リソースタイプに “AWS::CloudFormation::Stack“を指定しURLを指定すると、 そのテンプレートを読み込む – 呼び出された側に対するParameterの引き渡しや、呼び出し側で呼び出された側の "Resources" : { Outputsを参照することが可能 "WebServer" : { "Type" : "AWS::CloudFormation::Stack", "Properties" : { "TemplateURL" : “https://s3.amazonaws.com/hoge.template" ]]}, "Parameters" : { "KeyName" : { "Ref" : "KeyName" }, "InstanceType" : { "Ref" : "InstanceType"}, }}, テンプレートのまとめ • JSONフォーマットでスタックの情報を記載 • リソース間の依存関係はCloudFormationが⾃自動判別する • Parameterを利利⽤用すれば、パラメータのユーザ⼊入⼒力力を受け取れる • Management Console等に値を出⼒力力したい場合はOutputsに記述する • タグを設定してリソースの管理理性を⾼高める アジェンダ • CloudFormationの概要 • スタック • テンプレート • CloudFormer • アプリケーションのデプロイ • まとめ CloudFormer • 構築済みの環境からテンプレートを作成するツール(Webアプリ) • テンプレート作成のベースを構築するのに有益 テンプレート CloudFormer EC2 EC2 AutoScaling CloudFormerの特徴 • CloudFormerは全てのCloudFormationのリソースをサポート • どのリソースをテンプレートに含めるか完全に制御可能 • リソースを選択すると、従属するリソースも⾃自動選択(変更更可) – 例例えば、EC2インスタンスを選択すると、EC2インスタンスが必要とするセキュリ ティグループもテンプレートに含まれるようになる • EC2インスタンスを選択すると、そのインスタンスが起動された元の AMIが指定される – 構築済みのイメージを利利⽤用したい場合は、⽣生成されたテンプレートのAMI IDを確認 する。意図しないものであれば修正を⾏行行う • CloudFormerで⽣生成されたテンプレートを⼿手修正し、最終的なテンプ レートとして利利⽤用することを推奨 CloudFormerの使い⽅方 1. 既存の⼿手順やツールで必要なリソースを構成 2. 公開されているCloudFormer⽤用テンプレートからスタックを起動 https://aws.amazon.com/developertools/6460180344805680 3. CloudFormerがEC2のt1.microインスタンスで動作する 4. CloudFormerのURLにアクセスし、画⾯面の指⽰示通りにテンプレート 化するリソースを指定 5. ⽣生成されたテンプレートはAmazon S3に保存される 6. 作業が終わったら、CloudFormerのスタックはDeleteを推奨 CloudFormerスタックの起動・アクセス CloudFormerアプリケーション CloudFormerによるテンプレート⽣生成 • テンプレート化を⾏行行うリソースのリージョンを指定 • チェックを⼊入れて指定したリソースが含まれるテンプレートができる • 必要に応じてParameterの利利⽤用やOutputsの定義を⾏行行う アジェンダ • CloudFormationの概要 • スタック • テンプレート • CloudFormer • CloudFormationによる運⽤用 • まとめ CloudFormationと運⽤用ポリシー • CloudFormationはAWSリソースの構築を⾃自動化するツール • スタック単位でリソースの起動・破棄が⾏行行えるため、類似の環境を 複数構築する場合に⾮非常に有益 • アプリケーションの管理理については、CloudFormation⾃自体では制 御されないため、デプロイ⽅方式について考慮が必要 • CloudFormationにはアプリケーションを意識識させないという運⽤用 ⽅方法も考えられる 典型的なやりかた • CloudFormationではインフラ環境の構築までを⾏行行い、アプリケー ションは⼿手作業を含む別の⽅方法でデプロイする – CloudFormationにはアプリを意識識させないパターン • アプリのデプロイまで完了了した”Baked-‐‑‒AMI”を作成しておき、 CloudFormationではそのAMIを利利⽤用して環境を構築する – 全部⼊入りのAMIを⽤用意しておくパターン • 汎⽤用的なAMIを利利⽤用し、インスタンス起動時に必要なソフトウェア 群をセットアップする – スタックの起動時に都度度ソフトウェアをダウンロードし、都度度インストールす るパターン メリット・デメリットとユースケース メリット デメリット ユースケース CloudFormationではイン フラ環境の構築のみ行う • 構築が容易 • 一度作成したテンプレート の流用が容易 • アプリケーションのデプロイやミ ドルウェアの構築が別途必要 • ベストプラクティスを取り込ん だ汎用的な標準環境を展開す る アプリ配置済みのBakedAMIを利用して構築 • 構築が容易 • 起動が速い (オートスケールに適する) • ベースAMIやミドルウェア更新、 アプリバージョンアップ時に再 構築が必要 • リージョン毎にAMIの管理が必 要 • テストが完了した本番環境を 複製して開発環境を作る • 変更の少ないシステムのDR サイト起動用として インスタンス起動時に必要 なソフトウェア群をセット アップする • ベースAMI/ミドルウェア更 新時に追従が可能 • DBのエンドポイントなどの 定義情報を渡せる • テンプレートの構築がやや難し い • 都度セットアップの分、インスタ ンスの起動に時間がかかる • 常に最新のソフトウェア環境を 利用する必要があるとき • RDSをはじめとするAWSのマ ネージドサービスと連携する 場合 インスタンス起動時のソフトウェア環境構築 • インスタンスの起動時にuserdata(スクリプト)を渡すことで初期設 定を⾃自動化するブートストラッピングが可能 • AMIとは紐紐付かない。そのため、ベースAMIが更更新されたとしても、 変更更作業を⾏行行う必要はない • インスタンス起動時⼀一度度実⾏行行されるだけなので、書き換えて再実⾏行行 ができない点に注意。最⼤大容量量は16KBまで cloud-‐‑‒init • Amazon Linuxに⼊入っている、初期設定ツール • EC2インスタンスの起動時に、userdataに記述されたスクリプトを 実⾏行行する – 「#!」 で始まる⽂文字列列の場合のみ、スクリプトを実⾏行行 • ロケール変更更、アプリインストール、ファイル書き換えなどが可能 • RHELでも利利⽤用可能 – http://aws.amazon.com/articles/2519228458631605 • WindowsではEC2ConfigService cloud-‐‑‒init User Dataに定義 EC2インスタンス起動 Cloud-‐‑‒initがuserdataを 読み込む 読み込んだスクリプトを 実⾏行行 CloudFormationでuserdataを利利⽤用する • EC2リソースのプロパティ「UserData」に内容を記載 "MyInstance": { "Type": "AWS::EC2::Instance", "Properties": { "ImageId" : "ami-dcfa4edd", "KeyName" : { "Ref" : "KeyName" }, "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [ "#!/bin/bash\n", "log='/tmp/init.log'\n", "apt-get update &>> $log\n", "apt-get install -y ruby &>> $log\n", "cd /tmp\n", "wget http://rubygems.org/rubygems.tgz &>> $log\n", "tar zxf rubygems.tgz &>> $log\n", "cd rubygems\n", "ruby setup.rb --no-format-executable &>> $log\n", ]] } } } CloudFormationでユーザデータを利利⽤用する • CloudFormationでUserDataを定義すると、定義中にRefや Fn::GetAttrを使⽤用することが可能 • RDSのEndPointをUserDataに埋め込むといったことができる "Resources" : { "MyInstance": { "Type": "AWS::EC2::Instance", "Properties": { "ImageId" : "ami-dcfa4edd", "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [ "#!/bin/bash\n", "cd /home/ec2-user\n", { "Fn::Join" : ["", [ "echo ", {"Fn::GetAtt" : ["DBInstance", "Endpoint.Address"]} , "> db.conf\n" ]]} ]]} } } }, "DBInstance" : { "Type": "AWS::RDS::DBInstance", } } CloudFormation helper scripts • EC2インスタンス初期化時のヘルパースクリプト群 • userdataだけでは不不可能な複雑な設定を⾏行行う際に利利⽤用 • 利利⽤用⽅方法 – Amazon Linux AMIでは導⼊入済み – Yumリポジトリから取得可能 – その他下記よりダウンロード可能 http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-‐‑‒ helper-‐‑‒scripts-‐‑‒reference.html • 以下の4種を⽤用意 – cfn-‐‑‒init, cfn-‐‑‒get-‐‑‒metadata, cfn-‐‑‒signal, cfn-‐‑‒hup cfn-‐‑‒init • ファイルのダウンロード、ファイルの⽣生成を⾏行行うスクリプト • 実⾏行行のための設定は、Metadata領領域に定義 – AWS::CloudFormation::Init – Configsets、Commands、Files、Groups、Packages、Services、Sources、Users "Resources": { "MyInstance": { "Type": "AWS::EC2::Instance", "Metadata" : { "AWS::CloudFormation::Init" : { "config" : { "sources" : { : }, "packages" : { : } "files" : { : } "services" : { : } } } }, "Properties": { : } } source,package,files,services の順に実⾏行行される cfn-‐‑‒initの利利⽤用⽅方法 • sources – 指定したURLからファイルをダウンロードして展開 – Tar,zip,tar+gzip,tar+bz2 • packages "sources" : { "/etc/myapp" : "https://s3.amazonaws.com/mybucket/myapp.tar.gz" } – パッケージシステムを使⽤用してアプリをインストール – apt, yum, rubygems, python, rpm "packages" : { 最新版を取得 "yum" : { "httpd" : [], "php" : [], }, "rubygems" : { バージョン指 "chef" : [ "0.10.2" ], 定あり }} cfn-‐‑‒initの利利⽤用⽅方法 • files – 指定パスへのファイルの⽣生成 ファイルパス "files" : { "/app/db.conf" : { "content" : { "Fn::Join" : ["", [ "db.name=", {"Ref" : "DBName"}, "\n", "db.user=", {"Ref" : "DBUser"}, "\n", "db.pass=", {"Ref" : "DBPassword" },"\n", "db.host=", {"Fn::GetAtt" : ["DBInstance", "Endpoint.Address"]}, "\n", ]] }, "mode" : "000644", "owner" : "root", "group" : "root" } "/etc/myapp/myapp-init.pp" : { "source" : "https://s3.amazonaws.com/myapp/myapp-init.pp", "mode" : "100644", "owner" : "root", "group" : "wheel" }} ファイルの中⾝身を⽣生成 S3などから取得 cfn-‐‑‒initの利利⽤用⽅方法 • services OS起動時に 起動させるかどうか – サービスの起動・再起動の指定 – 現在sysvinitのみ "services" : { "sysvinit" : { "nginx" : { "enabled" : "true", "ensureRunning" : "true", "files" : ["/etc/nginx/nginx.conf"], "sources" : ["/var/www/html"] }, "php-fastcgi" : { "enabled" : "true", "ensureRunning" : "true", "packages" : { "yum" : ["php", "spawn-fcgi"] } } } cfn-‐‑‒init終了了後に起動するかどうか 設定ファイルもしくは指定ディレク トリのファイルが変わっていた場合 にサービス再起動する cfg-‐‑‒initでパッケージを⼊入れていた らサービス再起動 cfn-‐‑‒initの起動 • cfn-‐‑‒initはデフォルトでは動作しない • User-‐‑‒dataにcfn-‐‑‒initを起動するスクリプトを記述して、cloud-‐‑‒init 経由で起動 • 引数にスタック名、リソース名、リージョン、アクセスキー、シー クレットキーを指定 "Properties": { "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [ "#!/bin/bash\n", "/opt/aws/bin/cfn-init -s ", { "Ref" : "AWS::StackName" }, " -r WebServer ", " --access-key ", { "Ref" : "HostKeys" }, " --secret-key ", {"Fn::GetAtt": ["HostKeys", "SecretAccessKey"]}, " --region ", { "Ref" : "AWS::Region" }, "\n", ]]}} } その他のスクリプト • cfn-‐‑‒get-‐‑‒metadata – Metadataを簡単に取得出来るスクリプト • cfn-‐‑‒signal – リソース「WaitCondition」と共に使⽤用 – cfn-‐‑‒signalを使⽤用して、スタックに対して初期化状態の通知をすることが出来る – アプリのインストールが失敗した場合にスタックを破棄したりできる • cfn-‐‑‒hup – スタックを更更新(StackUpdateAPIを使⽤用)した場合に、それを感知して指定の ファイルを実⾏行行するフックスクリプト https://s3.amazonaws.com/cloudformation-‐‑‒examples/BoostrappingApplicationsWithAWSCloudFormation.pdf cfn-‐‑‒initの起動 • cfn-‐‑‒initはデフォルトでは動作しない • User-‐‑‒dataにcfn-‐‑‒initを起動するスクリプトを記述して、cloud-‐‑‒init 経由で起動 • 引数にスタック名、リソース名、リージョン、アクセスキー、シー クレットキーを指定 "Properties": { "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [ "#!/bin/bash\n", "/opt/aws/bin/cfn-init -s ", { "Ref" : "AWS::StackName" }, " -r WebServer ", " --access-key ", { "Ref" : "HostKeys" }, " --secret-key ", {"Fn::GetAtt": ["HostKeys", "SecretAccessKey"]}, " --region ", { "Ref" : "AWS::Region" }, "\n", ]]}}} アジェンダ • CloudFormationの概要 • スタック • テンプレート • CloudFormer • CloudFormationによる運⽤用 • まとめ まとめ • AWSリソースを組み合わせた環境を⾃自動的に構築することができる – ベストプラクティスが適⽤用された構成の展開に有益 • 利利⽤用料料⾦金金は無料料。EC2やRDSなどリソースの利利⽤用料料⾦金金のみ • CloudFormationそのものはアプリケーションを意識識しないので、 アプリケーションをどう管理理するかは別途検討する • 必要に応じてElastic BeanstalkやOpsWorksと組み合わせて利利⽤用す ることで、アプリ実⾏行行環境を容易易に構築できる リファレンス • Cloud Formation Samples – http://aws.amazon.com/jp/cloudformation/aws-‐‑‒cloudformation-‐‑‒templates/ • AWS CloudFormation のアーティクルとチュートリアル – http://aws.amazon.com/jp/cloudformation/aws-‐‑‒cloudformation-‐‑‒articles-‐‑‒and-‐‑‒ tutorials/ – BootstrappingApplicationsWithAWSCloudFormation • https://s3.amazonaws.com/cloudformation-‐‑‒examples/ BoostrappingApplicationsWithAWSCloudFormation.pdf • AWS CloudFormation よくある質問 – http://aws.amazon.com/jp/cloudformation/faqs/ Webinar資料料の配置場所 • AWS クラウドサービス活⽤用資料料集 – http://aws.amazon.com/jp/aws-‐‑‒jp-‐‑‒introduction/
© Copyright 2025 ExpyDoc