Amazon Bedrock AgentCoreを一通りさわり倒してみる ~ 全体の感想とRuntime編 ~

ジェネラティブエージェンツの遠藤です。
7月にジョインしたばかりなので初めましての方が多いと思いますが、今後ともよろしくお願いします!

発表されたばかりのAmazon Bedrock AgentCore (Preview)のドキュメントを一通り読んだところ、「これ欲しかったやつ!!」ってなってテンションが爆上がりしています。
勢いに任せて全部触ってまとめようと思ったのですが思ったより量が多いので、まずは全体の感想とAgentCore RuntimeでLangChainを動かしてみた所をまとめてみました。

aws.amazon.com

ざっくりの感想として「遂にエージェントのためにAWSが本気で作ってくれたやつがでたな・・・!」って感じがしています。
LLMアプリケーションのインフラを考え始めると色々と悩ましい点が多いのですが、Agent Coreにはそれらの困りどころを解決するためのサービスが多数実装されています。

AgentCoreがめちゃくちゃ熱い・・・!

実際にLLMアプリケーションをデプロイしようとすると、以下のような点が悩ましいポイントになると思います。

  • アクセスがまばらだったりスパイクがあったりするけどサーバどうしよう
  • 短期記憶とか長期記憶を保存しておきたいけどデータストアどうしよう
  • エージェントが作ったコードをサンドボックス環境で実行させたい
  • エージェントにブラウザ操作させるために独立したブラウザ環境を準備したい
  • エージェントが利用するMCPやツールのデプロイとか認証どうしよう
  • 稼働状況の監視やトレースがしたいけどどうしよう
  • エージェントに認証がある外部サービスを触らせたいがどうしよう
  • などなど・・・

AgentCore、なんとこれらの困りどころを解決するサービス群で構成されています。
サーバ周りは「Runtime」が、記憶周りは「Memory」が、サンドボックス環境でのコード実行は「Code Interpreter」が、ブラウザ操作は「Browser」が、MCP周りは「Gateway」が、監視は「Observability」が、認証周りは「Identity」が面倒を見てくれる布陣となっています。

個人的にはRuntime、Code Interpreter、Browserだけでも凄い嬉しいのに、MemoryやIdentityもとても助かるし、複雑な事するならGatewayにも助けられそうだし、監視は絶対したいからObservabilityにもお世話になるしで全部使う未来しかみえません。

実際に触ってみた

各サービスの肌感をつかむべく簡単に触ってみた内容についてまとめていきます。
目的はそれぞれのサービスで何ができるかをつかむことなので、ふわっと触れてます。
今回はまずAgentCore Runtimeについてまとめています。
他のサービスは別記事で書こうと思います。

AgentCore Runtime

これがAgentCoreの中心といっても過言では無い、エージェントをデプロイするためのサーバレス環境ですね。
スケールはもちろん、実行時に割り当てられるSession IDを用いた最長8時間の連続稼働など魅力的な機能が沢山あります。

より詳しく知りたい方は以下の公式ドキュメントをぜひご覧下さい。

docs.aws.amazon.com

デプロイするコードは幾つかの規約(/invocationsに応答することとか)さえ守ればOKで、FastAPIとかで自前で実装しても良いのですが、便利なライブラリ(bedrock_agentcore.runtime)も提供されています。
このライブラリを利用することで規約に準拠したアプリがさっと実装できるようになっています。

実験用のサンプルコードを組んでみた

LangGraph quickstartのコードを借りつつ実際に実装して動かしてみます。

# agent_core_runtime.py
from bedrock_agentcore.runtime import BedrockAgentCoreApp
from langgraph.prebuilt import create_react_agent


def get_weather(city: str) -> str:
    """Get weather for a given city."""
    return f"It's always sunny in {city}!"


agent = create_react_agent(
    model="anthropic:claude-3-7-sonnet-latest",
    tools=[get_weather],
    prompt="You are a helpful assistant",
)

app = BedrockAgentCoreApp()


@app.entrypoint
def invoke(payload):
    location = payload.get("prompt")
    result = agent.invoke(
        {"messages": [{"role": "user", "content": f"what is the weather in {location}"}]}
    )
    return {"result": result["messages"][-1].content}


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

こういうコードを書くだけで、ローカルでは以下のようにエージェントを起動させれます。

$ python agent_core_runtime.py
INFO:     Started server process [10327]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:8080 (Press CTRL+C to quit)

curlで叩けばちゃんと応答を返してくれます。

$ curl -X POST http://localhost:8080/invocations -H "Content-Type: application/json" -d '{"prompt": "tokyo"}'
{"result":"According to the current weather information, it's always sunny in Tokyo! Looks like you've got great weather there."}

公式ドキュメントにはFastAPIで実装したパターンなども載ってますが、ライブラリを利用した方が圧倒的にシンプルでとても楽ですね。

デプロイ前の準備

エージェントを動かすためのexecution roleが必要なので、以下のページを見て事前に作成してarnを控えておいてください。

Permissions for AgentCore Runtime - Amazon Bedrock AgentCore

注意点として、公式ドキュメントで指定されているIAM Roleの権限だと動作しない場合がありました。
例えばECRからのpullに失敗したりしたのですが、そこまで深掘りしていないので手元で発生した場合は適宜調整してみてください。
まだプレビューなのでトライ&エラーで突き進む部分がありますね。

デプロイしてみた

bedrock-agentcore-starter-toolkitというライブラリをインストールするとagentcoreコマンドが利用できるようになります。

$ pip install bedrock-agentcore-starter-toolkit
$ agentcore --help

罫線が崩れちゃうので「--help」の結果は画像で貼りますね。

agentcore --helpの内容

このコマンドで初期設定(configure)やデプロイ(launch)、デプロイしたエージェントの起動(invoke)などができます。
まずはデプロイのために初期設定をします。

$ agentcore configure --entrypoint agent_core_runtime.py -er <先ほど作ったRoleのARN>

このコマンドを実行すると「ECRを自動で作る?」とか色々聞かれるので状況に合わせて答えてください。
そうするとDockerfile.bedrock_agentcore.yamlといったファイルが作られます。

その後以下のコマンドでローカルで動作確認できます。
現状、環境変数を渡す公式な方法を見つけられなかったので、検証のためにやむを得ずDockerfileにAPIキーを直接記述しました。

$ agentcore launch -l
Launching Bedrock AgentCore (local mode)...

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

Found credentials in shared credentials file: ~/.aws/credentials
Configuration of aws_configurator not loaded, configurator already loaded
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)

ローカルでちゃんと動いたら、次はデプロイですね。

$ agentcore launch

出力結果が長いのでここでは割愛しますが、上手くいくと「Deployment Successful!」と表示されます。
デプロイできたら以下のコマンドでエージェントを起動できます。

$ agentcore invoke '{"prompt": "tokyo"}'
Payload:
{
  "prompt": "tokyo"
}
Invoking BedrockAgentCore agent 'agent_core_runtime' via cloud endpoint
Found credentials in shared credentials file: ~/.aws/credentials                                                                                        
Session ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
...

Response:
{
  ...
  "contentType": "application/json",
  "statusCode": 200,
  "response": [
    "b'{\"result\":\"Based on the information I received, it\\'s currently sunny in Tokyo! Perfect weather if you\\'re in the area or planning to 
visit.\"}'"
  ]
}

またしても出力が長いので途中を「...」で省略しましたが、ちゃんとエージェントが応答を返してくれました!
Session IDが発行されてるので、連続してinvokeしたい時はこのSession IDを指定して実行できます。
invokeコマンドの細かい使い方は以下のコマンドで確認できます。

$ agentcore invoke --help

これも罫線が崩れちゃうので「--help」の結果は画像で。

agentcore invoke --helpの結果

また、デプロイするとマネジメントコンソールのBedrockの中に表示されます。

マネジメントコンソール上のエージェントの状況

CloudWatchでもトレースが見えるようになります。

CloudWatchで表示されるエージェントのトレース情報

これだけの環境を手動で構築するのは非常に大変ですが、AgentCore Runtimeを使えばインフラ管理をAWSに任せてエージェント本体の開発に集中できるのでとても熱いですね!!

まとめ

今回はAmazon Bedrock AgentCore全体の感想と、その中のAgentCore Runtimeを動かしてみた記録をまとめてみました。
まだプレビューなのでGAまでにどうなるかはドキドキですが、現時点でもすでに期待しかないのでとてもワクワクしています。

Code Interpreterとか「今までやりたくてもインフラが準備しきれないから・・・」って諦めていたことを気軽にできそうですし、Identityもよりエージェントに色々な作業をお願いできるのではという期待しかありません。
今回紹介できなかった残りの機能も順次触り倒していこうと思うので、続編をお待ち頂ければと思います!