CloudFormationの新しい機能を使って簡単にIaCに移行する


AWSでシステム開発をしていると以下のような声をよく聞きます。

「手で作ってしまったリソースがあるのだけど、これをIaC化したい」

これまで、公式では実現する手段がなく(過去にはCloudFormerがありましたが、、、)、 3rd partyのツールであるFormer2を使うぐらいしか実現手段がありませんでした。

Former2も便利ですが、以下のような課題があります。

  • 自前で実行すると運用対象が増える
  • 公式でSaaSっぽく提供されているが、ReadOnlyとはいえIAMユーザ作ってアクセスキー、シークレットキーを連携するのは、はばかられる

そんな中、公式での提供が復活し、IaCジェネレータという既存のリソースからCloudFormationのテンプレートを出力する機能が登場しました。

https://aws.amazon.com/about-aws/whats-new/2024/02/aws-cloudformation-templates-cdk-apps-minutes/

こちらを利用することで、ある程度既存のリソースをIaC化しやすくなります。

今回は以下のような単純なWebサーバのシステム構成を例に実際の例を見せながら紹介したいと思います。

IaCジェネレータからテンプレートを出力する

IaCジェネレータの使い方の詳細は、公式のドキュメントを参照してください。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/generate-IaC.html

アカウントスキャンすると今あるリソースが一覧化されて、そこからポチポチとコード化したいリソースを選択するだけで非常に簡単です。 Former2と比べてスキャンの時間はちょっとかかりますが、コーヒーでも淹れている間に終わります。

Former2に対してよかったところは関連リソースの抽出の精度です。 Former2でも選択したリソースで関連するものを一緒に選択することはできますが、直接参照の関係にあるリソースしか抽出されず、CloudFormationのリソースを意識した上で関連するものを選んでいく必要があります。

それに対して、VPCを選択するだけでサブネットやルーティングテーブルなどを候補に提示してくれるなど、 ユーザはそこまで細かく意識することなくIaCコードにする対象リソースを選択することができました。

こうして選んだリソースは、yamlまたはjson形式でCloudFormationのテンプレートとしてダウンロードすることができます。

出力されたコードを修正しながらテンプレート化する

IaCジェネレータから出力されたコードをそのまま流用できるテンプレートとして利用できればよいのですが、 なかなかそうもいきません。

固有情報だったり、テンプレートには適さない情報が含まれているので、修正する必要があります。

デバッグにおいては、根本原因の検出というものがあり、複数のエラーが出ているときに対処するべき箇所をわかりやすく表示することができます。

以下の例では、ELBの設定において、SubetとSubnetMappingが両方設定されているのでどちらか片方にしなさい、と書かれていて、ELBの設定ミスが原因でデプロイに失敗していることがすぐにわかります。

また、3/28のアップデートで、Application Composerとの連携が発表されています。

https://aws.amazon.com/about-aws/whats-new/2024/03/aws-cloudformation-console-visualization-stacks-application-composer/

これを活用することで、関係性がそのままだとわかりにくいリソース間の関係性をわかりやすく表示したり、もちろん編集することが可能です。

これらの機能を活用して効率良くIaC化をすすめることができます。

IaCジェネレータを利用する上での注意点と今後への期待

IaCジェネレータは非常に便利ですが、注意点もいくつかあります。

まず第一に出力されたパラメータを編集しないとそのままではエラーがおきる場所がいくつかあります。例えば

  • ALBのアクセスログを保存しない設定の場合、パラメータ access_logs.s3.bucket が空白で出力される。これは空白を許容しないのでパラメータごとテンプレートから削除しておかないとデプロイ時にエラーになる
  • 先述の通り、ALBの SubnetSubnetMappings は両方併記できないが、両方とも出力されている
  • Targetグループに実際に今登録されているターゲットの情報が含まれている

などなど。最後のはしかたがないと思いますが、実際にテンプレートとしてデプロイするためには、手直しが必要でした。 もちろんゼロから作成するよりはずっと楽ですが、CloudFormationを使ったことが無い人がこれを使って開発できるかというと難しいので、 あくまで補助ツールとして使うようにしましょう。

また、設定値はすべてハードコードされています。 テンプレートを横展開するためには適切なパラメータ抽出が必要ですが、これは利用者側で実施する必要があります。

最後に、ひとつのスタックとして出力されるので、これも運用面を考えると分割したほうがよいでしょう。 とはいえ、IaCジェネレータは関連リソースの機能が強いので、例えばVPCを選んで出力、ワークロードを選んで出力と段階ごとに出力することで、スタック分割のベースとなり、整備しやすいのではないかと思います。

今後、これらの今はユーザ側で修正が必要になる箇所もカバーされるようになると、もっと便利に使えると感じました。

まとめ

今回は、CloudFormationのIaCジェネレータを活用して 簡単に既存のリソースをIaC化する方法と、その際に活用できる最新の機能群、そしてIaCジェネレータを実際に利用した上での注意点をご紹介しました。

開発の初期段階からIaC化することは難しく試行錯誤しながら構成を決めて、それをテンプレ化したいというケースはよくあるので、 その際に活用して効率よく進めていきましょう。


See also

comments powered by Disqus