【入門編】Terraformコードの自動リファクタリング手法:AST(抽象構文木)解析とhcl2jsonを活用した大規模コード移行の自動化スクリプト – インフラ構成管理(IaC)活用バイブル

Terraformコードを「手作業」で直すのは今日で終わり。AST解析で挑む大規模リファクタリングの極意

こんにちは。クラウドインフラの深淵を覗き続けてきたエンジニアです。

Terraformのコードベースが数万行を超え、モジュールの再編やリソースの統合に追われた経験はありませんか? 「全リソースのタグを一括変更する」「旧式の `resource` 定義を新しいモジュール形式に書き換える」……これらを手動で行うのは、SREの魂を削るような苦行です。

今日は、「AST(抽象構文木)解析」という魔法を使って、Terraformコードをプログラムで安全かつ正確に書き換える、現場のプロが使う「自動リファクタリング」の手法を伝授します。

—

1. なぜ「正規表現」ではダメなのか?

多くの初心者は `sed` や `grep` でコードを置換しようとしますが、それは「爆弾の導火線をハサミで切る」ようなものです。

HCL(HashiCorp Configuration Language)は構造化されたデータです。正規表現は行単位の操作には向いていますが、ブロックのネスト構造や依存関係を理解できません。そこで登場するのがAST(抽象構文木)です。コードを一度「木構造」のデータとして解析し、そのノードを操作してから再びコードとして書き出す。このプロセスこそが、大規模変更を成功させる唯一の道です。

2. 武器の選定:hcl2json の導入

今回は、複雑なHCLをプログラムで扱いやすいJSON形式に変換し、変換後にHCLへ戻す手法をとります。

インストールと環境構築

まずは、Terraform公式のツール群を扱えるようにしましょう。

hcl2jsonをインストール(macOSの例)
brew install hcl2json

もしGo環境があれば、自身でビルドするのも推奨です
go install github.com/kvz/json2hcl/…

3. HelloWorld:AST解析の第一歩

まずは、「特定のタグを自動挿入する」という簡単なスクリプトをPythonで書いてみましょう。

手順:HCL → JSON → 加工 → HCL

① HCLをJSONに変換(解析フェーズ)

hcl2json main.tf > main.json

② PythonでJSONを操作(変換フェーズ)
`transform.py` を作成します。

import json

def add_standard_tags(data):
# すべてのaws_instanceに強制的にタグを追加するロジック
if ‘resource’ in data:
for res in data[‘resource’]:
if ‘aws_instance’ in res:
for instance in res[‘aws_instance’].values():
instance[0][‘tags’] = [{“ManagedBy”: “Terraform-Automator”}]
return data

with open(‘main.json’, ‘r’) as f:
data = json.load(f)

new_data = add_standard_tags(data)

with open(‘modified.json’, ‘w’) as f:
json.dump(new_data, f, indent=2)

③ JSONをHCLに戻す

json2hclを使って変換
json2hcl -reverse modified.json > main_updated.tf

—

4. 現場で震えるほど役立つ「安全」の担保

自動リファクタリングで最も怖いのは「構文エラーでデプロイが止まること」です。これを防ぐために、以下のステップをスクリプトに組み込んでください。

1. Planの事前保存: 変更前に `terraform plan -out=before.tfplan` を実行しておく。
2. Lintの自動実行: 書き換え後に必ず `terraform fmt` を走らせる。
3. Validateの強制: `terraform validate` が通らない場合は自動でロールバックする。

現場用シェルスクリプト例(一部抜粋)

!/bin/bash
set -e # エラーが発生したら即停止

1. バックアップ
cp main.tf main.tf.bak

2. 自動変換
hcl2json main.tf > temp.json
python3 transform.py # ここでロジックを実行
json2hcl -reverse temp.json > main.tf.new

3. 検証
terraform fmt main.tf.new
if terraform validate main.tf.new; then
echo “リファクタリング成功!”
mv main.tf.new main.tf
else
echo “エラー!変更を破棄します”
mv main.tf.bak main.tf
fi

—

結論:コードを支配する者が、クラウドを支配する

最初は難しく感じるかもしれませんが、この「プログラムでコードを操作する」感覚を掴むと、Terraformの管理工数は劇的に(1/10以下に)減ります。

重要なのは、一度にすべてを書き換えようとせず、「特定のパターン」を一つずつ確実に書き換える小さなツールを積み重ねることです。

これが、世界中の大規模インフラを支えるSREたちが密かに行っている「究極の省力化」です。さあ、あなたの環境でもぜひ試してみてください。疑問があれば、いつでも聞いてくださいね。応援しています!

タイトルとURLをコピーしました