🤖

Amazon Bedrock AgentCore RuntimeでStrands AgentsのQuickstartを動かしてみる

に公開

はじめに

しれっと登場してきたAmazon Bedrock AgentCoreというサービスを試してみようと記事です。今回は特にAgentCore RuntimeというAIエージェントを安全にクラウド上へ公開できる基盤を試してみました。

初めてのAIエージェントを作ってみる

まず最初に公開するAIエージェントを作らないことには始まりません。ということで、Strands AgentsのQuickstartとして提供されている非常に簡潔なサンプルを参考に作ってみましょう。

以下のステップで作業していきます。

  1. Pythonプロジェクトの初期化
  2. Strands Agentsの依存関係の追加とインストール
  3. エージェントを実装
  4. AIエージェントを実行

Pythonプロジェクトの初期化

何も難しいことはありません。以下の構造を作ってください。ファイルの中身は未だ空のままで大丈夫です。

my-agent/
├── __init__.py
├── agent.py
└── requirements.txt

ディレクトリの中にある各ファイルは以下の役割を持っています。

ファイル名 役割
__init__.py このファイルが配置されたディレクトリがPythonパッケージであることを示すファイルです。存在さえしていればよいので最後まで空のままです。
agent.py AIエージェントの実装ファイルです。
requirements.txt Pythonプロジェクトで必要な外部ライブラリ一覧を管理すファイルです。pipコマンドを用いてこのファイルにリストされた外部ライブラリのインストールが可能です。

Strands Agentsの依存関係の追加とインストール

requirements.txtにStrands Agentsでの開発に必要な外部ライブラリを追加します。

requirements.txt
strands-agents
strands-agents-tools

追加が完了したら、my-agentディレクトリに移動してpipコマンドを実行して外部ライブラリをインストールします。

/my-agents$ pip install -r ./requirements.txt

エージェントを実装

agent.pyに非常にシンプルなAIエージェントを実装します。概ねQuickstartにある実装と同じですが、2点変更を加えています。

  1. 利用モデルにClaude Sonnet 4を明示的に指定しています。
  2. プロンプトに「回答は日本語ですること」という制約も追加しています。
agent.py
"""This script demonstrates how to create and use an AI agent with custom tools. """
from strands import Agent, tool
from strands_tools import calculator, current_time, python_repl
from strands.models import BedrockModel

# Define the Bedrock model
bedrock_model = BedrockModel(
    model_id="us.anthropic.claude-sonnet-4-20250514-v1:0",
    region_name="us-east-1"
)

# Define a custom tool as a Python function using the @tool decorator
@tool
def letter_counter(word: str, letter: str) -> int:
    """
    Count occurrences of a specific letter in a word.

    Args:
        word (str): The input word to search in
        letter (str): The specific letter to count

    Returns:
        int: The number of occurrences of the letter in the word
    """
    if not isinstance(word, str) or not isinstance(letter, str):
        return 0

    if len(letter) != 1:
        raise ValueError("The 'letter' parameter must be a single character")

    return word.lower().count(letter.lower())

# Create an agent with various tools, including a custom letter_counter tool
# as well as our custom letter_counter tool
agent = Agent(tools=[calculator, current_time, python_repl, letter_counter], model=bedrock_model)

# Ask the agent a question that uses the available tools
message = """Please respond in Japanese.
I have 4 requests:

1. What is the time right now?
2. Calculate 3111696 / 74088
3. Tell me how many letter R's are in the word "strawberry" 🍓
4. Output a script that does what we just spoke about!
   Use your python tools to confirm that the script works before outputting it
"""
agent(message)

agent.py の実装内容

agent.py は、strands ライブラリを使用してAIエージェントを構築し、カスタムツールと既存のツールを組み合わせて質問に答える方法を示すスクリプトです。

主要なコンポーネント
  1. Bedrock モデルの定義:

    • BedrockModel を使用して、Amazon Bedrock の us.anthropic.claude-sonnet-4-20250514-v1:0" モデルをAIエージェントの基盤として設定します。
  2. カスタムツールの定義 (letter_counter):

    • @tool デコレータを使用して、特定の単語内の特定の文字の出現回数をカウントする letter_counter というカスタムPython関数を定義します。
    • このツールは、入力の型チェックと単一文字の制約を強制する基本的なエラーハンドリングを含みます。
  3. エージェントの作成:

    • Agent クラスのインスタンスを作成し、以下のツールを渡します。
      • calculator (strands-tools より)
      • current_time (strands-tools より)
      • python_repl (strands-tools より)
      • letter_counter (カスタムツール)
    • 定義された bedrock_model をエージェントのモデルとして設定します。
  4. エージェントへの質問:

    • エージェントが利用可能なツールを使用するように設計された複数行のメッセージを定義します。
    • メッセージには、時刻の取得、計算の実行、カスタムツール (letter_counter) の使用、およびPythonスクリプトの出力という4つのリクエストが含まれています。
    • 最後に、定義された agent インスタンスにこのメッセージを渡すことで、エージェントを実行します。
目的

このスクリプトは、strands フレームワーク内でAIエージェントをセットアップし、組み込みツールとカスタムツールの両方を活用して複雑なマルチステップのプロンプトに応答する方法のデモンストレーションとして機能します。

AIエージェントを実行

AIエージェントの実装が出来たので実行してみます。

/my-agents$ python ./agent.py

同じ回答が出るとは限りませんが、以下の通りagent.pyに書かれているプロンプトに沿った回答が返ってくれば成功です。

承知いたしました。4つのリクエストにお答えします。

**1. 現在時刻を取得します:**
Tool #1: current_time
**2. 3111696 ÷ 74088 を計算します:**
Tool #2: calculator
**3. "strawberry"という単語に含まれる文字"R"の数を数えます:**
Tool #3: letter_counter
**4. 上記の処理を行うスクリプトを作成し、動作確認します:**
Tool #4: python_repl
Do you want to proceed with Python code execution? [y/*] y
Error reading from PTY: [Errno 5] Input/output error
=== 処理結果 ===
1. 現在時刻: 2025-08-10T16:57:38.546864+00:00
2. 3111696 ÷ 74088 = 42.0
3. 'strawberry'の中の'R'の数: 3個
4. スクリプトが正常に動作しました!
## 結果まとめ:

1. **現在時刻**: 2025-08-10T16:57:18.505750+00:00 (UTC)
2. **計算結果**: 3111696 ÷ 74088 = **42**
3. **文字数**: "strawberry" 🍓 には文字 **"R"が3個** 含まれています
4. **スクリプト**: 動作確認済みです!

以下が完成したスクリプトです:

\```python
import datetime

def get_current_time():
    """現在時刻を取得する"""
    return datetime.datetime.now(datetime.timezone.utc).isoformat()

def calculate_division(dividend, divisor):
    """割り算を計算する"""
    return dividend / divisor

def count_letter_r(word):
    """単語内の文字'R'の数を数える(大文字小文字区別なし)"""
    return word.upper().count('R')

# 実行例
print("=== 処理結果 ===")
print(f"1. 現在時刻: {get_current_time()}")
print(f"2. 3111696 ÷ 74088 = {calculate_division(3111696, 74088)}")
print(f"3. 'strawberry'の中の'R'の数: {count_letter_r('strawberry')}個")
print("4. スクリプトが正常に動作しました!")
\```

すべての処理が正常に完了し、スクリプトの動作も確認できました!

スクリプト実行のようなリスクを伴う処理にはDo you want to proceed with Python code execution? [y/*]とユーザーの許可を求めてきています。特に実装を書かなくても、このようなAIエージェント定番の機能がきちんと実現されるのは嬉しいですね。

Bedrock AgentCore で公開してみる

次に作成したAIエージェントをクラウド上に公開していきましょう。公開先はAmazon Bedrock AgentCoreの一機能であるAgentCore Runtimeです。

以下のステップで作業していきます。

  1. starter-toolkitのインストール
  2. AgentCore Runtimeの依存関係の追加とインストール
  3. agent.pyの実装変更
  4. AgentCore Runtime用の各種ファイ生成
  5. ローカルでのビルドと実行
  6. リモートでのビルドとデプロイ
  7. デプロイされたAIエージェントの実行

starter-toolkitのインストール

未だAgentCore自体がpreviewなこともありビルドやデプロイに必要なリソースの準備はマネジメントコンソールやAWS CLIで簡単に完了できる状態ではありません。しかし、嬉しいこそれらを簡単に実行してくれる便利なコマンドラインツールとしてstarter-toolkitが提供されています。今回はそれを使っていきましょう。

インストールはpipで一発です。

/$ pip install bedrock-agentcore-starter-toolkit

AgentCore Runtimeの依存関係の追加とインストール

AgentCore Runtimeで動作させるために必要な外部ライブラリをrequirements.txtに追加します。

requirements.txt
strands-agents
strands-agents-tools
# AgentCore Runtimeのため追加
bedrock-agentcore

追加が完了したら、my-agentディレクトリに移動してpipコマンドを実行して外部ライブラリをインストールします。

/my-agents$ pip install -r ./requirements.txt

agent.pyのリファクタリング

既存のagent.pyをAgentCore Runtimeで実行可能なように実装を変更します。変更後のコードは以下の通りです。

agent.py
"""This script demonstrates how to create and use an AI agent with custom tools. """
from strands import Agent, tool
from strands_tools import calculator, current_time, python_repl
from strands.models import BedrockModel
from bedrock_agentcore.runtime import BedrockAgentCoreApp

# Define the Bedrock model
bedrock_model = BedrockModel(
    model_id="us.anthropic.claude-sonnet-4-20250514-v1:0",
    region_name="us-east-1"
)

#
app = BedrockAgentCoreApp()

# Define a custom tool as a Python function using the @tool decorator
@tool
def letter_counter(word: str, letter: str) -> int:
    """
    Count occurrences of a specific letter in a word.

    Args:
        word (str): The input word to search in
        letter (str): The specific letter to count

    Returns:
        int: The number of occurrences of the letter in the word
    """
    if not isinstance(word, str) or not isinstance(letter, str):
        return 0

    if len(letter) != 1:
        raise ValueError("The 'letter' parameter must be a single character")

    return word.lower().count(letter.lower())

# Ask the agent a question that uses the available tools
message = """Please respond in Japanese.
I have 4 requests:

1. What is the time right now?
2. Calculate 3111696 / 74088
3. Tell me how many letter R's are in the word "strawberry" 🍓
4. Output a script that does what we just spoke about!
Use your python tools to confirm that the script works before outputting it
"""

@app.entrypoint
def invoke(payload):

    # Create an agent with various tools, including a custom letter_counter tool
    # as well as our custom letter_counter tool
    agent = Agent(tools=[calculator, current_time, python_repl, letter_counter], model=bedrock_model, )

    """Process user input and return a response"""
    user_message = payload.get("prompt", message)
    response = agent(user_message)
    return str(response) # response should be json serializable

if __name__ == "__main__":
    app.run()

主な変更内容は以下の通りです。大きな変更はなく、既存のStrands Agentsの実装をAgentCore Runtimeで実行できるようにラップするコードが主に追加されています。

  1. BedrockAgentCoreAppのインポートとインスタンス化。Bedrock AgentCoreで実行可能なアプリケーションの実装に必要です。
  2. invoke関数の作成と@app.entrypointの付与。ユーザーから送信されたリクエストを受信するための関数です。
  3. Agentの初期化と実行をinvoke関数内へ移動。ユーザーから送信されたリクエストに応じたエージェントの実行が可能になります。
  4. Agentからの応答をinvoke関数の応答として返却。ユーザーから送信されたリックエストに対する応答となります。

AgentCore Runtime用の各種ファイルの生成

starter toolkitのconfigureサブコマンドを利用すると必要なファイルを作成してくれます。

/my-agents$ agentcore configure --entrypoint agent.py --region us-east-1 --disable-otel
オプション 役割
entrypoint エージェントが実装されているファイルを指定します。
region デプロイ先となるリージョンを指定します。
disable-otel ローカルなどメトリクスの送信先をセットアップしてい環境での実行も想定しているので無効にしています。

実行が成功すると、.bedrock_agentcore.yamlDockerfile,.dockerignoreが追加されディレクトリ内は以下の構造になります。

./my-agent/
├── .bedrock_agentcore.yaml
├── .dockerignore
├── Dockerfile
├── __init__.py
├── agent.py
└── requirements.txt
ファイル名 役割
.bedrock_agentcore.yaml エージェントの構成ファイルです。ビルド、デプロイや実行の際に参照されます。
.dockerignore Dockerイメージをビルドする際に処理対象から除外するファイルやパターンを指定します。
Dockerfile Bedrock AgentCore Runtime上で実行されるコンテナイメージの構成ファイルです。

サーバーサイドで実行するためのひと手間

Strands Agentsで作成したAIエージェントはスクリプト実行前にDo you want to proceed with Python code execution? [y/*]と親切に尋ねてくれますが、今回はクラウド上のサーバーサイドでエージェントを実行するためユーザーへの確認によって処理が中断してしまうのは好ましくありません。このユーザーへの確認の無効化は環境変数BYPASS_TOOL_CONSENTを設定することで実現できます。

具体的には、先ほど生成されたDockerファイルに以下の一文を追加することで実現できます。

ENV BYPASS_TOOL_CONSENT=true

ローカルでのビルドと実行

クラウドへデプロイする前にローカルで動作確認をしましょう。

ローカルでのビルドと起動

以下のコマンドでローカルでビルドと起動が行われます。

/my-agent$ agentcore launch --local

ここで、exec format errorが発生する人も多いと思われます。これは、AgentCore Runtime用のDockerイメージが要求しているCPUアーキテクチャ(arm64)と実行中のマシンのCPUアーキテクチャ(たぶんamd64)が異なっているのが原因です。以下のコマンドを実行して異なるCPUアーキテクチャでもビルド可能にしてあげましょう。

/my-agent$ docker run --privileged --rm tonistiigi/binfmt --install all 

初回起動時は数分以上の時間がかかりますが根気よく待ちます。以下のログが出力されたら起動完了です。

🏠 Launching Bedrock AgentCore (local mode)...
   • Build and run container locally
   • Requires Docker/Finch/Podman to be installed
   • Perfect for development and testing

Launching Bedrock AgentCore agent 'agent' locally
⠹ Launching Bedrock AgentCore...Docker image built: bedrock_agentcore-agent:latest
✓ Docker image built: bedrock_agentcore-agent:latest
✓ Ready to run locally
Starting server at http://localhost:8080
Press Ctrl+C to stop

WARNING: The requested image's platform (linux/arm64) does not match the detected host platform (linux/amd64/v3) and no specific platform was requested
INFO:     Started server process [1]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)

Bedrock AgentCore Runtimeのarm64アーキテクチャの環境で実行されるはずのイメージを、ローカルのamd64アーキテクチャの環境で実行しているため警告が出ていますが、とりあえず問題なく動きます。

ローカルで起動したAIエージェントへのリクエスト

以下のコマンドでローカルに起動しているAIエージェントにリクエストを送ることが出来ます。今回はエージェント側にハードコードされているプロンプトを実行するためペイロードは空文字にします。

/my-agents$ agentcore invoke --local ""

サーバー側には以下のようなログが出力されます。Strands Agentsで実行したときと同じ内容ですがBYPASS_TOOL_CONSENT環境変数の設定によりユーザーへの確認が行われず、中断されることなく最後まで実行されています。

現在時刻を取得し、計算を行い、文字数を数えて、スクリプトを作成いたします。
Tool #1: current_time

Tool #2: calculator

Tool #3: letter_counter
それでは、これらの機能を実行するスクリプトを作成し、テストいたします:
Tool #4: python_repl
Error reading from PTY: [Errno 5] Input/output error
=== 4つのタスクを実行するスクリプト ===

1. 現在時刻: 2025-08-11T12:49:31.775956
2. 3111696 ÷ 74088 = 42.0
3. 単語「strawberry」に含まれる文字「r」の数: 3個
4. スクリプトが正常に動作しました!🍓
Error saving state: [Errno 13] Permission denied: '/app/repl_state/repl_state.pkl'
## ご要望への回答 📝

1. **現在時刻**: 2025年8月11日 12:49:18 (UTC)

2. **計算結果**: 3,111,696 ÷ 74,088 = **42**

3. **文字数カウント**: 「strawberry」🍓という単語には文字「R」が**3個**含まれています

4. **スクリプト**: 上記で作成・テストしたPythonスクリプトが、今お話しした4つのタスクをすべて実行します。スクリプトは正常に動作することを確認済みです!

完成したスクリプトは以下の機能を含んでいます:
- 現在時刻の取得
- 数学的計算の実行
- 文字数のカウント
- 結果の表示

す2025-08-11 12:49:41,063 - bedrock_agentcore.app - INFO - [a7e2108a] Invocation completed successfully (26.197s)
べてのタスクが正常に完了いたしました! 🎉INFO:     172.17.0.1:55094 - "POST /invocations HTTP/1.1" 200 OK

リクエストを送信したクライアント側には以下の応答が返されます。

Payload:
{
  "message": ""
}
Invoking BedrockAgentCore agent 'agent' locally
Session ID: dce21f4d-c095-47e5-9fea-9b9363a3da16

Response:
{
  "response": "\"## ご要望への回答 📝\\n\\n1. **現在時刻**: 2025年8月11日 12:49:18 (UTC)\\n\\n2. **計算結果**: 3,111,696 ÷ 74,088 = **42**\\n\\n3. **文字数カウント**: 
「strawberry」🍓という単語には文字「R」が**3個**含まれています\\n\\n4. **スクリプト**: 
上記で作成・テストしたPythonスクリプトが、今お話しした4つのタスクをすべて実行します。スクリプトは正常に動作することを確認済みです!\\n\\n完成したスクリプトは以下の機能を含んでいます:\\n- 現在時刻の取得\\n- 
数学的計算の実行\\n- 文字数のカウント\\n- 結果の表示\\n\\nすべてのタスクが正常に完了いたしました!🎉\\n\""
}

リモートでのビルドとデプロイ

次はクラウド上へのデプロイを行います。ローカルでビルドした結果をデプロイすることも可能ですが、今回はビルドもクラウド上で実行します。

/my-agent$ agentcore launch

色々とログが出てきますが、概ね以下のよう処理が行われています。

最終的に以下のメッセージを含む出力が出てくればビルドとデプロイは成功です。AIエージェントは起動済みでリクエストを受け入れ可能な状態になっています。

CodeBuild ARM64 Deployment Successful!

デプロイされたAIエージェントの実行

いよいよクラウドに公開されたAIエージェントを実行します。

リモートで起動したAIエージェントへのリクエスト

以下のコマンドでクラウド上に起動しているAIエージェントにリクエストを送ることが出来ます。今回はエージェント側にハードコードされているプロンプトを実行するためペイロードは空文字にします。

/my-agents$ agentcore invoke ""

処理が成功すると以下のよ応答を受け取ることが出来ます。

Payload:
{
  "message": ""
}
Invoking BedrockAgentCore agent 'agent' via cloud endpoint
Session ID: 2fee7d03-17b3-4b3c-a8ef-8c9b746b0a5b

Response:
{
  "ResponseMetadata": {
    "RequestId": "bee85d62-7061-4625-b442-5e133737d54a",
    "HTTPStatusCode": 200,
    "HTTPHeaders": {
      "date": "Mon, 11 Aug 2025 13:59:54 GMT",
      "content-type": "application/json",
      "transfer-encoding": "chunked",
      "connection": "keep-alive",
      "x-amzn-requestid": "bee85d62-7061-4625-b442-5e133737d54a",
      "baggage": "Self=1-6899f73b-6e5af7c32d8a872144599aeb,session.id=2fee7d03-17b3-4b3c-a8ef-8c9b746b0a5b",
      "x-amzn-bedrock-agentcore-runtime-session-id": "2fee7d03-17b3-4b3c-a8ef-8c9b746b0a5b",
      "x-amzn-trace-id": "Root=1-6899f73b-6a1d16ef40c0d10334f20222;Self=1-6899f73b-6e5af7c32d8a872144599aeb"
    },
    "RetryAttempts": 0
  },
  "runtimeSessionId": "2fee7d03-17b3-4b3c-a8ef-8c9b746b0a5b",
  "traceId": "Root=1-6899f73b-6a1d16ef40c0d10334f20222;Self=1-6899f73b-6e5af7c32d8a872144599aeb",
  "baggage": "Self=1-6899f73b-6e5af7c32d8a872144599aeb,session.id=2fee7d03-17b3-4b3c-a8ef-8c9b746b0a5b",
  "contentType": "application/json",
  "statusCode": 200,
  "response": [
    "b'\"\\xe5\\xae\\x8c\\xe7\\x92\\xa7\\xe3\\x81\\xa7\\xe3\\x81\\x99\\xef\\xbc\\x81\\xe3\\x82\\xb9\\xe3\\x82\\xaf\\xe3\\x83\\xaa\\xe3\\x83\\x97\\xe3\\x83\\x88\\xe3\\x81\\x8c\\xe6\\xad\\xa3\\xe5\\xb8\\xb8\\xe3\\x81\\xab\\
xe5\\x8b\\x95\\xe4\\xbd\\x9c\\xe3\\x81\\x99\\xe3\\x82\\x8b\\xe3\\x81\\x93\\xe3\\x81\\xa8\\xe3\\x82\\x92\\xe7\\xa2\\xba\\xe8\\xaa\\x8d\\xe3\\x81\\x97\\xe3\\x81\\xbe\\xe3\\x81\\x97\\xe3\\x81\\x9f\\xe3\\x80\\x82\\\\n\\\\n## 
\\xe3\\x81\\x94\\xe8\\xa6\\x81\\xe6\\x9c\\x9b\\xe3\\x81\\xb8\\xe3\\x81\\xae\\xe5\\x9b\\x9e\\xe7\\xad\\x94\\xef\\xbc\\x9a\\\\n\\\\n**1. \\xe7\\x8f\\xbe\\xe5\\x9c\\xa8\\xe6\\x99\\x82\\xe5\\x88\\xbb:** 
2025-08-11T13:59:27.555251+00:00\\\\n\\\\n**2. \\xe8\\xa8\\x88\\xe7\\xae\\x97\\xe7\\xb5\\x90\\xe6\\x9e\\x9c:** 3111696 \\xc3\\xb7 74088 = **42**\\\\n\\\\n**3. \\xe6\\x96\\x87\\xe5\\xad\\x97\\xe6\\x95\\xb0:** 
\\\\\"strawberry\\\\\" \\xf0\\x9f\\x8d\\x93 \\xe3\\x81\\xa8\\xe3\\x81\\x84\\xe3\\x81\\x86\\xe5\\x8d\\x98\\xe8\\xaa\\x9e\\xe3\\x81\\xab\\xe3\\x81\\xaf **3\\xe5\\x80\\x8b** \\xe3\\x81\\xae \\\\\"r\\\\\" 
\\xe3\\x81\\x8c\\xe5\\x90\\xab\\xe3\\x81\\xbe\\xe3\\x82\\x8c\\xe3\\x81\\xa6\\xe3\\x81\\x84\\xe3\\x81\\xbe\\xe3\\x81\\x99\\\\n\\\\n**4. 
\\xe5\\xae\\x8c\\xe6\\x88\\x90\\xe3\\x81\\x97\\xe3\\x81\\x9fPython\\xe3\\x82\\xb9\\xe3\\x82\\xaf\\xe3\\x83\\xaa\\xe3\\x83\\x97\\xe3\\x83\\x88:**\\\\n\\\\n```python\\\\nfrom datetime import datetime, timezone\\\\n\\\\ndef 
get_current_time():\\\\n    
\\\\\"\\\\\"\\\\\"\\xe7\\x8f\\xbe\\xe5\\x9c\\xa8\\xe3\\x81\\xae\\xe6\\x99\\x82\\xe5\\x88\\xbb\\xe3\\x82\\x92\\xe5\\x8f\\x96\\xe5\\xbe\\x97\\xef\\xbc\\x88UTC\\xef\\xbc\\x89\\\\\"\\\\\"\\\\\"\\\\n    return 
datetime.now(timezone.utc).isoformat()\\\\n\\\\ndef calculate_division(dividend, divisor):\\\\n    \\\\\"\\\\\"\\\\\"\\xe9\\x99\\xa4\\xe7\\xae\\x97\\xe3\\x82\\x92\\xe5\\xae\\x9f\\xe8\\xa1\\x8c\\\\\"\\\\\"\\\\\"\\\\n    
return dividend / divisor\\\\n\\\\ndef count_letter_in_word(word, letter):\\\\n    
\\\\\"\\\\\"\\\\\"\\xe5\\x8d\\x98\\xe8\\xaa\\x9e\\xe5\\x86\\x85\\xe3\\x81\\xae\\xe7\\x89\\xb9\\xe5\\xae\\x9a\\xe3\\x81\\xae\\xe6\\x96\\x87\\xe5\\xad\\x97\\xe3\\x81\\xae\\xe6\\x95\\xb0\\xe3\\x82\\x92\\xe6\\x95\\xb0\\xe3\\x
81\\x88\\xe3\\x82\\x8b\\\\\"\\\\\"\\\\\"\\\\n    return word.lower().count(letter.lower())\\\\n\\\\n# 
\\xe3\\x83\\xa1\\xe3\\x82\\xa4\\xe3\\x83\\xb3\\xe5\\xae\\x9f\\xe8\\xa1\\x8c\\xe9\\x83\\xa8\\xe5\\x88\\x86\\\\nprint(\\\\\"=== 
\\xe3\\x83\\xaa\\xe3\\x82\\xaf\\xe3\\x82\\xa8\\xe3\\x82\\xb9\\xe3\\x83\\x88\\xe3\\x81\\xae\\xe7\\xb5\\x90\\xe6\\x9e\\x9c ===\\\\\")\\\\n\\\\n# 1. 
\\xe7\\x8f\\xbe\\xe5\\x9c\\xa8\\xe6\\x99\\x82\\xe5\\x88\\xbb\\\\ncurrent_time = get_current_time()\\\\nprint(f\\\\\"1. \\xe7\\x8f\\xbe\\xe5\\x9c\\xa8\\xe6\\x99\\x82\\xe5\\x88\\xbb: {current_time}\\\\\")\\\\n\\\\n# 2. 
\\xe8\\xa8\\x88\\xe7\\xae\\x97 3111696 / 7408'",
    "b'8\\\\nresult = calculate_division(3111696, 74088)\\\\nprint(f\\\\\"2. 3111696 \\xc3\\xb7 74088 = {result}\\\\\")\\\\n\\\\n# 3. 
\\\\\"strawberry\\\\\"\\xe5\\x86\\x85\\xe3\\x81\\xae\\\\\"r\\\\\"\\xe3\\x81\\xae\\xe6\\x95\\xb0\\\\nletter_count = count_letter_in_word(\\\\\"strawberry\\\\\", \\\\\"r\\\\\")\\\\nprint(f\\\\\"3. 
\\'strawberry\\'\\xe5\\x86\\x85\\xe3\\x81\\xae\\'r\\'\\xe3\\x81\\xae\\xe6\\x95\\xb0: {letter_count}\\xe5\\x80\\x8b\\\\\")\\\\n\\\\nprint(\\\\\"\\\\\\\\n=== 
\\xe3\\x82\\xb9\\xe3\\x82\\xaf\\xe3\\x83\\xaa\\xe3\\x83\\x97\\xe3\\x83\\x88\\xe3\\x81\\xae\\xe3\\x83\\x86\\xe3\\x82\\xb9\\xe3\\x83\\x88\\xe5\\xae\\x8c\\xe4\\xba\\x86 
===\\\\\")\\\\n```\\\\n\\\\n\\xe3\\x81\\x93\\xe3\\x81\\xae\\xe3\\x82\\xb9\\xe3\\x82\\xaf\\xe3\\x83\\xaa\\xe3\\x83\\x97\\xe3\\x83\\x88\\xe3\\x81\\xaf\\xe7\\xa7\\x81\\xe3\\x81\\xaePython\\xe3\\x83\\x84\\xe3\\x83\\xbc\\xe3\\
x83\\xab\\xe3\\x81\\xa7\\xe3\\x83\\x86\\xe3\\x82\\xb9\\xe3\\x83\\x88\\xe6\\xb8\\x88\\xe3\\x81\\xbf\\xe3\\x81\\xa7\\xe3\\x80\\x81\\xe6\\xad\\xa3\\xe5\\xb8\\xb8\\xe3\\x81\\xab\\xe5\\x8b\\x95\\xe4\\xbd\\x9c\\xe3\\x81\\x99\\x
e3\\x82\\x8b\\xe3\\x81\\x93\\xe3\\x81\\xa8\\xe3\\x82\\x92\\xe7\\xa2\\xba\\xe8\\xaa\\x8d\\xe3\\x81\\x97\\xe3\\x81\\xa6\\xe3\\x81\\x84\\xe3\\x81\\xbe\\xe3\\x81\\x99\\xef\\xbc\\x81\\xf0\\x9f\\x8d\\x93\\\\n\"'"
  ]
}

レスポンスのメッセージがバイナリデータとなっていますが、デコードすると以下の文字列であることが分かります。無事にStrands Agents単体での実行時、ローカルでの実行時、いずれとも同等の結果がAgentCore Runtime上で実行しても取得することが出来ました。

完璧です!スクリプトが正常に動作することを確認しました。

## ご要望への回答:

**1. 現在時刻:** 2025-08-11T13:59:27.555251+00:00

**2. 計算結果:** 3111696 ÷ 74088 = **42**

**3. 文字数:** "strawberry" 🍓 という単語には **3個** の "r" が含まれています

**4. 完成したPythonスクリプト:**

\```python
from datetime import datetime, timezone

def get_current_time():
    """現在の時刻を取得(UTC)"""
    return datetime.now(timezone.utc).isoformat()

def calculate_division(dividend, divisor):
    """除算を実行"""
    return dividend / divisor

def count_letter_in_word(word, letter):
    """単語内の特定の文字の数を数える"""
    return word.lower().count(letter.lower())

# メイン実行部分
print("=== リクエストの結果 ===")

# 1. 現在時刻
current_time = get_current_time()
print(f"1. 現在時刻: {current_time}")

# 2. 計算 3111696 / 74088
result = calculate_division(3111696, 74088)
print(f"2. 3111696 ÷ 74088 = {result}")

# 3. "strawberry" 内の "r" の数
letter_count = count_letter_in_word("strawberry", "r")
print(f"3. 'strawberry' 内の 'r' の数: {letter_count}個")

print("\n=== スクリプトのテスト完了 ===")
\```

このスクリプトは私のPythonツールでテスト済みで、正常に動作することを確認しています!🍓

最後に

今回の目的であるAgentCore RuntimeでのAIエージェント開発の一連の流れを確認することはできました。AgentCore Runtimeは作成したAIエージェントを安全にクラウドに公開できる基盤であり、これから本格的にAIエージェントの作成や利用を推進する人々にとって「Undifferentiated Heavy Lifting(差別化されない重同労)」からの解放を実現してくれるサービスになってくれそうです。

AgentCoreには、Runtime以外にもGatewaysやIdentityなどの気になる機能も存在しているので、時間を見つけて、Strands Agentsとの連携も含めて色々と試していこうと思います。

Discussion