AWS CloudFormation - Amazon Web Services

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/