Your SlideShare is downloading. ×
0
AWSマイスターシリーズ~CloudFormation~               2011年11月01日               片山 暁雄( @c9katayama )               ソリューションアーキテクト
ほぼ週刊AWSマイスターシリーズへようこそ!~GoToMeetingの使い方~ 参加者は、自動的にミュートになっています 質問を投げることができます!  GoToMeetingの仕組みを使って、随時書き込んでください    ただし環境によっ...
プレゼント本日一番良い質問を頂いた方に、        AWS特製紙コップ     (JAWS-UGコラボモデル)            1年分をプレゼントします!
Webセミナーほぼ週刊AWSマイスターシリーズ(全10回)    10/19   第4回 IAM & Consolidated Billing    10/26   第5回 ELB, AutoScaling & CloudWatch   ...
Agenda CloudFormationの概要 スタック テンプレート Cloud-init CloudFormation helpers CloudFormer その他Tips まとめ               Copyright © 2...
CloudFormationの概要
CloudFormation EC2やELBなどを使ったAWSサービスのシステム構築を、設 定ファイル(テンプレート)を元に行えるサービス テンプレートを自由に作成できるため、自分好みのシステム 構成が可能 テンプレートは、AWSのサービスを操...
CloudFormation                                     テンプレートに基づき                                      各サービスが起動               ...
利用シーンと利点一度テンプレートを作成すれば、同じ構成を再現できる  開発環境の構築  Blogシステム、Webシステム、ゲームプラットフォームなど、   同じ仕組みでアプリやデータが異なるようなものベストプラクティスが盛り込まれたテンプレ...
利用料金CloudFormationの利用自体は無料テンプレートに従って構築された各AWSサービスに対して課金
スタック
スタックリソース(EC2インスタンスやS3バケット、RDSインスタンスなど)の集合のことスタック単位でリソースの管理が可能。スタック破棄を実行すると、スタックにひもづくリソースを破棄することが可能使用するリソースおよびリソースの構築順は、テンプ...
スタック可能なリソース    これらをスタックに組み込み、設定を行えるAmazon EC2 Instances                       Amazon Simple Storage Service (S3) BucketsAm...
スタック構築方法AWS ManagementConsoleから構築コマンドラインツール  http://aws.amazon.com/developertools/AWS-   CloudFormation/2555753788650372J...
AWS ManagementConsoleから構築-1                 スタックの名称              ・サンプルテンプレート               ・ローカルファイルの                     ...
AWS ManagementConsoleから構築-2                  各種パラメータの入力                  (後で説明)
AWS ManagementConsoleから構築-3                 スタック構築開始
AWS ManagementConsoleから構築-4                  スタック構築実行中
AWS ManagementConsoleから構築-5                  スタック構築完了                  この時点ですべてのサービスが                  起動している
テンプレート
{                         "AWSTemplateFormatVersion" : "2010-09-09",テンプレート                   "Description" : “Sample",    ...
テンプレート解説                                                         テンプレートのバージョン{                                            ...
Parameters{    "AWSTemplateFormatVersion" : “2010-09-09",    "Description" : "Valid JSON strings up to 4K",    "Parameters...
Parametersとは   スタック構築時に値の入力が可能   データ型、デフォルト値、最小最大値など設定可能"Parameters" : {  "Age":{     "Type":"Number",     “Default” : “30...
Parametersのプロパティ  利用出来るプロパティプロパティ                   内容Type                    データ型 “String” “Number” “CommaDelimitedList”D...
Parametersの参照 入力したパラメータ値は、テンプレート中で “Ref”を使用し て参照可能 ユーザー名、パスワード、ドメインなどの可変部分に便利                          ここにパラメータ入力値が反映される  ...
Function    Ref      パラメータを参照する    Fn::Base64      文字列をBase64エンコードする    Fn::FindInMap      Mapから値を取り出す    Fn::GetAtt   ...
Pseudo Parameter    実行リージョンやスタック名といったパラメータを取得出来る予約語    AWS::Region      スタック構築対象のリージョンを取得する      { “Ref” : “AWS::Region”...
Mappings{    "AWSTemplateFormatVersion" : “2010-09-09",    "Description" : "Valid JSON strings up to 4K",    "Parameters" ...
Mappingsとは     キーとバリューのテーブル     例えば、入力値やリージョンによって値が変わるようなもの     を決めるような使い方"Mappings" : {   "RegionTable" : {     "us-east-...
Mappingsの使い方     “Fn:FindInMap”で値を取得     "Fn::FindInMap" : [ "MapName", "Key", "Value"]     MapName,key,Valueには”Ref”が利用可能"...
Resources{    "AWSTemplateFormatVersion" : “2010-09-09",    "Description" : "Valid JSON strings up to 4K",    "Parameters"...
Resourcesとは     EC2やELB,RDSなど、起動するサービスを設定     リソース毎に決められたパラメータを設定する“Resources" : {   “MyWebServer" : {     “Type" : “AWS:E...
EC2+SecurityGroupの例"Resources" : {   "Ec2Instance" : {                                  リソースタイプ     "Type" : "AWS::EC2::In...
リソースタイプAuto Scaling AutoScalingGroup         AWS::AutoScaling::AutoScalingGroup        Auto Scaling AutoScalingGroup      ...
Outputs{    "AWSTemplateFormatVersion" : “2010-09-09",    "Description" : "Valid JSON strings up to 4K",    "Parameters" :...
Outputsとは スタック構築後に取得・表示したい情報の定義 例えばアクセスURLや、DBの通信先情報、作ったIAMユーザ ー名など、あとで使用するもの マネジメントコンソールから確認できるので、スタックに関 する情報を出力すると便利(キーペ...
Outputの定義                                     出力したい名称を定義"Outputs" : {"InstanceId" : {     "Description" : "InstanceId of t...
Outputの定義"Outputs" : {  "InstanceId" : {     "Description" : "InstanceId of the newly created EC2 instance",     "Value" :...
テンプレートのまとめParameters,Mappings,Resources,Outputsの4つのブロックに定義を記述可変項目はパラメーター化したり、Mappingで定義Functionsを使用して、参照や文字連結などの操作が可能Resou...
テンプレートTips リソース定義にEC2インスタンスが必須ではない  DB構築だけ、オートスケールだけ、アラーム設定だけでもOK 参照関係があると、依存関係があるとみなされる。相互参照 や循環参照はNG(エラーとなる) 参照関係がある部分は...
テンプレートTips リソース数が多いと、何のリソースか分からなくなるので、 Tagsプロパティを使用する "MyInstance" : {   "Type" : "AWS::EC2::Instance",   "Properties" : {...
テンプレートTips CloudFormationで作られたリソースには、スタック名など のタグが付与される
Cloud-init
Cloud-init AmazonLinuxに入っている、初期設定ツール   元々はUbuntuで作られたもの EC2インスタンスの起動時に、「userdata」として設定した スクリプトを呼び出す。   「#!」 で始まる文字列の場合のみ...
Cloud-init                    EC2インスタンス起動     User Dataに定義                    Cloud-initがuserdataを                        ...
Cloud-initの利点と欠点 利点 インスタンス起動時に、インスタンスの初期化が可能  AMIとユーザーデータは分離できるので、AMIの作り込みが不要   になる  Apacheインストール済みのAMIを用意すると、OSやApacheの...
CloudFormationとの連携 EC2リソースのプロパティ「UserData」に内容を記載"MyInstance": {   "Type": "AWS::EC2::Instance",   "Properties": {     "Ima...
CloudFormationとの連携 CloudFormationでUserDataを定義すると、定義中にRefや Fn::GetAttrを使用することが可能 例えばRDSのEndPointをUserDataに埋め込むといったこと が出来る"R...
CloudFormation helpers
CloudFormation helpers EC2インスタンス初期化時のヘルパースクリプト群 AmazonLinux正式版(2011.09)以降に搭載 /opt/aws/bin に格納     cfn-init     cfn-get-m...
cfn-init  パッケージやファイルのダウンロード、ファイルの生成を行  うスクリプト  実行のための設定は、Metadata領域に定義    sources,packages,files,services  "Resources": {...
cfn-initの設定 sources   指定したURLからファイルをダウンロードして展開   Tar,zip,tar+gzip,tar+bz2  "sources" : {    "/etc/myapp" : "https://s3.a...
cfn-initの設定 files   指定パスへのファイルの生成   "files" : {                                         ファイルパス        "/app/db.conf" : { ...
cfn-initの設定 services   サービスの起動・再起動の指定   現在sysvinitのみ  "services" : {                         OS起動時に起動さ   "sysvinit" : { ...
cfn-initの起動 cfn-initはデフォルトでは動作しない User-dataにcfn-initを起動するスクリプトを記述して、 cloud-init経由で起動 引数にスタック名、リソース名、リージョン、アクセスキー 、シークレットキー...
初期化シーケンス EC2インスタンス起動                    cfn-init内で、meta-dataの読み込み  Init.dに登録してある cloud-initが実行される                       Me...
https://s3.amazonaws.com/cloudformation-templates-Chef(solo)との連携例      us-east-1/wordpress-via-chef-solo.template         ...
その他スクリプト cfn-get-metadata   Metadataを簡単に取得出来るスクリプト cfn-signal   リソース「WaitCondition」と共に使用   cfn-signalを使用して、スタックに対して初期化状...
CloudFormer
CloudFormer 既に構築済みのシステム構成から、テンプレートを作成する ツール テンプレート作成のベースとなるテンプレートを構築するの に利用可能 ベータ版                                 テンプレート ...
CloudFormer実行方法 https://forums.aws.amazon.com/ann.jspa?annID=10 48 でテンプレートを入手 テンプレートからスタックを構築(リージョンは問わず) 構築後、Outputsに表示されて...
CloudFormer実行方法 テンプレート化したいリージョンを選ぶと、ウィザード形式 でリソースの選択が可能 チェックボックスを入れたリソースを元にテンプレートが完 成
その他Tips
入れ子テンプレート テンプレートからテンプレートの呼び出しが可能 リソースタイプに “AWS::CloudFormation::Stack“を指定 TemplateURLを指定すると、そのテンプレートを読み込み"Resources" : {  ...
Baked AMI VS CF-Init    AMIの作り込み VS Cloud-init+CloudFormation helpers    用途によって、AMI作り込み、cloud-init、helperを使い分    ける事が重要   ...
IAM Capability CloudFormationでIAMユーザーを作成する場合、ウィザー ド途中でチェックボックスをonにする必要がある   cfn-create-stackおよびcfn-update-stackの場合は、     ...
まとめ
まとめCloudFormationを使用すると、システム構成をテンプレート化できるAmazonLinuxにはOS初期化のための仕組みが用意されているcloud-initとcfnヘルパー、またchefなどをCloudFormationと組み合わせ...
CloudFormationで真のクラウドマイスターを目指せ!          App      Web         Server   Server
参考URLCloud Formation Samples  http://aws.amazon.com/jp/cloudformation/aws-   cloudformation-templates/BootstrappingApplic...
Q&ACopyright © 2011 Amazon Web Services
次回のほぼ週刊AWSマイスターシリーズは、       11月9日 17:00~~ Virtual Private Cloud (VPC) ~          Copyright © 2011 Amazon Web Services
ご参加ありがとう ございました Copyright © 2011 Amazon Web Services
Upcoming SlideShare
Loading in...5
×

CloudFormation 詳細 -ほぼ週刊AWSマイスターシリーズ第6回-

15,707

Published on

ほぼ週刊AWSマイスターシリーズでは、毎週テーマを決めて、各サービスの詳細情報を解説します。

Published in: Technology

Transcript of "CloudFormation 詳細 -ほぼ週刊AWSマイスターシリーズ第6回- "

  1. 1. AWSマイスターシリーズ~CloudFormation~ 2011年11月01日 片山 暁雄( @c9katayama ) ソリューションアーキテクト
  2. 2. ほぼ週刊AWSマイスターシリーズへようこそ!~GoToMeetingの使い方~ 参加者は、自動的にミュートになっています 質問を投げることができます!  GoToMeetingの仕組みを使って、随時書き込んでください  ただし環境によっては、日本語の直接入力ができないので、 お手数ですが、テキストエディタ等に打ち込んでから、 貼り付けててください  最後のQ&Aの時間で、できるだけ回答させて頂きます  書き込んだ質問は、主催者にしか見えません Twitterのハッシュタグは#jawsugでどうぞ Copyright © 2011 Amazon Web Services
  3. 3. プレゼント本日一番良い質問を頂いた方に、 AWS特製紙コップ (JAWS-UGコラボモデル) 1年分をプレゼントします!
  4. 4. Webセミナーほぼ週刊AWSマイスターシリーズ(全10回)  10/19 第4回 IAM & Consolidated Billing  10/26 第5回 ELB, AutoScaling & CloudWatch  11/1 第6回 CloudFormation  11/9 第7回 VPC  11/16 第8回 RDS  11/22 第9回 EMR  11/30 第10回 SES申し込みサイト http://aws.amazon.com/jp/event_schedule/
  5. 5. Agenda CloudFormationの概要 スタック テンプレート Cloud-init CloudFormation helpers CloudFormer その他Tips まとめ Copyright © 2011 Amazon Web Services
  6. 6. CloudFormationの概要
  7. 7. CloudFormation EC2やELBなどを使ったAWSサービスのシステム構築を、設 定ファイル(テンプレート)を元に行えるサービス テンプレートを自由に作成できるため、自分好みのシステム 構成が可能 テンプレートは、AWSのサービスを操るための新しい言語
  8. 8. CloudFormation テンプレートに基づき 各サービスが起動 スタック ElasticLoadBalanceingテンプレート S3 Cloud Formation SNS EC2 EC2 AutoScaling CloudWatch
  9. 9. 利用シーンと利点一度テンプレートを作成すれば、同じ構成を再現できる  開発環境の構築  Blogシステム、Webシステム、ゲームプラットフォームなど、 同じ仕組みでアプリやデータが異なるようなものベストプラクティスが盛り込まれたテンプレートが使用可能  システムアーキテクチャの再利用  WordPress,Redmineなどが入った、多くのサンプルテンプレ ートが提供済み起動時にパラメータを渡せる  例えばDBのエンドポイントをEC2に渡せる
  10. 10. 利用料金CloudFormationの利用自体は無料テンプレートに従って構築された各AWSサービスに対して課金
  11. 11. スタック
  12. 12. スタックリソース(EC2インスタンスやS3バケット、RDSインスタンスなど)の集合のことスタック単位でリソースの管理が可能。スタック破棄を実行すると、スタックにひもづくリソースを破棄することが可能使用するリソースおよびリソースの構築順は、テンプレートの依存関係で決定 スタック これらを一度に生成・破棄可能 App Web Server Server
  13. 13. スタック可能なリソース これらをスタックに組み込み、設定を行える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
  14. 14. スタック構築方法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/
  15. 15. AWS ManagementConsoleから構築-1 スタックの名称 ・サンプルテンプレート ・ローカルファイルの いずれか テンプレート ・テンプレートファイルURL (同一リージョンのS3上)
  16. 16. AWS ManagementConsoleから構築-2 各種パラメータの入力 (後で説明)
  17. 17. AWS ManagementConsoleから構築-3 スタック構築開始
  18. 18. AWS ManagementConsoleから構築-4 スタック構築実行中
  19. 19. AWS ManagementConsoleから構築-5 スタック構築完了 この時点ですべてのサービスが 起動している
  20. 20. テンプレート
  21. 21. { "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" }] } } } }
  22. 22. テンプレート解説 テンプレートのバージョン{ (最新は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など)
  23. 23. 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 }}
  24. 24. Parametersとは スタック構築時に値の入力が可能 データ型、デフォルト値、最小最大値など設定可能"Parameters" : { "Age":{ "Type":"Number", “Default” : “30”, “MinValue”: “20”, “MaxValue”: “60”, "Description":"input your age.“ }, "FirstName":{ "Type":"String", "Description":"input your first name.“ },}
  25. 25. Parametersのプロパティ 利用出来るプロパティプロパティ 内容Type データ型 “String” “Number” “CommaDelimitedList”Default デフォルト値NoEcho 入力時に*****となる(パスワードなどに使用)AllowedValues 入力可能値の一覧指定 (例:[“true”,”false”] )AllowedPattern 正規表現で入力可能パターンを指定(例:[a-zA-Z]*)MaxLength 最大文字数MaxValue 最大値MinValue 最小値Description プロパティの詳細説明ConstraintDescription 入力した値がAllowedPatternやMaxLengthなどの制約 に引っかかった時に表示する説明 (どのような制約があるかの説明を記述)
  26. 26. Parametersの参照 入力したパラメータ値は、テンプレート中で “Ref”を使用し て参照可能 ユーザー名、パスワード、ドメインなどの可変部分に便利 ここにパラメータ入力値が反映される “Resources" : { “MyServer":{ “Type":“AWS::EC2::Instance", “Properties” : { “KeyName”: { “Ref” : “Age”}, “Tags” : { “Ref” : “FirstName”} } } }
  27. 27. 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
  28. 28. 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
  29. 29. 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 }}
  30. 30. 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” } } },
  31. 31. 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を決定できる
  32. 32. 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 }}
  33. 33. 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” } } },
  34. 34. 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" }] } } }
  35. 35. リソースタイプ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
  36. 36. 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など)
  37. 37. Outputsとは スタック構築後に取得・表示したい情報の定義 例えばアクセスURLや、DBの通信先情報、作ったIAMユーザ ー名など、あとで使用するもの マネジメントコンソールから確認できるので、スタックに関 する情報を出力すると便利(キーペア名、AZ、インスタン スIDなど)
  38. 38. 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を使って文字列を 加工
  39. 39. 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"] ] } } }
  40. 40. テンプレートのまとめParameters,Mappings,Resources,Outputsの4つのブロックに定義を記述可変項目はパラメーター化したり、Mappingで定義Functionsを使用して、参照や文字連結などの操作が可能Resourceのパラメータはリソースタイプにより異なる。ドキュメントを利用して定義  http://docs.amazonwebservices.com/AWSCloudFormatio n/latest/UserGuide/index.html?aws-template-resource- type-ref.html
  41. 41. テンプレートTips リソース定義にEC2インスタンスが必須ではない  DB構築だけ、オートスケールだけ、アラーム設定だけでもOK 参照関係があると、依存関係があるとみなされる。相互参照 や循環参照はNG(エラーとなる) 参照関係がある部分は、参照の整合性が取れるよう起動順を CloudFormationが決定 スタックを破棄すると、スタックにひもづくリソースは破棄 される  ただし”DeletionPolicy”を”Retain”にすると破棄されない "Resources" : { "myS3Bucket" : { "Type" : "AWS::S3::Bucket", "DeletionPolicy" : "Retain" } }
  42. 42. テンプレートTips リソース数が多いと、何のリソースか分からなくなるので、 Tagsプロパティを使用する "MyInstance" : { "Type" : "AWS::EC2::Instance", "Properties" : { "SecurityGroups" : [ { "Ref" : "MySecurityGroup" } ], "ImageId" : "ami-20b65349", "Tags" : [ { "Key" : “Name", "Value" : “MyInstance" } ] } }
  43. 43. テンプレートTips CloudFormationで作られたリソースには、スタック名など のタグが付与される
  44. 44. Cloud-init
  45. 45. Cloud-init AmazonLinuxに入っている、初期設定ツール  元々はUbuntuで作られたもの EC2インスタンスの起動時に、「userdata」として設定した スクリプトを呼び出す。  「#!」 で始まる文字列の場合のみ、スクリプトを実行 スクリプトを記述できるので、ロケール変更、アプリインス トール、ファイル書き換えなどが可能
  46. 46. Cloud-init EC2インスタンス起動 User Dataに定義 Cloud-initがuserdataを 読み込む 読み込んだスクリプト を実行
  47. 47. Cloud-initの利点と欠点 利点 インスタンス起動時に、インスタンスの初期化が可能  AMIとユーザーデータは分離できるので、AMIの作り込みが不要 になる  Apacheインストール済みのAMIを用意すると、OSやApacheの バージョンが上がったときに再作成になる 欠点 userdataは一度定義すると、書き換えは不可能  書き換えて再実行が出来ない(後述のスタック更新に使えない) 設定できるデータ量は、16KByteまで
  48. 48. 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", ]] } } }
  49. 49. 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", } }
  50. 50. CloudFormation helpers
  51. 51. CloudFormation helpers EC2インスタンス初期化時のヘルパースクリプト群 AmazonLinux正式版(2011.09)以降に搭載 /opt/aws/bin に格納  cfn-init  cfn-get-metadata  cfn-signal  cfn-hup Python製
  52. 52. 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": { : } }
  53. 53. 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" ], } }
  54. 54. 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" } }
  55. 55. 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でパッケージを入れてい たらサービス再起動
  56. 56. 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", ]]}} }
  57. 57. 初期化シーケンス EC2インスタンス起動 cfn-init内で、meta-dataの読み込み Init.dに登録してある cloud-initが実行される Meta-dataの設定に従い、 Sources(ファイルダウンロード) User-data領域から、 Packages(インストール) スクリプトを読み込み Files(設定作成) Services(サービス) を実行 スクリプト内で、 cfg-initを呼び出し 起動完了
  58. 58. 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(レシピの一部書き換え) スクリプト内で、 を実行 cfg-initを呼び出し スクリプト内で、 Chefを実行 ダウンロードしたレシピを元に、 chefがサーバ構築 起動完了
  59. 59. その他スクリプト cfn-get-metadata  Metadataを簡単に取得出来るスクリプト cfn-signal  リソース「WaitCondition」と共に使用  cfn-signalを使用して、スタックに対して初期化状態の通知を することが出来る  アプリのインストールが失敗した場合にスタックを破棄したり できる cfn-hup  スタックを更新(StackUpdateAPIを使用)した場合に、それ を感知して指定のファイルを実行するフックスクリプトhttps://s3.amazonaws.com/cloudformation-examples/BoostrappingApplicationsWithAWSCloudFormation.pdf
  60. 60. CloudFormer
  61. 61. CloudFormer 既に構築済みのシステム構成から、テンプレートを作成する ツール テンプレート作成のベースとなるテンプレートを構築するの に利用可能 ベータ版 テンプレート CloudFormer EC2 EC2 AutoScaling
  62. 62. CloudFormer実行方法 https://forums.aws.amazon.com/ann.jspa?annID=10 48 でテンプレートを入手 テンプレートからスタックを構築(リージョンは問わず) 構築後、Outputsに表示されているURLにアクセス
  63. 63. CloudFormer実行方法 テンプレート化したいリージョンを選ぶと、ウィザード形式 でリソースの選択が可能 チェックボックスを入れたリソースを元にテンプレートが完 成
  64. 64. その他Tips
  65. 65. 入れ子テンプレート テンプレートからテンプレートの呼び出しが可能 リソースタイプに “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"}, } },
  66. 66. 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のエンドポイントなどの 定義が渡せる
  67. 67. IAM Capability CloudFormationでIAMユーザーを作成する場合、ウィザー ド途中でチェックボックスをonにする必要がある  cfn-create-stackおよびcfn-update-stackの場合は、 「--capalilities CAPABILITY_IAM」をコマンドに付与
  68. 68. まとめ
  69. 69. まとめCloudFormationを使用すると、システム構成をテンプレート化できるAmazonLinuxにはOS初期化のための仕組みが用意されているcloud-initとcfnヘルパー、またchefなどをCloudFormationと組み合わせると、アプリケーションのセットアップも柔軟に可能システム構築の発想を変えてみる  OSは素材  テンプレート化で、よりクラウドの特性を生かしたシステム構 築が可能に!
  70. 70. CloudFormationで真のクラウドマイスターを目指せ! App Web Server Server
  71. 71. 参考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
  72. 72. Q&ACopyright © 2011 Amazon Web Services
  73. 73. 次回のほぼ週刊AWSマイスターシリーズは、 11月9日 17:00~~ Virtual Private Cloud (VPC) ~ Copyright © 2011 Amazon Web Services
  74. 74. ご参加ありがとう ございました Copyright © 2011 Amazon Web Services
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×