Terraformを利用した構文チェックやVS CODEと連携した設定の仕方を解説

2024年2月11日

はじめに

こんにちは、久しぶりのブログ投稿になってしまいましたが皆さま、いかがお過ごしでしょうか。

今回は、 Windows 環境を対象に IaC ツールである terraform を題材として、 各種ツールの紹介から VS CODE との連携まで簡単にご紹介いたします。

それでは、早速、みていきましょう。

tfenv のセットアップ

rbenv にインスパイアされた Terraform のバージョンマネージャーである tfenv のセットアップをおこないます。

こちらを使うことにより、 terraform のバージョンを切り替えることが可能になります。

bash --version

GNU bash, version 5.2.15(1)-release (x86_64-pc-msys)
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
git clone https://github.com/tfutils/tfenv.git ~/.tfenv
echo 'export PATH="$HOME/.tfenv/bin:$PATH"' >> ~/.bash_profile
source ~/.bash_profile

terraformバージョンにより、動作に影響する場合があるので任意のバージョンをインストールします。

インストール可能なバージョンの一覧を確認します。

tfenv list-remote | sort -n

・
・[中略]
・
1.4.1
1.4.2
1.4.3
1.4.4
1.4.5
1.4.6
1.5.0-alpha20230405
1.5.0-alpha20230504
1.5.0-beta1

今回は、terraform version 1.4.6 をインストールします。

インストール完了後、 tfenv use 1.4.6 しろと出ます。

tfenvで使用するバージョンを切り替えるコマンドとなり、今回、インストールしたバージョンを利用したいのでそのままコマンドを実行します。

tfenv install 1.4.6
Installing Terraform v1.4.6
Downloading release tarball from https://releases.hashicorp.com/terraform/1.4.6/terraform_1.4.6_windows_amd64.zip
######################################################################## 100.0%
Downloading SHA hash file from https://releases.hashicorp.com/terraform/1.4.6/terraform_1.4.6_SHA256SUMS
Not instructed to use Local PGP (/c/Users/***/.tfenv/use-{gpgv,gnupg}) & No keybase install found, skipping OpenPGP signature verification
Archive:  /tmp/tfenv_download.uhBh60/terraform_1.4.6_windows_amd64.zip
  inflating: /c/Users/***/.tfenv/versions/1.4.6/terraform.exe
Installation of terraform v1.4.6 successful. To make this your default version, run 'tfenv use 1.4.6'

tfenv use で指定したバージョンがデフォルトで選択され、環境変数「TFENV_TERRAFORM_VERSION」または、「.terraform-version」ファイルに指定されていればそちらのバージョンへ上書きされます。

tfenv use 1.4.6

Switching default version to v1.4.6
Default version (when not overridden by .terraform-version or TFENV_TERRAFORM_VERSION) is now: 1.4.6

tfenv list コマンドでインストール済 terraform バージョンを確認することが可能です。

tfenv list

* 1.4.6 (set by /c/Users/***/.tfenv/version)

tfenv の詳細な使い方は以下を参照してください。

GitHub – tfutils/tfenv: Terraform version manager

terraform の自動補完機能を有効にします。

ただし、 terraform のバージョンが変更された際に再設定の必要があることに注意してください。

バージョンが変更された際にも対応可能な方法はありますがここでは割愛します。

terraform -install-autocomplete
source ~/.bashrc

cat ~/.bashrc

complete -C C:\Users\***\.tfenv\versions\1.4.6\terraform.exe terraform.exe

tflint のセットアップ

terraform validate や terraform plan で、検出できない構文不備を見つけることができる構文チェックツールをセットアップします。

各 OS 用にパッケージが用意されています、今回は、windows版をインストールします。

https://github.com/terraform-linters/tflint/releases/download/v0.46.1/tflint_windows_amd64.zip

各 OS のパッケージは以下、リンク先から確認可能です。

Releases · terraform-linters/tflint

tfenv インストール先ディレクトリを作成します。

mkdir ~/.tfenv/tflint

ls -la ~/Downloads/tflint_windows_amd64.zip

-rw-r--r-- 1 *** 197121 9153139 May 21 01:16 /c/Users/***/Downloads/tflint_windows_amd64.zip

先ほど作成したディレクトリを指定した形で解凍します。

unzip ~/Downloads/tflint_windows_amd64.zip -d ~/.tfenv/tflint/

Archive:  /c/Users/***/Downloads/tflint_windows_amd64.zip
  inflating: /c/Users/***/.tfenv/tflint/tflint.exe

パスを知らせるため、 windows の環境変数に tflint のインストール先 C:\Users\***\.tfenv\tflint を設定します。

  • 設定手順
  1. windows スタートメニューを右クリックし、「ファイル名を指定して実行」をクリック後、 sysdm.cpl を入力し「OK」をクリックします。

  2. システムのプロパティ画面が出ますので、詳細設定タブを選択します。

  3. 環境変数ボタンをクリックし、ユーザーの環境変数より Path 項目をダブルクリックします。

  4. 新規ボタンをクリックし、 tflint をインストールしたパスを入力し「OK」ボタンをクリックします。

git bash を終了し、新規で再度、開き、 tflint --version と入力し、コマンド結果が返ってくればインストール完了です。

tflint --version

TFLint version 0.46.1
+ ruleset.terraform (0.2.2-bundled)

tflint 構文チェック設定

terraform のプロジェクト直下へ、 tflint の設定ファイルを置く必要がありますので設定します。

「TFLint Ruleset for terraform-provider-aws」というAWSのルールセットが用意されていますのでこちらを利用します。

vi .tflint.hcl

plugin "aws" {
    enabled = true
    deep_check = true
    version = "0.23.0"
    source  = "github.com/terraform-linters/tflint-ruleset-aws"
}

初期化

tflint –init コマンドを実行し、初期設定を適用します。

これにより、ルールセットがダウンロードされます。

terraform プロジェクト設定

terraform.tfvarsというファイルは特別なファイルとなり、自動的に読み込まれ、外に公開したくない認証情報などを記載しておくものとなりここに認証情報等を記載します。

vi terraform.tfvars

aws_access_key = "{アクセスキー}"
aws_secret_key = "{シークレットキー}"

※一般的に「credentials.csv」に認証情報が記述されています。(IAMユーザ作成の時にダウンロードしておくようにします。)
 それぞれ「{アクセスキー}」、「{シークレットキー}」を各々のものにあわせてください。

main.tf

main.tfというファイルを作成し、プロバイダー情報や、AWSのIAMユーザに関すること記述します。
これは、Terraform 0.13以降の書き方となります。

required_version は terraform のバージョンとなります。

terraform –version コマンドで確認可能です。

required_providers 項目の version は AWS プロバイダーのバージョンとなります。

プロバイダーのバージョンは以下より確認可能です。
hashicorp/aws | Terraform Registry

vi main.tf

terraform {
  required_version = "1.4.6"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.67.0"
    }
  }
}

variable "aws_access_key" {}
variable "aws_secret_key" {}
variable "region" {
  default = "ap-northeast-1"
}

provider "aws" {
  access_key = var.aws_access_key
  secret_key = var.aws_secret_key
  region     = var.region
}

プロジェクト初期化

terraformのプロジェクト初期化およびプラグインダウンロードの為、 「terraform init」 コマンドを使用します。

「Terraform-provider-aws_v4.67.0」のダウンロードがなされ、「Terraform has been successfully initialized!」でプロジェクトの初期化が完了したことになります。

※terraformバックエンドやモジュールの変更を実施した場合、再初期化が必要となります。

動作確認

適当に AWS リソースを定義し、構文チェック等を実施します。

チェックは以下コマンドで実施可能です。

terraform fmt でフォーマットを整えてくれます。

terraform fmt
tflint
terraform validate

以下コマンドで、 デプロイ前のチェックおよびAWS 環境へデプロイが実施できます。

terraform plan -out=output.bin
terraform apply "output.bin"

Ex.

VS CODE に以下、拡張機能を導入することで、 Terraform の構文チェックや自動フォーマットを実施できます。

名前: HashiCorp Terraform
ID: hashicorp.terraform
説明: Syntax highlighting and autocompletion for Terraform
バージョン: 2.26.1
パブリッシャー: HashiCorp
VS Marketplace リンク: https://marketplace.visualstudio.com/items?itemName=HashiCorp.terraform

VS CODE の settings.json へ以下記述をすると便利です。

この設定は、拡張機能のページにも記載がありますので気になった方は、参考にしてください。

    "terraform.experimentalFeatures.prefillRequiredFields": true,
    "terraform.experimentalFeatures.validateOnSave": true,
    "diffEditor.codeLens": true,
    "terraform.codelens.referenceCount": true,
    "[terraform]": {
        "editor.defaultFormatter": "hashicorp.terraform",
        "editor.formatOnSave": true,
        "editor.formatOnSaveMode": "file",
        "editor.suggest.preview": true,
        "editor.codeActionsOnSave": {
            "source.formatAll.terraform": true
        }
    },
    "[terraform-vars]": {
        "editor.defaultFormatter": "hashicorp.terraform",
        "editor.formatOnSave": true,
        "editor.formatOnSaveMode": "file",
        "editor.suggest.preview": true,
        "editor.codeActionsOnSave": {
            "source.formatAll.terraform": true
        }
    },
    "terraform.validation.enableEnhancedValidation": true,
    "[terraform][terraform-vars]": {
        "editor.codeActionsOnSave": {
            "source.formatAll.terraform": "explicit"
        }
    }

まとめ

いかがでしたでしょうか、筆者の感想としてはよりすくない記述量で AWS リソースが定義でき、構文チェックや補助機能、各種参考文献が豊富にあり、とても使いやすい印象を受けました。

terraform がもっと普及しより便利になることを願い締めさせていただきます。