awsマイスターシリーズreloaded(aws cloudformation)

69
AWSマイスターシリーズ Reloaded ~AWS CloudFormation~ 20120402片山 暁雄( @c9katayama ソリューションアーキテクト [email protected]

Upload: akio-katayama

Post on 24-May-2015

1.529 views

Category:

Technology


2 download

TRANSCRIPT

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

AWSマイスターシリーズ Reloaded ~AWS CloudFormation~

2012年04月02日

片山 暁雄( @c9katayama ) ソリューションアーキテクト

[email protected]

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

Agenda

CloudFormationの概要

スタック

テンプレート

Cloud-init

CloudFormation helpers

CloudFormer

その他Tips

まとめ

Copyright © 2011 Amazon Web Services

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

CloudFormationの概要

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

CloudFormation

EC2やELBなどを使ったAWSサービスのシステム構築を、設定ファイル(テンプレート)を元に行えるサービス

テンプレートを自由に作成できるため、自分好みのシステム構成が可能

テンプレートは、AWSのサービスを操るための新しい言語

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

スタック

CloudFormationのイメージ

S3

CloudWatch

ElasticLoadBalanceing

EC2 EC2

AutoScaling

SNS

テンプレート

Cloud

Formation

テンプレートに基づき

各サービスが起動

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

利用シーンと利点

一度テンプレートを作成すれば、同じ構成を再現できる

開発環境の構築

Blogシステム、Webシステム、ゲームプラットフォームなど、同じ仕組みでアプリやデータが異なるようなもの

ベストプラクティスが盛り込まれたテンプレートが使用可能

システムアーキテクチャの再利用

WordPress,Redmineなどが入った、多くのサンプルテンプレートが提供済み

起動時にパラメータを渡せる

例えばDBのエンドポイントをEC2に渡せる

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

利用料金

CloudFormationの利用自体は無料

テンプレートに従って構築された各AWSサービスに対して課金

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

スタック

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

スタック

リソース(EC2インスタンスやS3バケット、RDSインスタンスなど)の集合のこと

スタック単位でリソースの管理が可能。スタック破棄を実行すると、スタックにひもづくリソースを破棄することが可能

使用するリソースおよびリソースの構築順は、テンプレートの依存関係で決定

Web

Server App

Server

スタック これらを一度に生成・破棄可能

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

スタック可能なリソース

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 New!! Amazon Virtual Private Cloud

New!! Amazon ElastiCache

これらをスタックに組み込み、設定を行える

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

AWS ManagementConsoleから構築-1

スタックの名称

・サンプルテンプレート

・ローカルファイルの

テンプレート

・テンプレートファイルURL

(同一リージョンのS3上)

いずれか

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

各種パラメータの入力

(後で説明)

AWS ManagementConsoleから構築-2

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

AWS ManagementConsoleから構築-3

スタック構築開始

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

AWS ManagementConsoleから構築-4

スタック構築実行中

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

AWS ManagementConsoleから構築-5

スタック構築完了

この時点ですべてのサービスが起動している

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

テンプレート

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

テンプレート

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"

} ]

}

}

}

}

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

テンプレート解説

{

"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など)

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

{

"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ユーザー名など)

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

Parametersとは

"Parameters" : {

"Age":{

"Type":"Number",

“Default” : “30”,

“MinValue”: “20”,

“MaxValue”: “60”,

"Description":"input your age.“

},

"FirstName":{

"Type":"String",

"Description":"input your first name.“

},

}

スタック構築時に値の入力が可能

データ型、デフォルト値、最小最大値など設定可能

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

Parametersのプロパティ

プロパティ 内容

Type データ型 “String” “Number” “CommaDelimitedList”

Default デフォルト値

NoEcho 入力時に*****となる(パスワードなどに使用)

AllowedValues 入力可能値の一覧指定 (例:[“true”,”false”] )

AllowedPattern 正規表現で入力可能パターンを指定(例:[a-zA-Z]*)

MaxLength 最大文字数

MaxValue 最大値

MinValue 最小値

Description プロパティの詳細説明

ConstraintDescription 入力した値がAllowedPatternやMaxLengthなどの制約に引っかかった時に表示する説明

(どのような制約があるかの説明を記述)

利用出来るプロパティ

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

“Resources" : {

“MyServer":{

“Type":“AWS::EC2::Instance",

“Properties” : {

“KeyName”: { “Ref” : “Age”},

“Tags” : { “Ref” : “FirstName”}

}

}

}

Parametersの参照

入力したパラメータ値は、テンプレート中で “Ref”を使用して参照可能

ユーザー名、パスワード、ドメインなどの可変部分に便利

ここにパラメータ入力値が反映される

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

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

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

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”}

}

}

}

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

{

"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番号など)

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

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”

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

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”

}

}

},

“Fn::FindInTemplate”

“Resources" : {

“MyServer":{

“Type":“AWS::EC2::Instance",

“Properties” : {

“ImageId”: {

“Fn:FindInMap” : [

“RegionTable” ,

{ “Ref” : “region” },

“AMI”]

},

}

}

} この例だと、入力された

regionパラメータによって

利用するAMIのIDを決定できる

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

{

"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など、スタックを構成する

リソースを定義

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

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”

}

}

},

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

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"

} ]

}

}

}

リソース毎のプロパティ

リソースタイプ

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

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

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

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など)

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

Outputsとは

スタック構築後に取得・表示したい情報の定義

例えばアクセスURLや、DBの通信先情報、作ったIAMユーザー名など、あとで使用するもの

マネジメントコンソールから確認できるので、スタックに関する情報を出力すると便利(キーペア名、AZ、インスタンスIDなど)

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

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を使って文字列を加工

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

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"] ] }

}

}

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

テンプレートのまとめ

Parameters,Mappings,Resources,Outputsの4つのブロックに定義を記述

可変項目はパラメーター化したり、Mappingで定義

Functionsを使用して、参照や文字連結などの操作が可能

Resourceのパラメータはリソースタイプにより異なる。ドキュメントを利用して定義

http://docs.amazonwebservices.com/AWSCloudFormation/latest/UserGuide/index.html?aws-template-resource-type-ref.html

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

テンプレートTips

リソース定義にEC2インスタンスが必須ではない

DB構築だけ、オートスケールだけ、アラーム設定だけでもOK

参照関係があると、依存関係があるとみなされる。相互参照や循環参照はNG(エラーとなる)

参照関係がある部分は、参照の整合性が取れるよう起動順をCloudFormationが決定

スタックを破棄すると、スタックにひもづくリソースは破棄される

ただし”DeletionPolicy”を”Retain”にすると破棄されない

"Resources" : {

"myS3Bucket" : {

"Type" : "AWS::S3::Bucket",

"DeletionPolicy" : "Retain"

}

}

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

テンプレートTips

リソース数が多いと、何のリソースか分からなくなるので、Tagsプロパティを使用する

"MyInstance" : {

"Type" : "AWS::EC2::Instance",

"Properties" : {

"SecurityGroups" : [ { "Ref" : "MySecurityGroup" } ],

"ImageId" : "ami-20b65349",

"Tags" : [

{ "Key" : “Name", "Value" : “MyInstance" }

]

}

}

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

テンプレートTips

CloudFormationで作られたリソースには、スタック名などのタグが付与される

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

テンプレートTips

テンプレートのコスト試算が可能

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

Cloud-init

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

Cloud-init

AmazonLinuxに入っている、初期設定ツール

元々はUbuntuで作られたもの

EC2インスタンスの起動時に、「userdata」として設定したスクリプトを呼び出す。

「#!」 で始まる文字列の場合のみ、スクリプトを実行

スクリプトを記述できるので、ロケール変更、アプリインストール、ファイル書き換えなどが可能

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

Cloud-init

User Dataに定義

Cloud-initがuserdataを読み込む

読み込んだスクリプトを実行

EC2インスタンス起動

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

Cloud-initの利点と欠点

利点

インスタンス起動時に、インスタンスの初期化が可能

AMIとユーザーデータは分離できるので、AMIの作り込みが不要になる

Apacheインストール済みのAMIを用意すると、OSやApacheのバージョンが上がったときに再作成になる

欠点

userdataは一度定義すると、書き換えは不可能

書き換えて再実行が出来ない(後述のスタック更新に使えない)

設定できるデータ量は、16KByteまで

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

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",

] ]

}

}

}

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

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",

}

}

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

CloudFormation helpers

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

CloudFormation helpers

EC2インスタンス初期化時のヘルパースクリプト群

AmazonLinux正式版(2011.09)以降に搭載

/opt/aws/bin に格納

cfn-init

cfn-get-metadata

cfn-signal

cfn-hup

Python製

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

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の順に実行される

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

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" ],

}

}

最新版

バージョン指定

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

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などから取得

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

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でパッケージを入れていたらサービス再起動

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

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",

]]}}

}

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

初期化シーケンス

EC2インスタンス起動

Init.dに登録してあるcloud-initが実行される

User-data領域から、

スクリプトを読み込み

スクリプト内で、

cfn-initを呼び出し

cfn-init内で、meta-dataの読み込み

Meta-dataの設定に従い、

Sources(ファイルダウンロード)

Packages(インストール)

Files(設定作成)

Services(サービス)

を実行

起動完了

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

Chef(solo)との連携例

EC2インスタンス起動

Init.dに登録してあるcloud-initが実行される

User-data領域から、

スクリプトを読み込み

スクリプト内で、

cfn-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がサーバ構築

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

その他スクリプト

cfn-get-metadata

Metadataを簡単に取得出来るスクリプト

cfn-signal

リソース「WaitCondition」と共に使用

cfn-signalを使用して、スタックに対して初期化状態の通知をすることが出来る

アプリのインストールが失敗した場合にスタックを破棄したりできる

cfn-hup

スタックを更新(StackUpdateAPIを使用)した場合に、それを感知して指定のファイルを実行するフックスクリプト

https://s3.amazonaws.com/cloudformation-

examples/BoostrappingApplicationsWithAWSCloudFormation.pdf

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

CloudFormer

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

CloudFormer

既に構築済みのシステム構成から、テンプレートを作成するツール

テンプレート作成のベースとなるテンプレートを構築するのに利用可能

ベータ版

EC2 EC2

AutoScaling

テンプレート

CloudFormer

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

CloudFormer実行方法

https://forums.aws.amazon.com/ann.jspa?annID=1048 でテンプレートを入手

テンプレートからスタックを構築(リージョンは問わず)

構築後、Outputsに表示されているURLにアクセス

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

CloudFormer実行方法

テンプレート化したいリージョンを選ぶと、ウィザード形式でリソースの選択が可能

チェックボックスを入れたリソースを元にテンプレートが完成

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

その他Tips

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

入れ子テンプレート

テンプレートからテンプレートの呼び出しが可能

リソースタイプに “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"},

}

},

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

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初期化に時間がかかる

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

IAM Capability

CloudFormationでIAMユーザーを作成する場合、ウィザード途中でチェックボックスをonにする必要がある

cfn-create-stackおよびcfn-update-stackの場合は、

「--capalilities CAPABILITY_IAM」をコマンドに付与

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

まとめ

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

まとめ

CloudFormationを使用すると、システム構成をテンプレート化できる

AmazonLinuxにはOS初期化のための仕組みが用意されている

cloud-initとcfnヘルパー、またchefなどをCloudFormation

と組み合わせると、アプリケーションのセットアップも柔軟に可能

システム構築の発想を変えてみる

OSは素材

テンプレート化で、よりクラウドの特性を生かしたシステム構築が可能に!

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

CloudFormationで

真のクラウドマイスターを目指せ!

Web

Server App

Server

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

参考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