はじめのTerraform入門講座②Terraformの構成ファイルと構文について説明します!

Terraform02キャッチ画像 インフラ

今回も、前回に引き続きTerraformについて説明します。

私が現在参画しているプロジェクトでは、Terraformを使用し、GoogleCloudサービスを構築することが要件になっています。

その中で学習した内容についてアウトプットします。

今後、私と同じようにTerraformを使用する方向けに、Terraform学習の手助けになれば幸いです!

Terraformの構成ファイル

Terraformの主な構成ファイルは4つです。

  • main.tf
  • terraform.tfstate
  • .terraform(不可視フォルダ)
  • .terraform.lock.hcl(不可視ファイル)
Terraform構成ファイル

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点について説明を行いました。

  1. Terraformの構成ファイル
  2. Terraformの構文
  3. Terraformのコマンド

Terraformを習得すると、クラウドで検証環境を素早く作成することができます。また、サービスを展開する時もよく使用するので、是非、覚えておいてください!

これからも、Macのシステムエンジニアとして、日々、習得した知識や経験を発信していきますので、是非、ブックマーク登録してくれると嬉しいです!

それでは、次回のブログで!

タイトルとURLをコピーしました