1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

長すぎるterraform planをAIが自動レビュー!Azure OpenAI × GitHub ActionsでPRにリスク評価を自動コメントする

1
Last updated at Posted at 2026-05-09

はじめに

インフラエンジニアなら一度は感じたことがあるはずです——「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 ポータルにログインし、以下の手順でリソースを作成します。
スクリーンショット 2026-05-10 021253.png

  1. 「Azure OpenAI」を検索してリソースを作成
  2. リージョン: East US 2(GPT-4o が安定して利用可能)
  3. 価格レベル: Standard S0

1-2. GPT-4o モデルをデプロイ

Azure OpenAI Studio(または Azure AI Foundry)で GPT-4o をデプロイします。

  1. 「モデルのデプロイ」→「基本モデルをデプロイ」を選択
  2. モデル: gpt-4o
  3. デプロイ名: gpt-4o(この名前を後で使用します)
    スクリーンショット 2026-05-10 023650.png

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 を作成してみましょう。
スクリーンショット 2026-05-10 022937.png

GitHub Actions が実行され、終了すると……

👇 実際にAIがコメントしてくれた様子がこちら!

スクリーンショット 2026-05-10 023840.png
スクリーンショット 2026-05-10 023855.png

AIのレビューのすごいところ:

  • allow_nested_items_to_be_public = true というインフラ設定を見逃さず、「不必要にデータが公開されるリスクがある」 とセキュリティ観点の指摘をしてくれました。
  • データ冗長性についても LRS (ローカル冗長) だけでは要件不足になる可能性を示唆し、GRSZRS を検討するようアドバイスをくれています。
  • 総合的なリスク評価 も表形式で出してくれており、レビュアー(人間)がどこに注目して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: 以降の差分部分だけを抽出して渡す

変更がない場合のスキップ処理を追加するには、スクリプトに以下を加えます。

scripts/analyze_plan.py(追記例)
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 への書き込みを許可」が有効になっているか確認してください(SettingsActionsGeneralWorkflow permissions)。


今後の展望(ネクストステップ)

今の実装でも十分に便利ですが、実際の運用を考えると以下のような改善の余地があると考えています。

  1. データの軽量化とコスト最適化
    現状は terraform plan のテキスト結果をそのまま送信していますが、大規模な構成変更ではトークン制限やコストが課題になります。今後は terraform show -json を活用して差分データ(resource_changes)のみを抽出・整形し、AIに渡す情報を「本当に必要なコンテキスト」に絞る実装を試したいです。
  2. セキュリティガードレールとの共存
    AI のレビューは文脈の理解に長けていますが、機械的なポリシーチェックは tfseccheckov などの静的解析ツールが確実です。これらを併用し、「静的解析でルール違反を防ぎつつ、AIで全体のリスクを要約する」という、より多層的なレビューパイプラインの構築を目指します。
  3. レビューコメントの運用改善
    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 活用の第一歩です。

ぜひ自分のプロジェクトに組み込んで、インフラレビューの効率化を試してみてください!

私自身、まだ大学2年生でインフラやDevOpsの勉強を始めたばかりの身です。もし記事の内容で間違っている点や、「もっとこうした方が実装が綺麗になるよ!」といった改善アドバイスがありましたら、ぜひコメント欄で教えていただけると大変嬉しいです!🙇‍♂️

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?