はじめに
インフラエンジニアなら一度は感じたことがあるはずです——「terraform plan の出力、長すぎて全部読めない問題」。
数十・数百行に及ぶ Plan 結果から「本当に危ない変更」を見つけ出すのは、人間がやるには非効率です。見落としが起きやすく、レビューに時間もかかります。
この記事では、Azure OpenAI(GPT-4o) を GitHub Actions のパイプラインに組み込んで、Pull Request の terraform plan 結果を AIが自動で読み込み、変更の要約とリスク評価をPRに自動コメントする仕組みを実装します。
この記事を読むと、以下のことができるようになります:
- ✅ GitHub Actions で
terraform planを自動実行する - ✅ Plan 結果を Azure OpenAI(GPT-4o)に渡して分析させる
- ✅ リスク評価コメントを Pull Request に自動投稿する
対象読者: Terraform と GitHub Actions の基本的な操作に慣れている中級者向けです。Azure OpenAI の事前知識は不要です。
環境・前提条件
| 項目 | バージョン / 備考 |
|---|---|
| Terraform | v1.7 以上 |
| Python | 3.11 以上 |
| GitHub Actions | GitHub.com(クラウド版) |
| Azure OpenAI |
gpt-4o デプロイ済み |
| Azure サブスクリプション | 有効なもの(Azure OpenAI リソース作成用) |
全体アーキテクチャ
┌──────────────────────────────────────────────┐
│ 開発者が Pull Request を作成 │
└─────────────────────┬────────────────────────┘
│ トリガー
▼
┌──────────────────────────────────────────────┐
│ GitHub Actions ワークフロー │
│ │
│ 1. terraform init / plan 実行 │
│ 2. plan.txt を保存 │
│ 3. Python スクリプトを起動 │
└─────────────────────┬────────────────────────┘
│ API呼び出し
▼
┌──────────────────────────────────────────────┐
│ Azure OpenAI(GPT-4o) │
│ │
│ - Plan 結果を解析 │
│ - 変更サマリーを生成 │
│ - リスク評価(高・中・低)を付与 │
└─────────────────────┬────────────────────────┘
│ Markdown コメント
▼
┌──────────────────────────────────────────────┐
│ Pull Request │
│ 🤖 AI によるレビューコメントが自動投稿 │
└──────────────────────────────────────────────┘
Step 1: Azure OpenAI リソースのセットアップ
1-1. Azure ポータルでリソースを作成
Azure ポータルにログインし、以下の手順でリソースを作成します。

- 「Azure OpenAI」を検索してリソースを作成
- リージョン:
East US 2(GPT-4o が安定して利用可能) - 価格レベル:
Standard S0
1-2. GPT-4o モデルをデプロイ
Azure OpenAI Studio(または Azure AI Foundry)で GPT-4o をデプロイします。
1-3. エンドポイントと API キーを確認
リソースの「キーとエンドポイント」から以下の情報をメモします。
-
エンドポイント:
https://<リソース名>.openai.azure.com/ -
キー:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Step 2: AIレビュー用 Python スクリプトの作成
Terraform の出力を受け取り、Azure OpenAI の API を叩いて要約・評価させるスクリプトを作成します。
リポジトリのルートに scripts/ai_reviewer.py を作成し、以下を記述します。
import os
import sys
from openai import AzureOpenAI
def main():
# 標準入力から terraform plan の結果を受け取る
plan_output = sys.stdin.read()
if not plan_output.strip() or "No changes." in plan_output:
print("No significant changes found in Terraform plan.")
return
try:
# Azure OpenAI クライアントの初期化
client = AzureOpenAI(
api_key=os.getenv("AZURE_OPENAI_API_KEY"),
api_version="2024-02-15-preview",
azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT")
)
prompt = f"""
あなたは優秀なDevOpsとクラウドインフラのエンジニアです。
以下のTerraform planの出力をレビューしてください。
以下のポイントを含めて、Markdown形式で見やすく整理して回答してください。
1. 変更のサマリー(何が追加・変更・削除されるか)
2. 潜在的なリスクや注意点
3. 総合的なリスク評価(高・中・低)
Terraform Plan Output:
```
{plan_output}
```
"""
# GPT-4o モデルにリクエストを送信
response = client.chat.completions.create(
model=os.getenv("AZURE_OPENAI_DEPLOYMENT_NAME", "gpt-4o"),
messages=[
{"role": "system", "content": "You are a helpful assistant for Terraform reviews."},
{"role": "user", "content": prompt}
]
)
print(response.choices[0].message.content)
except Exception as e:
print(f"Error occurred during AI Review: {e}")
if __name__ == "__main__":
main()
また、依存モジュール管理のため scripts/requirements.txt も作成しておきます。
openai>=1.14.0
Step 3: GitHub Actions ワークフローの設定
3-1. GitHub Secrets の登録
スクリプトで利用する認証情報を GitHub リポジトリの Settings > Secrets and variables > Actions に登録します。
-
AZURE_OPENAI_ENDPOINT: 先ほどメモしたエンドポイント -
AZURE_OPENAI_API_KEY: 先ほどメモしたキー -
AZURE_CREDENTIALS: Azureリソース作成用のサービスプリンシパル情報
3-2. ワークフローファイルの作成
.github/workflows/ai-review.yml を作成します。
name: "Terraform Plan AI Review"
on:
pull_request:
branches:
- main
paths:
- 'terraform/**'
permissions:
contents: read
pull-requests: write
jobs:
terraform-plan-review:
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./terraform
steps:
- name: Checkout Repository
uses: actions/checkout@v4
# Azure ログイン
- name: Azure Login
uses: azure/login@v2
with:
creds: ${{ secrets.AZURE_CREDENTIALS }}
# TerraformのセットアップとPlan実行
- name: Setup Terraform
uses: hashicorp/setup-terraform@v3
- name: Terraform Init
run: terraform init
- name: Terraform Plan
id: plan
run: terraform plan -no-color > plan.txt
continue-on-error: true
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install Dependencies
run: pip install -r ../scripts/requirements.txt
# AI レビュースクリプトの実行
- name: Run AI Review
id: ai_review
env:
AZURE_OPENAI_API_KEY: ${{ secrets.AZURE_OPENAI_API_KEY }}
AZURE_OPENAI_ENDPOINT: ${{ secrets.AZURE_OPENAI_ENDPOINT }}
AZURE_OPENAI_DEPLOYMENT_NAME: "gpt-4o"
run: |
cat plan.txt | python ../scripts/ai_reviewer.py > ai_review.md
# 複数行の出力を GitHub Actions の step output に格納するハック
EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64)
echo "summary<<$EOF" >> $GITHUB_OUTPUT
cat ai_review.md >> $GITHUB_OUTPUT
echo "$EOF" >> $GITHUB_OUTPUT
# PR にコメントを投稿
- name: Comment on PR
uses: actions/github-script@v7
env:
REVIEW_SUMMARY: ${{ steps.ai_review.outputs.summary }}
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: `### 🤖 AI Terraform Plan Review\n\n${process.env.REVIEW_SUMMARY}`
})
Step 4: 実際に Pull Request を作成して検証!
試しに、Terraform のコードに azurerm_storage_account(ストレージアカウント)を追加する変更を加え、ブランチをプッシュして Pull Request を作成してみましょう。

GitHub Actions が実行され、終了すると……
👇 実際にAIがコメントしてくれた様子がこちら!
AIのレビューのすごいところ:
-
allow_nested_items_to_be_public = trueというインフラ設定を見逃さず、「不必要にデータが公開されるリスクがある」 とセキュリティ観点の指摘をしてくれました。 - データ冗長性についても
LRS(ローカル冗長) だけでは要件不足になる可能性を示唆し、GRSやZRSを検討するようアドバイスをくれています。 - 総合的なリスク評価 も表形式で出してくれており、レビュアー(人間)がどこに注目してPRをチェックすべきかが一目でわかります。
おまけ:Azure DevOps Pipelinesでの実装例
GitHub Actions ではなく、Azure DevOps をお使いの方向けの azure-pipelines.yml の定義例です。
trigger:
branches:
include:
- main
paths:
include:
- "infra/*.tf"
pool:
vmImage: ubuntu-latest
variables:
- group: azure-openai-secrets # Variable Group に API キーを格納
steps:
- task: TerraformInstaller@1
inputs:
terraformVersion: "1.9.0"
- task: TerraformTaskV4@4
displayName: "Terraform Init"
inputs:
provider: azurerm
command: init
workingDirectory: "$(System.DefaultWorkingDirectory)/infra"
- task: TerraformTaskV4@4
displayName: "Terraform Plan"
inputs:
provider: azurerm
command: plan
workingDirectory: "$(System.DefaultWorkingDirectory)/infra"
commandOptions: "-no-color -out=tfplan"
- script: |
terraform show -no-color tfplan > plan.txt
pip install openai>=1.14.0
python scripts/analyze_plan.py plan.txt
displayName: "AI Review with Azure OpenAI"
workingDirectory: "$(System.DefaultWorkingDirectory)/infra"
env:
AZURE_OPENAI_ENDPOINT: $(AZURE_OPENAI_ENDPOINT)
AZURE_OPENAI_API_KEY: $(AZURE_OPENAI_API_KEY)
AZURE_OPENAI_DEPLOYMENT_NAME: "gpt-4o"
- task: PostComment@1
displayName: "Post AI Review to PR"
inputs:
filePath: "$(System.DefaultWorkingDirectory)/infra/pr_comment.md"
コスト管理のヒント
Azure OpenAI の利用コストを抑えるためのポイントをまとめます。
💡 コスト削減のTips
-
max_tokensを 1,500 に制限することで、1回の分析コストを抑える -
terraform planの出力が変更なし(No changes.)の場合は API 呼び出しをスキップするロジックを追加する - Plan 出力の全文ではなく、
Changes to Outputs:以降の差分部分だけを抽出して渡す
変更がない場合のスキップ処理を追加するには、スクリプトに以下を加えます。
def has_changes(plan_text: str) -> bool:
"""terraform plan に実質的な変更があるかチェックする。"""
no_change_markers = [
"No changes. Your infrastructure matches the configuration.",
"No changes. Infrastructure is up-to-date.",
]
return not any(marker in plan_text for marker in no_change_markers)
main() 関数の冒頭でこのチェックを追加することで、変更がない PR への不要な API 呼び出しを防げます。
トラブルシューティング
Q: AuthenticationError が発生する
API キーかエンドポイントが間違っています。GitHub Secrets の値を確認してください。エンドポイントは末尾に / を含む形式(https://xxx.openai.azure.com/)が正しいです。
Q: DeploymentNotFound エラーが出る
AZURE_OPENAI_DEPLOYMENT 環境変数に設定したデプロイ名が、Azure OpenAI Studio でのデプロイ名と一致しているか確認してください。
Q: Plan ファイルが空になる
terraform plan の出力先パスが正しいか確認してください。working-directory の設定とファイルパスの相対位置に注意してください。
Q: PR コメントが投稿されない
permissions: pull-requests: write がワークフローに設定されているか確認してください。また、リポジトリの設定で「Actions のワークフローに PR への書き込みを許可」が有効になっているか確認してください(Settings → Actions → General → Workflow permissions)。
今後の展望(ネクストステップ)
今の実装でも十分に便利ですが、実際の運用を考えると以下のような改善の余地があると考えています。
-
データの軽量化とコスト最適化
現状はterraform planのテキスト結果をそのまま送信していますが、大規模な構成変更ではトークン制限やコストが課題になります。今後はterraform show -jsonを活用して差分データ(resource_changes)のみを抽出・整形し、AIに渡す情報を「本当に必要なコンテキスト」に絞る実装を試したいです。 -
セキュリティガードレールとの共存
AI のレビューは文脈の理解に長けていますが、機械的なポリシーチェックはtfsecやcheckovなどの静的解析ツールが確実です。これらを併用し、「静的解析でルール違反を防ぎつつ、AIで全体のリスクを要約する」という、より多層的なレビューパイプラインの構築を目指します。 -
レビューコメントの運用改善
PRを更新するたびに新しいコメントが追加されていくとノイズになってしまいます。以前のコメントを自動で更新(Update)する仕組みや、重要なリスクがある場合のみ担当者にメンションするロジックを組み込み、より良い開発者体験(DX)を提供していきたいです。
まとめ
この記事では、Azure OpenAI × GitHub Actions を組み合わせて、terraform plan の結果を AI が自動分析し、Pull Request にリスク評価コメントを投稿する仕組みを構築しました。
| ポイント | 内容 |
|---|---|
| 解決した課題 | 長大な Plan 出力のレビュー負荷を AI が軽減 |
| 主な技術スタック | Azure OpenAI (GPT-4o)、GitHub Actions、Terraform |
| 実装のコア | Python スクリプト 1 本 + YAML ワークフロー 1 ファイル |
| 拡張性 | Azure DevOps Pipelines でも同じスクリプトが再利用可能 |
AI によるレビューはあくまで 人間のレビューを補助するもの です。最終的な承認判断は人間のエンジニアが行う設計を維持することが、安全な AI 活用の第一歩です。
ぜひ自分のプロジェクトに組み込んで、インフラレビューの効率化を試してみてください!


