こんにちは!クラウドインフラやSREの世界へようこそ。
日々、TerraformのHclと格闘したり、複雑なAWSのコンソール画面をクリックして回ったりしていませんか?「チャットに『ここに高可用性なVPCを作って』と打つだけで、インフラが勝手に組み上がったらどんなに楽だろう……」そんな未来のSREの姿を夢見たことはありませんか?
今回は、次世代のインフラ構成管理(IaC)ツールである Pulumi と、LLMの代表格である OpenAI API を組み合わせて、「チャットからインフラを自動生成し、プレビューまで実行するAIボット」を作る実験的な試みを解説します。
「AIにコードを書かせるなんて危なくない?」と思うかもしれませんが、そこはプロのSRE。安全に実務へ適用するためのバリデーションの仕組みも含めて、優しく、そして徹底的に深掘りしていきましょう。これをマスターすれば、あなたのインフラ構築のワークフローは劇的に変わりますよ!
—
1. なぜ「Pulumi × OpenAI API」なのか?
従来のIaC(TerraformやCloudFormationなど)は、専用のドメイン固有言語(DSL)やYAML/JSONを書く必要がありました。もちろん型安全性や宣言的記法のメリットは大きいですが、「人間がコードに落とし込むまでのリードタイム」がどうしても発生します。
ここで Pulumi の出番です。Pulumiの最大の特徴は、TypeScript、Python、Goといった汎用プログラミング言語でインフラを定義できる点にあります。
そして、この特徴が LLM(OpenAI API)と劇的なシナジーを生みます。LLMはYAMLを書くよりも、PythonやTypeScriptのコード生成において圧倒的に高い精度を発揮します。つまり、「自然言語のプロンプト $\rightarrow$ OpenAI API $\rightarrow$ 実行可能なPulumiコード」というパイプラインを作ることが、技術的に非常に自然で、かつ強力なのです。
—
2. 開発環境の全体像とセットアップ
まずは、私たちの実験室(ローカル環境)を整えましょう。今回は最も書きやすくAIとの相性も良い Python をベースに進めます。
必要なツールのインストール
以下のツールがインストールされていることを確認してください。
- Python 3.10以上
- Pulumi CLI
- OpenAI Python SDK
Pulumi CLIのインストール(macOSの場合)
brew install pulumi
作業用ディレクトリの作成と仮想環境の有効化
mkdir pulumi-ai-bot
cd pulumi-ai-bot
python -m venv venv
source venv/bin/activate
必要なライブラリのインストール
pip install pulumi openai pydantic
APIキーの設定
OpenAIのAPIキーを環境変数に設定しておきます。
export OPENAI_API_KEY=”sk-your-openai-api-key-here”
—
3. 実装:チャットからPulumiコードを生成するボット
ここからが本題です。自然言語を受け取り、OpenAI APIを使ってPulumiのPythonコードを出力、さらにそれを安全にファイルとして書き出して `pulumi preview` まで走らせるPythonスクリプトを作成します。
プロジェクト内に `bot.py` という名前で以下のコードを作成してください。
import os
import subprocess
from openai import OpenAI
from pydantic import BaseModel, Field
OpenAIクライアントの初期化
client = OpenAI(api_key=os.environ.get(“OPENAI_API_KEY”))
LLMの出力を構造化するためのPydanticモデル
class InfrastructureCode(BaseModel):
explanation: str = Field(description=”生成したインフラストラクチャの解説”)
python_code: str = Field(description=”実行可能なPulumi(Python)のコード全体。__main__.pyにそのまま書き込めるもの。”)
def generate_pulumi_code(prompt: str) -> InfrastructureCode:
“””
自然言語のプロンプトからOpenAI APIを用いてPulumiのPythonコードを生成する
“””
system_prompt = “””
あなたは世界最高峰のクラウドインフラ・SREエンジニアです。
ユーザーの要望に基づき、Pulumi (Python) を用いたインフラ定義コードを生成してください。
【ルール】
1. リソースはAWSを想定してください(例: pulumi_aws)。
2. コードはそのまま `__main__.py` として実行できる完全なものにしてください。
3. プレースホルダーではなく、実際に動作するリソース名や設定を使用してください。
4. 危険な設定(全開放のセキュリティグループなど)は避け、ベストプラクティスに従ってください。
“””
response = client.beta.chat.completions.parse(
model=”gpt-4o”,
messages=[
{“role”: “system”, “content”: system_prompt},
{“role”: “user”, “content”: prompt},
],
response_format=InfrastructureCode,
)
return response.choices[0].message.parsed
def init_pulumi_project():
“””実験用のPulumiプロジェクトを初期化する”””
if not os.path.exists(“Pulumi.yaml”):
subprocess.run([“pulumi”, “new”, “aws-python”, “–name”, “ai-infra-bot”, “–stack”, “dev”, “–yes”], check=True)
def main():
print(“🤖 SRE AI Bot: インフラの要望を教えてください(例: ‘t3.microのEC2インスタンスを1つ作って’)”)
user_prompt = input(“>>> “)
print(“\n[1/3] 🧠 OpenAI APIがインフラストラクチャのコードを設計中…”)
result = generate_pulumi_code(user_prompt)
print(f”\n💡 設計意図:\n{result.explanation}\n”)
print(“[2/3] 📦 Pulumiプロジェクトの準備とコードの書き込み…”)
init_pulumi_project()
# __main__.pyにAIが生成したコードを上書き
with open(“__main__.py”, “w”) as f:
f.write(result.python_code)
print(“[3/3] 🔍 Pulumi Previewを実行して安全性を検証中…\n”)
try:
# 実際にリソースを作成する前に、変更計画(プレビュー)を表示する
subprocess.run([“pulumi”, “preview”], check=True)
print(“\n✨ プレビューが正常に完了しました!コードを適用する場合は ‘pulumi up’ を実行してください。”)
except subprocess.CalledProcessError as e:
print(f”\n❌ Pulumiのプレビュー中にエラーが発生しました: {e}”)
if __name__ == “__main__”:
main()
—
4. 動作確認:実際にチャットからインフラをデプロイしてみよう
それでは、このボットを動かしてみましょう!ターミナルで以下を実行します。
python bot.py
画面にプロンプトが表示されたら、次のように入力してみてください。
>>> t3.microのEC2インスタンスを1つ、名前は ‘web-server’ で作って。ついでにセキュリティグループでHTTP(80)を許可して。
数秒待つと、OpenAI APIがコードを生成し、自動的に `__main__.py` が書き換えられて `pulumi preview` が走ります。コンソールには、AWS上にどのようなリソースが作成される予定なのかの差分(Plan)が美しく表示されるはずです。
🌟 このアプローチの何が凄いのか?
1. Pydanticによる型安全なLLM出力
`response_format=InfrastructureCode` を使うことで、LLMが勝手に変なフォーマットで出力するのを防ぎ、確実に「解説」と「Pythonコード」の構造体として受け取ることができます。
2. 「Apply」ではなく「Preview」で止める安全性
AIは何を言い出すか分からない(ハルシネーションの懸念がある)ため、コード生成の直後にいきなり `pulumi up`(適用)するのではなく、必ず `pulumi preview` で人間のSREがレビューする仕組みにしています。これが実務でAIを使うための絶対的な鉄則です。
—
5. 実務へ適用するためのSRE的知見とさらなる高みへ
この実験的な試みを、個人の遊びから「実務で使える信頼性の高いプラットフォーム」に昇華させるためには、以下のステップを踏む必要があります。
- 静的解析とポリシーチェック(OPA / Checkov)
AIが生成したコードを `__main__.py` に書き込んだ後、デプロイ前にセキュリティLinter(CheckovやOpenAIの追加プロンプトによるレビュー)を挟み、IAMポリシーが過剰に広くないかなどを機械的にチェックさせます。
- ステート管理の安全化
本番環境でこれを動かす場合、Pulumiのバックエンド(Pulumi ServiceやAWS S3等)を厳格に管理し、誰がどのプロンプトからどのインフラを生成したかの監査ログ(Audit Log)を必ず残すように設計します。
おわりに
今回は、PulumiとOpenAI APIを連携させて、チャットからインフラを自動生成・プレビューするボットの作り方を解説しました。
「インフラをコードで管理する(IaC)」の次は、「自然言語の意図からインフラを動的に導出する(Conversational IaC)」の時代が確実に近づいています。
しかし、どれだけAIが進化しようとも、最終的な安全性を担保し、システムに責任を持つのは私たちエンジニアです。「AIにコードを書かせ、人間がPreviewでレビューする」という黄金律を守れば、日々のインフラ運用はもっとクリエイティブで楽しいものになります。
ぜひ、手元の環境で試して、未来のインフラ管理を体感してみてくださいね!それでは、良きIaCライフを!