Terraform用のPowerShellモジュールを作ってみた

2022.09.26

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

しばたです。

先週の連休に自分のGitHubリポジトリを整理してたのですが、その際に以前から作ろうと思っていた簡単なPowerShellモジュールを実装して公開しました。
割と「俺の俺による俺のためのモジュール」なんですがせっかくなので本記事で簡単に紹介します。

TerraformUtil モジュール

今回公開したのはTerraformUtilという名前のPowerShell 7環境でTerraformを扱う際のユーティリティ機能を提供するモジュールです。
ソースはGitHubで公開しています。

私は普段TerraformをLinux環境(BashまたはPowerShell 7)とWindows環境(PowerShell 7)の両方で使い分けて扱っているのですが、Windows環境で扱う際に手間や不便を感じた部分を補完するための機能をこのモジュールに実装しています。

このためモジュール自体はクロスプラットフォーム対応ですが一部機能はWindows専用にしてます。

サポート環境とインストール手順

このモジュールでサポートする環境はPowerShell 7以降です。
最初はWindows PowerShellもサポートしようと考えたのですが、Terraformのバージョン(Semantic Versioning)の扱いがWindows PowerShellでは辛すぎたので切り捨てました。 *1
また、前提条件としてTerraformのバイナリ(terraform.exeterraform)がPATHが通っているディレクトリにインストール済みである必要があります。

モジュールのインストールはPowerShell Galleryから行うだけです。

# PowerShell Galleryからインストール
Install-Module -Name TerraformUtil -Force

機能説明

このモジュールは現時点で6つの関数を提供しています。

Register-TFArgumentCompleter

この関数は以前の記事で紹介した入力補完でもう少し詳細な情報を提供する様にしたものです。

プロファイルなどにこの関数を仕込むことで入力補完を有効にします。

# Terraformの入力補完を有効にする
Register-TFArgumentCompleter

UnRegister-TFArgumentCompleter

この関数はRegister-TFArgumentCompleterで有効にした入力補完を解除します。

# Terraformの入力補完を解除する
UnRegister-TFArgumentCompleter

PowerShell公式には入力補完を解除する機能は無いのですが、入力補完時の処理(スクリプトブロック)を$nullにすることで同等の機能を実現しています。

Test-TFVersion

この関数は現在インストール済みのTerraformのバージョンと現在最新のバージョンを比較してその結果を表示します。
だいたいterraform versionコマンドと同じ機能ですが、PowerShellの流儀に則った記法にし処理結果をオブジェクトとして出力可能にしています。

# だいたい terraform version と同じ機能
C:\> terraform version
Terraform v1.2.9
on windows_amd64

Your version of Terraform is out of date! The latest version
is 1.3.0. You can update by downloading from https://www.terraform.io/downloads.html

# 現在のバージョンと最新バージョンを比較
C:\> Test-TFVersion
Newer version Terraform v1.3.0 is available. (Current : v1.2.9)

# -PassThru パラメーターを付けるとバージョン情報をオブジェクトとして出力できる
C:\> Test-TFVersion -PassThru
Newer version Terraform v1.3.0 is available. (Current : v1.2.9)

Result CurrentVersion LatestVersion
------ -------------- -------------
 False 1.2.9          1.3.0

Find-TFRelease

この関数はHashicorp Releases APIを使いTerraformのリリース情報を取得します。

# 最新バージョンを取得
C:\ > Find-TFRelease -Latest

Version PreRelease State     Created              Updated
------- ---------- -----     -------              -------
1.3.0   False      supported 9/21/2022 1:58:58 PM 9/21/2022 1:58:58 PM

# 特定バージョンを取得
C:\> Find-TFRelease -Version 1.2.9

Version PreRelease State     Created             Updated
------- ---------- -----     -------             -------
1.2.9   False      supported 9/7/2022 9:03:28 PM 9/7/2022 9:03:28 PM

Hashicorp Releases APIの制限により取得するバージョンを指定しない場合は最大20件まで取得可能です。

Save-TFWindowsBinary

この関数はWindows環境専用です。
指定したバージョンのTerraformバイナリ(terraform.exe)を指定のフォルダにダウンロードし保存します。

# 最新バージョンの terraform.exe を C:\hashicorp\terraform に保存
C:\> Save-TFWindowsBinary -Latest -DestinationPath C:\hashicorp\terraform
Download https://releases.hashicorp.com/terraform/1.3.0/terraform_1.3.0_windows_amd64.zip
  to C:\Users\shibata\AppData\Local\Temp
Expand terraform_1.3.0_windows_amd64.zip to C:\hashicorp\terraform
Binary file is saved to C:\hashicorp\terraform
Remove C:\Users\shibata\AppData\Local\Temp\terraform_1.3.0_windows_amd64.zip

Terraformはシングルバイナリで動作するのでこの関数は事実上アップデータとして使えます。

Windows環境ではTerraformをサポートするオフィシャルなパッケージマネージャがまだ無い *2ので代わりにこの関数を実装しました。

Windows以外の環境では普通にパッケージマネージャーがありこの関数を使う意味もないので非サポートとしています。

なおWindows以外のバイナリが必要な場合は Find-TFRelease を使うことで代替可能です。

# リリース情報に含まれるビルド情報 (この例では 64bit Linux) を取得
PS /> $release = Find-TFRelease -Latest
PS /> $linuxBuild = $release.Builds | Where-Object { $_.OS -eq 'linux' -and $_.Architecture -eq 'amd64' }
PS /> $linuxBuild

Architecture OS    Url
------------ --    ---
amd64        linux https://releases.hashicorp.com/terraform/1.3.0/terraform_1.3.0_linux_amd64.zip

# 各ビルドオブジェクトには Download メソッドを実装
PS /> $linuxBuild.DownLoad('/tmp/')
PS /> ls /tmp/*.zip
/tmp/terraform_1.3.0_linux_amd64.zip

# Expand-Archive で解凍
PS /> Expand-Archive -Path /tmp/terraform_1.3.0_linux_amd64.zip -DestinationPath /tmp/
PS /> ls -al /tmp/terraform*
-rwxr-xr-x 1 shibata shibata 61239296 Sep 21 13:44 /tmp/terraform
-rw-r--r-- 1 shibata shibata 19450952 Sep 26 16:32 /tmp/terraform_1.3.0_linux_amd64.zip

Save-TFWindowsLinterBinary

この関数はWindows環境専用です。
指定したバージョンのTerraform Linterのバイナリ(tflint.exe)を指定のフォルダにダウンロードし保存します。

# 最新バージョンの tflint.exe を C:\hashicorp\terraform に保存
C:\> Save-TFWindowsLinterBinary -Latest -DestinationPath C:\hashicorp\terraform
Find tflint v0.41.0.
Download https://github.com/terraform-linters/tflint/releases/download/v0.41.0/tflint_windows_amd64.zip
  to C:\Users\shibata\AppData\Local\Temp\tflint_windows_amd64.zip
Expand tflint_windows_amd64.zip to C:\hashicorp\terraform
Binary file is saved to C:\hashicorp\terraform
Remove C:\Users\shibata\AppData\Local\Temp\tflint_windows_amd64.zip

作った動機はSave-TFWindowsBinaryと同じです。
tflintはLinux環境ではオフィシャルなインストールスクリプト、macOSではHomebrewが使えます。

最後に

ざっとこんな感じです。

そもそもPowerShell上でTerraformを使っている人がそんなにいない予感がします...
もし私と同じ奇特な方がいればこのモジュールが役に立つ思います。

脚注

  1. 実際自分ではWindows PowerShellを使わないのでサポートしても意味が無いな、とも...
  2. WinGetのZipアーカイブ対応が何年待てども実装されない悲しい現実があるのです...なお、Chocolateyは信仰上の理由で使う気が無いです。