3
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?

1. はじめに

AWS Bedrock AgentCoreの使い方を調べていました。本記事ではBedrcok AgentCoreのスターターツールキットを使用したEC2のCPU利用率監視とAI調査を行うサンプルコードの作り方とテストの仕方をご紹介します。

本記事では、CloudWatchメトリクスを監視し、異常を検知した際にAIエージェントが原因を調査するシナリオのサンプルコードを掲載していますが、流用される場合はくれぐれも自己責任でお願いいたします。

2. 開発フロー

自分の開発用のPCがインターネットに接続できる環境にあることを前提として以下開発のフローを記述します。
開発フローの概要は、自分のPC上に、bedrock-agentcore-starter-toolkit を使用してPythonベースでのコードを記述し、ローカルでテスト後にAWSにデプロイする、というフローになります。

開発者のローカル環境に必要なのは:
Python 3.10以上
AWS認証情報
インターネット接続

開発フローの概要は以下のようになります。

# bedrock-agentcore-starter-toolkitを導入
pip install bedrock-agentcore-starter-toolkit

# プロジェクトの作成 
agentcore create --framework strands --model anthropic --name cpumonitoragent
cd cpumonitoragent

# AgentCoreを使用した業務コード(Python)の開発

# ローカルでのテスト
agentcore dev  # 開発サーバー起動
agentcore invoke --dev "テストメッセージ"  # ローカルテスト

# AWS上へのデプロイ
agentcore launch  # AgentCore Runtimeにデプロイ

3. プロジェクト構成

このサンプルプロジェクトでは、プロジェクトの構成は以下のように配置しています。

cpumonitoragent/
├── agent.py              # メインエージェントコード
├── tools/
│   ├── __init__.py #初期化時に自動作成
│   ├── cloudwatch_tool.py    # CloudWatch監視ツール
│   └── ec2_tool.py          # EC2情報取得ツール
├── requirements.txt
└── agentcore.yaml

4. コードの開発

以下に作成するファイルについて記載します。

①agent.py

AIのポイントになる部分をピックアップして抜粋します

import json
import logging
from datetime import datetime, timedelta
from strands import Agent 
from strands.models import BedrockModel
from bedrock_agentcore.runtime import BedrockAgentCoreApp

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

class CPUMonitorAgent:
    def __init__(self):
        # Bedrockモデルを設定
        self.model = BedrockModel(
            model_id="anthropic.claude-3-5-sonnet-20241022-v2:0"
        )
        
        # システムプロンプト
        self.system_prompt = """
        あなたはEC2インスタンスのCPU利用率を監視し、異常時に原因を調査するエージェントです。
        CPU利用率が閾値を超えた場合、詳細な調査を行い、推奨対策を提示してください。
        """
        
        # エージェント作成
        self.agent = Agent(
            model=self.model,
            system_prompt=self.system_prompt
        )
 

後続のコードは以下のように記述しています。

    def investigate_high_cpu(self, instance_id: str, threshold: float = 80.0):
        """CPU利用率調査"""
        try:
            investigation_prompt = f"""
            EC2インスタンス {instance_id} のCPU利用率が閾値 {threshold}% を超過しました。
            以下の調査を行ってください:
            
            1. 考えられる原因の分析
            2. 推奨される対策
            3. 監視すべき追加メトリクス
            
            調査結果を構造化して報告してください。
            """
            
            response = self.agent(investigation_prompt)
            
            return {
                "status": "investigated",
                "instance_id": instance_id,
                "threshold": threshold,
                "investigation": response.message,
                "timestamp": datetime.now().isoformat()
            }
            
        except Exception as e:
            logger.error(f"調査中にエラーが発生しました: {str(e)}")
            return {
                "status": "error",
                "message": f"調査中にエラーが発生しました: {str(e)}"
            }

# AgentCore Runtime用のアプリケーション
app = BedrockAgentCoreApp()

@app.entrypoint
def handler(payload, context):
    """AgentCore Runtime用のハンドラー"""
    cpu_agent = CPUMonitorAgent()
    
    # ペイロードからパラメータを取得
    instance_id = payload.get('instance_id', 'i-example123')
    threshold = payload.get('threshold', 80.0)
    
    # CPU監視調査を実行
    result = cpu_agent.investigate_high_cpu(instance_id, threshold)
    
    return result

# ローカルテスト用
if __name__ == "__main__":
    # ローカルテスト
    test_payload = {
        "instance_id": "i-1234567890abcdef0",
        "threshold": 80.0
    }
    
    test_context = {}
    result = handler(test_payload, test_context)
    print(json.dumps(result, indent=2, ensure_ascii=False))

②requirements.txt

strands-agents>=0.1.0
strands-agents-tools>=0.1.0
bedrock-agentcore>=0.1.0
boto3>=1.34.0

③AgentCore設定ファイル (agentcore.yaml)

name: cpumonitoragent 
description: "EC2 CPU監視・調査エージェント" 
runtime: 
memory: 1024 
timeout: 300 
environment: 
AWS_DEFAULT_REGION: ap-northeast-1 
permissions: 
- cloudwatch:GetMetricStatistics 
- cloudwatch:ListMetrics 
- ec2:DescribeInstances 
- logs:CreateLogGroup 
- logs:CreateLogStream 
- logs:PutLogEvents 

3. テスト実行手順

プロジェクトフォルダに移動後、以下の手順で環境の構築と実際の動作を確認していきます。

# Python仮想環境 
python -m venv .venv 
.venv\Scripts\activate # Windows PCの場合

# 必要なパッケージインストール 
pip install bedrock-agentcore strands-agents bedrock-agentcore-starter-toolkit boto3 

# AWS認証情報設定(まだの場合) 
aws configure 

# プロジェクト初期化
agentcore create 

agentcore create では以下のように質問に対して青文字で回答候補が表示されていきますので確認して進めていきます。
bdrockagentcore.png

# 作成したファイルをローカルプロジェクトに配置
(略)
# 開発サーバー起動 
agentcore dev

# テスト実行 
agentcore invoke --dev '{"instance_id": "i-1234567890abcdef0", "threshold": 80.0}' 

# AWS上にデプロイ 
agentcore launch 

デプロイ時には、以下の事が自動で行われます:
・Dockerコンテナの自動生成
・Amazon ECRリポジトリの作成
・AgentCore Runtimeへのデプロイ
・CloudWatch統合
・IAMロールの作成

4. まとめ

今回はインターネットで接続可能なローカル環境でプロジェクトを作成し、AgentCoreのデプロイを行う手順にフォーカスして検証を行いました。将来の記事で更に深堀りしていければと考えています。

AgentCore Runtime の特徴:
・完全サーバーレス: インフラ管理不要
・セッション分離: 各ユーザーセッションが独立したmicroVMで実行
・自動スケーリング: 需要に応じて自動的にスケール
・従量課金: 使用した分だけ支払い

AgentCore は「差別化されない重労働」を取り除き、開発者がエージェントの機能開発に集中できるよう設計されています。サーバーの準備や管理は一切必要なく、コードを書いて agentcore launch を実行するだけで本番環境にデプロイできます。

主な参考文献は以下になります。

・Strands Agents SDK - Amazon Bedrock AgentCore 
https://docs.aws.amazon.com/ja_jp/bedrock-agentcore/latest/devguide/strands-sdk-memory.html
・strands-agent in cloudshell | AWS re:Post 
https://repost.aws/ja/questions/QUD3XVFpa1RFygo_FuH9w5yQ/strands-agent-in-cloudshell
・Using AgentCore Code Interpreter via AWS Strands - Amazon Bedrock AgentCore
https://docs.aws.amazon.com/ja_jp/bedrock-agentcore/latest/devguide/code-interpreter-using-strands.html

3
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
3
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?