はじめに
こんにちは、ノバセルでエンジニアをしている者です。
この記事では Terraform の lint ツール TFLint にカスタムルールを追加し、それを GitHub にホスティングしてインポートする方法を紹介します。
公式の GitHub リポジトリの README や解説記事には、ホスティングやインポートに関する情報が断片的に掲載されています。しかし、手順を最初から最後まで網羅的に説明している記事が見当たらなかったため、備忘録としてまとめました。
手順
① カスタムルールのテンプレートリポジトリを元にリポジトリを新規作成
tflint-ruleset-template リポジトリをテンプレートにしてリポジトリを新規作成します。
このときリポジトリ名は tflint-ruleset-{任意の文字列} の命名にしてください。
作成したプラグインはこの命名ルールでないと読み込めないためです。
今回は tflint-ruleset-hoge という名前でリポジトリを作成しました。

② カスタムルールの実装を記述
今回はホスティング方法を説明したいだけなため rules ディレクトリにあるサンプル実装をそのまま使います。
③ 鍵を作成
カスタムルールを配信するためにはビルドしたバイナリに署名をする必要があります。 そのため Terraform の下記ドキュメント通りに鍵を作成します。
③-1 gpg のインストール
brew install gpg
③-2 主鍵の作成
$ sudo gpg --full-generate-key
対話式に情報を入力していきます。
ご希望の鍵の種類を選択してください: (1) RSA と RSA (2) DSA と Elgamal (3) DSA (署名のみ) (4) RSA (署名のみ) (9) ECC (署名と暗号化) *デフォルト (10) ECC (署名のみ) (14) カードに存在する鍵
1を入力
RSA 鍵は 1024 から 4096 ビットの長さで可能です。 鍵長は? (3072)
4096 を入力してください。 ※ 4096 でなくとも任意の長さで構いません
鍵の有効期限を指定してください。
0 = 鍵は無期限
<n> = 鍵は n 日間で期限切れ
<n>w = 鍵は n 週間で期限切れ
<n>m = 鍵は n か月間で期限切れ
<n>y = 鍵は n 年間で期限切れ
鍵の有効期間は? (0)
任意の有効期限を設定してください
これで正しいですか? (y/N)
y を入力
GnuPGはあなたの鍵を識別するためにユーザIDを構成する必要があります。 本名:
任意の名前を入力してください
この例では hoge taro としました。
電子メール・アドレス:
任意のアドレスを入力してください
コメント:
任意のコメントを入力してください
名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)?
O を入力してください
新しい鍵を保護するために、 パスフレーズを入力してください。 パスフレーズ: <OK> <キャンセル(C)>
任意のパスフレーズを設定してください。
鍵が作成されます。
③-2 鍵の export
$ gpg --armor --export "名前"
先ほど指定した名前をキーにして公開鍵を出力します
sudo gpg --armor --export-secret-keys "名前"
先ほど指定した名前をキーにして秘密鍵を出力します
④ GitHub Actions の Secret に秘密鍵とパスフレーズを登録
GitHub Actions の repository secret に下記を設定してください
- GPG_PRIVATE_KEY: 秘密鍵の値
- PASSPHRASE: 鍵作成時に設定したパスフレーズ
⑤ GitHub Actions の実行
タグの作成をトリガーにして、カスタムルールのビルドが行われます。
v0.1.0 というタグを作成します

GitHub Actions が実行されます

実行完了するとビルド成果物がタグ assets にアップロードされます。

⑥ カスタムルールのインポート
tflint を実行するディレクトリに .tflint.hcl を作成し、下記を記載します。
- プラグイン名(plugin "hoge"の部分): リポジトリ名の tflint-ruleset-
nameのnameの部分 - version: GitHub に作成したタグのバージョン名
- source: リポジトリ名
- 公開鍵: 作成した公開鍵
plugin "hoge" {
enabled = true
version = "0.1.0"
source = "github.com/example/tflint-ruleset-hoge"
signing_key = <<-KEY
-----BEGIN PGP PUBLIC KEY BLOCK-----
KEY
}
init し、カスタムルールをインポートします。
$ tflint --init Installing `hoge` plugin... Installed `hoge` (source: github.com/example/tflint-ruleset-hoge, version: 0.1.0)
--version をするとカスタムプラグイン ruleset.template (0.1.0) がインポートされたことがわかります。 今回はテンプレートリポジトリの実装内容を変更していないのでルールセット名が template になっています。
$ tflint --version TFLint version 0.47.0 + ruleset.template (0.1.0) + ruleset.terraform (0.4.0-bundled)