Contenu connexe Similaire à 20120402 aws meister-reloaded-cloud-formation Similaire à 20120402 aws meister-reloaded-cloud-formation (20) Plus de Amazon Web Services Japan Plus de Amazon Web Services Japan (20) 20120402 aws meister-reloaded-cloud-formation5. CloudFormationのイメージ
テンプレートに基づき
各サービスが起動
スタック
ElasticLoadBalanceing
テンプレート
S3
Cloud
Formation
SNS
EC2 EC2
AutoScaling
CloudWatch
6. 利用シーンと利点
一度テンプレートを作成すれば、同じ構成を再現できる
開発環境の構築
Blogシステム、Webシステム、ゲームプラットフォームなど、
同じ仕組みでアプリやデータが異なるようなもの
ベストプラクティスが盛り込まれたテンプレートが使用可能
システムアーキテクチャの再利用
WordPress,Redmineなどが入った、多くのサンプルテンプレ
ートが提供済み
起動時にパラメータを渡せる
例えばDBのエンドポイントをEC2に渡せる
10. スタック可能なリソース
これらをスタックに組み込み、設定を行える
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)
Amazon CloudFront Distributions
Instances
AWS Identity and Access Management users and
Amazon RDS Security Groups
groups
AWS Elastic Beanstalk AWS Identify and Access Management policies
Amazon CloudWatch Alarms New!! Amazon Virtual Private Cloud
New!! Amazon ElastiCache
11. スタック構築方法
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/
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::AutoScalingGroup
IAM Access Key AWS::IAM::AccessKey Auto Scaling LaunchConfiguration AWS::AutoScaling::LaunchConfiguration
IAM Group AWS::IAM::Group Auto Scaling Policy AWS::AutoScaling::ScalingPolicy
IAM Policy AWS::IAM::Policy Auto Scaling Trigger AWS::AutoScaling::Trigger
IAM Add User to Group UserToGroupAddition Amazon CloudFormation Stack AWS::CloudFormation::Stack
IAM User AWS::IAM::User Amazon CloudFormation WaitCondition AWS::CloudFormation::WaitCondition
Amazon CloudFormation
Elastic Load Balancing LoadBalancer AWS::ElasticLoadBalancing::LoadBalancer AWS::CloudFormation::WaitConditionHandle
WaitConditionHandle
Amazon RDS DBInstance AWS::RDS::DBInstance Amazon CloudFront Distribution AWS::CloudFront::Distribution
Amazon RDS DBSecurityGroup AWS::RDS::DBSecurityGroup Amazon CloudWatch AWS::CloudWatch::Alarm
Amazon Route 53 Resource Record Set AWS::Route53::RecordSet Amazon EBS Volume AWS::EC2::Volume
Amazon Route 53 Resource Record Set Amazon EBS Volume Attachment AWS::EC2::VolumeAttachment
AWS::Route53::RecordSetGroup
Group
Amazon EC2 Elastic IP Address AWS::EC2::EIP
Amazon S3 Bucket AWS::S3::Bucket
Amazon EC2 Elastic IP Address
AWS::EC2::EIPAssociation
Amazon S3 Bucket Policy AWS::S3::BucketPolicy Association
Amazon EC2 Instance AWS::EC2::Instance
Amazon SimpleDB Domain AWS::SDB::Domain
Amazon EC2 Security Group AWS::EC2::SecurityGroup
SNS Topic Policy AWS::SNS::TopicPolicy
Amazon EC2 Security Group Ingress AWS::EC2::SecurityGroupIngress
Amazon SNS Subscription AWS::SNS::Subscription
Amazon SQS Queue Policy AWS::SQS::QueuePolicy
Amazon 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など)
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"] ] }
}
}
38. テンプレートTips
リソース定義にEC2インスタンスが必須ではない
DB構築だけ、オートスケールだけ、アラーム設定だけでもOK
参照関係があると、依存関係があるとみなされる。相互参照
や循環参照はNG(エラーとなる)
参照関係がある部分は、参照の整合性が取れるよう起動順を
CloudFormationが決定
スタックを破棄すると、スタックにひもづくリソースは破棄
される
ただし”DeletionPolicy”を”Retain”にすると破棄されない
"Resources" : {
"myS3Bucket" : {
"Type" : "AWS::S3::Bucket",
"DeletionPolicy" : "Retain"
}
}
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.log'n",
"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",
}
}
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
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のエンドポイントなどの
定義が渡せる
69. 参考URL
Cloud Formation Samples
http://aws.amazon.com/jp/cloudformation/aws-
cloudformation-templates/
BootstrappingApplicationsWithAWSCloudFormation
https://s3.amazonaws.com/cloudformation-
examples/BoostrappingApplicationsWithAWSCloudForma
tion.pdf
Integrating CloudFormation with Chef
https://s3.amazonaws.com/cloudformation-
examples/IntegratingAWSCloudFormationWithOpscodeC
hef.pdf
CloudFormer
https://forums.aws.amazon.com/ann.jspa?annID=1048