Terraform + Slack + AIで権限管理を自動化
はじめに
こんにちは!ナウキャストデータAIソリューションドメイン所属の境です。
この記事では、社内AIコンテストで制作した「Terraform PRを自動生成するAI駆動システム」の開発の背景や仕組み、実装で工夫した点などをご紹介します。
きっかけ
データ基盤の運用をしていると、Terraformでのユーザー権限管理は本当に地味で大変です。
毎日のようにユーザー追加や権限変更のPRを作ってるんですが、これは意外と時間かかりますよね。
「もっと楽にできないかな…」と思って、Slackで要件を伝えるだけでTerraform PRを自動生成してくれるSlack Appを作ってみました。
何が面倒だったのか
うちのチームでは、クライアントのデータ基盤を運用していて、Terraformでユーザー管理をしています。
で、これが結構大変で…
- 毎日のようにユーザー追加や権限変更のPR作成依頼が来る
- 似たようなTerraformコードを書くのに、毎回結構な時間がかかる
「この作業、絶対自動化できるでしょ!」
ということで、まずは一番よくあるパターンから自動化してみることにしました。
どんなシステムを作ったか
作ったのは、Slackのボットにメンションして「〇〇さんにこの権限追加して」って言うだけで、勝手にTerraform PRを作ってくれるシステムです。
できること
- 普通の日本語で指示: 「田中さんにS3の読み取り権限をお願いします」みたいに普通に話せばOK
- リアルタイムで状況確認: スレッドで「今これやってます」って教えてくれる
- GitHub連携: 完全自動でPRまで作成
- セキュア: GitHub MCP Server(Model Context Protocol - AIエージェントが安全にGitHubを操作するためのプロトコル)を使って安全にリポジトリを操作
アーキテクチャと技術選択
システム構成
技術的な工夫点
1. 2段Lambda構成による堅牢性確保
Slackは3秒以内にレスポンスを返さないとタイムアウトエラーになります。でもAIでTerraformのコードを生成するのはどう考えても3秒じゃ無理ですね。
そこで2段Lambda構成にしました:
- 1段目: Slackのイベントを受け取って「了解!処理中です」と即座に返事
- 2段目: 裏でゆっくりとAIにTerraform PR生成をお願い
この構成でSlackの処理がタイムアウトにならず、後ろ側で重い処理もちゃんと完了できるようになりました。
2. セキュリティ設計
認証・認可
- Slack Appの署名検証による認証
- GitHub MCP Serverで使用する認証情報は最小権限の原則に基づく
インフラストラクチャ
- 2段Lambdaによる処理の分離
- 非同期処理によるタイムアウト対策
- Secrets Managerによるセキュアなシークレット管理
GitHub MCP Server(Model Context Protocol)へのアクセスは厳重にセキュリティを管理しています。MCP Serverにアクセスできると「好き放題」できてしまうためです。
3. AIエージェントの核心:9ステップワークフロー
このシステムの肝となるのが、AIエージェントが自動でTerraform PRを作成する9ステップのワークフローです。実装では約200行にわたる詳細なプロンプトで、AIに明確な手順を指示しています。
実際のワークフロー
重要な工夫点
1. 状態管理フラグ
-
FAILED_FLAG
("!!!FAILED!!!")とCOMPLETE_FLAG
("!!!SUCCESS!!!")でワークフロー状態を明確化 - 各ステップで完了チェックを必須化
2. 過去事例からの学習
3. **Similar Pull Request Investigation and Learning:**
* Search the target repository's pull request history for past changes...
* Judge similarity based on keywords from the user request, affected file paths...
権限追加系のPRは類似パターンが多いという仮説のもと、過去のPRから学習する仕組みを組み込みました。
3. Diff-based編集の自動化
従来のファイル全体置換ではなく、差分ベースでの編集を採用:
def patch_content_text(original_content: str, diff_content: str) -> tuple[bool, str]:
# patchコマンドを使用してdiffを適用
result = subprocess.run(
["patch", "-l", temp_file_path, diff_file_path],
capture_output=True, text=True,
)
これにより、大きなファイルでもピンポイントな修正が可能になりました。
開発プロセスとAI活用
AI駆動開発の実践
今回の開発では、最新のAI開発ツールを積極的に活用しました:
1. 要件定義と設計
- 業務課題の明確化
- システムアーキテクチャの設計
- セキュリティ要件の定義
- AI活用ポイントの特定
2. 実装フェーズ
- AIエージェントの開発
- Slack連携の実装
- GitHub MCP Serverの設定と統合
- エラーハンドリングの実装
Cursorを活用したVibe Coding
開発ではCursorを有効活用し、Vibe Coding(AIと対話しながら、ほとんどコードを書かずに実装を進める開発スタイル)でほとんどコードを書かずに開発を進めました:
- Cursorの機能でリポジトリのruleを作成
- このrulesを元にクリーンなコード生成、テストコード生成、PR生成などを実行
-
コード自体は1日程度で完了
この開発手法により、短期間で高品質なシステムを構築することができました。
直面した課題と解決策
1. ファイルサイズの制限
課題: 編集対象のファイルが大きいことによるAzure OpenAIの内部エラー
- 1000行を超えると処理が厳しくなる
- Cline(VS Code拡張のAIコーディングアシスタント)、Cursor(AI統合型コードエディタ)でも同様の問題が発生
対策検討: 差分取得して編集を試みたが、適切に差分が反映されない問題が発生。実装したのが5月頃でしたが、現時点(9月)の主流モデル(Claude 3.5 Sonnet、GPT-4o等)はほぼすべて200k~1M(コンテキスト長:約15万~75万文字相当)の入力をサポートできるようになって、生成の精度も高くなってきました。この課題はモデルの更新に連れ自然に解決される見込みです。
Q&A
Q: なぜGitHub MCP Serverを選んだのですか?
A: GitHub公式のMCP Serverを使うことで、認証やセキュリティ面での安全性を確保できます。また、公式サポートされているため、API変更への追従やバグ修正も期待できます。自前でGitHub APIラッパーを作るより、メンテナンス負荷が大幅に削減できました。
Q: 開発期間はどのくらいでしたか?
A: 全体の設計・実装・テストで約1週間程度です。うち、実際のコード実装はCursorを使ったVibe Codingで1日程度で完了しました。残りの時間は要件整理、アーキテクチャ設計、プロンプトの調整に費やしました。
Q: なぜGPT-4.1を利用したか?
A: 開発時期(5月頃)にちょうどGPT-4.1がリリースされたので、性能確認を兼ねて採用しました。コンテキスト長が長く、複雑なプロンプトでも安定して動作してくれました。
Q: LLMのプロンプトで特に工夫した点は何ですか?
A: 200行にわたる詳細な9ステップワークフローを定義したことです。特に:
- 各ステップでの「完了チェック」を必須化
-
FAILED_FLAG
とCOMPLETE_FLAG
での状態管理 - 過去のPRから学習する仕組み
- Diff-based編集での厳密な行番号管理
これにより、AIが迷子にならずに確実にタスクを完遂できるようになりました。
まとめ
今回開発したTerraform PR自動生成システムは、AIエージェントが自律的にコードを修正し、プルリクエストを作成するワークフローを確立することで、日常的な運用作業の効率化に大きく貢献する可能性を示しました。
奇しくも開発とほぼ同じタイミングで、より高度なタスクに対応可能なClaude Code Actionのような新しいツールがリリースされました。しかし、本記事で紹介したシステム開発を通じて得られた 「AIに複雑なタスクを安定して遂行させるための詳細なワークフロー設計」や「過去の事例から学習させる仕組み」 といった知見は、これらの新しいツールを効果的に活用する上でも非常に重要です。
私たちのチームでは、ここで得た知見を活かし、現在はClaude Code Actionを用いて権限付与のさらなる効率化を進めています。この新しい運用方法については、また後日別の記事で共有させてください。
AI技術の進歩は目覚ましく、これまで手動で行っていた繰り返し作業の自動化がますます現実的になってきています。今後もAIとの協働により、より効率的な開発プロセスを追求していきます。
技術スタック
- フロントエンド: Slack App
- バックエンド: AWS Lambda, FastAPI
- AI: OpenAI LLM, AI Agent
- リポジトリ操作: GitHub MCP Server
- インフラ: AWS (Lambda, API Gateway, Secrets Manager)
- 開発ツール: Cursor, Marp (プレゼンテーション作成)
Discussion