IaCとTerraform

皆さん、こんにちは。技術開発グループのn-ozawanです。
桜が見頃ですね。当社の近くにある旧芝離宮恩賜庭園では桜が満開でとても綺麗でした。

本題です。
私はこれまで主にアプリ開発をしており、インフラにはノータッチだったのですが、最近のクラウド環境に興味を持ち、TerraformによるAWSクラウド環境構築を勉強しました。今回はIaCとTerraformを紹介したいと思います。

IaC (Infrastructure as Code) とは

IaCとは、サーバーなどのインフラ環境を、手作業ではなく、コードにより自動的に構築する手法です。例えばApacheなどのHTTPサーバーを構築する際、従来は手作業によりコマンドを入力して構築していたところを、事前に作成したコードを元に構築します。

インフラ構築の手順をコード化すればいいので、シェルスクリプトで構築できればそれも立派なIaCです。IaCツールにはAnsibleやTerraformなどがあります。

メリット

IaCのメリットは以下となります。
・手作業によるオペミスがなくなる
・同じ環境を複製することが出来る(再現性がある)
・コード化することにより、自動化、バージョン管理、第三者のレビュー、CI/CDが行える

今回、IaCツールとしてTerraformを使い、AWSクラウドを構築してみた所感ですが、とても良く感じられました。AWSクラウドを構築するとどうしても料金が発生するため、業務の終わりには構築した環境を破棄する必要があります。Terraformでコード化しておくと、構築と破棄が簡単に行えます。

デメリット

一方でIaCには以下のデメリットを指摘する声もあります。
・コード化するのに、手作業以上に工数がかかる
・工数をかけて作成したコードに対して、費用対効果が薄い

コード化する、つまりエンジニアがコーディングする、ということです。当たり前ですがコーディングする工数が必要になります。コーディングルールも定めないといけません。また、専門的な知識も必要ですので、その学習コストを考慮する必要があるかもしれません。

先ほど私が「構築と破棄が手軽に行えるのは魅力的」と言いましたが、実際の運用ではそうそう破棄なんてしません。一度構築すれば、特別な理由がない限りはそのままです。頑張って工数かけてコード化したけど、最初の1回しか使われないのであれば、手作業による構築で十分とも言えます。

とはいえ先ほども述べた通りIaCのメリットはあります。何もかもコード化するのではなく、費用対効果を考慮して、必要であればコード化するのが良いかと思います。IaCに限った話ではありませんが、メリットとデメリットの両方を理解して適切に使っていきたいものですね。

Terraform とは

TerraformとはHashiCorp社が開発したIaCツールの1つであり、AWSなどのクラウド環境を構築することが出来ます。AWS以外にもAzureやGCPにも対応しており、Kubernetesのクラスターに対して操作することも可能です。

IaCツールには昔からAnsibleが有名ですが、Ansibleは手作業で行うプロセスをコード化する「命令的なコード」に対して、Terraformは「宣言的なコード」で記載するという違いがあります。近年、アプリ開発の現場でも宣言的なコードが好まれる傾向にあり、IaCツールもTerraformが多くの技術者に支持されています。
※命令的なコードと、宣言的なコードの違いついては別の機会でお話しします。

HCL

TerraformはHCL (HashiCorp Configuration Language) という、Terraform独自の文法で記述します。例えば以下のように記述して実行すればAWSクラウド環境にEC2インスタンスが構築されます。

resource "aws_instance" "example" {
  ami = "ami-0c3fd0f5d33134a76"
  instance_type="t2.micro"
}

おわりに

Terraformはクラウド環境構築のIaCツールとしてデファクトスタンダードとなりつつあります。今回初めてIaCで環境を構築してみたのですが、特に違和感なくコーディングすることが出来ました。そういう扱いやすさも人気の一つかもしれません。
Terraformに関しては次回以降も取り上げていきたいと思います。

Recommendおすすめブログ