規範ガイダンス：AWSで利用可能なIaCツール比較ガイドの紹介

# はじめに
NTTデータの西川です。
普段は公共部門の技術集約組織でクラウドの導入支援に従事しています。

2024/2/23にAWS規範ガイダンスの1つとして、AWSで利用可能な5つのIaCツールの比較ガイドが公開されました。（2024/03/04時点で英語版のみ公開）

今回紹介する比較ガイド
Choosing an infrastructure as code tool for your organization
https://docs.aws.amazon.com/prescriptive-guidance/latest/choose-iac-tool/introduction.html

> AWS規範ガイダンスとは
実績のある戦略、ガイド、およびパターンを提供して、クラウド移行、モダナイゼーション、および最適化プロジェクトを促進するのに役立ちます。これらのリソースは、AWS の技術エキスパートと AWS パートナーのグローバルコミュニティが開発したもので、お客様が AWS でビジネス目標を実現するのをサポートしてきた長年の経験に基づきます。
https://aws.amazon.com/jp/prescriptive-guidance

「IaCツールを比較してみた」系の記事は技術ブログで散見されますが、今回紹介する比較ガイドはAWS公式のIaCツール比較ガイドです。
 
本ブログでは以下の内容を整理してみました。
- 比較ガイドの紹介
- ガイドの一部を紹介：AWS CloudFormation、AWS CDKを触った経験を元に所感を追記しました。
**※追記部分はBold表記としています。**
 
<br>
 
# 目次
- はじめに
- 比較ガイドの概要
- 比較ガイド
- AWS CloudFormation
- AWS CDK

# 比較ガイドの概要
本ガイドは大きく4つの章で構成されています。
- IaCツールの利点
- AWSリソースをプロビジョニング可能な5つのIaCツールの説明。
    - AWS CloudFormation（以降、CloudFormation）
    - AWS Serverless Application Model (以降、SAM)
    - AWS Cloud Development Kit (以降、CDK)
    - HashiCorp Terraform (以降、Terraform)
    - Pulumi
- 比較ガイド：チーム、組織、クラウド人材のニーズを満たすツールを選択するプロセスを示す。
- IaCツールを利用し始める際に参照するドキュメントの紹介。
 
# 比較ガイド
いきなりですが比較ガイドのまとめです。
＃ガイド本編の章構成とは異なります。
 
- パターン1【SAM】サーバレスサービスの利用が必要なケース
サーバーレス AWS ソリューションを管理またはデプロイしている場合は、SAMが適切なオプションになる可能性があります。基本的にはCloudFormation と同じ機能がすべて備わっています。また、AWS クラウドへのサーバーレス アプリケーションのテストとデプロイも簡素化されます。
 
- パターン2【CloudFormationまたはCDK】インフラをすべてAWSで構築しているケース
インフラをすべて AWS で構築している場合は、CloudFormation またはCDKが適しています。これらはすぐに使用できる状態管理を提供し、新しい機能や新しい AWS リソースをネイティブに利用することもできます。
 
- パターン3【Terraform】マルチクラウド対応が必要なケース
マルチクラウドまたはハイブリッド クラウド インフラストラクチャを管理する場合は、Terraformが適切なオプションになる可能性があります。幅広いプラグインが利用可能で、エンタープライズサポートオプションを備えたコミュニティがあります。
 
- パターン4：【CDK】AWSのベストプラクティスに沿ったインフラを構築したいケース
ベストプラクティスを備えたトップダウンのディストリビューションがあり、共通のプログラミング言語を使用して再利用可能なモジュールを作成、公開、配布するオーケストレーションがある場合は、CDK が適切なオプションになる可能性があります。
 
- パターン5：【Pulumi】マルチクラウド対応が必要なケース
組織が高レベルのリスクを許容でき、マルチクラウドまたはハイブリッド クラウド環境をサポートする必要がある場合は、Pulumi の使用を検討してください。

**パターン3と5の差分に関する記載が少ないので補足です。PulumiはPythonやTypeScriptなどのプログラミング言語で記述、Terraformは独自言語のHCL（HashiCorp Configuration Language）で記述する点などが異なります。**
 
以降、CloudFormationとCDKについてガイドの内容を紹介します。
 
# AWS CloudFormation
### ツール概要
CloudFormationは、テンプレートファイルを使用して AWS リソースのプロビジョニングを自動化するサービスです。テンプレートファイルはJSONまたはYAMLで記述します。
 
> CloudFormationの詳細は以下のBlack Beltを参照。
#1 基礎編（2023/7公開）
https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2023_CloudFormation-1_0731_v1.pdf
#2 基礎編（2023/12公開）
https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2023_CloudFormation-2_1231_v1.pdf
 
### CloudFormationを利用するメリット
- 変更セットを使用して、デプロイ前に変更内容をプレビュー可能な点。
- 変更セットのデプロイ中にエラーが発生した場合、自動的にロールバック可能な点。
- スタックセットを使用して、複数のAWSアカウントやリージョンにリソースをデプロイ可能な点。

**加えて個人的には、CloudFormationの実行結果をGUIで確認できるので、初学者に易しい＆直観的にわかりやすいと思っています。**
> 変更セット：既存スタックで管理しているリソースに対して提案された変更を要約したもの。
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-whatis-concepts.html#cfn-concepts-change-sets

> スタック：管理するAWSリソースをスタックと呼ばれる単一ユニットとして管理。スタックを作成、更新、削除することで、AWSリソースのコレクションを作成、更新、削除可能。
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-whatis-concepts.html#cfn-concepts-stacks

> スタックセット：単一の CloudFormation テンプレートを使用して、複数リージョンにわたって AWS アカウントにスタックを作成。スタック セットの CloudFormation テンプレートは、各スタック内のすべてのリソースを定義。
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-concepts.html
 

 
### CloudFormationを利用するデメリット
- JSONやYAMLに関する懸念点：インラインコメント、インデントについて触れられています。
- マルチクラウド非対応な点。
- 再利用可能な構造、モジュール化など、ロジックの組み込みが難しい点。
 
**特に個人的には大規模プロジェクトや複雑なリソース関係を管理する際に、テンプレートの冗長化、複雑化が懸念されると思っています。**
 
# AWS CDK
### ツール概要
CDKは使い慣れたプログラミング言語を使用してクラウドアプリケーションリソースを定義できるOSSのフレームワークです。JavaScript、TypeScript、Python、Java、C#、Go をサポートしています。CDK は、AWS CloudFormation を通じて安全かつ反復可能な方法でリソースをプロビジョニングします。
 
> CDKの詳細は以下のBlack Beltを参照。
Basic #1（2023/7公開）
https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2023_AWS-CDK-Basic-1-Overview_0731_v1.pdf
Basic #2（2023/8公開）
https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2023_AWS-CDK-Basic-2-Features_0831_v1.pdf
Basic #3（2023/8公開）
https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2023_AWS-CDK-Basic-3-AppDev_0831_v1.pdf
 
### CDKを利用するメリット
- for ループなどの論理構造を使用できるので、簡潔かつエラーのない方法でインフラストラクチャを宣言可能。
- コンストラクトの活用によって、開発の時間と労力を削減可能。
 
**特に個人的にはL2コンストラクトなどで抽象化できるため、以下の点がメリットと感じています。**
- CloudFormationに比べて記述量が少なくなる点。
- 自動的にAWSのベストプラクティスに沿った設計内容が反映される点。
 
### CDKを利用するデメリット
- 各 AWS アカウントにブーストラップ環境が必要。
- マルチクラウド非対応。
 
**加えて個人的には、メリットの点で述べた高度な抽象化によって自動作成されたリソースの管理が難しいと思ってます。具体的には自動作成されたRoleやSecurity Groupなどが大量に作成されるので管理方法を検討する必要があります。**

> ブートストラップ：デプロイする環境を準備するプロセス。ブートストラップは、リソースをデプロイするすべての環境に対して実行する必要がある 1 回限りのアクション。
 
余談ですが、私はこれからCDKに触れる機会が増えそうなので、以下のような先人の知恵を活かしていこうと思っています。これからCDKを始めようとしている方は是非参考にしてみてはいかがでしょうか。
>Best practices for developing and deploying cloud infrastructure with the AWS CDK
https://docs.aws.amazon.com/cdk/v2/guide/best-practices.html
AWS CDKのあるあるお悩みに答えたい
https://speakerdeck.com/tmokmss/answering-cdk-faqs
BLEA開発チームが学んだAWS CDKの開発プラクティス 2023年版
https://speakerdeck.com/konokenj/blea-cdk-dev-practice-2023
【AWS CDK】APP内でStackを分割をする際の注意 ※
https://qiita.com/akwayne/items/eb0c146fab5fb6ac8906
※私と同じNTTデータの組織に所属する方の記事です。
 
# まとめ
AWSでIaCツールの利用を検討する際に最初に目を通すガイドとして、活用できそうな資料かと思いました。本ブログを通して気になった方は比較ガイドを一読してみてはいかがでしょうか。

最新状況については、比較ガイドや各IaCツールに関する最新の公開情報をご確認ください。
※ 本ブログに記載した内容は個人の見解であり、所属する会社、組織とは関係ありません。

<br>

以下、本ガイドから少し脱線しますが、IaCツールのシェアを調べてみました。
1：JAWS DAYSのセッション内アンケート
先日参加した「JAWS DAYS 2024 - LEAP BEYOND」で利用しているIaCツールについてアンケートが行われました。アンケート結果は「CloudFormation86名、Terraform65名、CDK59名、SAM24名」といったところでした。
CloudFormationが1番多いのは、「CloudFormation単体で利用」と「CDK経由でCloudFormationを利用」の数が加算された結果なのかな？と想像しています。

![iac1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570843/b4dc3f2a-5cfc-c188-8392-2d839f8512ee.png)
＃左からCloudFormation, Terraform, SAM, CDK, Pulumi, Others
> 引用元：https://speakerdeck.com/rrrraaaaa6/boku-no-kangaeta-saikiyou-no_mentimeter?slide=3
セッション概要：https://jawsdays2024.jaws-ug.jp/sessions/timetable/C-1/

2：Google Trendsで比較
Terraformがマルチクラウド対応していることもあり、Terraformが圧倒的に検索されています。また、2020/9頃からCDKはCloudFormationより検索されているようです。最近AWS公式BlogでもCDKネタが増えているので、これからCDKはより使われていくのかなと感じました。

![iac2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570843/bc997910-af92-4ebc-6dbe-bb54ff267407.png)
> Google Trends：Google 検索でのトレンドをグラフで可視化できるツール。