ひぃ(hixi)の技術雑記ブログ

事実や解決策というよりも自分が思ったことをつらつらと書いていく所存。文章構成とかそういうのあまり気にせずに書きます

CloudFormation / Custom Resource Lambda との戦い

CloudFormation の分け方/作り方 (05/09追記) - ひぃ(hixi)の技術雑記ブログ で書いたけども CloudFormation はとてもいい。 全部記述できるし、例えば development / testing / production といった環境を作るのも一度作ってしまえばすぐ作れるし、 変更がコード化される、

が、全部 CloudFormation でやろうと記述をしていくと課題にぶち当たる。確実にぶち当たる。

CloudFormation は実はかゆいところに手が届かない。 再利用するようなものを定数定義したいとかエンジニアでは結構すぐに起こる発想だし、文字列をちょっと変えたいとかもよくある発想。

そういうプログラマティックに書きたい事があるっていうのもあるし、そもそも提供されていないリソースもある。 aws cli にいるけども、CloudFormation にはいないとかもよくある話。

じゃあ、その使いづらいままの基本文法部分を使うのか。 じゃあ、そのリソースが公式サポートされるまで待つ、そこだけ手動でやるのか。 そんなことしてたらいつまで立っても使えない。

さて、基本文法部分とリソースのサポートを並列に書いたものの、これらには大きな違いがある。 基本文法部分は DRY にできないとかそういった綺麗さな部分なのでまぁ譲ることは可能*1。 一方でリソースのサポートはそれがない限り使いものにならないって意味で非常に重要となる。

リソースのサポートの文脈で言えば、2つの異なった種類のものがあることも重要。

1つ目は新機能に対するサポート。 aws cli (RESTful API) ではサポートされているものの、 CloudFormation にまだ作られていないもの

2つ目はいつまで立ってもサポートされない機能。 SES などがいい例。 SES はリリースされてから結構立つものの、未だにサポートがされていない。

このことからわかることは、全部CloudFormationでやるためには、それを満たすものを自分で作らなければいけないということである。

前回の記事でもちょろっと触れたけども、その課題の解決策として AWS Lambda-backed カスタムリソース - AWS CloudFormation がある。 っていうか、これを使わずにすべてを IaC をやるのは不可能ってレベル。

なので、 CloudFormation を用いて

  • 記述式のインフラを構築したい
  • 周りの人にしっかりわかるようなインフラを作りたい

といった IaC 的な効果を期待をするようであれば Custom Resource Lambda を作ることにネガティブになってはいけない。 壁にぶち当たったらサクッと作れるようにしなければいけない。

といいつつ、 Custom Resource Lambda のリファレンスは非常に少ない。 じゃあどこで学ぶのかというとすでに書かれたものをみつつ、自分なりの書き方を模索するのが一番。*2

binx.io · GitHub はとてもいいリポジトリ群です。僕もかなり参考にさせてもらいました。 僕も基本機能はここにあるけども、ちょっと違うやつとかも作ったりしました。

自分も GitHub - hixi-hyi/aws-cloudformation-lambda: cloudformation custom lambda っていうのを作り始めてて、自分が作ったものは公開していくつもり。 まだ少ないけど使えるものあったら使っていってもらえると嬉しいです。 とりあえず今月中には SES 系は commit したい。

そのほかにも公開している人はいるので、これらを見ながら自分なりにサクッとコードを書ける土台を作るとよいです。 今から CFn を始めようと思う人は CFn の学習工数はもちろんのこと CFn Lambda の学習工数をちゃんととった上で挑みましょう。 そうしないと中途半端な IaC になってしまいがっかりすると思います。

※ もし一般アップロードしていいなら GitHub - hixi-hyi/aws-cloudformation-lambda: cloudformation custom lambda を参考にしつつ同じ様なフォーマットで作ってもらって、そして Commit してくれれば嬉しいかも!

ちなみに、 GitHub - awslabs/aws-cdk: The AWS Cloud Development Kit is a framework for defining cloud infrastructure in code を使えば、DRY あたりについては解決しそう。 一方で、リソースのサポートという面でいうと CloudFormation と一緒だと思われる。(例としてすでに aws-cdk-examples/typescript/custom-resource at master · aws-samples/aws-cdk-examples · GitHub があるし、 example の書き方だと create / update / delete の phase を書くことができないし) CDK は使ったときないので使ってみたいと思いつつ、正直 CloudFormation だけで手一杯だし、学ぶことが多くなると大変。

*1: 譲れないケースについては AWS::Include Transform - AWS CloudFormation の利用が必要

*2:CloudFormation Custom Resource Lambda の作り方の注意点についてはまた書けたら。