IaC ツールの理解:CloudFormation vs. Terraform

AWS CloudFormationとTerraform — どちらを選ぶべきか悩んでいますか?この記事は、賢明な決定を下す手助けをします。

クラウドコンピューティングはDevOpsの世界を革命的に変えました。それはもはや流行語ではなく、私たちのアプリケーションの開発と維持の方法を変えるためにここにあります。すべての規模のビジネスにクラウドコンピューティングを使用すべき理由は数え切れませんが、少しの制限があります:インフラストラクチャを手動でプロビジョニングする必要があります。

クラウドプロバイダーのコンソールにアクセスし、正確に何を望んでいるかを伝えなければなりません。これは小規模なユースケースにはうまく機能しますが、異なる人々がコンソールで設定変更を行う場合はどうでしょうか?非常に複雑なインフラストラクチャになり、維持がますます困難になる可能性があります。クラウドインフラストラクチャの変更を追跡したり、効率的にコラボレーションしたりする方法はありません。さて、インフラストラクチャをコードとして扱う方法があります。

インフラストラクチャとしてのコード(IaC)は、クラウドコンピューティングにおけるトレンド用語です。それは、IT IaCを管理するプロセスです。そうです、その通りです。コンソールにアクセスしてすべてを手動で行う代わりに、IaCを使用すると、クラウドインフラストラクチャをプロビジョニングするための設定ファイルを書くことができます。IaCは、一貫性、簡単で迅速なメンテナンス、人為的エラーの余地がないといった利点を私たちに提供します。

Amazon Web ServicesでのIaCの使用

AWSは、世界で最も先進的なクラウドコンピューティングサービスであり、次のクラウドプロバイダーの市場シェアの倍を誇ります。数百から数千のユースケースに対応できる200以上のサービスを提供しています。

AWSでIaCを使用し始めるとき、AWS CloudFormationとオープンソースツールTerraformの2つに絞ることが多くなります。どちらかを選ぶ際には、両方のツールが提供する多数の機能を理解するのが圧倒的に難しい場合があります。この記事では、AWS CloudFormationとTerraformの違いを検証し、どちらのツールがあなたのニーズにより適しているかを決定するのに役立てます。

TerraformとAWS CloudFormation:違い

モジュラリティ

大規模な組織でIaCを使用する際、モジュラリティは適切なツールを選ぶ上で重要な要素となることがあります。

CloudFormation

CloudFormationは、モジュールに対するネイティブサポートを持っていません。代わりに、モジュールとして使用できる「ネストされたスタック」と呼ばれるものを利用することができます。

例えば、組織内でS3バケットをプロビジョニングするための標準のCloudFormationテンプレートを作成することができます。エンドユーザーがS3バケットを作成したい場合、このCloudFormationテンプレートをネストされたスタックとして使用して標準のS3バケットをプロビジョニングすることができます。

また、AWSサービスであるAWSサービスカタログもあり、CloudFormationのモジュール化に役立ちます。AWSサービスカタログは、コンプライアンス、セキュリティ、コスト、パフォーマンスの要件を満たすために、AWSサービスの範囲を制限する必要がある組織向けに設計されています。バックエンドではCloudFormationテンプレートを使用します。

例を使ってこれを理解しましょう。適切に使用しないと、S3バケットは機密データに対してすぐに壊滅的な影響を及ぼす可能性があります。同じ例を考えましょう。組織内でS3を使用する標準的な方法を確立したいとします。最初のオプションは、他のCloudFormationスタック内で使用できるネストされたスタックテンプレートを作成することであり、同様に優れた方法です。

または、AWSサービスカタログを使用することもできます。これにより、ユーザーはコンソールUIからこの標準テンプレートを使用し、わずかなカスタマイズのためのいくつかのパラメーターを指定することができます。これにより、AWSアカウントでインフラストラクチャがプロビジョニングされる方法を制御し、望ましくないシナリオを防ぐことができます。

CloudFormationのネストされたスタックとAWSサービスカタログの使用は、大規模な組織での標準的な構成もサポートできますが、より多くの手動の設定が必要になる場合があります。

Terraform

Terraformはモジュールをネイティブにサポートしています。これにより、AWS CloudFormationと同様の標準的な構成を作成し、他のTerraform構成で使用することができます。

Terraformはオープンソースのツールなので、Terraform Registryでいくつかの事前に作成されたオープンソースのモジュールを見つけて使用することもできます。また、独自の構成で独自のモジュールを作成し、プライベートモジュールレジストリにホストすることもできます。

Terraformのモジュールへのネイティブなサポートは、モジュラリティへの簡単なアプローチを提供します。ただし、大規模なチーム間でモジュールを管理する場合は、適切な使用を確保するために追加のガバナンスが必要となる場合があります。

CloudFormation内でのネストされたスタックの使用は、Terraformのモジュールの使用ほど簡単ではありません。主な要因は、CFNテンプレートからネストされたスタックへのデータの受け渡しが複雑であることです。

CloudFormationにはテンプレートを共有するための中央リポジトリがありません。AWS Service Catalogを使用すると、このプロセスを管理できますが、主にコンソールを介してルールを強制します。CloudFormationテンプレートは複雑なタスクをカプセル化できますが、リソースを作成する際には引数を指定する必要があります。

一方、Terraformにはモジュールを作成、維持、共有するための一連の方法があります。Terraform Module Registryでモジュールの正確な要件を確認し、簡単にTerraformファイルで使用できます。

インフラストラクチャの制御とガバナンス

AWSアカウントで作成できるリソースを制限したい場合、AWS CloudFormationとTerraformを使用してそれを行う手段が提供されます。

CloudFormation

CloudFormationはIAMポリシーを介して制御を提供し、ユーザーがリソースへのアクセスを管理できるようにします。ただし、この制御はAWS固有のものであり、インフラストラクチャが完全にAWSに中心的な場合には理想的です。

私たちのS3バケットの例では、ユーザーが”S3 Create”権限を制限し、AWS Service CatalogやネストされたスタックからのみS3バケットを作成できるようにしたいと思うかもしれません。

Terraform

Terraformを使用すると、ポリシーとしてのコードツールであるSentinelを使用して、ユーザーが作成できるリソースを制御することができます。Sentinelを使用すると、Terraformを介してユーザーアクションを許可または拒否するための細かい論理ベースのポリシーを強制することができます。例えば、S3バケットを作成するすべてのリソースを拒否し、ユーザーが標準モジュールからのみS3バケットを作成できるようにすることができます。

状態管理

AWS CloudFormationとTerraformは管理するリソースを追跡する必要があります。

Terraform

Terraformはインフラストラクチャの状態を状態ファイルに保存します。このファイルはデフォルトでローカルに保存されますが、S3などのリモートバックエンドに保存したり、複数のユーザーが同じインフラストラクチャセットに変更を加えることができます。

CloudFormation

CloudFormationはバックグラウンドで状態管理を行うため、ユーザーは状態ファイルを手動で管理する必要はありません。これは、完全に管理されたサービスを望むユーザーにとって良いです。

AWS CloudFormationとTerraformの両方は、インフラストラクチャに対してどのような変更が行われるかを確認することができます。Terraformでは、「terraform plan」コマンドを実行することで、Terraformがどのように設定変更を適用する予定なのかを確認できます。CloudFormationでは、ユーザーは変更セットを通じてこの情報を見ることができます。

言語

Terraform

Terraformは、HashiCorpによって作成されたHashiCorp構成言語(HCL)を使用しています。これはJSONに非常に似ており、追加の組み込み機能や能力があります。

CloudFormation

CloudFormationテンプレートは、YAMLまたはJSON形式で記述されます。

ログとロールバック

AWS CloudFormationとTerraformの両方には、優れたログ機能があります。私の経験では、エラーや問題は比較的明確でした(大部分は)。

CloudFormation

デフォルトでは、CloudFormationはスタック変更が失敗した場合にすべての変更をロールバックします。これは良い機能ですが、デバッグ目的で無効にすることもできます。

Terraform

Terraformは、失敗した場合に自動的に変更をロールバックしません。これは問題ではなく、Terraform destroyコマンドを実行して部分的にプロビジョニングされた設定を削除し、Terraformの実行を再開することができます。

スコープ

Terraform

Terraformのマルチクラウドサポートにより、AWS、Azure、Google Cloud、およびその他のプラットフォームにわたってインフラストラクチャを展開することができ、マルチクラウド環境で作業する際の柔軟性を提供します。

CloudFormation

CloudFormation は AWS と緊密に統合されており、AWS 専用のインフラストラクチャに最適ですが、マルチクラウド環境には制限があります。

機能サポート

CloudFormation

AWS CloudFormation は、AWS との密接な統合から、新しいサービスや機能の更新を最初に受け取ることが一般的です。

Terraform

Terraform が一部の AWS 機能に欠ける場合、CloudFormation スタックを Terraform コードに直接統合することで回避策を見つけることができます。

技術サポート

CloudFormation

有料の AWS 技術サポートプランには CloudFormation サポートも含まれます。

Terraform

HashiCorp には Terraform の技術サポート用の有料プランもあります。

結論

AWS CloudFormation と Terraform はどちらも堅牢で完全に開発されたツールであり、それぞれに利点があります。上記の違いは、どのツールがあなたのニーズに最適かを判断するのに役立ちます。複数のクラウドプラットフォームを使用する場合は、Terraform がマルチクラウドサポートを提供していますが、AWS CloudFormation は AWS 固有の環境には優れた選択肢です。最終的に、どちらのツールも公平な選択肢であり、IaC を効果的に管理することができます。適切な選択肢は、AWS に焦点を当てるか複数のクラウドプロバイダーと連携するかによって異なります。

Source:
https://dzone.com/articles/understanding-iac-tools-cloudformation-vs-terraform