今回も、前回に引き続きTerraformについて説明します。
私が現在参画しているプロジェクトでは、Terraformを使用し、GoogleCloudサービスを構築することが要件になっています。
その中で学習した内容についてアウトプットします。
今後、私と同じようにTerraformを使用する方向けに、Terraform学習の手助けになれば幸いです!
Terraformの構成ファイル
Terraformの主な構成ファイルは4つです。
- main.tf
- terraform.tfstate
- .terraform(不可視フォルダ)
- .terraform.lock.hcl(不可視ファイル)
main.tf
Terraformのコードを記述するファイルです。名前は、「main.tf」以外でも良いですが、一般的には「main.tf」が使用されます。構築するサービスや環境が多数ある場合は、フォルダ分けしますが、それについては別のブログで紹介します。
terraform.tfstate
Terraformの状態を保存しているファイルです。「terraform apply」実行時、既に実行した環境についてはスキップされますが、このファイルを参照しスキップしています。「terraform apply」を実行すると、自動的に作成されます。
.terraform※不可視フォルダ
プロバイダー(GCPやAWS)のライブラリをダウンロードし、インストールしているフォルダです。「terraform init」を実行すると、自動的に作成されます。
.terraform.lock.hcl※不可視ファイル
すべてのTerraform 実行の一貫性を確保するため、使用されている正確なプロバイダー バージョンが記載されているファイルです。これにより、構成で使用されているプロバイダーを、いつアップグレードするかを制御することができます。「terraform init」を実行すると、自動的に作成されます。
Terraformの構文
Terraformの構文は、主に3つのブロックがあります。
- terraformブロック
- providerブロック
- resourceブロック
ブロックの基本的な記述方法は、
ブロック名 {
設定名 = 設定
}
になります。
これは、例えばAndroidスマフォの設定を変更する時に、「設定→機内モード:オン」にするのを、英語で記述しているだけです。
上記の記述方法に当てはめてみると、
settings {
airplane_mode = on
}
になります。
ブロック名:settings
設定名:airplane_mode
設定:on
上記のように、ブロック名や設定名等は、予めTerraformやプロバイダーで決められています。Terraformは、それを記述していく形です。
<サンプルコード>
terraform {
required_providers {
google = {
source = "hashicorp/google"
version = "3.5.0"
}
}
}
provider "google" {
credentials = file("xxxxxxxxxxxxxxxx-xxxxxxxxx.json")
project = "xxxxxxxxxxxxxx"
region = "asia-northeast1"
zone = "asia-northeast1-a"
}
resource "google_compute_network" "vpc_network" {
name = "terraform-network"
}
terraformブロック
terraformブロックは、インフラストラクチャのプロビジョニング(必要なものを準備する)に必要なプロバイダー等の設定が含まれています。プロバイダーごとに、 source属性のオプションで、ホスト名、名前空間、およびプロバイダーの種類を定義します。
Terraformは、既定でTerraformレジストリからプロバイダーをインストールします。この構成例では、googleプロバイダーのソースとして定義されています。「hashicorp/google」は省略形です。実際は、「registry.terraform.io/hashicorp/google」です。
required_providersブロックに、プロバイダーごとのバージョン制約を定義することができます。このversion属性はオプションですが、プロバイダーのバージョンを適用するために使用することをお勧めします。これがないと、Terraform は常にプロバイダーの最新バージョンを使用するため、重大な変更が発生する可能性があります。
providerブロック
providerブロックは、指定するプロバイダーを構成します。プロバイダーは、Terraformがリソースの作成と管理に使用するプラグインです。Terraform構成で複数のプロバイダーブロックを定義して、さまざまなプロバイダーからリソースを管理できます。通常、異なるプロバイダーの構成ファイルを作成する際は、ファイルを分けます。
<Google Cloudサービスの場合>
provider "google"{
region = "asia-northeast1"
}
<AWSの場合>
provider "aws"{
region = "ap-northeast-1"
}
resourceブロック
resourceブロックは、インフラストラクチャのコンポーネントを定義します。リソースは、サーバーなどの物理コンポーネントの場合もあれば、GoogleCloudサービスなどの論理リソースの場合もあります。
resourceブロックには、ブロックの前にリソースタイプとリソース名の 2 つの文字列があります。
上の例では、
・リソースタイプ:google_compute_network
・リソース名:vpc_network
です。
型のプレフィックス(接頭辞)は、プロバイダーの名前にマップされます。上のサンプルコードの場合、Terraformはプロバイダーを使用してgoogle_compute_networkリソースを管理します。
googleリソースタイプとリソース名が一緒になって、リソースに一意のIDを形成します。たとえば、ネットワークIDは「google_compute_network.vpc_network」です。
Terraformのコマンド
Terraformには、様々なコマンドがあります。コマンドの説明とコマンドを記載します。
作業ディレクトリの初期化を行うコマンド
terraform init
インフラ構成が想定通りであることを確認するコマンド
terraform plan
Terraform構成ファイルを使用してインフラを構築するコマンド
terraform apply
Terraformの状態を表示する
terraform show
Terraform構成ファイルのフォマーットを行うコマンド
terraform fmt
既存のインフラストラクチャをTerraformにインポートするコマンド
terraform import
※インポートした情報はstateファイルに保存されるだけなので、Terraform構成ファイルは作成する必要があります。stateファイルは、「terraform state」で表示できます。
stateファイルを確認・操作したいときに使用するコマンド
terraform state
stateファイルを強制的にロック解除するコマンド
terraform force-unlock
※複数人でTerraformを使用している場合、プロバイダーによっては、stateファイルをロックすることがあります。そのような場合に、強制的に解除するコマンドです。
stateファイルからOutput Valueを抽出するコマンド
terraform output
対話型のコンソールを起動するコマンド
terraform console
使用しているプロバイダのバージョン一覧を確認するコマンド
terraform providers
モジュールをアップデートするためのコマンド
terraform get -update
作業ディレクトリ内のTerraform構成ファイルの構文をチェックするコマンド
terraform validate
※validateとplanの違い
planの場合、現状のインフラ構成を確認する時間がかかります。validateは構文にエラーがないかのみを確認するので、通常は、validate⇒planの順に行います。
まとめ
今回は、下記3点について説明を行いました。
- Terraformの構成ファイル
- Terraformの構文
- Terraformのコマンド
Terraformを習得すると、クラウドで検証環境を素早く作成することができます。また、サービスを展開する時もよく使用するので、是非、覚えておいてください!
これからも、Macのシステムエンジニアとして、日々、習得した知識や経験を発信していきますので、是非、ブックマーク登録してくれると嬉しいです!
それでは、次回のブログで!