AWSマイスターシリーズReloaded(AWS Cloudformation)

  • 1,441 views
Uploaded on

 

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
1,441
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
44
Comments
0
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. AWSマイスターシリーズ Reloaded~AWS CloudFormation~ 2012年04月02日 片山 暁雄( @c9katayama ) ソリューションアーキテクト akiok@amazon.co.jp
  • 2. Agenda CloudFormationの概要 スタック テンプレート Cloud-init CloudFormation helpers CloudFormer その他Tips まとめ Copyright © 2011 Amazon Web Services
  • 3. CloudFormationの概要
  • 4. CloudFormation EC2やELBなどを使ったAWSサービスのシステム構築を、設 定ファイル(テンプレート)を元に行えるサービス テンプレートを自由に作成できるため、自分好みのシステム 構成が可能 テンプレートは、AWSのサービスを操るための新しい言語
  • 5. CloudFormationのイメージ テンプレートに基づき 各サービスが起動 スタック ElasticLoadBalanceingテンプレート S3 Cloud Formation SNS EC2 EC2 AutoScaling CloudWatch
  • 6. 利用シーンと利点一度テンプレートを作成すれば、同じ構成を再現できる  開発環境の構築  Blogシステム、Webシステム、ゲームプラットフォームなど、 同じ仕組みでアプリやデータが異なるようなものベストプラクティスが盛り込まれたテンプレートが使用可能  システムアーキテクチャの再利用  WordPress,Redmineなどが入った、多くのサンプルテンプレ ートが提供済み起動時にパラメータを渡せる  例えばDBのエンドポイントをEC2に渡せる
  • 7. 利用料金CloudFormationの利用自体は無料テンプレートに従って構築された各AWSサービスに対して課金
  • 8. スタック
  • 9. スタックリソース(EC2インスタンスやS3バケット、RDSインスタンスなど)の集合のことスタック単位でリソースの管理が可能。スタック破棄を実行すると、スタックにひもづくリソースを破棄することが可能使用するリソースおよびリソースの構築順は、テンプレートの依存関係で決定 スタック これらを一度に生成・破棄可能 App Web Server Server
  • 10. スタック可能なリソース これらをスタックに組み込み、設定を行えるAmazon EC2 Instances Amazon Simple Storage Service (S3) BucketsAmazon Elastic Block Store (EBS) Volumes Amazon Simple DB DomainsElastic Load Balancers Amazon Simple Queue Service (SQS) QueuesElastic IP Addresses Amazon Simple Notification Service (SNS) TopicsAmazon EC2 Security Groups Amazon SNS SubscriptionsAuto Scaling Groups Amazon Route 53 DNS RecordsAmazon Relational Database Service (RDS) Amazon CloudFront DistributionsInstances AWS Identity and Access Management users andAmazon RDS Security Groups groupsAWS Elastic Beanstalk AWS Identify and Access Management policiesAmazon CloudWatch Alarms New!! Amazon Virtual Private CloudNew!! Amazon ElastiCache
  • 11. スタック構築方法AWS ManagementConsoleから構築コマンドラインツール  http://aws.amazon.com/developertools/AWS- CloudFormation/2555753788650372Java・.Net・PHPの各種SDK  Java : http://aws.amazon.com/jp/sdkforjava/  .NET : http://aws.amazon.com/jp/sdkfornet/  PHP : http://aws.amazon.com/jp/sdkforphp/
  • 12. AWS ManagementConsoleから構築-1 スタックの名称 ・サンプルテンプレート ・ローカルファイルの いずれか テンプレート ・テンプレートファイルURL (同一リージョンのS3上)
  • 13. AWS ManagementConsoleから構築-2 各種パラメータの入力 (後で説明)
  • 14. AWS ManagementConsoleから構築-3 スタック構築開始
  • 15. AWS ManagementConsoleから構築-4 スタック構築実行中
  • 16. AWS ManagementConsoleから構築-5 スタック構築完了 この時点ですべてのサービスが 起動している
  • 17. テンプレート
  • 18. { "AWSTemplateFormatVersion" : "2010-09-09",テンプレート "Description" : “Sample", "Parameters" : { "KeyName" : { "Description" : “Sample key, "Type" : "String" } }, "Mappings" : { }, "Resources" : {CloudFormationの心臓部 "Ec2Instance" : { "Type" : "AWS::EC2::Instance", "Properties" : {スタック構築の設計図 "SecurityGroups" : [ { "Ref" : "InstanceSecurityGroup" } ], "KeyName" : { "Ref" : "KeyName" },JSONフォーマットで記述 "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" }] } } } }
  • 19. テンプレート解説 テンプレートのバージョン{ (最新は2010-09-09) "AWSTemplateFormatVersion" : “2010-09-09", "Description" : "Valid JSON strings up to 4K", テンプレートの詳細(説明文) "Parameters" : { set of parameters CloudFormation実行時に }, 後で変更可能なパラメータを列挙 (例:DBユーザー名など) "Mappings" : { set of mappings }, Hashtableのようなもの キーに応じて値を特定出来る "Resources" : { (例:リージョンに応じたAMI番号など) set of resources }, EC2やRDSなど、スタックを構成する "Outputs" : { リソースを定義 set of outputs }} スタック構築後に取得したい値 (例:アクセスURLなど)
  • 20. Parameters{ "AWSTemplateFormatVersion" : “2010-09-09", "Description" : "Valid JSON strings up to 4K", "Parameters" : { set of parameters CloudFormation実行時に }, 後で変更可能なパラメータを列挙 (例:DBユーザー名など) "Mappings" : { set of mappings }, "Resources" : { set of resources }, "Outputs" : { set of outputs }}
  • 21. Parametersとは スタック構築時に値の入力が可能 データ型、デフォルト値、最小最大値など設定可能"Parameters" : { "Age":{ "Type":"Number", “Default” : “30”, “MinValue”: “20”, “MaxValue”: “60”, "Description":"input your age.“ }, "FirstName":{ "Type":"String", "Description":"input your first name.“ },}
  • 22. Parametersのプロパティ 利用出来るプロパティプロパティ 内容Type データ型 “String” “Number” “CommaDelimitedList”Default デフォルト値NoEcho 入力時に*****となる(パスワードなどに使用)AllowedValues 入力可能値の一覧指定 (例:[“true”,”false”] )AllowedPattern 正規表現で入力可能パターンを指定(例:[a-zA-Z]*)MaxLength 最大文字数MaxValue 最大値MinValue 最小値Description プロパティの詳細説明ConstraintDescription 入力した値がAllowedPatternやMaxLengthなどの制約 に引っかかった時に表示する説明 (どのような制約があるかの説明を記述)
  • 23. Parametersの参照 入力したパラメータ値は、テンプレート中で “Ref”を使用し て参照可能 ユーザー名、パスワード、ドメインなどの可変部分に便利 ここにパラメータ入力値が反映される “Resources" : { “MyServer":{ “Type":“AWS::EC2::Instance", “Properties” : { “KeyName”: { “Ref” : “Age”}, “Tags” : { “Ref” : “FirstName”} } } }
  • 24. Function Ref  パラメータを参照する Fn::Base64  文字列をBase64エンコードする Fn::FindInMap  Mapから値を取り出す Fn::GetAtt  リソースから属性を取り出す  例:"Fn::GetAtt" : [ "MyELB" , "DNSName"] Fn:GetAZs  指定リージョンのアベイラビリティゾーンを返す Fn:Join  文字列の連結  “Fn::Join” : [ “:”, [ “a”, “b”, “c” ] ] は 「a:b:c」を返す  “:”がセパレータ。不要な場合は ”” を定義http://docs.amazonwebservices.com/AWSCloudFormation/latest/UserGuide/index.html?intrinsic-function-reference.html
  • 25. Pseudo Parameter 実行リージョンやスタック名といったパラメータを取得出来る予約語 AWS::Region  スタック構築対象のリージョンを取得する  { “Ref” : “AWS::Region” } で値を取得可能 AWS::StackName  スタックの名前を取得する  { “Ref” : “AWS::StackName” } で値を取得可能 “Resources" : { “MyServer":{ “Type":“AWS::EC2::Instance", “Properties” : { “KeyName”: { “Ref” : “AWS::StackName”}, “Tags” : { “Ref” : “AWS::Region”} } } }http://docs.amazonwebservices.com/AWSCloudFormation/latest/UserGuide/index.html?pseudo-parameter-reference.html
  • 26. Mappings{ "AWSTemplateFormatVersion" : “2010-09-09", "Description" : "Valid JSON strings up to 4K", "Parameters" : { set of parameters }, "Mappings" : { set of mappings }, Hashtableのようなもの キーに応じて値を特定出来る "Resources" : { (例:リージョンに応じたAMI番号など) set of resources }, "Outputs" : { set of outputs }}
  • 27. Mappingsとは キーとバリューのテーブル 例えば、入力値やリージョンによって値が変わるようなもの を決めるような使い方"Mappings" : { "RegionTable" : { "us-east-1" : { マッピングを定義 "AMI" : "ami-8c1fece5“, (この例の場合、”RegionTable”という “Key” : “myKey-east” マッピングを定義) }, "us-west-1" : { "AMI" : "ami-3bc9997e“, “Fn::FindInTemplate” “Key” : “myKey-west” }, "ap-northeast-1" : { "AMI" : "ami-300ca731“, “Key” : “myKey-japan” } } },
  • 28. Mappingsの使い方 “Fn:FindInMap”で値を取得 "Fn::FindInMap" : [ "MapName", "Key", "Value"] MapName,key,Valueには”Ref”が利用可能"Mappings" : { "RegionTable" : { "us-east-1" : { “Resources" : { "AMI" : "ami-8c1fece5“, “MyServer":{ “Key” : “myKey-east” “Type":“AWS::EC2::Instance", }, “Properties” : { "us-west-1" : { “ImageId”: { “Fn::FindInTemplate” "AMI" : "ami-3bc9997e“, “Fn:FindInMap” : [ “Key” : “myKey-west” “RegionTable” , }, { “Ref” : “region” }, "ap-northeast-1" : { “AMI”] "AMI" : "ami-300ca731“, }, “Key” : “myKey-japan” } } } } } この例だと、入力された }, regionパラメータによって 利用するAMIのIDを決定できる
  • 29. Resources{ "AWSTemplateFormatVersion" : “2010-09-09", "Description" : "Valid JSON strings up to 4K", "Parameters" : { set of parameters }, "Mappings" : { set of mappings }, "Resources" : { set of resources }, EC2やRDSなど、スタックを構成する "Outputs" : { リソースを定義 set of outputs }}
  • 30. Resourcesとは EC2やELB,RDSなど、起動するサービスを設定 リソース毎に決められたパラメータを設定する“Resources" : { “MyWebServer" : { “Type" : “AWS:EC2::Instance” “Properties" : { “KeyName" : "ami-8c1fece5“, “ImageId” : “myKey-east” }, "us-west-1" : { "AMI" : "ami-3bc9997e“, “Key” : “myKey-west” }, "ap-northeast-1" : { "AMI" : "ami-300ca731“, “Key” : “myKey-japan” } } },
  • 31. EC2+SecurityGroupの例"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" }] } } }
  • 32. リソースタイプAuto Scaling AutoScalingGroup AWS::AutoScaling::AutoScalingGroup Auto Scaling AutoScalingGroup AWS::AutoScaling::AutoScalingGroupIAM Access Key AWS::IAM::AccessKey Auto Scaling LaunchConfiguration AWS::AutoScaling::LaunchConfigurationIAM Group AWS::IAM::Group Auto Scaling Policy AWS::AutoScaling::ScalingPolicyIAM Policy AWS::IAM::Policy Auto Scaling Trigger AWS::AutoScaling::TriggerIAM Add User to Group UserToGroupAddition Amazon CloudFormation Stack AWS::CloudFormation::StackIAM User AWS::IAM::User Amazon CloudFormation WaitCondition AWS::CloudFormation::WaitCondition Amazon CloudFormationElastic Load Balancing LoadBalancer AWS::ElasticLoadBalancing::LoadBalancer AWS::CloudFormation::WaitConditionHandle WaitConditionHandleAmazon RDS DBInstance AWS::RDS::DBInstance Amazon CloudFront Distribution AWS::CloudFront::DistributionAmazon RDS DBSecurityGroup AWS::RDS::DBSecurityGroup Amazon CloudWatch AWS::CloudWatch::AlarmAmazon Route 53 Resource Record Set AWS::Route53::RecordSet Amazon EBS Volume AWS::EC2::VolumeAmazon Route 53 Resource Record Set Amazon EBS Volume Attachment AWS::EC2::VolumeAttachment AWS::Route53::RecordSetGroupGroup Amazon EC2 Elastic IP Address AWS::EC2::EIPAmazon S3 Bucket AWS::S3::Bucket Amazon EC2 Elastic IP Address AWS::EC2::EIPAssociationAmazon S3 Bucket Policy AWS::S3::BucketPolicy Association Amazon EC2 Instance AWS::EC2::InstanceAmazon SimpleDB Domain AWS::SDB::Domain Amazon EC2 Security Group AWS::EC2::SecurityGroupSNS Topic Policy AWS::SNS::TopicPolicy Amazon EC2 Security Group Ingress AWS::EC2::SecurityGroupIngressAmazon SNS Subscription AWS::SNS::Subscription Amazon SQS Queue Policy AWS::SQS::QueuePolicyAmazon SNS Topic AWS::SNS::Topic Amazon SQS Queue AWS::SQS::Queue http://docs.amazonwebservices.com/AWSCloudFormation/latest/UserGuide/index.h tml?aws-template-resource-type-ref.html
  • 33. Outputs{ "AWSTemplateFormatVersion" : “2010-09-09", "Description" : "Valid JSON strings up to 4K", "Parameters" : { set of parameters }, "Mappings" : { set of mappings }, "Resources" : { set of resources }, "Outputs" : { set of outputs }} スタック構築後に取得したい値 (例:アクセスURLなど)
  • 34. Outputsとは スタック構築後に取得・表示したい情報の定義 例えばアクセスURLや、DBの通信先情報、作ったIAMユーザ ー名など、あとで使用するもの マネジメントコンソールから確認できるので、スタックに関 する情報を出力すると便利(キーペア名、AZ、インスタン スIDなど)
  • 35. Outputの定義 出力したい名称を定義"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" : { "Description" : "URL of running web application", "Value" : { "Fn::Join": ["", [ "http://", { "Fn::GetAtt": [ "Ec2Instance" , "PublicIp"] } , "/index.html"] ] } } } Functionを使って文字列を 加工
  • 36. Outputの定義"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" : { "Description" : "URL of running web application", "Value" : { "Fn::Join": ["", [ "http://", { "Fn::GetAtt": [ "Ec2Instance" , "PublicIp"] } , "/index.html"] ] } } }
  • 37. テンプレートのまとめParameters,Mappings,Resources,Outputsの4つのブロックに定義を記述可変項目はパラメーター化したり、Mappingで定義Functionsを使用して、参照や文字連結などの操作が可能Resourceのパラメータはリソースタイプにより異なる。ドキュメントを利用して定義  http://docs.amazonwebservices.com/AWSCloudFormatio n/latest/UserGuide/index.html?aws-template-resource- type-ref.html
  • 38. テンプレートTips リソース定義にEC2インスタンスが必須ではない  DB構築だけ、オートスケールだけ、アラーム設定だけでもOK 参照関係があると、依存関係があるとみなされる。相互参照 や循環参照はNG(エラーとなる) 参照関係がある部分は、参照の整合性が取れるよう起動順を CloudFormationが決定 スタックを破棄すると、スタックにひもづくリソースは破棄 される  ただし”DeletionPolicy”を”Retain”にすると破棄されない "Resources" : { "myS3Bucket" : { "Type" : "AWS::S3::Bucket", "DeletionPolicy" : "Retain" } }
  • 39. テンプレートTips リソース数が多いと、何のリソースか分からなくなるので、 Tagsプロパティを使用する "MyInstance" : { "Type" : "AWS::EC2::Instance", "Properties" : { "SecurityGroups" : [ { "Ref" : "MySecurityGroup" } ], "ImageId" : "ami-20b65349", "Tags" : [ { "Key" : “Name", "Value" : “MyInstance" } ] } }
  • 40. テンプレートTips CloudFormationで作られたリソースには、スタック名など のタグが付与される
  • 41. テンプレートTips テンプレートのコスト試算が可能
  • 42. Cloud-init
  • 43. Cloud-init AmazonLinuxに入っている、初期設定ツール  元々はUbuntuで作られたもの EC2インスタンスの起動時に、「userdata」として設定した スクリプトを呼び出す。  「#!」 で始まる文字列の場合のみ、スクリプトを実行 スクリプトを記述できるので、ロケール変更、アプリインス トール、ファイル書き換えなどが可能
  • 44. Cloud-init EC2インスタンス起動 User Dataに定義 Cloud-initがuserdataを 読み込む 読み込んだスクリプト を実行
  • 45. Cloud-initの利点と欠点 利点 インスタンス起動時に、インスタンスの初期化が可能  AMIとユーザーデータは分離できるので、AMIの作り込みが不要 になる  Apacheインストール済みのAMIを用意すると、OSやApacheの バージョンが上がったときに再作成になる 欠点 userdataは一度定義すると、書き換えは不可能  書き換えて再実行が出来ない(後述のスタック更新に使えない) 設定できるデータ量は、16KByteまで
  • 46. CloudFormationとの連携 EC2リソースのプロパティ「UserData」に内容を記載"MyInstance": { "Type": "AWS::EC2::Instance", "Properties": { "ImageId" : "ami-dcfa4edd", "KeyName" : { "Ref" : "KeyName" }, "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [ "#!/bin/bashn", "log=/tmp/init.logn", "apt-get update &>> $logn", "apt-get install -y ruby &>> $logn", "cd /tmpn", "wget http://rubygems.org/rubygems.tgz &>> $logn", "tar zxf rubygems.tgz &>> $logn", "cd rubygemsn", "ruby setup.rb --no-format-executable &>> $logn", ]] } } }
  • 47. 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/bashn", "cd /home/ec2-usern", { "Fn::Join" : ["", [ "echo ", {"Fn::GetAtt" : ["DBInstance", "Endpoint.Address"]} , "> db.confn" ]]} ]]} } } }, "DBInstance" : { "Type": "AWS::RDS::DBInstance", } }
  • 48. CloudFormation helpers
  • 49. CloudFormation helpers EC2インスタンス初期化時のヘルパースクリプト群 AmazonLinux正式版(2011.09)以降に搭載 /opt/aws/bin に格納  cfn-init  cfn-get-metadata  cfn-signal  cfn-hup Python製
  • 50. cfn-init パッケージやファイルのダウンロード、ファイルの生成を行 うスクリプト 実行のための設定は、Metadata領域に定義  sources,packages,files,services "Resources": { "MyInstance": { "Type": "AWS::EC2::Instance", "Metadata" : { "AWS::CloudFormation::Init" : { "config" : { source,package,files,servicesの "sources" : { : }, "packages" : { : } 順に実行される "files" : { : } "services" : { : } } } }, "Properties": { : } }
  • 51. cfn-initの設定 sources  指定したURLからファイルをダウンロードして展開  Tar,zip,tar+gzip,tar+bz2 "sources" : { "/etc/myapp" : "https://s3.amazonaws.com/mybucket/myapp.tar.gz" } packages  パッケージシステムを使用してアプリをインストール  Apt,yum,rubygems,python,rpm "packages" : { 最新版 "yum" : { "httpd" : [], "php" : [], バージョン }, 指定 "rubygems" : { "chef" : [ "0.10.2" ], } }
  • 52. 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" } S3などから取得 "/etc/myapp/myapp-init.pp" : { "source" : "https://s3.amazonaws.com/myapp/myapp-init.pp", "mode" : "100644", "owner" : "root", "group" : "wheel" } }
  • 53. cfn-initの設定 services  サービスの起動・再起動の指定  現在sysvinitのみ "services" : { OS起動時に起動さ "sysvinit" : { せるかどうか "nginx" : { "enabled" : "true", cfn-init終了後に起動するかどうか "ensureRunning" : "true", "files" : ["/etc/nginx/nginx.conf"], "sources" : ["/var/www/html"] 設定ファイルもしくは指定ディ }, "php-fastcgi" : { レクトリのファイルが変わって "enabled" : "true", いた場合にサービス再起動する "ensureRunning" : "true", "packages" : { "yum" : ["php", "spawn-fcgi"] } } } Cfg-initでパッケージを入れてい たらサービス再起動
  • 54. cfn-initの起動 cfn-initはデフォルトでは動作しない User-dataにcfn-initを起動するスクリプトを記述して、 cloud-init経由で起動 引数にスタック名、リソース名、リージョン、アクセスキー 、シークレットキーを指定 "Properties": { "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [ "#!/bin/bashn", "/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", ]]}} }
  • 55. 初期化シーケンス EC2インスタンス起動 cfn-init内で、meta-dataの読み込み Init.dに登録してある cloud-initが実行される Meta-dataの設定に従い、 Sources(ファイルダウンロード) User-data領域から、 Packages(インストール) スクリプトを読み込み Files(設定作成) Services(サービス) を実行 スクリプト内で、 cfn-initを呼び出し 起動完了
  • 56. https://s3.amazonaws.com/cloudformation-templates-Chef(solo)との連携例 us-east-1/wordpress-via-chef-solo.template が分かりやすい例 EC2インスタンス起動 cfn-init内で、meta-dataの読み込み Init.dに登録してある cloud-initが実行される Meta-dataの設定に従い、 User-data領域から、 Sources(レシピファイルダウンロード) スクリプトを読み込み Packages(rubygemでchefインストール) Files(レシピの一部書き換え) スクリプト内で、 を実行 cfn-initを呼び出し スクリプト内で、 Chefを実行 ダウンロードしたレシピを元に、 chefがサーバ構築 起動完了
  • 57. その他スクリプトcfn-get-metadata  Metadataを簡単に取得出来るスクリプトcfn-signal  リソース「WaitCondition」と共に使用  cfn-signalを使用して、スタックに対して初期化状態の通知を することが出来る  アプリのインストールが失敗した場合にスタックを破棄したり できるcfn-hup  スタックを更新(StackUpdateAPIを使用)した場合に、それ を感知して指定のファイルを実行するフックスクリプト https://s3.amazonaws.com/cloudformation- examples/BoostrappingApplicationsWithAWSCloudFormation.pdf
  • 58. CloudFormer
  • 59. CloudFormer 既に構築済みのシステム構成から、テンプレートを作成する ツール テンプレート作成のベースとなるテンプレートを構築するの に利用可能 ベータ版 テンプレート CloudFormer EC2 EC2 AutoScaling
  • 60. CloudFormer実行方法 https://forums.aws.amazon.com/ann.jspa?annID=10 48 でテンプレートを入手 テンプレートからスタックを構築(リージョンは問わず) 構築後、Outputsに表示されているURLにアクセス
  • 61. CloudFormer実行方法 テンプレート化したいリージョンを選ぶと、ウィザード形式 でリソースの選択が可能 チェックボックスを入れたリソースを元にテンプレートが完 成
  • 62. その他Tips
  • 63. 入れ子テンプレート テンプレートからテンプレートの呼び出しが可能 リソースタイプに “AWS::CloudFormation::Stack“を指定 TemplateURLを指定すると、そのテンプレートを読み込み"Resources" : { "WebServer" : { "Type" : "AWS::CloudFormation::Stack", "Properties" : { "TemplateURL" : “https://s3.amazonaws.com/hoge.template" ]]}, "Parameters" : { "KeyName" : { "Ref" : "KeyName" }, "InstanceType" : { "Ref" : "InstanceType"}, } },
  • 64. Baked AMI VS CF-Init AMIの作り込み VS Cloud-init+CloudFormation helpers 用途によって、AMI作り込み、cloud-init、helperを使い分 ける事が重要 利点 欠点AMI作り込み ・構築が容易 ・ベースAMI/ミドルウェア ・起動が速い 更新時に再インストールが必要 (オートスケールに有効) ・リージョン毎の構築が必要ベースAMI+ ・ベースAMI/ミドルウェア更新時 ・テンプレート構築が手間Cloud-init+CFN に追従が可能 ・OS初期化に時間がかかるhelpers ・DBのエンドポイントなどの 定義が渡せる
  • 65. IAM Capability CloudFormationでIAMユーザーを作成する場合、ウィザー ド途中でチェックボックスをonにする必要がある  cfn-create-stackおよびcfn-update-stackの場合は、 「--capalilities CAPABILITY_IAM」をコマンドに付与
  • 66. まとめ
  • 67. まとめCloudFormationを使用すると、システム構成をテンプレート化できるAmazonLinuxにはOS初期化のための仕組みが用意されているcloud-initとcfnヘルパー、またchefなどをCloudFormationと組み合わせると、アプリケーションのセットアップも柔軟に可能システム構築の発想を変えてみる  OSは素材  テンプレート化で、よりクラウドの特性を生かしたシステム構 築が可能に!
  • 68. CloudFormationで真のクラウドマイスターを目指せ! App Web Server Server
  • 69. 参考URLCloud Formation Samples  http://aws.amazon.com/jp/cloudformation/aws- cloudformation-templates/BootstrappingApplicationsWithAWSCloudFormation  https://s3.amazonaws.com/cloudformation- examples/BoostrappingApplicationsWithAWSCloudForma tion.pdfIntegrating CloudFormation with Chef  https://s3.amazonaws.com/cloudformation- examples/IntegratingAWSCloudFormationWithOpscodeC hef.pdfCloudFormer  https://forums.aws.amazon.com/ann.jspa?annID=1048