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>"