aws meister-cloud formation-summit2012
DESCRIPTION
AWS meister series "AWS Cloud Formation"TRANSCRIPT
AWSサービス一覧
お客様のアプリケーション
ライブラリ & SDKs Java, PHP, .NET,
Python, Ruby
Web インターフェース
Management Console
IDE プラグイン
Eclipse
Visual Studio
デプロイと自動化 AWS Elastic Beanstalk AWS CloudFormation
認証 & 請求 AWS IAM
Identity Federation Consolidated Billing
モニタリング Amazon CloudWatch
スケーリング Auto Scale
ネットワーク&ルーティング Amazon VPC
Amazon Elastic LB Amazon Route 53
AWS Direct Connect
コンテンツ配信Amazon
CloudFront
メッセージ通知Amazon SNS
分散処理 Elastic
MapReduce
メール配信 Amazon SES
コンピュータ処理 Amazon EC2
ストレージ
Amazon S3
Amazon EBS AWS Storage Gateway
データベース Amazon RDS
Amazon DynamoDB Amazon SimpleDB
Amazon Elasticache
AWS のグローバルなインフラ
キューイングAmazon SQS
ワークフロー Simple
Workflow
Agenda
CloudFormationの概要
スタック
テンプレート
Cloud-init
CloudFormation helpers
CloudFormer
その他Tips
まとめ
Copyright © 2011 Amazon Web Services
CloudFormation
EC2やELBなどを使ったAWSサービスのシステム構築を、設定ファイル(テンプレート)を元に行えるサービス
テンプレートを自由に作成できるため、自分好みのシステム構成が可能
テンプレートは、AWSのサービスを操るための新しい言語
スタック
CloudFormation
S3
CloudWatch
ElasticLoadBalanceing
EC2 EC2
AutoScaling
SNS
テンプレート
Cloud
Formation
テンプレートに基づき
各サービスが起動
利用シーンと利点
一度テンプレートを作成すれば、同じ構成を再現できる
開発環境の構築
Blogシステム、Webシステム、ゲームプラットフォームなど、同じ仕組みでアプリやデータが異なるようなもの
ベストプラクティスが盛り込まれたテンプレートが使用可能
システムアーキテクチャの再利用
WordPress,Redmineなどが入った、多くのサンプルテンプレートが提供済み
起動時にパラメータを渡せる
例えばDBのエンドポイントをEC2に渡せる
スタック
リソース(EC2インスタンスやS3バケット、RDSインスタンスなど)の集合のこと
スタック単位でリソースの管理が可能。スタック破棄を実行すると、スタックにひもづくリソースを破棄することが可能
使用するリソースおよびリソースの構築順は、テンプレートの依存関係で決定
Web Server
App Server
スタック これらを一度に生成・破棄可能
スタック可能なリソース
Amazon EC2 Instances Amazon Simple Storage Service (S3) Buckets
Amazon Elastic Block Store (EBS) Volumes Amazon Simple DB Domains
Elastic Load Balancers Amazon Simple Queue Service (SQS) Queues
Elastic IP Addresses Amazon Simple Notification Service (SNS) Topics
Amazon EC2 Security Groups Amazon SNS Subscriptions
Auto Scaling Groups Amazon Route 53 DNS Records
Amazon Relational Database Service (RDS)
Instances Amazon CloudFront Distributions
Amazon RDS Security Groups AWS Identity and Access Management users and
groups
AWS Elastic Beanstalk AWS Identify and Access Management policies
Amazon CloudWatch Alarms
これらをスタックに組み込み、設定を行える
スタック構築方法
AWS ManagementConsoleから構築
コマンドラインツール
http://aws.amazon.com/developertools/AWS-CloudFormation/2555753788650372
Java・.Net・PHPの各種SDK
Java : http://aws.amazon.com/jp/sdkforjava/
.NET : http://aws.amazon.com/jp/sdkfornet/
PHP : http://aws.amazon.com/jp/sdkforphp/
AWS ManagementConsoleから構築-1
スタックの名称
・サンプルテンプレート
・ローカルファイルの テンプレート
・テンプレートファイルURL (同一リージョンのS3上)
いずれか
demo
テンプレート
CloudFormationの心臓部
スタック構築の設計図
JSONフォーマットで記述
{
"AWSTemplateFormatVersion" : "2010-09-09",
"Description" : “Sample",
"Parameters" : {
"KeyName" : {
"Description" : “Sample key,
"Type" : "String"
}
},
"Mappings" : {
},
"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"
} ]
}
}
}
}
テンプレート解説
{
"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
}
}
テンプレートのバージョン
(最新は2010-09-09)
テンプレートの詳細(説明文)
CloudFormation実行時に
後で変更可能なパラメータを列挙
(例:DBユーザー名など)
Hashtableのようなもの
キーに応じて値を特定出来る
(例:リージョンに応じたAMI番号など)
EC2やRDSなど、スタックを構成する
リソースを定義
スタック構築後に取得したい値
(例:アクセスURLなど)
{
"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
}
}
Parameters
CloudFormation実行時に
後で変更可能なパラメータを列挙
(例:DBユーザー名など)
Parametersとは
"Parameters" : { "Age":{ "Type":"Number", “Default” : “30”, “MinValue”: “20”, “MaxValue”: “60”, "Description":"input your age.“ }, "FirstName":{ "Type":"String", "Description":"input your first name.“ }, }
スタック構築時に値の入力が可能
データ型、デフォルト値、最小最大値など設定可能
Parametersのプロパティ
プロパティ 内容
Type データ型 “String” “Number” “CommaDelimitedList”
Default デフォルト値
NoEcho 入力時に*****となる(パスワードなどに使用)
AllowedValues 入力可能値の一覧指定 (例:[“true”,”false”] )
AllowedPattern 正規表現で入力可能パターンを指定(例:[a-zA-Z]*)
MaxLength 最大文字数
MaxValue 最大値
MinValue 最小値
Description プロパティの詳細説明
ConstraintDescription 入力した値がAllowedPatternやMaxLengthなどの制約に引っかかった時に表示する説明
(どのような制約があるかの説明を記述)
利用出来るプロパティ
“Resources" : {
“MyServer":{
“Type":“AWS::EC2::Instance",
“Properties” : {
“KeyName”: { “Ref” : “Age”},
“Tags” : { “Ref” : “FirstName”}
}
}
}
Parametersの参照
入力したパラメータ値は、テンプレート中で “Ref”を使用して参照可能
ユーザー名、パスワード、ドメインなどの可変部分に便利
ここにパラメータ入力値が反映される
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
Pseudo Parameter 実行リージョンやスタック名といったパラメータを取得出来る予約語
AWS::Region
スタック構築対象のリージョンを取得する
{ “Ref” : “AWS::Region” } で値を取得可能
AWS::StackName
スタックの名前を取得する
{ “Ref” : “AWS::StackName” } で値を取得可能
http://docs.amazonwebservices.com/AWSCloudFormation/latest/UserGuide/index.html?pseudo-parameter-reference.html
“Resources" : { “MyServer":{ “Type":“AWS::EC2::Instance", “Properties” : { “KeyName”: { “Ref” : “AWS::StackName”}, “Tags” : { “Ref” : “AWS::Region”} } } }
{ "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 } }
Mappings
Hashtableのようなもの キーに応じて値を特定出来る
(例:リージョンに応じたAMI番号など)
Mappingsとは
キーとバリューのテーブル
例えば、入力値やリージョンによって値が変わるようなものを決めるような使い方
"Mappings" : { "RegionTable" : { "us-east-1" : { "AMI" : "ami-8c1fece5“, “Key” : “myKey-east” }, "us-west-1" : { "AMI" : "ami-3bc9997e“, “Key” : “myKey-west” }, "ap-northeast-1" : { "AMI" : "ami-300ca731“, “Key” : “myKey-japan” } } },
マッピングを定義 (この例の場合、”RegionTable”という
マッピングを定義)
“Fn::FindInTemplate”
Mappingsの使い方
“Fn:FindInMap”で値を取得
"Fn::FindInMap" : [ "MapName", "Key", "Value"]
MapName,key,Valueには”Ref”が利用可能
"Mappings" : { "RegionTable" : { "us-east-1" : { "AMI" : "ami-8c1fece5“, “Key” : “myKey-east” }, "us-west-1" : { "AMI" : "ami-3bc9997e“, “Key” : “myKey-west” }, "ap-northeast-1" : { "AMI" : "ami-300ca731“, “Key” : “myKey-japan” } } },
“Resources" : { “MyServer":{ “Type":“AWS::EC2::Instance", “Properties” : { “ImageId”: { “Fn:FindInMap” : [ “RegionTable” , { “Ref” : “region” }, “AMI”] }, } } }
この例だと、入力された regionパラメータによって
利用するAMIのIDを決定できる
{
"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
}
}
Resources
EC2やRDSなど、スタックを構成する
リソースを定義
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”
}
}
},
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"
} ]
}
}
}
リソース毎のプロパティ
リソースタイプ
Auto Scaling AutoScalingGroup AWS::AutoScaling::AutoScalingGroup
IAM Access Key AWS::IAM::AccessKey
IAM Group AWS::IAM::Group
IAM Policy AWS::IAM::Policy
IAM Add User to Group UserToGroupAddition
IAM User AWS::IAM::User
Elastic Load Balancing LoadBalancer AWS::ElasticLoadBalancing::LoadBalancer
Amazon RDS DBInstance AWS::RDS::DBInstance
Amazon RDS DBSecurityGroup AWS::RDS::DBSecurityGroup
Amazon Route 53 Resource Record Set AWS::Route53::RecordSet
Amazon Route 53 Resource Record Set Group
AWS::Route53::RecordSetGroup
Amazon S3 Bucket AWS::S3::Bucket
Amazon S3 Bucket Policy AWS::S3::BucketPolicy
Amazon SimpleDB Domain AWS::SDB::Domain
SNS Topic Policy AWS::SNS::TopicPolicy
Amazon SNS Subscription AWS::SNS::Subscription
Amazon SNS Topic AWS::SNS::Topic
Auto Scaling AutoScalingGroup AWS::AutoScaling::AutoScalingGroup
Auto Scaling LaunchConfiguration AWS::AutoScaling::LaunchConfiguration
Auto Scaling Policy AWS::AutoScaling::ScalingPolicy
Auto Scaling Trigger AWS::AutoScaling::Trigger
Amazon CloudFormation Stack AWS::CloudFormation::Stack
Amazon CloudFormation WaitCondition AWS::CloudFormation::WaitCondition
Amazon CloudFormation WaitConditionHandle
AWS::CloudFormation::WaitConditionHandle
Amazon CloudFront Distribution AWS::CloudFront::Distribution
Amazon CloudWatch AWS::CloudWatch::Alarm
Amazon EBS Volume AWS::EC2::Volume
Amazon EBS Volume Attachment AWS::EC2::VolumeAttachment
Amazon EC2 Elastic IP Address AWS::EC2::EIP
Amazon EC2 Elastic IP Address Association
AWS::EC2::EIPAssociation
Amazon EC2 Instance AWS::EC2::Instance
Amazon EC2 Security Group AWS::EC2::SecurityGroup
Amazon EC2 Security Group Ingress AWS::EC2::SecurityGroupIngress
Amazon SQS Queue Policy AWS::SQS::QueuePolicy
Amazon SQS Queue AWS::SQS::Queue
リソースタイプ
http://docs.amazonwebservices.com/AWSCloudFormation/latest/UserGuide/index.h
tml?aws-template-resource-type-ref.html
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など)
Outputsとは
スタック構築後に取得・表示したい情報の定義
例えばアクセスURLや、DBの通信先情報、作ったIAMユーザー名など、あとで使用するもの
マネジメントコンソールから確認できるので、スタックに関する情報を出力すると便利(キーペア名、AZ、インスタンスIDなど)
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を使って文字列を加工
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"] ] }
}
}
テンプレートのまとめ
Parameters,Mappings,Resources,Outputsの4つのブロックに定義を記述
可変項目はパラメーター化したり、Mappingで定義
Functionsを使用して、参照や文字連結などの操作が可能
Resourceのパラメータはリソースタイプにより異なる。ドキュメントを利用して定義
http://docs.amazonwebservices.com/AWSCloudFormation/latest/UserGuide/index.html?aws-template-resource-type-ref.html
テンプレートTips
リソース定義にEC2インスタンスが必須ではない
DB構築だけ、オートスケールだけ、アラーム設定だけでもOK
参照関係があると、依存関係があるとみなされる。相互参照や循環参照はNG(エラーとなる)
参照関係がある部分は、参照の整合性が取れるよう起動順をCloudFormationが決定
スタックを破棄すると、スタックにひもづくリソースは破棄される
ただし”DeletionPolicy”を”Retain”にすると破棄されない
"Resources" : { "myS3Bucket" : { "Type" : "AWS::S3::Bucket", "DeletionPolicy" : "Retain" } }
テンプレートTips
リソース数が多いと、何のリソースか分からなくなるので、Tagsプロパティを使用する
"MyInstance" : { "Type" : "AWS::EC2::Instance", "Properties" : { "SecurityGroups" : [ { "Ref" : "MySecurityGroup" } ], "ImageId" : "ami-20b65349", "Tags" : [ { "Key" : “Name", "Value" : “MyInstance" } ] } }
CloudFormer
既に構築済みのシステム構成から、テンプレートを作成するツール
テンプレート作成のベースとなるテンプレートを構築するのに利用可能
ベータ版
EC2 EC2
AutoScaling
テンプレート
CloudFormer
CloudFormer実行方法
https://forums.aws.amazon.com/ann.jspa?annID=1048 でテンプレートを入手
テンプレートからスタックを構築(リージョンは問わず)
構築後、Outputsに表示されているURLにアクセス
まとめ
CloudFormationを使用すると、システム構成をテンプレート化できる
AmazonLinuxにはOS初期化のための仕組みが用意されている
cloud-initとcfnヘルパー、またchefなどをCloudFormation
と組み合わせると、アプリケーションのセットアップも柔軟に可能
システム構築の発想を変えてみる
OSは素材
テンプレート化で、よりクラウドの特性を生かしたシステム構築が可能に!
Cloud-init
AmazonLinuxに入っている、初期設定ツール
元々はUbuntuで作られたもの
EC2インスタンスの起動時に、「userdata」として設定したスクリプトを呼び出す。
「#!」 で始まる文字列の場合のみ、スクリプトを実行
スクリプトを記述できるので、ロケール変更、アプリインストール、ファイル書き換えなどが可能
Cloud-initの利点と欠点
利点
インスタンス起動時に、インスタンスの初期化が可能
AMIとユーザーデータは分離できるので、AMIの作り込みが不要になる
Apacheインストール済みのAMIを用意すると、OSやApacheのバージョンが上がったときに再作成になる
欠点
userdataは一度定義すると、書き換えは不可能
書き換えて再実行が出来ない(後述のスタック更新に使えない)
設定できるデータ量は、16KByteまで
CloudFormationとの連携
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 helpers
EC2インスタンス初期化時のヘルパースクリプト群
AmazonLinux正式版(2011.09)以降に搭載
/opt/aws/bin に格納
cfn-init
cfn-get-metadata
cfn-signal
cfn-hup
Python製
cfn-init
パッケージやファイルのダウンロード、ファイルの生成を行うスクリプト
実行のための設定は、Metadata領域に定義
sources,packages,files,services
"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
"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" ], } }
最新版
バージョン指定
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
サービスの起動・再起動の指定
現在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終了後に起動するかどうか
OS起動時に起動させるかどうか
設定ファイルもしくは指定ディレクトリのファイルが変わっていた場合にサービス再起動する
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", ]]}} }
初期化シーケンス
EC2インスタンス起動
Init.dに登録してあるcloud-initが実行される
User-data領域から、
スクリプトを読み込み
スクリプト内で、
cfg-initを呼び出し
cfn-init内で、meta-dataの読み込み
Meta-dataの設定に従い、
Sources(ファイルダウンロード)
Packages(インストール)
Files(設定作成)
Services(サービス)
を実行
起動完了
Chef(solo)との連携例
EC2インスタンス起動
Init.dに登録してあるcloud-initが実行される
User-data領域から、
スクリプトを読み込み
スクリプト内で、
cfg-initを呼び出し
cfn-init内で、meta-dataの読み込み
Meta-dataの設定に従い、
Sources(レシピファイルダウンロード)
Packages(rubygemでchefインストール)
Files(レシピの一部書き換え)
を実行
起動完了
スクリプト内で、
Chefを実行
https://s3.amazonaws.com/cloudformation-templates-
us-east-1/wordpress-via-chef-solo.template
が分かりやすい例
ダウンロードしたレシピを元に、chefがサーバ構築
その他スクリプト
cfn-get-metadata
Metadataを簡単に取得出来るスクリプト
cfn-signal
リソース「WaitCondition」と共に使用
cfn-signalを使用して、スタックに対して初期化状態の通知をすることが出来る
アプリのインストールが失敗した場合にスタックを破棄したりできる
cfn-hup
スタックを更新(StackUpdateAPIを使用)した場合に、それを感知して指定のファイルを実行するフックスクリプト
https://s3.amazonaws.com/cloudformation-
examples/BoostrappingApplicationsWithAWSCloudFormation.pdf
入れ子テンプレート
テンプレートからテンプレートの呼び出しが可能
リソースタイプに “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"},
}
},
Baked AMI VS CF-Init
AMIの作り込み VS Cloud-init+CloudFormation helpers
用途によって、AMI作り込み、cloud-init、helperを使い分ける事が重要
利点 欠点
AMI作り込み ・構築が容易
・起動が速い
(オートスケールに有効)
・ベースAMI/ミドルウェア
更新時に再インストールが必要
・リージョン毎の構築が必要
ベースAMI+
Cloud-init+CFN
helpers
・ベースAMI/ミドルウェア更新時 に追従が可能
・DBのエンドポイントなどの
定義が渡せる
・テンプレート構築が手間
・OS初期化に時間がかかる
IAM Capability
CloudFormationでIAMユーザーを作成する場合、ウィザード途中でチェックボックスをonにする必要がある
cfn-create-stackおよびcfn-update-stackの場合は、
「--capalilities CAPABILITY_IAM」をコマンドに付与
参考URL
Cloud Formation Samples
http://aws.amazon.com/jp/cloudformation/aws-cloudformation-templates/
BootstrappingApplicationsWithAWSCloudFormation
https://s3.amazonaws.com/cloudformation-examples/BoostrappingApplicationsWithAWSCloudFormation.pdf
Integrating CloudFormation with Chef
https://s3.amazonaws.com/cloudformation-examples/IntegratingAWSCloudFormationWithOpscodeChef.pdf
CloudFormer
https://forums.aws.amazon.com/ann.jspa?annID=1048