CloudFormationを試した。以下Cfnとかく。一緒にkumogataをつかった。
CfnはAWSのリソースをプロビジョニングできる。
具体的には「セキュリティグループをつくって、EC2を起動する」みたいなことをJSONで記述することができる。成功した時には各リソースのIDがどうなったのかを出力したりできるようだ。
EC2のUserDataを使えば起動したインスタンスで実行したスクリプトも記述できるのでデプロイをキックしたりもできそうだ。
そんなわけでCfnはAWSで似たような環境を何度もつくる場合に便利である。
Cfnに渡すJSONは設計図のようなもので、変数のようなものを埋め込んだりすることができる。
テンプレートと呼ばれて、サンプルテンプレートが用意されている。
リファレンス
http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-reference.html
Cfnにテンプレートを渡すと実際にAWSのリソースが構築される。作成されるリソースをまとめたものをスタックというらしい。
ようするに、スタックを作成するのに、テンプレートが必要となる。
スタックには使用したテンプレートや起動したインスタンスの情報をもっている。スタックを削除すると、このスタックに関連するリソースはすべて破棄される。
JSONをかくのはつらいので、今回はhttps://github.com/winebarrel/kumogataのDSLを活用した。
EC2インスタンスの作成とセキュリティグループでポート22と80をあけてみる例。
まずテンプレートとなるcfn.rb
を作成した。特に変数的な部分はない。
AWSTemplateFormatVersion "2010-09-09"
Description (<<-EOS).undent
CloudFourmation Sample
EOS
Resources do
WebEC2Instance do
Type "AWS::EC2::Instance"
Properties do
ImageId "ami-cbf90ecb"
InstanceType "t2.micro"
KeyName "xxx" # 自分の公開鍵のペア名
UserData do
Fn__Base64 (<<-EOS).undent
#!/bin/bash
yum install -y httpd
service httpd start
echo Hello, World > /var/www/html/index.html
EOS
end
end
end
WebServerSecurityGroup do
Type "AWS::EC2::SecurityGroup"
Properties do
GroupDescription "Enable HTTP and SSH access"
security_groups = ["80","22"].map do |port|
_{
IpProtocol "tcp"
FromPort port
ToPort port
CidrIp "0.0.0.0/0"
}
end
SecurityGroupIngress(*security_groups)
end
end
end
Outputs do
WebsiteURL do
Value 'http://<%= Fn__GetAtt "WebEC2Instance", "PublicDnsName"%>/'.fn_join
end
end
Outputsに記述してある値はスタック生成終了後に出力として閲覧することができる。
URLをいれておくことで生成したウェブサーバにアクセスしやすくしている。
このテンプレートからstackを作成するには
$ kumogata create テンプレート名 スタック名
となる。具体的には
$ kumogata create cfn.rb sample-stack
みたいな感じだ。
スタック名は sample-stackとなるので、つくったリソースを削除したい場合は
$ kumogata delete sample-stack
となる。
kumogataをつかわずにJSONでかいてもあまり差はないがRubyの力をかりて処理がまとめたりできるのが魅力だ。
createする再にスタックを指定しない場合はスタックは削除されてリソースは残った状態になる。
ミドルウェアの設定済のAMIを用意しておいて、アプリケーションデータを保存しておく用のEBSを用意してデプロイコマンドのキックする感じにつかおうかなぁ、とおもっている。
たぶんスタックにテンプレートを再適用して変化部分のみ再実行なんかもできるようだ。