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たちが密かに行っている「究極の省力化」です。さあ、あなたの環境でもぜひ試してみてください。疑問があれば、いつでも聞いてくださいね。応援しています!