CloudFormationとTerraformはどちらを使うべき?

CloudFormationとTerraformはどちらを使うべき?

Hidemasa Toma

Hidemasa Toma

近年、インフラをコード化する技術であるIaCの手段として、CloudFormationとTerraformが注目を集めています。

ですが、CloudFormationとTerraformにはそれぞれに特徴があり、どちらを選択すべきか悩む場合も多いでしょう。

そこで、本記事ではCloudFormationとTerraformの特徴や、どのような場合にどちらのツールを使用すべきかを判断するための基準についてお伝えします。

そもそもIaCとは

まずは、IaCについて説明します。

IaCとは「Infrastructure as Code」の略で、サーバーなどのシステムインフラの構築を、コードを用いて行うことを表します。このIaCを利用することで、必要なソフトウェアのインストールや、各種設定を自動的に行えるようになります。

IaCのメリットとデメリットとしては、以下のものがあげられます。

IaCのメリット
  • 手動オペレーションによる人的ミスを最小化できる(コードで環境をレビューできる、Pull Requestで証跡を残せるなど)
  • コピペでサクサク作れる(同じ環境を別のアカウントでも簡単に展開できる)
IaCのデメリット
  • コードに起こす手間がかかる
  • 設計や、Gitのフローをしっかりと組まないと運用が負担になる

CloudFormationとは

CloudFormationはプログラミング言語やテキストファイルを使用してAWSリソースを自動で構築するIaCツールです。

CloudFormationでは、JSON/YAML形式のテキストファイルであるテンプレート(設計図)を使用するため、プログラミングコードが書けなくても使用できます。一方で、プログラミング的な書き方ができないため、たとえば100個同じものを作成するような場合、100個同じものを並べる必要があります。

ただし、AWS CDKを使えばその問題も解決できます。

AWS CDKとは、AWS上のリソースをコンポーネント化して提供し、AWS上でのアプリケーション開発を支援するサービスです。プログラミング言語で書いたコードが、CloudFormationのリソースとして出力されます。

AWS CDKでは、一般的なCloudFormationのように明示的にすべてのリソースを記述できるほか、数行で複数のリソースを作れるモジュールも提供されています。なお、AWS CDKはJavaScript、TypeScript、Python、Java、C#で利用が可能です。

Terraformとは

Terraformとは、HashiCorp社が手がけるオープンソースのIaCツールです。

Providerを独自で用意することができ、HCL(HashiCorp Configuration Language)でインフラを記述します。AWS以外にもGCP、Azure、DigitalOcean、CloudFlareなどが対応しています。

ですが、ローカルPCなどのマシン上で実行するため、キーの管理を検討する必要があります。

CloudFormationとTerraformのメリットとデメリット

CloudFormation Terraform 備考
UI CloudFormation:

  • GUI(AWSコンソール)
  • CUI(AWSCLI)

Terraform:

  • CUI(terraformコマンド)
異なるリージョンへのデプロイ CloudFormation:

  • StackSetsを使って異なるリージョンへのリソース作成/更新/削除が可能
  • 異なるアカウントへのデプロイが可能

Terraform:

  • 異なるProviderを用いることで可能
異なるIaaSへのデプロイ × CloudFormation:

  • AWSサービスのため他のプラットフォームへのデプロイは対応していない

Terraform:

  • Providerを切り替えることで異なるIaaSにデプロイが行える
差分検出 CloudFormation:

  • ドリフト検出という機能がある
  • 環境とコードの差分を自動で検出する機能
  • Configルールと組み合わせてSlackで通知も可能

Terraform:

  • Planコマンドを実行してStateとの差分を比較する
  • オプションを付けることでコールバックからの差分検出が可能になるため、プログラムで通知をすることが可能
  • 自動化したい場合は作り込みが必要になる
ロジック CloudFormation:

  • Conditionsセクションを使用する

Terraform:

  • いわゆるプログラミング言語に近い記述ができる(分岐処理はない)
排他制御 CloudFormation:

  • 実行中はCREATE_IN_PROGRESSステータスになり、その最中は変更不可

Terraform:

  • Stateをどこに置くかによって異なる
  • DynamoDB lockを用いれば排他制御は可能
バージョン管理 × CloudFormation:

  • バージョンの概念がない

Terraform:

  • Terraformそのものと Providerのバージョンを管理する
開発ツール CloudFormation:

  • Cfn-lintというLinterがある
  • 構文チェックなどをしてくれる
  • IDE(VSCode)のプラグインもある
  • フォーマットを自動修正してくれる機能はない

Terraform:

  • TFLintというLinterがある
  • 構文チェックなどをしてくれる
  • IDE(VSCode)のプラグインはない
  • terraform fmtというコマンドでフォーマットを自動修正してくれる
状態の管理 CloudFormation:

  • スタック生成時のオプションで設定可能

Terraform:

  • コードとして表現する必要がある(全リソース分、明示的に)
リソースのタグ付け CloudFormation:

  • AWSのサービスで管理(自動)

Terraform:

  • ファイルで管理
変更内容のチェック CloudFormation:

  • 「変更セット」という機能を使って確認する
  • 場合によっては見づらい

Terraform:

  • terraform plan を実行することで確認でき、変更点に色付けをしてくれるので見やすい
一部リソースの再作成 CloudFormation:

  • 該当リソースに関する記述を削除したテンプレートを用いてスタックを更新し、その後元のテンプレートで改めてスタックを更新する必要がある

Terraform:

  • taintで簡単に実現可能
適用失敗時のロールバック × CloudFormation:

  • ロールバック機能あり

Terraform:

  • ロールバック機能なし
手動作成リソースの取り込み CloudFormation:

  • CloudFormationスタックに既存リソースをインポートする機能ががある

Terraform:

  • terraform import により実現できるが、対応していないリソースも存在する

なお、CloudFormationとTerraformを選ぶ際には、以下の基準に照らし合わせる必要があります。

  • 納品物として指定があるか
  • 採用した技術の特性をチームで理解し運用していけるか
  • それぞれのメリット、デメリットが案件にマッチしているか

まとめ

今回は、CloudFormationとTerraformについて解説しました。

Terraformのすごい部分は、アプリはGCP、データベースはAWSといったように、異なるプラットフォームのサービスを組み合わせたインフラ構成の実現ができるところにあります。

しかしながら、AWSのみで構築する場合にはAWSの手厚いサポートを受けられるという大きなメリットがあるため、普段使用するサービスとしてはCloudformationのみで十分だと思います。

そのため、記事内でも述べましたが、案件の状況に合わせて使用するサービスを選定しましょう。

この記事のシェア数

Hidemasa Toma
Hidemasa Toma Technology / Technical Director / 當眞 秀将

2010年よりJAVAエンジニアとしてキャリアをスタート。政令指定都市基幹システムや県庁向け事務システムの開発等に従事。設計・実装・テストだけでなく数十名規模の案件でのPMも経験。LIGに入社後は、日系大手アイウェアブランドUS支社のECサイトプラットフォーム開発案件で、TDとして約20名のフィリピンメンバーと案件を推進。

このメンバーの記事をもっと読む
デザイン力 × グローバル体制を活かしたシステム・アプリ開発
お問い合わせ サービス詳細/実績