猫でもわかるWebプログラミングと副業

本業エンジニアリングマネージャー。副業Webエンジニア。Web開発のヒントや、副業、日常生活のことを書きます。

Terraform と CloudFormation の違い、どちらを採用したらいいのか

Terraform と CloudFormation の概要

Terraform について

f:id:yoshiki_utakata:20200916081045p:plain

Terraform とは HashiCorp 社から提供されている構成管理ツールです。Ansible でサーバーのミドルウェアを管理するように、 Terraform では AWS等のリソースの管理を行います。

www.terraform.io

EC2インスタンスを増やしたり、設定を変更したり、といったことがコードで管理されるようになります。

www.hashicorp.com

HashiCorp 社は、あまり聞いたことがない人もいるかもしれませんが、サーバーの構成管理に関わるツールを多数提供している会社で、インフラに近いレイヤーを触っているエンジニアなら、よく聞く会社でしょう。

CloudFormation について

f:id:yoshiki_utakata:20200916081104p:plain

FloudFormation は AWS から提供されている構成管理ツールで、 Terraform とほぼ同じことができます。

Terraform は AWS 以外にも(GCP, Azure 等に)対応していますが、 CloudFormation は(基本的には) AWS のみの対応になります。

こう書くと、 Terraform のほうが対応範囲が広いので、 CloudFormation を使う意味はない と思うかもしれませんが、そんなことはありません(詳細は後述)。

Terraform についての僕の誤解

f:id:yoshiki_utakata:20200916081312p:plain

Terraform は AWS 以外にも、 GCP や Azure 、 Heroku 等、多数のプラットフォームに対応しています。

僕はこのあたりについて誤解していました。

サーバー構成を書いたら、GCPやAWS、Azure上どこでも同じ構成が再現できて、AWSからGCPに簡単に移行ができたりするイメージでした。*1

実際にはそのような意味ではありません。

アプリケーションは GCP で動かしたいが、DB は AWS で動かしたい というシチュエーションに対応できるのが Terraform なのです。CloudFormation ではこれをするのが難しいです。

ただ、通常、 AWS RDS を使いたいなら、アプリケーションは AWS EC2 で動かすと思います。

しかし、最初は AWS を使っていたが、GCP で良さそうな機能がリリースされたので、一部 GCP を使いたい といったことがあります。コレにも対応できるのが Terraform の強みの一つです。

Terrafom vs CloudFormation

Terraform のメリットは、AWS以外にも対応できる点以外にもあります。 CloudFormation は、AWS にしか対応していない代わりに、独自の強みもあります。

AWSの構成管理をしたい場合、どちらを選ぶかはプロダクトの内容や、個人の好みによります。

Terraform と CloudFormation の比較はこの記事がよくまとまっています。

qiita.com

個人的の経験から Terraform vs CloudFormation

僕は Terraform と CloudFormation を両方仕事で使ったことがあります。その中で感じた、それぞれの強みについてまとめるので、↑の Qiita 記事とあわせて参考にしてください。

CloudFormation の良いところ(Terraformの悪いところ)

  • AWS公式という安心感
    • AWSに新機能が追加された時のサポートの速さ等
  • 実行時エラーがあった場合にそこで止まって自動でロールバック
    • Terraform は自動でロールバックされないので、revert & 再実行を自分でやる
  • Web UI が提供されている
    • 見やすい、操作しやすい
    • ログイン情報をコード上で管理する必要がなくなる
      • Webでログインして CloudFormation ファイルをアップロードして流すだけ
      • Terraform の場合 CUI しかなく、秘匿情報は環境変数で設定するなどが必要。面倒
  • リソース再作成が必要な変更を行おうとしたらブロックできたりする
    • スペックの変更などは、リソース再作成が必要な場合がある
    • Terraform の場合、実行したらリソースが作り直される
    • CloudFormation は、リソース再作成をブロックする仕組みが充実している

Terraformの良いところ(CloudFormationの悪いところ)

  • 記述のシンプルさ、表現力の高さ
    • CloudFormation は YAML なので表現力が低い
      • YAML はプログラミング言語ではないため表現力が低い
      • モジュール分割するとか、変数定義するとか、簡単にできそうなことでも結構たいへん
      • Syantax Error に気づきづらい
  • terraform plan による実行計画のわかりやすさ
    • どのようにリソースが変更されるのか事前にわかるし、見やすい

僕の好みは Terraform

僕は Terraform の方が好みです

  • 記述が CloudFormation よりシンプルで読みやすい
    • CloudFormation の YAML はやっぱり辛いことが多い。記述量も多いし。
  • AWS 以外でも使える

AWS で Terraform を使う場合、このページが導入としてわかりやすかったので紹介しておきます。

dev.classmethod.jp

*1:こう思っていた一方、「どうやってそれを実現しているんだろう」という疑問は持っていました。