[小ネタ]CloudFormation テンプレートをPythonで記述して実行してみた

この記事は公開されてから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が作成され・・・

write-cloudformation-template-python-stack

S3にバケットが作成されました。

write-cloudformation-template-python-s3

まとめ

CloudFormationのテンプレート作成には様々なアプローチがあり、troposphereなどのツールを使うのもなどがあります。それらのうちの1つとして「プログラムでJSONを記述してしまう」というのも頭の片隅に入れておくと良いかもしれません。