この記事では、Google CloudをTerraformで管理するための基本的な知識と手順を解説します。Terraformを使ってインフラをコード化することで、手作業によるミスを減らし、効率的かつ安全にリソースを管理できるようになります。
ターゲット読者
・Terraformをこれから学びたい初心者エンジニア
・Google Cloudでのインフラ管理を効率化したい方
なぜ今、Terraformなのか?
クラウド環境の複雑化に伴い、IaC (Infrastructure as Code) の重要性が高まっています。中でもTerraformは、特定のクラウドに依存しない汎用性と、コードによるインフラ管理の容易さから多くの企業に採用されています。
手作業によるミスを排除: コードで定義された通りにリソースがデプロイされるため、一貫した状態を保てます。
変更履歴の管理と追跡: Gitなどのバージョン管理システムを利用して変更履歴を追跡できます。
迅速なデプロイと繰り返し可能な環境構築: 開発環境やステージング環境を迅速かつ確実に構築できます。
コスト削減: 不要なリソースの削除忘れなどを防ぎ、コスト最適化にも繋がります。
そもそもTerraformとは?
Terraformは、HashiCorp社が開発した、オープンソースのIaC(Infrastructure as Code)ツールです。IaCとは、サーバーやネットワークといったインフラを、コードとして定義し、バージョン管理や自動化を行うことです。
IaC(Infrastructure as Code)とは?
IaCとは、サーバーやネットワーク機器、データベースといったインフラ構成を、手動操作ではなく、コードとして定義・管理することです。
これまで、インフラの構築や変更は、GUIでの手動操作やスクリプト実行によって行われてきました。しかし、この方法にはヒューマンエラーや属人化などの課題がありました。
IaCを導入することで、これらの課題を解決し、ソフトウェア開発と同じ手法でインフラを管理できるようになります。これにより、以下のようなメリットが生まれます。
バージョン管理: Gitなどのツールで変更履歴を追跡・管理でき、いつでも過去の状態に戻せます。
自動化: コードを実行するだけで、何度でも同じ環境を迅速かつ確実にデプロイできます。
コラボレーション: 複数人でインフラを共同開発・管理できるようになります。
宣言的アプローチ(Declarative Approach)
Terraformは宣言的なアプローチを採用しています。これは
「最終的にどのような状態にしたいか」 をコードで記述する方式です。
例えば、「Webサーバー用の仮想マシンを1台、us-central1リージョンに作成したい」という最終状態をコードで定義します。Terraformはそのコードを読み取り、現在のインフラの状態と比較し、必要な操作(作成、更新、削除)を自動的に判断・実行します。
対照的に、AnsibleやChefなどのツールは命令的なアプローチ(Imperative Approach) を採用しています。これは
「最終状態に到達するためにどのような手順を踏むか」 を記述する方式です。
例えば、「まずOSをインストールし、次にWebサーバーソフトウェアをインストールし、最後に設定ファイルを配置する」といった手順を順を追って記述します。このアプローチでは、手順の順番や依存関係を開発者が細かく指定する必要があります。
マルチクラウド対応
Terraformは、マルチクラウド対応が大きな強みです。
Google Cloud、AWS、Azureといった主要なクラウドベンダーに加えて、KubernetesやVMwareなど、多岐にわたるプラットフォームを単一のツールで管理できます。これにより、異なるクラウドにまたがる複雑なシステムでも、一貫したワークフローでインフラを構築・運用できます。
一方、マルチクラウドに対応していない、特定のクラウドに特化したIaCサービスも存在します。代表的なものとして、AWSのAWS CloudFormationや、AzureのAzure Resource Manager(ARM)テンプレートが挙げられます。これらのサービスは、それぞれのクラウド環境に深く統合されているため、そのクラウド特有の機能やサービスをより細かく制御できるという利点があります。
Terraformの基本的なワークフロー
Terraformの基本的なワークフローは以下の4つのコマンドで構成されます。
terraform init
: 作業ディレクトリを初期化し、必要なプロバイダやモジュールをダウンロードする
terraform plan
: 記述されたコードと現在のインフラの状態を比較し、これから適用される変更内容を事前に表示する
terraform apply
: planで確認した変更を実際のインフラに適用する
terraform destroy
: Terraformが管理しているすべてのリソースを削除する
GCEをTerraformで構築する
GCPプロジェクト内に1台のVMインスタンスを構築します。
まず、コードの解説からします。
パラメータは以下とします。
パラメータ | 値 |
---|---|
名前 | terraform-vm-tmp |
リージョン | asia-northeast1 |
ゾーン | asia-northeast1-a |
マシン | e2-micro |
OS | Debian-cloud/debian-11 |
このコードは3つの主要なブロックで構成されます。
terraform ブロック
: Terraform自体の設定を行います。ここでは、Google Cloudのプロバイダを使用することを指定します。
provider ブロック
: Google Cloudとの接続設定を行います。プロジェクトID、リージョン、ゾーンを指定します。
resource ブロック
: 作成したいGCPリソースを定義します。ここではgoogle_compute_instanceを使ってVMインスタンスを定義しています。
# プロバイダの設定
terraform {
required_providers {
google = {
source = "hashicorp/google"
version = "~> 4.51.0" # 任意のバージョンを指定
}
}
}
# Google Cloud プロバイダの設定
provider "google" {
project = "your-gcp-project-id" # ここをあなたのプロジェクトIDに置き換えてください
region = "asia-northeast1"
}
# VMインスタンスの作成
resource "google_compute_instance" "vm_instance" {
# VMインスタンスの名前
name = "terraform-vm-tmp"
# VMをデプロイするゾーン
zone = "asia-northeast1-a"
# マシンタイプ(CPUとメモリ)
machine_type = "e2-micro"
# ブートディスクの設定
boot_disk {
initialize_params {
# OSイメージを指定
image = "debian-cloud/debian-11"
}
}
# ネットワークインターフェースの設定
network_interface {
# デフォルトのVPCネットワークを使用
network = "default"
}
}
実行環境はGoogle Cloud Console内のCloud Shellとします。
Cloud Shellには、gcloudコマンドとTerraformが最初からインストールされているため、環境構築の手間がほぼありません。
1.Cloud Shellの起動とプロジェクトの確認
Google Cloud コンソールで作業したいプロジェクトを選択します。コンソール上部にあるナビゲーションバーからプロジェクトを選択してください。
次に、コンソール上部のツールバーにある「Cloud Shell をアクティブにする」ボタンをクリックして、Cloud Shellを起動します。
Cloud Shellが起動したら、以下のコマンドを実行して、プロジェクトIDを出力します。
gcloud config get-value project
2. Terraformファイルの作成
作業ディレクトリを作成し、その中にTerraformのコードを記述します。
mkdir terraform-gce
cd terraform-gce
次に、エディタを起動して必要なファイルを作成します。Cloud Shellには、コマンドラインから起動できるエディタが統合されています。
cloudshell edit .
main.tfをterraform-gce配下に作成します。
touch main.tf
そしてmain.tfに下のコードを張り付けて保存します。
project = "your-gcp-project-id"
には
gcloud config get-value project
で得られたIDを入力してください。
# プロバイダの設定
terraform {
required_providers {
google = {
source = "hashicorp/google"
version = "~> 4.51.0" # 任意のバージョンを指定
}
}
}
# Google Cloud プロバイダの設定
provider "google" {
project = "your-gcp-project-id" # ここをあなたのプロジェクトIDに置き換えてください
region = "asia-northeast1"
}
# VMインスタンスの作成
resource "google_compute_instance" "vm_instance" {
# VMインスタンスの名前
name = "terraform-vm-tmp"
# VMをデプロイするゾーン
zone = "asia-northeast1-a"
# マシンタイプ(CPUとメモリ)
machine_type = "e2-micro"
# ブートディスクの設定
boot_disk {
initialize_params {
# OSイメージを指定
image = "debian-cloud/debian-11"
}
}
# ネットワークインターフェースの設定
network_interface {
# デフォルトのVPCネットワークを使用
network = "default"
}
}
3. Terraformコマンドの実行
ファイルを作成したら、ターミナルに戻り、以下のTerraformコマンドを順に実行します。
① 初期化
プロジェクトで使用するプロバイダをダウンロードし、作業ディレクトリを初期化します。
terraform init
② 実行計画の確認
terraform planコマンドで、これから適用される変更内容を確認します。
terraform plan
③ 適用
terraform applyコマンドで、実際にVMインスタンスをGoogle Cloud上にデプロイします。
terraform apply
実行後、yesと入力してエンターを押してください。TerraformがGoogle CloudのAPIを呼び出してVMインスタンスを作成します。
4. リソースの確認と削除
デプロイが完了したら、Google CloudコンソールでVMインスタンスが作成されたことを確認できます。
不要になった場合は、以下のコマンドでリソースを削除できます。
terraform destroy
Terraformのファイルとその役割
Terraformのコードは、単一のファイルに記述することもできますが、プロジェクトの規模が大きくなると管理が難しくなります。そのため、役割ごとにファイルを分割することが推奨されています。
一例
versions.tf
: プロバイダのバージョンを定義。
provider.tf
: プロバイダの接続設定を定義。
variables.tf
: 変数を定義。
main.tf
: 実際のリソースを定義。
terraform.tfvars
: 変数に具体的な値を代入。
ファイル構成
.
├── main.tf
├── versions.tf
├── provider.tf
├── variables.tf
└── terraform.tfvars
それぞれ解説します。
versions.tf
versions.tf は、Terraform本体とプロバイダのバージョンを定義するファイルです。これにより、チームメンバー間で開発環境を統一し、予期せぬバージョン間の互換性の問題を避けることができます。
# versions.tfの例
terraform {
required_version = ">= 1.0"
required_providers {
google = {
source = "hashicorp/google"
version = "~> 4.51"
}
}
}
provider.tf
クラウドプロバイダ(今回はGoogle Cloud)に接続するための認証情報や、プロジェクトID、リージョンなどの一般的な設定を記述します。
# provider.tfの例
# Google Cloud プロバイダの設定
provider "google" {
# プロジェクトIDとリージョンはvariables.tfで定義
project = var.project_id
region = var.region
}
variables.tf
Terraformコード内で使用する変数を定義するファイルです。環境ごとに異なる値(例: プロジェクトID、リージョン、インスタンスの数など)をハードコードせずに柔軟に設定できます。
# variables.tfの例
variable "project_id" {
description = "The ID of the GCP project."
type = string
}
variable "region" {
description = "The region to deploy resources in."
type = string
default = "asia-northeast1"
}
variable "zone" {
description = "The zone for the VM instance."
type = string
default = "asia-northeast1-a"
}
variable "vm_name" {
description = "The name of the VM instance."
type = string
default = "terraform-vm-tmp"
}
main.tf
main.tf は、Terraformコードの中心となるファイルです。通常、作成したいリソース(VM、ネットワーク、データベースなど)の定義を記述します。
# main.tfの例
resource "google_compute_instance" "vm_instance" {
name = var.vm_name
zone = var.zone
machine_type = "e2-micro"
boot_disk {
initialize_params {
image = "debian-cloud/debian-11"
}
}
network_interface {
network = "default"
}
}
terraform.tfvars
terraform.tfvars は、variables.tfで定義した変数に具体的な値を代入するファイルです。このファイルを使用することで、Terraformの実行時にコマンドラインで値を渡す手間を省けます。
# terraform.tfvarsの例
project_id = "your-gcp-project-id" # ここをあなたのプロジェクトIDに置き換える
region = "asia-northeast1"
zone = "asia-northeast1-a"
vm_name = "terraform-vm-tmp""
コマンドでファイルを作成し、同様にGCEをデプロイします。
cat << EOF > main.tf
resource "google_compute_instance" "vm_instance" {
name = var.vm_name
zone = var.zone
machine_type = "e2-micro"
boot_disk {
initialize_params {
image = "debian-cloud/debian-11"
}
}
network_interface {
network = "default"
}
}
EOF
作成後のエディタの画面ショットです。
terraform.tfstate
Terraformが管理するインフラの現在の状態を記録したファイルです。このファイルは、Terraformがインフラを正確に管理するために不可欠な、重要なデータベースの役割を果たします。
Terraformは、コード(理想の状態)と、このterraform.tfstateファイル(現在の状態)を比較して、次に実行すべきアクション(作成、更新、削除)を判断します。
このファイルが破損した場合、インフラ管理に重大な問題を引き起こす可能性があります。
参考資料
まとめ
この記事では、Terraformを使ったGoogle Cloudリソースの管理方法を学びました。手動での作業からコードによる管理へと移行することで、インフラの一貫性、再現性、そして安全な変更が可能になります。
IaCの効果:インフラをコード化することで、手動ミスをなくし、バージョン管理や自動化の恩恵を享受できます。
Terraformの基本:init, plan, applyというシンプルなワークフローで、インフラの構築から変更までを実行できます。
ファイル分割の重要性:main.tfだけでなく、variables.tfやversions.tfなどを活用することで、コードの管理がに楽になります。
Terraformの導入は、インフラ管理をより効率的なものに変える、最初の一歩です。