自然言語でAWSインフラを検索できるAIエージェントを作ってみた

はじめに

最近生成AIが流行りですので、流行りにのっかってみました。
「EC2インスタンスの一覧を教えて」「このIPアドレスのVPC IDは?」
そんな質問に、AIがリアルタイムでAWS環境を検索して回答してくれる——そんなツールを作りました。

あくまで本アプリケーションは実際の利用を想定したものというよりも、「LangChainでアプリケーションをとりあえず作って、AWSにデプロイしてみた」というものとなります。そのためコードの説明は抜粋した部分にとどめております。
こちらを踏まえた上で、暖かい目で本記事をご覧になっていただけますと嬉しいです。

技術スタック

カテゴリ 技術
AI/LLM OpenAI GPT-3.5/4
フレームワーク LangChain, LangGraph
実行環境 AWS Lambda (コンテナイメージ)
IaC Docker
CI/CD GitHub Actions (OIDC認証)

アーキテクチャ図

file

処理フロー

  1. 質問の受信: ユーザーが「EC2インスタンス一覧を教えて」と質問
  2. エージェント起動: Lambda上でLangGraphエージェントが起動
  3. ツール選択: AIが質問を解析し、適切なツール(get_ec2_infoなど)を自動選択
  4. AWS API呼び出し: Boto3経由でAWSから最新情報を取得
  5. 回答生成: 取得したデータをもとにLLMが自然な回答を生成

ディレクトリ構成

.
├── agent.py # LangGraphによるエージェントの定義
├── tools.py # AWS Boto3を使用した具体的なツール群
├── lambda_function.py # AWS Lambdaのエントリーポイント
├── test_local.py # ローカル動作確認用スクリプト
├── Dockerfile # Lambdaデプロイ用コンテナ定義
├── requirements.txt # 依存ライブラリ
└── .github/
     └── workflows/
          └── deploy.yml # 自動デプロイ用ワークフロー

実装のポイント

LangGraphによるエージェント設計

LangGraphを使用することで、「思考→ツール実行→思考…」というループを簡潔に実装できます。

# エージェントの状態定義
class AgentState(TypedDict):
    messages: Annotated[List[BaseMessage], operator.add]

# グラフの構築
workflow = StateGraph(AgentState)
workflow.add_node("agent", agent)
workflow.add_node("tools", ToolNode(tools))

# 条件分岐: ツール呼び出しがあれば実行、なければ終了
def should_continue(state: AgentState):
    last_message = state['messages'][-1]
    if last_message.tool_calls:
        return "tools"
    return END

ツールの実装

@toolデコレータを使うことで、関数をAIが呼び出せるツールとして定義できます。

@tool
def get_ec2_info(instance_id: Optional[str] = None) -> List[Dict]:
    """
    EC2インスタンスの情報を取得します。
    """
    ec2 = boto3.client('ec2')
    response = ec2.describe_instances()
    # ... 結果を整形して返却

AIはこの関数のdocstringを読んで、いつ・どう使うかを判断します。

サーバーレス × コンテナ

AWS Lambdaのコンテナイメージ機能を活用することで:

  • 依存関係の管理が楽: requirements.txtをそのままDockerfileに
  • ローカルと本番の差異なし: 同じイメージでテスト可能
  • コールドスタート対策: 必要なライブラリを事前にインストール
FROM public.ecr.aws/lambda/python:3.12
COPY requirements.txt ${LAMBDA_TASK_ROOT}
RUN pip install -r requirements.txt
COPY *.py ${LAMBDA_TASK_ROOT}
CMD [ "lambda_function.lambda_handler" ]

CI/CDパイプライン

GitHub Actionsで完全自動化しています。

on:
  push:
    branches: [master, main]

jobs:
  deploy:
    steps:
      # OIDC認証でAWSにアクセス(アクセスキー不要!)
      - uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: ${{ secrets.AWS_ROLE_ARN }}

      # Dockerビルド & ECRプッシュ
      - run: docker build --platform linux/amd64 -t $IMAGE .
      - run: docker push $IMAGE

      # Lambda更新
      - run: aws lambda update-function-code --image-uri $IMAGE

OIDC認証のメリット

  • 永続的なアクセスキーが不要: セキュリティリスクを大幅に軽減
  • 一時的な認証情報: 必要な時だけ権限を取得
  • 監査が容易: CloudTrailで誰がいつアクセスしたか追跡可能

まとめ

LangChainを使用してとりあえず作ってみたアプリケーションでしたが、DockerやGitHub Actions流行りの開発手法を網羅できたのはよかったです。
作成したコードの詳細説明は別の機会に記事にしたいと思います。


参考リンク

Last modified: 2025-12-06

Author