📜

CloudFormationのテンプレートからパラメータファイルを作成する

2024/02/10に公開

はじめに

かなり久しぶりの投稿です。
難しいことは頭が疲れるので簡単なことやりました。

業務でCloudFormationのスタックを作成する時、画面上でポチポチやってます。
ふとしたときに私は思ったんですよ。AWS CLIで作成した方が早くないかと。
※今の時代はTerraformだろ?っていう意見は受けつけません。

ということで自分なり解決しようと思います。

ストレスに感じること3選👏👏

画面上でスタックを作成するときにストレスを感じることがあります。

  • テンプレートの選択
    ファイルの管理次第ですが、ファイルが多いと探すのが面倒
    (似たファイル名が多いと尚更)
  • パラメータの入力
    汎用的なテンプレートにするとパラメータの数が増えますな
    入力した値が間違ってないか念のため確認している
  • レビュー画面でパラメータ値の確認
    入力時に確認したのに、結局レビュー画面で再確認している

自分にとって楽なやり方

とにかく面倒なので楽な方法でやろうぜ。
AWS CLIでスタックを作成する場合でも、パラメータを指定することは変わらないので
それを短時間にできれば楽になるに違いない。

私は長考しました(体感1h実際は5分ぐらい)
テンプレートからパラメータファイルを作成すれば良いんじゃねーかと。

最初は、対話形式でスタックが作成できれば楽になりそうだと思ったんですが
・値を入力する
・間違ってないことを確認する
・Enterを押す
を繰り返すことになるので、画面でポチポチやってるのと変わらないじゃん!
というかむしろ遅くなりそうと思いました。

で行き着いたのが、パラメータファイルの作成にかかる時間を短くすること。

プログラムを書いてみた

私はシェルスクリプトを書くことが多いのですが、AWS Lambdaを使う機会が増え、たまにPythonでコードを書いています。
シェルスクリプトもそうなんですけど、ちょっとしたツールなんだから動けばいいんだよ👨

https://github.com/kaqua/shiba_inu/blob/main/create_cfn_parameter_file.py

yamlで「!Ref」のような短縮系の組み込み関数を読み込むとエラーになるようですが
aws-cliパッケージ内の yaml_parse という関数をで読み込むと解決するみたいです。

https://github.com/aws/aws-cli/blob/develop/awscli/customizations/cloudformation/yamlhelper.py#L89-L101

読み込んだ後は、順序付き辞書型(collections.OrderedDict)にしてくれるのでよしなに料理してちょうだいなって感じです。

で、個人的に配慮した点を書いておくと
パラメータに Default が設定されていない場合を想定したことです。
デフォルト値を設定しないから Default を省略しているテンプレートってざらにあるんですよね。

逆にデフォルト値が設定されている場合は、その値を使うようにしました。
でもテンプレートを作成した人のセンス次第で動的に変わるパラメータにデフォルト値を指定しているってことがあります。
ということで、対象が全てになりますが空の状態でテンプレートファイルを作成できるようにもしてあります。
どうやってやるかは、コードを見てください。すぐ分かると思います。

まとめ

久しぶりの投稿でした。
業務の時間を使ってまでやることではないかなーと思い、勉強がてらちょっとしたツール?を作ってみました。

ちなみにストレスがどうこうって冒頭に書きましたが、作って満足しました。

こうゆうものを作って業務改善に貢献できるように励みまーす。

参考

https://blog.serverworks.co.jp/cfn-python

Discussion