はじめに
最近生成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認証) |
アーキテクチャ図

処理フロー
- 質問の受信: ユーザーが「EC2インスタンス一覧を教えて」と質問
- エージェント起動: Lambda上でLangGraphエージェントが起動
- ツール選択: AIが質問を解析し、適切なツール(
get_ec2_infoなど)を自動選択 - AWS API呼び出し: Boto3経由でAWSから最新情報を取得
- 回答生成: 取得したデータをもとに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流行りの開発手法を網羅できたのはよかったです。
作成したコードの詳細説明は別の機会に記事にしたいと思います。
参考リンク
- LangChain Documentation
- LangGraph Documentation
- AWS Lambda Container Images
- GitHub Actions OIDC with AWS


