AWS インフラ クラウド

【IaC】TerraformとAWS CDKの比較

2021年11月22日

こんにちは、yassanです。
今回はAWS向けIaCツールの2大巨塔のTerraformとAWS CDKを比較したいと思います。

Infrastructure as Code とは?

そもそもIaCとはなんぞや?という方のために簡単におさらいしておきます。

Infrastrucure as Code (IaC) は、インフラ環境をコードで管理する考え方です。

従来はインフラリソースを手作業で管理していました。
リソースはパブリッククラウドの管理画面から管理して、OS以上の設定はコマンドで管理しますよね。

このようなリソースの管理の仕方では、都度手を動かすため工数がかかりますし、本番環境や開発環境などに差異が生まれてしまったりといったデメリットがあります。

そこで、これらのデメリットを払拭できるのが、IaCです。
インフラリソースをコードで管理するので、コードは使いまわせるので資産になりますし、パラメータさえ変えなければ環境ごとの際も生まれません。
(その分、属人化しやすいためコード管理・バージョン管理が重要になります。)

このように、IaCは従来のインフラリソースの方法を刷新する新たな考え方です。
IaCを実現するにはツールが必要で、それが今回比較するTerraformとAWS CDKです。

Terraform

TerraformはHashicorp社が提供するサービスの一つです。

主な特徴

Terraformは、以下の特徴があります。

ベンダーに依存しない

Terraformの一番大きな特徴が、ベンダーに依存しないことです。
AWSやGCPをはじめ、各クラウドサービスに対応しています。

各ベンダーが提供しているWebAPIを叩く形でTerraformは実行されるため、
AWSで言えばマネジメントコンソールでできることは、基本的にできると思っていて良いです。

Terraformはマルチクラウド構成でオーケストレーションする場合には、非常に役立ちます。
一方で、何か困ったことがある時にベンダーのサポートを利用することはできないので注意が必要です。

HCL言語で記述する

TerraformはHCLという独自の言語で記述します。
独自の言語といっても、jsonやyamlと同じようにkey-valueの形式で記述する仕様になっています。

そのため、プログラミングに精通していない人でも読解・コーディングすることが可能です。
一方で、コードの長さが冗長になったり、リファクタリングが難しいというデメリットもあります。

既存のリソースとコードの比較が可能

Terraformは既存のリソースとコードの差分を確認することができます。

コードで全てのリソースを管理するのは、どうしても難しいケースがあります。
例えば、緊急でマネジメントコンソールからリソースの内容を変更する場合もあるかと思います。

このように、実際のリソースとコードに差異が生まれた時に、その差分を覚えておくのはかなり大変です。
Terraformでは、この差分を確認するコマンドがあります。

ライフサイクル

Terraformのライフサイクルは、以下の通りです。

https://www.terraform.io より引用

開発者はコードを書き、"Plan"と"Apply"という工程を経てから、各ベンダーのAPIを実行してリソースを管理します。

図で表現している通り、コードは最初から作っても良いですし、Communityに共有されているコードを利用することも可能です。

"Plan"の工程では、このコードで実行したときの実際のリソースの差分を表示してくれます。
つまり、意図通りの変更ができるかどうかを試してみることができます。
文字通り、TerraformのPlanコマンドで実行できます。

"Apply"の工程では、コードを実行して実際にリソースを更新します。
こちらも、TerraformのApplyコマンドで実行できます。

採用するユースケース

採用するユースケースとしては、

  • マルチクラウドのリソースを管理する場合
  • 担当者が、Key-Valueの言語を使える場合
  • 今後どのように展開するかわからない場合

です。

おまけ

Terraformは現在、他の言語でプロビジョンされてます。

https://learn.hashicorp.com/tutorials/terraform/cdktf より引用

npmやpipでインストールして使うことができます。

AWS CDK

AWS CDKは、言わずもがなAWSが提供するサービスの一つです。

主な特徴

AWS CDKは以下の特徴があります。

TypeScriptやPythonでコードを書ける

AWS CDKはTypeScriptやPythonといった、一般的なプログラミング言語で記述することができます。
(AWS CDK自体がTypeScriptで動いています。)

プログラミングに精通している人であれば、自分の慣れた言語で記述することができるので非常に効率的です。
また、繰り返しやオブジェクト指向などの概念も使うことができます。

全体のコード量としても、言語の特性としてCloudformationよりも圧倒的に少なくなることも期待できます。

AWSのサポートが受けられる

AWS CDKはAWSが提供しているため、AWSのサポートを受けることができます。
AWSはサポート体制が非常に充実しているため、本当に困った時の予防線として重宝できます。

既存リソースとの比較ができない

後述しますが、AWS CDKはCFnを介してリソースを管理するため、Terraformのように既存リソースとの比較ができません。
また、既存リソースからのインポートもできません。

したがって、AWS CDKで管理するのであれば極力直接リソースを操作するのは避けた方が良いです。

ライフサイクル

AWS CDKのライフサイクルは、以下のとおりです。

https://aws.amazon.com/jp/blogs/news/aws-cdk-developer-preview より引用

CDKで様々なリソースを管理するコードを作成し、CLI上のコマンドでコンパイルします。
コンパイルしてできるのが、CFnのテンプレートですので、それを実行することでリソースを管理できます。

特徴は、CFnを中継してリソースを管理することです。
CDKから直接リソースを操作することができないので、上記のようなメリットデメリットを持ちます。

採用するユースケース

AWS CDKを採用するユースケースは、

  • IaCで管理するリソースはAWSのみの場合
  • 担当者がCloudFormationに精通している場合
  • 担当者がオブジェクト指向などのテクニックに精通している場合
  • いざという時にはAWSサポートを活用したい場合

です。

まとめ

というわけで、TerraformとAWS CDKの比較でした。

総合的にはTerraformの方が使い勝手が良いような書き方をしてしまったかもしれません。
AWS Onlyでやっていく場合や、AWSリソースはIaCで管理するという方針ならば、AWS CDKの方が良いと思います。

以上、TerraformとAWS CDKの比較 でした

AWS学習におすすめの書籍

AWSについて、しっかりと基礎から学びたい、実践的なスキルを身につけたいと考えている方向けに、おすすめの書籍を紹介します。
これらの書籍は、実際にAWSエンジニアとして働く僕が参考にしている書籍です。

AWSエンジニア入門講座――学習ロードマップで体系的に学ぶ

AWSを使いこなすための前提となるITインフラの知識が足りない初学者にとって、どこからどのように学べばよいのかがわかりづらくなっています。そこで本書では、AWS学習サイト運営YouTuberである監修者自身が実サービスの導入で習得しながら体系化した「学習ロードマップ」に沿って、AWSのサービスとIT技術をやさしく解説していきます。

著者が作成した学習ロードマップに沿って、AWSやインフラストラクチャを体系的に学ぶことができます。
付属のロードマップの完成度が高く、学習に迷ったときや復習にも使えます。
これからAWSエンジニアを目指す方や、インフラストラクチャを基礎から学びたい方におすすめです。

Amazon Web Services 業務システム設計・移行ガイド

オンプレミス上に構築された業務システムをAWS上に移行するための「サービスの選定」「ネットワーク設計・構築」「サーバとデータの移し方」「運用・監視体制の構築」など。これまで多くの企業にAWSを導入し、コンサルティングフェーズから実際の設計・開発、運用フェーズまでの全行程に携わってきた著者陣のノウハウを凝縮して、一般的な企業にAWSを導入する際のベストプラクティスをお届けします。

実務を想定した様々なユースケースとそれに対するベストプラクティスを、設計構築から運用まで幅広くカバーして紹介しています。
タイトルからは移行に焦点を当てたように見えますが、僕としては移行に限らずエンタープライズとしてAWSを利用する上で知っておくべきことが記されていると思います。
より実践的な知識やノウハウを身に着けたい方、初学者から一皮むけたい方におすすめです。

-AWS, インフラ, クラウド
-, , , ,