[入門編]Terraformを実践で使う際のポイント

Terraformを実践で使う際のポイントについて記載します。

具体的には

  • ファイル構成
  • 実行手順

の順に、記載していきます。

Terraformとは?という方は以下の記事をご参照ください。

Terraformとはーインフラストラクチャを安全に管理できるTerraformの使い方について理解する
「Terraformとは?」「Terraformを触ったみたい」というような方向けの記事です。「Terraformとは?について」「Terraformのインストール」「AWSのリソースをTerraformで管理してみる」の構成でTerraformについて記載していきます。

細かな文法については以下の記事を参考にさせていただくのが良いかと思います

入門Terraform

ではまずファイル構成から記載していきます。

以降、S3バケットを作成する例で記載していきます。

スポンサーリンク

ファイル構成

次のように複数ファイルへ分割することができます。
Terraformは拡張子「tf」のファイルを自動的に読み込んでくれます。
Terrafermファイル構成例

Terrafermファイル構成例

上記の例はS3バケットを作成するのみの単純な構成となっています。

それぞれのファイルの役割について記載していきます

  • provider.tf
    • 以下のような情報を記載します。
      • terraformバージョン
      • AWSプロバイダーの定義
      • tfstateファイルを管理する場所の定義
  • variables.tf
    • ローカル変数の管理
  • aws_s3_bucket.tf
    • 実際に作成するAWSリソースの情報を管理
    • 「AWS_{サービス名}.ft」というファイル名で作成する
    • 今回の例ではS3バケットを作成するため「aws_s3_bucket.tf」というファイル名にしています。

provider.tfについて詳しく見ていく

まず、provider.tfのファイルの中身は以下のようになります。


# terraformバージョンを固定
terraform {
  required_version = "1.3.9"
}

# AWSプロバイダーの定義
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.0"
    }
  }
}


#tfstateファイルを管理するS3バケットを定義
terraform {
  backend "s3" {
    bucket = "{バケット名}"                #バケット名
    key    = "terraform-test/terraform.tfstate" #tfstateファイルごとに異なる任意の値
    region = "ap-northeast-1"
  }
}
  • Terraformバージョンの固定
  • AWSプロバイダーのバージョンを定義
  • tfstateファイルをS3で管理

上記がポイントになります。

次にprovider.tfのファイルの中身について詳しく見ていきます。

terraformバージョンを固定について

以下の記述は、Terraformのバージョンは固定するための記述となります。
Terraformのバージョンは固定することで、バージョン違いによるトラブルを避けることができます。

# terraformバージョンを固定
terraform {
  required_version = "1.3.9"
}

AWSプロバイダーの定義について

以下の記述はプロバイダーの定義をしています。

プロバイダーについてもバージョンを記載しておきます。


# AWSプロバイダーの定義
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.0"
    }
  }
}

tfstateファイルを管理する場所の定義について

まず、tfstateファイルについて記載します。

tfstateファイルはTerraformが生成するファイルで、現在のインフラの状態を記録しています。

tfstateファイルは

  • terraform apply
  • terraform destroy

などインフラリソースを操作する際に参照される大事なファイルです。

tfstateファイル管理のポイント
    tfstateファイルは、デフォルトでローカルに保存されますが、チーム開発では、リモートストレージでtfstateファイルを管理する必要があります。
    今回の例ではS3にtfstateを保存しています。
    
    #tfstateファイルを管理するS3バケットを定義
    terraform {
      backend "s3" {
        bucket = "{バケット名}"                #バケット名
        key    = "terraform-test/terraform.tfstate" #tfstateファイルごとに異なる任意の値
        region = "ap-northeast-1"
      }
    }
    

    {バケット名}にはS3バケット名を記載します。

    variables.tfファイルについて詳しく見ていく

    まず、variables.tfのファイルの中身は以下のようになります。

    
    locals {
      s3_bucket_name = {
        public = "{バケット名}"
      }
    }
    

    ローカル変数を管理しています。

    本記事ではS3バケットを作成していきますので、

    S3のバケット名をローカル変数に格納しています。

     

    aws_s3_bucket.tfファイルについて詳しく見ていく

    まず、aws_s3_bucket.tfのファイルの中身は以下のようになります。

    
    resource "aws_s3_bucket" "terraform_test_public" {
      bucket = local.s3_bucket_name.public
      lifecycle {
        prevent_destroy = true
      }
    }
    

    ローカル変数(variables.tfで記載した変数)のバケット名でバケットを作成するファイルです。

    リソース作成時の注意ポイント

    Terraformで作ったリソースは、terraform destroyで簡単に削除できてしまいます。そのため、「prevent_destroy = true」で、terraform destroyで削除できないように保護しています。

    実行手順

    改めて、実行するTerraformファイルについて記載します

    用意するファイルは以下の3つです。

    ファイル名:provider.tf

    
    # terraformバージョンを固定
    terraform {
      required_version = "1.3.9"
    }
    
    # AWSプロバイダーの定義
    terraform {
      required_providers {
        aws = {
          source  = "hashicorp/aws"
          version = "~> 4.0"
        }
      }
    }
    
    
    #tfstateファイルを管理するS3バケットを定義
    terraform {
      backend "s3" {
        bucket = "{tfstateファイルを管理するS3バケット名}"                #バケット名
        key    = "terraform-test/terraform.tfstate" #tfstateファイルごとに異なる任意の値
        region = "ap-northeast-1"
      }
    }
    

    ファイル名:variables.tf

    
    locals {
      s3_bucket_name = {
        public = "{作成するバケット名}"
      }
    }
    

    ファイル名:aws_s3_bucket.tf

    
    resource "aws_s3_bucket" "terraform_test_public" {
      bucket = local.s3_bucket_name.public
      lifecycle {
        prevent_destroy = true
      }
    }
    

    次にTerraformを実行していきます。

    tfstateファイルを管理するS3バケットの作成

    実行の準備として、以下のコマンドで作成し、tfstateファイルを管理するS3を作成します。

    tfstateファイルを管理するS3の作成は手動で行う必要があります。

    aws s3 mb s3://{tfstateファイルを管理するS3バケット}

    terraform initの実行

    次にterraform initを実行します。
    ワークスペースを初期化するコマンドです。
    Terraform を実行するためには、1番初めに terraform init でワークスペースを初期化することが必須となっていて、必要なpluginのダウンロード処理などが実行されます。
    実行するコマンド:terraform init

    terraform fmtの実行

    Terraformはコードフォーマットが標準機能としてありますので、これを実行します。
    実行するコマンド:terraform fmt

    terraform validateの実行

    Terraformはバリデーション機能も標準機能としてありますので、これを実行します。
    実行するコマンド:terraform validate

    tflintの実行

    TerraformのLinterです。不正なコードを検出できます。
    こちらはインストールが必要です。
    インストールコマンド:brew install tflin

    インストール後にtflintを実行します。

    実行するコマンド:tflint

    terraform planの実行

    Terraform による実行計画を参照するコマンド。
    実行するコマンド:terraform plan

    terraform applyの実行

    .tf ファイルに記載された情報を元にリソースを作成するコマンド。
    実行するコマンド:terraform apply
    

    上記コマンドでS3作成ができたかと思います。

    次は削除してみます。

    terraform destroyの実行

    .tf ファイルに記載された情報を元にリソースを削除するコマンド。
    実行するコマンド:terraform destroy

    ただし、S3リソースを保護しているため、以下のエラーになると思います。

    Resource aws_s3_bucket.terraform_test_public has lifecycle.prevent_destroy set, but the plan calls for this resource to be destroyed. To avoid this error and continue with the plan, either disable lifecycle.prevent_destroy or reduce the scope of the plan using the -target flag.

    aws_s3_bucket.tfファイルを以下の通りに修正します。

    
    resource "aws_s3_bucket" "terraform_test_public" {
      bucket = local.s3_bucket_name.public
      lifecycle {
        prevent_destroy = false
      }
    }
    

    上記のように「prevent_destroy=false」に修正後に以下のコマンドを実行します

    実行するコマンド:terraform apply
    

    その後、以下のコマンドで削除できます

    実行するコマンド:terraform destroy
    

    まとめ

    まとめると、Terraformでのインフラ構築では以下の順で、作業を進めていくことになります。

    1. Terraformファイルの作成
      • Terraformバージョンを固定する
      • プロバイダーバージョンを指定する
      • tfstateファイルはS3で管理するようにする
      • インフラリソースは簡単に削除できないように、削除保護設定をしておく
    2. tfstateファイルを管理するS3バケットの作成
      • tfstateを管理するS3バケットは手動で作成する
    3. terraform initの実行
      • ワークスペースの初期化
    4. terraform fmtの実行
      • ソースファイルのフォーマット
    5. terraform validateの実行
      • バリデーションする
    6. tflintの実行
      • Linter実行
    7. terraform planの実行
      • ドライラン
    8. terraform applyの実行
      • インフラ構築を実行!!

    より実践的な記事もありますので、よろしければ、ご参照くださいー

    Terraformを実践的な使い方ーCloudFrontからS3へのアクセス制御をOACを使って正しく設定する編
    「S3+CloudFrontで静的サイト構築」をTerraformで構築します。S3へのアクセス制御は「Origin access control settings(OAC AWS推奨のやつ)」を使います。Terraformは実践的な書き方で記載しているので、色々な環境構築の応用できます

    ↓公式サイト↓

    Terraform by HashiCorp
    Terraform is an open-source infrastructure as code software tool that enables you to safely and predictably create, change, and improve infrastructure.