Terraform用のPowerShellモジュールを作ってみた
しばたです。
先週の連休に自分の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.exe
やterraform
)が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を使っている人がそんなにいない予感がします...
もし私と同じ奇特な方がいればこのモジュールが役に立つ思います。