この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
最近はぼちぼちとCloudFormationを触り始めている、t.hondaです。CloudFormationと言えば、JSONのテンプレートです。このテンプレート、いろいろなサイト・記事でも言われていることですが、私としては以下ようなことが心に引っ掛かっていました。
- コメントが書けない
- (ベタ書きのJSONのため)重複する記述を共通化できない
- もう少しプログラムチックに書きたい
これらを解決するため、プログラムにてJSONのテンプレートを作成するようにしてみました。同時にテンプレートからStackを作成し、コマンド一発でJSONの作成・Stackの作成をするようにしてみました。
プログラムについて
では、そのプログラムについてです。使用したプログラム言語はPython2.7で、S3にバケットを作成する簡単なテンプレートを記述してみました。
1.事前準備
pyenv、virtualenv、pipはインストール済みのものとします。またクレデンシャルファイル(~/.aws/credentials等)には接続先のアクセスキー・シークレットキーを記述しておきます。
作業する場所に移動し、以下のコマンドを実行して仮想環境を構築します。
$ pyenv local 2.7.11
$ virtualenv venv
$ . venv/bin/activate
Stackの作成にはboto3を使用するので、以下のコマンドでインストールしておきます。
pip install boto3
2.プログラム
プログラムは以下のようになります。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import json
from util.cloud_formation import CloudFormation
def main():
dict = {
"AWSTemplateFormatVersion" : "2010-09-09", #コメント1
"Resources" : {
"S3Bucket" : {
"Type" : "AWS::S3::Bucket",
"Properties" : {
"AccessControl" : "Private", #コメント2
"BucketName" : "t-honda-cloudformation"
}
}
}
}
json_str = json.dumps(dict, indent=4)
print(json_str)
cf = CloudFormation()
cf.create_stack('python-stack', json_str)
if __name__ == "__main__":
main()
Pythonのプログラムなので、8・13行目のようにコメントを記述することができます。また今回は行ってはいませんが、バケット名を外出しの定義ファイルに記述することや、テンプレートの重複する部分を共通化することも可能です。
実行してみる
上記のプログラムを実行してみます。
$ python s3.py
{
"AWSTemplateFormatVersion": "2010-09-09",
"Resources": {
"S3Bucket": {
"Type": "AWS::S3::Bucket",
"Properties": {
"AccessControl": "Private",
"BucketName": "t-honda-cloudformation"
}
}
}
}
以下のようにStackが作成され・・・
S3にバケットが作成されました。
まとめ
CloudFormationのテンプレート作成には様々なアプローチがあり、troposphereなどのツールを使うのもなどがあります。それらのうちの1つとして「プログラムでJSONを記述してしまう」というのも頭の片隅に入れておくと良いかもしれません。