11
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

最もシンプルな構成でAmazon Bedrock AgentCore Gatewayを理解する - ServiceNowエージェント構築実践

11
Last updated at Posted at 2025-09-01

この記事は99.9%人間が書きました(画像多いです)

みなさま日々のAIエージェント構築おつかれさまです。
数千兆のAIエージェント稼働には、マネージドなプラットフォームが必須です。
弊社もオレオレプラットフォームでAIエージェントの構築に取り組んでいましたが、そんな時にAWSから新しいサービス Amazon Bedrock AgentCore の発表がありました。

今回は、(個人的に)もっともシンプルに実践できる方法をご紹介します。

こんな方におすすめ

・まずは最小限のシンプルな構成で、Amazon Bedrock AgentCore Gatewayをステップバイステップで試して理解を深めたい。
・シンプルな構成に +1 で外部システムを追加する手順を知りたい。

Amazon Bedrock AgentCore(プレビュー)とは

デベロッパーが Amazon Bedrock または他の場所でホストされているあらゆるフレームワークとモデルを使用して、AI エージェントを大規模、迅速、安全にデプロイおよび運用するのに役立つ、包括的な一連のエンタープライズグレードのサービスです。

Amazon Bedrock AgentCoreは、様々な機能が提供されています。今回は AgentCore Gatewayに着目し、ServiceNowをツールとして活用するAIエージェントを作成してみます。

AgentCore Gateway – 既存の API と AWS Lambda 関数をエージェント対応ツールに変換し、MCP などのプロトコルやランタイム検出にわたる統合アクセスを提供します。

ServiceNowとは

ServiceNowは、企業のデジタルトランスフォーメーションを推進するAIを搭載したインテリジェントプラットフォームです。

IT、人事、カスタマーサービス、ファイナンスなど各部門の業務を一つのプラットフォームに統合し、AIと自動化によって業務プロセスを最適化します。既存システムの上に配置され、総入れ替えの必要なく導入できる「System of Action®」として機能します。

これにより、手作業を自動化して効率を大幅に向上させ、部門間のデータと業務フローをシームレスに連携。従業員は複雑な操作から解放され、より戦略的な業務に集中できるようになります。

ServiceNowは、成長促進とコスト削減を同時に実現する、企業のデジタル変革の中核となるプラットフォームです。

利用するサンプルノートブック

サービス発表前にAWSソリューションアーキテクト勢が総力を結集して作成したであろう以下のリポジトリから、AgentCore Gatewayのサンプルノートブックを利用します。

アーキテクチャ

今回実践するシステムのアーキテクチャは以下の通りです。実行環境には Amazon SageMaker AI ノートブックインスタンスを利用します。基本はサンプルノートブックのままです。追加で、ServiceNowをツールとして追加して、AIエージェント(Strands Agents)がServiceNowに関するタスクを行います。

image.png

番号をつけた処理フローを説明します。

  1. ユーザーは、Amazon SageMaker AI ノートブックインスタンス上で、サンプルノートブックを実行します。AIエージェントにはStrands Agentsが使われています。
  2. AgentCore Gatewayを利用する前に、Amazon Cognitoで認証を行い、Tokenを取得します。
  3. 取得したTokenを持ち、AgentCore Gateway を利用します。
  4. 外部システムを利用するために、AgentCore Identity と AWS Secrets Manager からキー情報を取得します。
  5. 取得したキー情報を用いて、外部システムを利用します。

実践1:サンプルノートブックの実行(ServiceNowなし)

冒頭に示した、サンプルノートブックを実行してみましょう。リージョンは、「米国(北部バージニア):us-east-1」としています。

1-1. Amazon SageMaker AI ノートブックインスタンスの構築

マネジメントコンソールから Amazon SageMaker AI を開き、
左メニューから、Notebooksを選択します。
「ノートブックインスタンスの作成」をクリックします。

image.png

まず、新しいIAMロールを作成します。
image.png

新しいIAMロール作成後、下記の画面のように入力していきます。
ノートブックインスタンス名は、test-agentcore-servicenowとしました。
image.png

Git リポジトリも設定しておきます。設定しなくても、JupyterLabのコンソールから git clone すればよいです。

https://github.com/awslabs/amazon-bedrock-agentcore-samples.git

image.png

「ノートブックインスタンスの作成」をクリックします。

image.png

3分待ちましょう。
作成されました。

image.png

IAMロールARNをクリックすると、作成されたIAMロールの詳細を見ることができます。
作成されたIAMロールは以下のような状態です。

image.png

「JupyterLabを開く」をクリックします。

image.png

Jupyter Labが起動しました

image.png

左のメニューから

01-tutorials > 02-transform-apis-into-mcp-tools > 01-transform-openapi-into-mcp-tools >
01-openapis-into-mcp-api-key.ipynb

を開きます。

image.png

カーネルは、conda_python3を選択します。

1-2. サンプルノートブック実行 - 準備編

サンプルノートブックを実行していきます。
最初のセルにて、いくつかエラーが出力されますが、ノートブックの実行は可能です。

image.png

ちなみに、requirements.txtでインストールされたライブラリのバージョンは以下:

bedrock-agentcore                       0.1.2
bedrock-agentcore-starter-toolkit       0.1.7
boto3                                   1.40.21
strands-agents                          1.6.0
strands-agents-tools                    0.2.5
uv                                      0.8.14
uvicorn                                 0.35.0

次のセルにいきます。

SageMakerノートブックインスタンスなので、AWS_ACCESS_KEY_IDとAWS_SECRET_ACCESS_KEYの設定は不要です。

リージョンも今回はus-east-1なので変更不要です。us-east-1以外で実施している場合は、リージョンを修正してください。

image.png

image.png

次のセルを実行します。AgentCore Gateway用のIAMロールを作成をします。
はい、IAMロールの作成権限がないので怒られます。

image.png

ノートブックインスタンスのIAMロールに、権限を追加しましょう。
マネジメントコンソールに戻り、ノートブックインスタンスの詳細画面を出します。

IAMロール ARNをクリックします。
image.png

IAMのロール詳細画面に遷移しました。
「ポリシーをアタッチ」をクリックします。

image.png

検索窓にIAMfull などと入力し、

IAMFullAccessを選択して、「許可を追加」をクリックします。

image.png

ポリシーがアタッチされました。

image.png

この対応、この後数回発生します。

JupyterLabに戻り、再度セルを実行します。
image.png

無事完了しました。

次のセルを実行します。Amazon Cognitoの構築です。
image.png
image.png

また権限エラーが発生しました。
先ほどと同じ手順で、Amazon Cognito用のロールをアタッチします。

image.png

アタッチされました。
image.png

JupyterLabに戻り、実行します。
成功しました。

image.png

次のセルを実行します。AgentCore Gatewayを作成します。
image.png
image.png

はい、IAMロールを追加します。

image.png

再実行し、成功しました
image.png

マネジメントコンソールで、Amazon Bedrock AgentCore を確認すると、Gateway が作成されていることがわかります。
image.png

次のセルを実行、、、の前に、ここでNASA Open APIのAPIキーを入力する必要があります。
ノートブックの「here」をクリックして、APIキーを入手してください。登録したメールアドレス宛にAPIキーが送付されてきます。

変数に格納し、セルを実行します。
image.png

成功しました。マネジメントコンソールから、AgentCore Identityを確認すると、Outbound Authが作成されていることがわかります。
image.png

詳細を見ると、AWS Secrets Managerが利用されていることがわかります。
image.png

詳細はこちら。
image.png

セルの実行に戻ります。 OpenAPIのスキーマ情報を作成し、Amazon S3に格納します。
image.png

ツールを利用するための、OpenAPI スキーマのJSONファイルをS3に保存しました。

マネジメントコンソールからも確認できます。
image.png

ちなみに、JSONファイルは以下のとおりです。

{
  "openapi": "3.0.3",
  "info": {
    "title": "NASA InSight Mars Weather API",
    "description": "Returns per‑Sol weather summaries from the InSight lander for the seven most recent Martian sols.",
    "version": "1.0.0"
  },
  "servers": [
    { "url": "https://api.nasa.gov" }
  ],
  "paths": {
    "/insight_weather/": {
      "get": {
        "summary": "Retrieve latest InSight Mars weather data",
        "operationId": "getInsightWeather",
        "parameters": [
          {
            "name": "feedtype",
            "in": "query",
            "required": true,
            "description": "Response format (only \"json\" is supported).",
            "schema": {
              "type": "string",
              "enum": ["json"]
            }
          },
          {
            "name": "ver",
            "in": "query",
            "required": true,
            "description": "API version string. (only \"1.0\" supported)",
            "schema": {
              "type": "string",
              "enum": ["1.0"]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response – weather data per Martian sol.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InsightWeatherResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad request – missing or invalid parameters."
          },
          "429": {
            "description": "Too many requests – hourly rate limit exceeded (2 000 hits/IP)."
          },
          "500": {
            "description": "Internal server error."
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "InsightWeatherResponse": {
        "type": "object",
        "required": ["sol_keys"],
        "description": "Top‑level object keyed by sol numbers plus metadata.",
        "properties": {
          "sol_keys": {
            "type": "array",
            "description": "List of sols (as strings) included in this payload.",
            "items": { "type": "string" }
          },
          "validity_checks": {
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/ValidityCheckPerSol"
            },
            "description": "Data‑quality provenance per sol and sensor."
          }
        },
        "additionalProperties": {
          "oneOf": [
            { "$ref": "#/components/schemas/SolWeather" }
          ]
        }
      },
      "SolWeather": {
        "type": "object",
        "properties": {
          "AT": { "$ref": "#/components/schemas/SensorData" },
          "HWS": { "$ref": "#/components/schemas/SensorData" },
          "PRE": { "$ref": "#/components/schemas/SensorData" },
          "WD": { "$ref": "#/components/schemas/WindDirection" },
          "Season": {
            "type": "string",
            "enum": ["winter", "spring", "summer", "fall"]
          },
          "First_UTC": { "type": "string", "format": "date-time" },
          "Last_UTC": { "type": "string", "format": "date-time" }
        }
      },
      "SensorData": {
        "type": "object",
        "properties": {
          "av": { "type": "number" },
          "ct": { "type": "number" },
          "mn": { "type": "number" },
          "mx": { "type": "number" }
        }
      },
      "WindDirection": {
        "type": "object",
        "properties": {
          "most_common": { "$ref": "#/components/schemas/WindCompassPoint" }
        },
        "additionalProperties": { "$ref": "#/components/schemas/WindCompassPoint" }
      },
      "WindCompassPoint": {
        "type": "object",
        "properties": {
          "compass_degrees": { "type": "number" },
          "compass_point": { "type": "string" },
          "compass_right": { "type": "number" },
          "compass_up": { "type": "number" },
          "ct": { "type": "number" }
        }
      },
      "ValidityCheckPerSol": {
        "type": "object",
        "properties": {
          "AT": { "$ref": "#/components/schemas/SensorValidity" },
          "HWS": { "$ref": "#/components/schemas/SensorValidity" },
          "PRE": { "$ref": "#/components/schemas/SensorValidity" },
          "WD": { "$ref": "#/components/schemas/SensorValidity" }
        }
      },
      "SensorValidity": {
        "type": "object",
        "properties": {
          "sol_hours_with_data": {
            "type": "array",
            "items": {
              "type": "integer",
              "minimum": 0,
              "maximum": 23
            }
          },
          "valid": { "type": "boolean" }
        }
      }
    }
  }
}

この OpenAPI スキーマを使って、AgentCore Gatewayに外部ツールを登録します。Targetと呼ばれます。
セルを実行します。
image.png

マネジメントコンソールでGatewayを確認すると、ターゲットが作成されていました。
image.png

1-3. サンプルノートブック実行 - 処理プロセス実施編

ここまでで、アーキテクチャの構築が整いましたので、処理プロセスを実施していきます。

まずは、AgentCore Gatewayにアクセスするためのトークンを、Amazon Cognitoから取得します。
image.png

AIエージェント(Strands Agentsを利用)を使う準備をします。モデルには、Amazon Bedrock の Amazon Nova を指定します。
image.png
image.png
エラーが長すぎるので省略...
image.png

はい、Amazon Bedrock用の権限がないためですね。
いつもの対応をします。
image.png

再びセル実行、応答が返ってきました。
image.png

応答は毎回違います。「できません」ということもありました。
image.png

おつかれさまでした!サンプルノートブックは、一旦完走しました。

補足:再度サンプルノートブックを先頭から実行したい場合

いくつかのセルで、すでにリソースが存在するためにエラーが発生します。

AgentCore Gateway作成で、すでに存在するエラー

image.png

後続で必要なのは、
・gatewayID
・gatewayURL
なので、マネジメントコンソールから取得して次のセルで直接入力してしまいましょう。

image.png

以下のように、無理やり変数代入してやればヨシ!
image.png

AgentCore Identity作成で、すでに存在するエラー

Identityの作成もエラーが発生。
credentialProviderARNを次のセルで代入すればヨシ!

エラー!
image.png

マネジメントコンソール確認!!
image.png

ヨシ!!!
image.png

AgentCore Gatewayのターゲット作成で、すでに存在するエラー

エラーでも無視でヨシ!
後続で必要な変数宣言などは特にないためです。
image.png

1セルずつ先頭から実行

はい、無事にAIエージェントを実行することができました。

image.png

実践2:ServiceNowをツール(AgentCore Gatewayのターゲット)登録してみよう

AgentCore GatewayのTargetにServiceNowを登録して、AIエージェントがServiceNowを利用できるようにします。

2-1. ServiceNow側の設定

PDI(個人開発者インスタンス)を取得します。

PDIにログインした状態
image.png

All → System OAuth → Application Registry

と進みます。
image.png

「New」をクリックします。
image.png

[Deprecated UI] Create an OAuth API endpoint for external clients をクリックします。
image.png

左上から 三メニュー -> Configure -> Form Layout を選択します。
image.png

Form Builder をお勧めされますが、続行します。
image.png

OAuth Application User を追加します。
image.png

フォームに表示されました。
image.png

2-2. Application Registryレコード作成

AWS側の、リダイレクトURIを確認します。以下のドキュメントに記載があります。

image.png

https://bedrock-agentcore.us-east-1.amazonaws.com/identities/oauth2/callback

リージョンは利用しているAgentCoreのリージョンに変更しましょう。今回はus-easet-1なのでそのままです。

ServiceNowのフォームに戻り、赤枠部分を入力していきます。
image.png

「Submit」をクリックします。

レコードが作成されました。
image.png

クリックしてレコードを開き、AWS側の設定で利用する、クライアントIDとクライアントシークレットをメモしておきます。
image.png

2-3. ServiceNowシステムプロパティの設定

以下のページにあるように、glide.oauth.inbound.client.credential.grant_type.enabled システムプロパティを作成します。

image.png

All で、検索窓に、sys_properties.list と入力します。
image.png

レコード一覧が表示されます。
右上の「New」をクリックします。
image.png

Name、Type、Valueをドキュメント通りに入力していきます。
image.png

「Submit」をクリックします。
作成されたはずのレコードを検索します。
image.png

ありました。
image.png

これで、システムプロパティが設定されました。

2-4. AgentCore GatewayのTarget登録

AWSマネジメントコンソールで作業していきます。

先ほど作成したAgentCore Gatewayを開き、Targets → Addをクリックします。
image.png

Outbound Auth configurationsの項目で、「OAuth client」を選択します。
表示された文章内の、「create new」をクリックし、ページ遷移します。
image.png

[補足]ちなみに、2025/8/31現在、以下のようなIntegrationsが用意されています。
image.png

「create new」をクリックし、AgentCore Identity ページ遷移しました。
「Add OAuth client」をクリックします。
image.png

残念ながらServiceNowは用意されていないので、Custom providerを選択し、設定していきます。
image.png

以下の赤枠を設定していきます。
Client IDとClient secretは、先ほどのServiceNow PDIでメモした値を入力します。
image.png

Issuer、Authorization endpoint、Token endpointは、それぞれ以下のように入力します。
XXXXXXには、ご自身のPDIの番号を入力します。

Issuer

https://devXXXXXX.service-now.com/

Authorization endpoint

https://devXXXXXX.service-now.com/oauth_auth.do

Token endpoint

https://devXXXXXX.service-now.com/oauth_token.do

ここの疎通が一番時間を溶かしました...

参考ドキュメント

oauth_auth.do
image.png

oauth_token.do
image.png

マネジメントコンソールに戻ります。
AgentCore Identityの OAuth Clientが作成されました。
image.png

OAuthクライアントを作れたので、Gatewayのターゲット作成に戻ります。
(一度更新ボタンを押さないとOAuth clientが表示されないので、再度入力。。。)
image.png

Add targetをクリックし、ターゲットが作成されました。

image.png

2-5. サンプルノートブックから実行してみる。

先ほどまで実行完了したサンプルノートブックに、以下のセルを追加していきます。

今回は、Claudeモデルを利用してみます。

yourmodel = BedrockModel(
    #model_id="us.amazon.nova-pro-v1:0",
    model_id="us.anthropic.claude-3-7-sonnet-20250219-v1:0",
    temperature=0.7,
)

以下のinstanceはご自身のPDIのインスタンス名devXXXXXXに変更してください。

with client:
    # Call the listTools
    tools = client.list_tools_sync()

    # Create an Agent with the model and tools
    agent = Agent(model=yourmodel,tools=tools) ## you can replace with any model you like
    print(f"Tools loaded in the agent are {agent.tool_names}")
    # Invoke the agent with the sample prompt. This will only invoke  MCP listTools and retrieve the list of tools the LLM has access to. The below does not actually call any tool.
    print("1.========================================================")
    agent("利用できるツールをリストアップしてください。")
    print("")
    print("")
    print("2.========================================================")
    agent('''ServiceNowのインシデントテーブルの最新レコードを取得してください。 
            引数は、以下を利用してください。 
            {'instance': 'dev202339',
            'sysparam_limit': 3,
            'sysparam_query': 'ORDERBYDESCopened_at',
            'sysparam_fields': 'number,short_description,opened_at,sys_id,state,priority,description,sys_created_by'
            }''')

実行してみます。
image.png
image.png
image.png

成功です!利用できるツールとして認識されて、実際にインシデント情報を読み取ることができました!

補足:ツールを指定して実行する

AIエージェントがうまく外部システムから情報を取得できない場合、認証周りの問題なのか、問い合わせクエリの問題なのか、はたまたモデル性能の問題なのか?と切り分けに苦労することがあります(私)。
下記のようにcall_tool_sync()メソッドを用いて明示的にツールを利用すると、ツール自体の正常性は検証することができます。私はこれでLLMがServiceNowに対して適切な問い合わせクエリを送れていないことに気付けました。プロンプトに引数指定しているのはこのためです(改善策検討中...)

import json

with client:
    result = client.call_tool_sync(
        tool_use_id="list-incidents-1",
        name="target-quick-start-i2i37j___listIncidents", ### 【要健康】ツールを指定
        arguments={
            "instance": "dev202339", ### 【要健康】ご自身のPDIインスタンス
            "sysparam_limit": 50,  # ServiceNowからは多めに取っておく
            "sysparam_query": "ORDERBYDESCopened_at",
            "sysparam_fields": "number,short_description,opened_at,state,priority"
        }
    )
    # ServiceNowからの応答を整形して表示
    data = json.loads(result['content'][0]['text'])
    incidents = data.get("result", [])

    # 先頭5件だけ表示
    for inc in incidents[:5]:
        print(f"{inc['number']}: {inc['short_description']} "
              f"(opened_at={inc['opened_at']}, state={inc['state']}, priority={inc['priority']})")

以下のように実行することができます。
image.png

以上で、AgentCore GatewayによるServiceNow連携も完了です!おつかれさまでした!!

実践3: 後片付け

サンプルノートブックの後片付けコマンドだけでは不十分なので、マネジメントコンソールから作成されたリソースを削除していきます。

3-1. AgentCore Gateway(サンプルノートブック)

以下のセルを実行します。
image.png

マネジメントコンソールで確認します。Gatewayが削除されました。
image.png

3-2. AgentCore Identity(AWS Secrets Manager含む)

マネジメントコンソールで作業していきます。

目を見開きながら、「削除、削除、削除」と消していきます。
image.png

AgentCore Identityを削除すると、紐づいていた AWS Secrets Manager のレコードも削除されます。

3-3. Amazon Cognito

マネジメントコンソールでAmazon Cognitoに移り、削除します。
image.png

削除
image.png

3-4. Amazon S3

同上です。バケットを空にして、
image.png

削除
image.png

3-5. Amazon SageMaker AI ノートブックインスタンス

IAMロールを削除
image.png

ノートブックインスタンスを、停止からの削除
image.png

削除
image.png

完了です。おつかれさまでした!
image.png

まとめ

今回は、きたる数千兆AIエージェント時代に必要不可欠になるであろうAmazon Bedrock AgentCore Gatewayを最もシンプルな構成で実践する手順を解説しました。実践して感じたことは、外部システムとの連携には泥くさく対応する必要があるなということです。コーディングエージェントを駆使しながらも、自分でAgentCoreとServiceNowの最新ドキュメントをあさり、仕組みを理解する必要があり、日々のスキル研鑽は今後も必要だと身に沁みました。引き続き、新しい技術にチャレンジしていきます!

参考にさせていただいた記事

[YouTube] Bedrock AgentCore & Strands Agentsハンズオン(JAWS-UG東京)

[YouTube] Building your first production-ready AI agent with Amazon Bedrock AgentCore | AWS Show & Tell

11
8
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
11
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?