NRIネットコム Blog

NRIネットコム社員が様々な視点で、日々の気づきやナレッジを発信するメディアです

業務で担当したIaCのメリデメざっくりまとめてみました

本記事は  【Advent Calendar 2023】  8日目の記事です。
🎄  7日目  ▶▶ 本記事 ▶▶  9日目  🎅

こんにちは小山です。
今まで担当した案件ではIaCツールでインフラ構築を実施する機会が多くありました。

その経験をもとに、それぞれの特徴についてまとめてみようと思います。

今回対象とするIaCツールはTerraform,CloudFormation,AWS CDKの3つとさせていただきます。 AWSで環境構築する際だいたいこの3つが選択肢に入るんじゃないかなと思います。 ではそれぞれどのような特徴があり、どんなシステム開発をするときに最適なんでしょうか。

そもそもIaCって?


一言でまとめるならコードを使用してインフラを定義、構築する事です。

IaCを使用しない場合と比べると以下のメリットがあります。


・環境の複製が容易に可能

⇒コードをデプロイすることで異なる環境に同じ設定の環境がコマンド一発で作成ができる。

・エラーチェックが容易&エラーの低減

⇒コードで環境を定義することで複数人からのレビュー、またテストコードを用意することで自動でエラーの検出が可能となる。

・変更の追跡が可能

⇒従来の手動管理では、変更追跡をしたい場合AWSだとCloudTrail等からログを調査する必要がある。
Git管理することによって誰が、いつ、どのように変更を加えたかがわかる。

では紹介していきます。

まとめてみた

IaCツール 言語 対応サービス 特徴(メリット) 特徴(デメリット) こんな人たちにおススメ 備考(感想)
Terraform HCL(HashiCorp Language)
AWS

GCP

Azure

オンプレ

どのクラウドプロバイダーでも使用可能

組み込み関数や型制約の関数・moduleの仕様により抽象化することでコード量の削減が可能

HCLという独自の言語を使用するため、キャッチアップのハードルが他二つの言語と比べて高い

サポートを受けたい場合Terraform専用の登録が必要

マルチクラウドを使用してシステム開発したい場合

オンプレ⇔クラウドの混合システムを一つの言語で構築したい場合
オンプレまでもIaCで管理できるのは、他二つの言語にはない強みなのでオンプレ⇔クラウド移行の可能性がある(その逆パターンも然り)システムの場合事前にTerraformで開発しておくと、技術者の負担が少ない気がしました。
AWS CDK
TypeScript

Python

Java

C#

Go(開発者プレビュー)
AWS
プログラミング言語の補完機能を使用することでドキュメント参照を少なく実装ができる

(L2,L3コンストラクタを使用する場合)ベストプラクティスに基づいた抽象化がされているため、記述量が少ない
       
プログラミング言語を用いて開発するため言語によってはアプリケーションエンジニアも開発可能

プログラミング言語を用いて開発するため、プログラミング未経験者にはキャッチアップのハードルが高い

サービスのアップデートが激しく後方互換性の担保が難しい場合がある

とにかく早く環境を作りたい場合

人的リソースが少なくアプリケーションエンジニアがインフラ構築を兼任する場合
テストツールも各言語で使用されているものがそのまま使えるのも強みかなと思います
CloudFormation
JSON

YAML
AWS
JSON/YAMLでパラメータをそのまま記載するため、初学者でも始めやすい

AWSのサービスを使用するため、サポートが受けやすい

パラメータをそのまま記述するため、記述量が多くなりがち

サポートを受けながら開発したい場合

パラメータを明示的に指定しながら開発したい場合
EC2を1つポンと立てるような簡単なシステムの場合だとCloudFormationデザイナーをうまく使えたらテンプレート作成が簡単になるかもしれません。
個人的に複雑なシステムはGUI(デザイナー)で作成するのは確認工数等を考えた時に逆に不向きな気がするので小さく始める、みたいな時におススメです。

おわりに

皆さんがIaCツールを選定する際の判断基準の一つになれば幸いです。

執筆者:小山
AWSメインのクラウドエンジニア
旅とクラウドが好き、セキュリティ・アプリも好き(できる訳ではない)