Terraformの基本を学ぶ

目次

Terraformとは?

コードベースでインフラストラクチャーを管理するInfrastructure as Codeツール。 開発者がインフラを構築するのはもちろん、セキュリティポリシーを維持するための適切な権限管理なども行うことができる。

今回はGCSのクラウドサービスをTerraformを用いて運用できるようにすることを目標とする。

前提条件

  • OS: macOS
  • ツール: Homebrew
  • GCアカウントの作成

事前準備

Terraformのインストール

brew tap hashicorp/tap
brew install hashicorp/tap/terraform

その他のインストール手順

Google Cloud の設定

Google Cloud にリソースを作成するためにはGC上にサービスアカウントを作成し、キーをローカルに保存する必要があるため、以下の2ステップを完了する必要があります。

基本構成を学ぶ

サンプル用の構成

専用ディレクトリの作成

mkdir terraform-gc

cd terraform-gc

エントリーポイント用のファイル作成

touch main.tf

main.tf に以下の内容を記述

terraform {
  required_providers {
    google = {
      source = "hashicorp/google"
      version = "4.51.0"
    }
  }
}

provider "google" {
  credentials = file("<NAME>.json")

  project = "<PROJECT_ID>"
  region  = "us-central1"
  zone    = "us-central1-c"
}

resource "google_compute_network" "vpc_network" {
  name = "terraform-network"
}

terraform ブロック

terraform {
  required_providers {
    google = {
      source = "hashicorp/google"
      version = "4.51.0"
    }
  }
}

Terraformがインフラストラクチャのプロビジョニング(リソース作成などの操作)に使用するプロバイダを定義する。 この設定に基づきTerraform Registryからプロバイダがインストールされる。 なお、バージョンは省略すると常に最新が参照され意図しない変更が加えられる可能性があるため、指定が推奨されている。 “hashicorp/google”はRegistry上の”registry.terraform.io/hashicorp/google”の省略形だそう。

プロバイダ ブロック

provider "google" {
  credentials = file("<NAME>.json")

  project = "<PROJECT_ID>"
  region  = "us-central1"
  zone    = "us-central1-c"
}
  • <NAME>.json はダウンロードしたサービスアカウントキーのパスを指定
  • <PROJECT_ID> はGCのプロジェクトIDを入力

Terraformが特定のクラウドリソース(GCなど)を作成・管理するために利用するプラグインのこと。 複数のプロバイダを利用し、異なるクラウドリソースを管理することも可能。

リソース ブロック

resource "google_compute_network" "vpc_network" {
  name = "terraform-network"
}

リソースブロックを使用してインフラストラクチャのリソースを定義する。この定義に基づきTerraformがプロバイダを経由し実際の作成・管理が行われる。 リソースの種類は多岐に渡り、ネットワークの構成などの物理リソースから、アプリケーションの論理リソースまでが含まれる。

resource "google_compute_network" "vpc_network" {
}

リソースブロックにはリソース・タイプリソース名がブロックの前に定義される。 リソース・タイプはプロバイダの定義と一致させる必要がある。(何のリソースを対象とするか) リソース名は任意の名前を割り当てる。 リソース・タイプとリソース名を合わせて、リソースの一意なIDを形成する。(この場合は google_compute_network.vpc_network )

※ リソース名の命名法則は個人ないしチームで法則を統一させると管理しやすい側面がある

resource "google_compute_network" "vpc_network" {
  name = "terraform-network"
}

リソースブロックの内部のパラメータはリソース・タイプに指定可能なパラメータを定義する。これはリソース・タイプ毎にTerraformのプロバイダのドキュメントを参照する。 例えばCloud Runのリソース・タイプのドキュメントを見ると、コンテナイメージの定義は必須であるが、通信トラフィックに関する定義は任意で良いとされている。

イメージ図

基本動作を学ぶ

ディレクトリの初期化

それではクラウドにリソースを作成していきます。 新規に構成を作成したり、バージョン管理から既存構成をチェックアウトした場合には、ディレクトリを初期化する必要があります。 その際Terraformが構成に基づきプロバイダのダウンロードが行われます。

terraform init

初期化が行われ、作業ディレクトリに隠しディレクトリ(.terraform)が作成されます。プロバイダはここに格納されています。 また、ロックファイル(.terraform.lock.hcl)も作成されます。一貫性を保つためで、プロバイダのバージョンが指定されます。

構成ファイルのフォーマットとバリデーション

構成ファイルは統一されたフォーマットであることが望ましいので以下のコマンドでのフォーマットをおすすめします。

terraform fmt

構成ファイルが構文的に有効か確かめるためには以下のコマンドでバリデーションをかけることができます。

terraform validate

リソースの変更を確認する

構成の変更が意図したリソースのみに適用されているかを確認することができます。 変更後のリソース状況を、実際に変更せずに確認できるため必ず行うことを推奨します。

terraform plan

リソースを変更する

構成を実際のクラウドリソースに適用する場合は以下のコマンドを実行します。

terraform apply

変更後のリソース状況が提示され、問題なければyesと入力します。

※ 前述のリソースの変更を確認するを実施している場合はこの確認は求められません。

以上となります。

変数の扱い方を学ぶ

変数を用いて動的にリソースを定義する方法を学びましょう。

変数用のファイル作成

touch variables.tf

variables.tf に以下の内容を記述

variable "project" { }

variable "credentials_file" { }

variable "region" {
  default = "us-central1"
}

variable "zone" {
  default = "us-central1-c"
}

※ Terraformは 作業ディレクトリの全ての.tfを読み込むため、任意のファイル名を定義することが可能です。

TerraformでGCのリソースを構築するケースでは project, credentials_file, region, zone変数を定義する必要があります。

この状態で terraform plan を実行すると、 projectとcredentials_fileの値を尋ねられるので入力します。

さっそくプロバイダブロックに反映させてみましょう。

provider "google" {
  credentials = file(var.credentials_file)

  project = var.project
  region  = var.region
  zone    = var.zone
}

これでプロバイダの各種パラメータが変数に基づいて設定されるようになりました。

ファイルから変数を設定する

Terraformはファイルから変数の値を読み取り、利用することができます。

terraform.tfvars または *.auto.tfvars の命名されたファイルが対象になります。

例えば、 terraform.tfvars ファイルに以下の内容を記述すれば、変数にその値が格納されます。

project                  = "<PROJECT_ID>"
credentials_file         = "<FILE>"