re:Invent 2018のセッションで紹介されてたtroposphereをさわってみた(CloudFormationをもっと便利に) #reinvent
はじめに
中山(順)です。
ラスベガスよりお送りします。
現地時間の11月26日(月)よりセッションが本格的にスタートしました。 すでに人が多くてぐったり気味です。 移動がつらい。
この記事では、"DEV327 Beyond the Basics: Advanced Infrastructure as Code Programming on AWS"というセッションで紹介された"troposphere"というツールをさわってみた結果をお送りします。
セッションレポートはこちらです!
[レポート]Beyond the Basics: Advanced Infrastructure as Code Programming on AWS #reinvent #DEV327
セッションの3行まとめ
だいたいこんな感じのセッションでした。
- CloudFormationのMacrosを使うことで手続き的な表現を持ち込める。その際にCloudFormationのテンプレートとは分離して開発できる。うまくいいとこ取りができるよ。
- Macrosを使えば、反復処理や文字列変換などいろんなことができるよ。
- CDKやtroposphereのようなツールを使えば、CloudFormationをより良くできるよ。
troposphereの何がいいのか
CloudFormationだけでは柔軟性にかけるなーと思う点がたまにあります。 例えば、同じ設定をリソースを繰り返し作りたい場合などです。 繰り返しだけであればTerraformを利用することでも課題を解決できますが、より柔軟にテンプレートの生成を行いたいときに一部を手続き型プログラミングのようにコーディングってなることがあると思います。
troposphereは、PythonでCloudFormationのテンプレートを生成するツールです。
実際に簡単な例をご紹介します。
やってみた
まずはREADMEに書いてあることを確認してみましょう。
動作確認はWindows 10のWSL(Ubuntu16)で実施します。
インストール
まずはツールのインストールを行います。
pip install troposphere
サンプルコード(インスタンスの作成)
以下のようなサンプルコードで、CloudFormationのリソース部分を生成できます。
テンプレートのインスタンスに対して、リソースの定義を追加し、最後にテンプレートを生成しています。
from troposphere import Ref, Template import troposphere.ec2 as ec2 t = Template() instance = ec2.Instance("myinstance") instance.ImageId = "ami-063fa8762cdc9a5a6" instance.InstanceType = "t3.micro" t.add_resource(instance) print(t.to_yaml())
実行した結果がこちらです
Resources: myinstance: Properties: ImageId: ami-063fa8762cdc9a5a6 InstanceType: t3.micro Type: AWS::EC2::Instance
このようにPythonのコードからCloudFormationテンプレートが生成できました。
他のサンプルもリポジトリ内にあるので、こちらを参考にすると捗りそうです。 こちらを確認するとわかりますが、VersionやParametersやOutputs等の部分も含めて生成可能です。
今回のサンプルコードは属性値を固定にしていますが、設定値を生成したり、リソースを繰り返し作成したり、条件分岐したり、Pythonで表現可能なことであれば一通りのことは実現できるはずです。
まとめ
troposphereを利用することで必要なリソースを順次テンプレートに追加しつつ、反復やCloudFormationだけでは実現できない何らかの処理を追加するなど、柔軟にテンプレートの生成を行うことが可能です。
CloudFormationの制約で「ぐぬぬ」ってなったことのある方は、一度さわってみてはいかがでしょうか? また、こちらだけでなくCDKも良さげなのでこちらもどうぞ。
現場からは以上です。