Terraformとは
インフラリソースをコードで定義して管理することをInfrastructure as Code(IaC)と呼びます。
Terraformは、HashiCorp社により開発されているオープンソースのIaCツールであり、クラウドを扱うIaCツールとしてデファクトスタンダードの地位を確立しています。
Terraformを使用すると、AWSやGCPなどのクラウドサービス上のインフラ環境(Webサーバーやデータベースなど)をコードで定義し、コードに基づいたインフラ環境を自動構築することができます。また、コードを見るだけでインフラの構成内容を理解できるようになりますし、インフラ環境もGitなどのツールでバージョン管理ができるようになります。
結果として、Terraformを利用することでオペレーションミスが無くなるほか、実体とドキュメントの二重管理から解放され、複数システムでコードを再利用することで効率化を図ることが出来ます。様々なリソースが必要となる場合に、手動で行うよりもアジリティの高いインフラ開発が可能になります。
Ansibleとは
AnsibleもIaCツールとしてはという有名でよく使われます。
Terraformはインフラ構築(サーバ/DB、ネットワーク設定)を得意とするIaCツールであるのに対し、Ansibleはアプリケーション環境の構築(ミドルウェアの導入、アプリデプロイ)を得意とします。
TerraformとAnsibleにはそれぞれ得意とするプロビジョニングレイヤが異なりますので、双方を効果的に使い分けることでIaCの効果を最大化することが出来ます。
その他のIaCツール
Terraformと同様にインフラ構築に強みを持つツールとしてGoogle Cloud Deployment ManagerやAWS CloudFormation、Azure Resource Managerなどが存在します。これらのツールはそれぞれのクラウドベンダーが自社サービスを扱うために開発されたツールですので、マルチクラウド環境においてはコードを統一して管理することが出来ません。その点、Terraformであれば1つのツールで複数のクラウドに対応可能なので、一貫性のある効率的な運用が可能となります。
Terraformの基本操作
TerraformのコードはHCL(HashiCorp Configuration Language)という言語で実装します。
(HCLはHashiCorp社が設計した言語)
init
Terraformのコードが格納されるディレクトリで「terraform init」コマンドを実行すると、リソースに必要なバイナリファイル(プロバイダなど)がダウンロードされます。
plan
「terraform plan」コマンドを実行するとどのような変更を実行するかという実行計画が出力されます。このコマンドにより、実際のリソースに変更を加えることなく、一連の変更の実行計画が正しいかどうかを確認することができます。
apply
「terraform apply」コマンドを実行するとplan の結果が表示され、最終確認が行われます。yes と入力するとリソース作成が行われます。
destroy
「terraform destroy」コマンドを実行するとapply と同様にplan の結果が表示され、最終確認が行われます。yes と入力すると作成されたリソースが削除されます。
Terraformのファイル構成
Terraformでは、tfファイル(拡張子が.tf)で定義された情報に従って各種リソースを構築します。
単一ファイルにすべてを定義することも可能ですが、分離することが一般的です。
標準構造に従った最小限の推奨モジュール構成として以下の構成が定められています。
.
├── README.md
├── main.tf
├── variables.tf
├── outputs.tf
(参考)Terraform公式サイト
README.md
tfファイルで定義したリソースについての説明ドキュメントとして用意します。作成されるリソースについての説明等を記述します。
main.tf
リソース定義(ファイル名は任意)を行うファイルです。以下のような項目をブロックを分けて定義します。
resourceブロック
作成するクラウドリソースを指定します。以下はAWSでEC2リソースを指定する場合の例です。
「resource “<リースの種類>” “<リソース名>” {}」という構文で定義します。
リソースの種類を指定する例として、VPCの場合は「aws_vpc」、セキュリティグループの場合は「aws_security_group」のように指定します。
resource "aws_instance" "web_server" {
instance_type = "t2.micro"
ami = "ami-00000000000000000"
}
providerブロック
構築するリソースのプロバイダー情報を記載します。
プロバイダはAWS、GCP、AzureなどのAPIの違いを吸収するラッパの役割を果たします。
以下はAWSのリソースを作成する場合の例です。
provider には”aws”を定義し、regionには、リソース構築先のAWSリージョンを指定します。
プロバイダはTerraform本体とは別で管理されており、terraformm init コマンドで、指定したプロバイダのバイナリファイルをダウンロードする必要があります。
provider "aws" {
region = "ap-northeast-1"
}
moduleブロック
Terraformコードを分割してモジュール化する仕組みがあり、以下のように定義することができます。
モジュールごとにディレクトリを分ける必要があり、モジュール定義では対象のディレクトリを指定します。
module "network" {
source = "./network"
}
variables.tf
インプット変数情報を「variable」として定義します。
インプット変数は関数の引数のようなもので、これを使用することで、main.tfなどのモジュールのソースコードを変更せずにカスタマイズが可能です。
type として変数に受け入れられる値の型(string, number, list)を指定します。また、default にはTerraformを実行するときに値が設定されていない場合に使用する値を指定します。
variable "availability_zone_names" {
type = list(string)
default = ["us-west-1a"]
}
outputs.tf
アウトプット変数情報を「output」として定義します。
モジュール外から値を取得する場合や、apply時にターミナルに値を出力したい場合に使用します。
tfstateファイル
apply 実行時にTerraformが自動的に.tfstateファイルを生成します。このファイルにはクラウドリソースの現在の状態が記録されます。tfファイルとtfstateファイルの差分を見ることで必要な更新のみが行われるようになります。