Bedrockナレッジベースに外部システムのAPI仕様を格納してDevOps Agentのログ調査に活用してみた

Bedrockナレッジベースに外部システムのAPI仕様を格納してDevOps Agentのログ調査に活用してみた

DevOps Agentの調査精度を上げるためにサーバーレスな構成でナレッジベースを構築して連携させてみました。 ナレッジベースをチューニングしてRun Bookが最適化できれば精度が上がりそうな感触です。
2026.03.02

リテールアプリ共創部@大阪の岩田です。

先日こんなブログを書いたようにDevOps AgentはMCPサーバーと連携させることでAWS外の情報も踏まえた上で調査を進めてくれるようになります。

https://dev.classmethod.jp/articles/devops-agent-with-tv-broadcast-info-mcp-server/

今回のブログではS3 Vectorsにシステムの関連ドキュメントがベクトル化されているという前提のもと、関連ドキュメントをベクトル検索するMCPサーバーを自作してDevOps Agentと連携させてみます。

やってみる

まずは自然言語でシステム関連ドキュメントを検索できるMCPサーバーを作っていきましょう!

構成

以下の流れで各サービスを連携させてDevOps Agentの調査に役立てます。
DevOps Agent → Agent Core → API GW → Lambda → Bedrock ナレッジベース → S3 Vectors

構成概要

SAMテンプレート

以下のSAMテンプレートで各種リソースをデプロイしました。以前ブログを書いた時はCloudFormationが未対応だったのでAgentCoreのGatewayTargetにAPI GWが指定できなかったのですが、今は普通に対応しているのでGatewayTargetもまとめて作成します。

SAMテンプレート
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Parameters:
  Domain:
    Type: String
    Description: Cognitoユーザープール用のドメイン
Globals:
  Function:
    Timeout: 600
    Tracing: Active
  Api:
    TracingEnabled: true
Resources:
  KnowledgeBase:
    Type: AWS::Bedrock::KnowledgeBase
    Properties:
      Description: サンプルシステムのナレッジベース
      KnowledgeBaseConfiguration: 
        Type: VECTOR
        VectorKnowledgeBaseConfiguration:
          EmbeddingModelArn: arn:aws:bedrock:ap-northeast-1::foundation-model/amazon.titan-embed-text-v2:0
      Name: external-system-knowledge-base
      RoleArn: !GetAtt KnowledgeBaseRole.Arn
      StorageConfiguration: 
        Type: S3_VECTORS
        S3VectorsConfiguration:
          IndexArn: !Ref KnowledgeBaseIndex
  KnowledgeBaseRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: bedrock.amazonaws.com
            Action:
              - sts:AssumeRole
      Policies:
        - PolicyName: KnowledgeBaseS3VectorsPolicy
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action:
                  - aws-marketplace:Subscribe
                  - aws-marketplace:ViewSubscriptions
                  - aws-marketplace:Unsubscribe
                Resource: 
                  - '*'                  
              - Effect: Allow
                Action:
                  - bedrock:InvokeModel
                Resource: 
                  - arn:aws:bedrock:ap-northeast-1::foundation-model/amazon.titan-embed-text-v2:0
              - Effect: Allow
                Action:
                  - s3:ListBucket
                  - s3:GetObject
                Resource: 
                  - !Sub arn:aws:s3:::${KnowledgeBaseSrc}
                  - !Sub arn:aws:s3:::${KnowledgeBaseSrc}/*
              - Effect: Allow
                Action:
                  - s3vectors:DeleteVectors
                  - s3vectors:GetIndex
                  - s3vectors:GetVectors
                  - s3vectors:QueryVectors
                  - s3vectors:PutVectors
                Resource: 
                  - !Ref KnowledgeBaseIndex
  KnowledgeBaseSrc:  
    Type: AWS::S3::Bucket
  KnowledgeBaseVectorDB:  
    Type: AWS::S3Vectors::VectorBucket
  KnowledgeBaseIndex:
    Type: AWS::S3Vectors::Index
    Properties:
      DataType: float32
      Dimension: 1024
      DistanceMetric: euclidean
      MetadataConfiguration: 
        NonFilterableMetadataKeys: 
          - AMAZON_BEDROCK_TEXT
          - AMAZON_BEDROCK_METADATA
      VectorBucketArn: !Ref KnowledgeBaseVectorDB
  KnowledgeBaseDataSource:
    Type: AWS::Bedrock::DataSource
    Properties:
      DataSourceConfiguration: 
        Type: S3
        S3Configuration:
          BucketArn: !GetAtt KnowledgeBaseSrc.Arn
      KnowledgeBaseId: !Ref KnowledgeBase
      Name: external-system-knowledge-base-data-source
  McpFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: mcp/
      Handler: app.lambdaHandler
      Runtime: nodejs24.x
      Architectures:
      - x86_64
      Environment:
        Variables:
          KNOWLEDGE_BASE_ID: !Ref KnowledgeBase
          MODEL_ARN: !Sub arn:aws:bedrock:ap-northeast-1:${AWS::AccountId}:inference-profile/global.anthropic.claude-sonnet-4-5-20250929-v1:0
      Policies:
        - Statement:
          - Effect: Allow
            Action:
              - bedrock:RetrieveAndGenerate
              - bedrock:Retrieve
              - bedrock:GetInferenceProfile
              - bedrock:InvokeModel
            Resource: '*'
      Events:
        mcp:
          Type: Api
          Properties:
            Path: /mcp
            Method: get
            RestApiId: !Ref McpApi
  McpApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: prd
      DefinitionBody:
        openapi: "3.0.1"
        info:
          title: "stream-mcp"
          version: "1.0"
        servers: []
        paths:
          /mcp:
            get:
              summary: Get External System Knowledge Base
              parameters: 
                - in: query
                  name: q
                  required: true 
                  schema:
                    type: string                       
                    description: ナレッジベースで検索したい内容
              operationId: getKnowledgeBase
              x-amazon-apigateway-integration:
                type: "aws_proxy"
                uri:
                  Fn::Sub: arn:aws:apigateway:${AWS::Region}:lambda:path/2021-11-15/functions/${McpFunction.Arn}/response-streaming-invocations
                httpMethod: "POST"
                passthroughBehavior: "when_no_match"
                responseTransferMode: "STREAM"
                contentHandling: "CONVERT_TO_TEXT"
              responses:
                "200":
                  description: レスポンスの取得に成功
                  content:
                    text/event-stream:
                      schema:
                        type: string
              security:
                - sigv4: []                        
        components:
          securitySchemes:
            sigv4:
              type: apiKey
              name: Authorization
              in: header
              x-amazon-apigateway-authtype: awsSigv4                      
  Gateway:
    Type: AWS::BedrockAgentCore::Gateway
    Properties:
      AuthorizerType: CUSTOM_JWT
      AuthorizerConfiguration:
        CustomJWTAuthorizer: 
          DiscoveryUrl: !Sub https://cognito-idp.${AWS::Region}.amazonaws.com/${AgentCoreGWUserPool}/.well-known/openid-configuration
          AllowedClients:
            - !Ref AgentCoreGWClient
      Description: DevOps Agentと連携させるためのゲートウェイ
      Name: gateway-for-devops-agent
      ProtocolType: MCP
      RoleArn: !GetAtt GatewayRole.Arn
      ExceptionLevel: DEBUG
  GatewayTarget:
    Type: AWS::BedrockAgentCore::GatewayTarget
    Properties:
      CredentialProviderConfigurations: 
        - CredentialProviderType: GATEWAY_IAM_ROLE
      GatewayIdentifier: !Ref Gateway
      Name: api-gateway-target
      TargetConfiguration: 
        Mcp:
          ApiGateway:
            RestApiId: !Ref McpApi
            Stage: prd
            ApiGatewayToolConfiguration:
              ToolFilters:
                - FilterPath: /mcp
                  Methods:
                    - GET
  GatewayRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: bedrock-agentcore.amazonaws.com
            Action:
              - sts:AssumeRole
      Policies:
        - PolicyName: GatewayRolePolicy
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action:
                  - execute-api:Invoke
                Resource: 
                  - !Sub arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:${McpApi}/*
  AgentCoreGWUserPool:
    Type: AWS::Cognito::UserPool
  AgentCoreGWResourceServer:
    Type: AWS::Cognito::UserPoolResourceServer
    Properties:
      Identifier: gateway
      Name: gateway
      Scopes:
        - ScopeName: genesis-gateway:invoke
          ScopeDescription: Scope for invoking the genesis gateway
      UserPoolId: !Ref AgentCoreGWUserPool    
  AgentCoreGWClient:
    Type: AWS::Cognito::UserPoolClient
    Properties:
      UserPoolId: !Ref AgentCoreGWUserPool
      GenerateSecret: true
      SupportedIdentityProviders: 
        - COGNITO
      AllowedOAuthFlows:
        - client_credentials
      AllowedOAuthFlowsUserPoolClient: true
      AllowedOAuthScopes:
        - gateway/genesis-gateway:invoke
    DependsOn: AgentCoreGWResourceServer
  AgentCoreGWUserPoolDomain:
    Type: AWS::Cognito::UserPoolDomain
    Properties:
      UserPoolId: !Ref AgentCoreGWUserPool
      Domain: !Ref Domain

Lambda Functionsのソースコード

ナレッジベースを検索するLambda Functionのソースコードは以下の通りです。APIのクエリストリングqからユーザーの問い合わせ内容を取得してBedrockナレッジベースで検索します。

import { BedrockAgentRuntimeClient, RetrieveAndGenerateCommand } from '@aws-sdk/client-bedrock-agent-runtime';

const client = new BedrockAgentRuntimeClient({ region: 'ap-northeast-1' });

export const lambdaHandler = awslambda.streamifyResponse(async (event, responseStream, _context) => {
    const metadata = {
      statusCode: 200,
      headers: {
        "Content-Type": "text/event-stream; charset=utf-8",
      }
    };
    responseStream = awslambda.HttpResponseStream.from(responseStream, metadata);

    try {
        const inputText = event.queryStringParameters?.q;
        if (inputText == null) {
          return responseStream.write('何を調べたいのか教えてください');          
        }

        const knowledgeBaseId = process.env.KNOWLEDGE_BASE_ID;
        const modelArn = process.env.MODEL_ARN;

        const command = new RetrieveAndGenerateCommand({
            input: {
                text: inputText
            },
            retrieveAndGenerateConfiguration: {
                type: 'KNOWLEDGE_BASE',
                knowledgeBaseConfiguration: {
                    knowledgeBaseId: knowledgeBaseId,
                    modelArn: modelArn
                }
            }
        });

        const response = await client.send(command);        
        const outputText = response.output?.text?? ''
        responseStream.write(outputText);
        
    } catch (error) {
        responseStream.write(`Error: ${error.message}`);
    } finally {
        responseStream.end();
    }
});

関連ドキュメントをナレッジベースに格納

上記テンプレートをデプロイしてリソースが作成できたら、S3バケットにマークダウン形式でファイルを配置します。
今回は業務でも利用するシーンの多い以下の決済代行会社のAPI仕様をマークダウン形式で抜粋してS3に配置しました。

  • ベリトランス4G
  • GMOペイメントゲートウェイ
  • Stripe
  • SBペイメントサービス

S3に外部APIの仕様書を配置

複数社のAPI仕様を配置しているのは、Bedrock ナレッジベースの検索がうまく機能するかを確認したい意図です。

ドキュメントの準備が整ったので、Bedrockナレッジベースのデータソースを同期し、S3 Vectorsにドキュメントの情報を格納します。

ナレッジベースのデータソースを同期

DevOps Agentの設定

MCPサーバーの準備ができたので、DevOps Agentの環境を作成して設定します。詳細な手順は以下のブログを参照してください。

https://dev.classmethod.jp/articles/devops-agent-with-tv-broadcast-info-mcp-server/

今回は以下の内容でRun Bookを追加しました。

Name default
Description エラーログを調査するためのスキル
Instructions * 連携先外部システムの仕様についてはMCPサーバーknowledge-base-mcpから取得可能。外部API呼び出し時に発生したエラーコードの意味はMCPサーバーから取得すること
* MCPサーバーには利用料金が必要なため、エラーコードの仕様調査以外にknowledge-base-mcpは利用しないこと
* knowledge-base-mcpを呼び出す際、パラメータのbasePathは必ずprdとして呼び出すこと
* パラメータのqは自然言語でエラーに関する質問を設定する
* エラーログのJSONを加工せずにそのまま抽出
* 抽出したログに自然言語を付加して問い合わせる
* 正しい例:q=このエラーの詳細を教えて:{"code":"ERR12312f3","msg":"エラーが発生しました"}
* 誤った例: q=ERR123123

いつの間にかDevOps Agentが日本語対応していたので日本語で記述しています。

DevOps Agentに調査させてみる

それではDevOps Agentに調査を依頼してみましょう。

調査のためにLambda FunctionからCloudWatch Logsに以下のエラーログを出力しました。

2026-02-27T07:22:47.259Z	489fa38c-4a8d-4de4-a05f-9c96f0883306	ERROR	{
  msg: 'ベリトランスのAPI呼び出し時にエラーが発生しました',
  rawResponse: {
    vResultCode: 'G021000000000000',
    mpiMstatus: 'failure',
    mpiVresultCode: 'GE24000000000000',
    reqAmount: 1000,
    reqCardNumber: '123456********12',
    requestId: 'abcdefghij',
    txnType: 'AuthorizeConfirm',
    merrMsg: '成功しました。',
    mstatus: 'success',
    optionResults: [],
    orderId: '100000000000',
    serviceType: 'mpi',
    txnVersion: '5.0'
  }
}

この状態でDevOps Agentに調査を依頼しました。入力した内容は以下の通りです。

  • 調査の詳細: CloudWatchのロググループ/aws/lambda/devops-agent-testにエラーログが出力された。 このエラーの原因と適切な対応方法についてレポートして
  • 調査の出発点: 東京リージョン(ap-northeast-1)のCloudWatchのロググループ/aws/lambda/devops-agent-test

最終的にDevOps Agentが出してきたレポート

しばらく待った後にDevOps Agentが出してきたレポートがこちらです。

DevOps Agentが出してきたレポートの最終系

Veritrans 3D Secure認証エラー(GE24:暗証番号不正)によるカード決済処理失敗
Lambda関数 devops-agent-test は、2026-02-27T07:22:45ZおよびT07:22:47Zに、Veritrans決済APIを呼び出して3D Secure(本人認証サービス)による決済処理を試みた際、エラーコード「GE24000000000000」(暗証番号不正)で認証に失敗した。このエラーは、カード保有者が入力した3Dセキュアパスワードが不正であったか、カード会社に登録されている認証情報と一致しなかったことを示している。Lambda関数自体は正常に実行を完了し(CloudWatch Errorsメトリクス=0)、アプリケーションレベルでエラーハンドリングが適切に行われている。しかし、決済処理自体は失敗しており、ユーザーの購入取引が完了していない状態となっている。

もっともらしいことを言ってはいるんですが、GE24エラーは正確には本人認証実行不可(イシュアによる認証拒否)なので暗証番号の不正ではないんですよね。。。残念ながら今回試した範囲では正確なレポートを得ることができませんでした。ただし、ナレッジベースのチューニングやRun Bookの調整で調査の精度は上げらるはずなので、今後はそういったアプローチも試していきたいと思います。

うまくいかなかった点、今後の課題など

その他トライ&エラーしたポイントをいくつか紹介します。

MCPサーバー呼び出し時のパラメータが不適切

初期段階ではMCPサーバーに問い合わせる際、エラーレスポンスの一部を抜粋して問い合わせを行っていたため、エラーコードに関する情報が取得できませんでした。

MCPサーバー呼び出し時のパラーメータが不適切

この問題についてはRun Bookを調整し、エラーログのJSONを加工せずにそのまま抽出という文言を付け加えたり、良い例/悪い例を追記することで改善できました。

MCPサーバーを必要以上に何度も呼び出してしまう

人間の目からするとこれ以上MCPサーバーからは有益な情報は取得できないであろう段階まで調査が進んでも、引き続き何度もMCPサーバーを呼び出していました。MCPサーバーの呼び出しはコストにも跳ね返ってくるので、うまくRun Bookを調整したいところです。Run BookにMCPサーバーには利用料金が必要なため、エラーコードの仕様調査以外にknowledge-base-mcpは利用しないことという文言を追加することでこの挙動は改善しました。

MCPサーバーを必要以上に何度も呼び出してしまう

まとめ

うまくいかなかった部分もありますが、DevOps AgentとBedrockナレッジベースを連携させることで調査の精度が上がりそうな感触を得られました。ナレッジベースをチューニングすることで、より精度を上げることができそうですが、チューニングにかかる労力がDevOps Agentによって効率化されるマンパワーを超えてしまうと本末転倒になりそうなので注意したいです。どこまでチューニングを頑張るのか?どこからは割り切って人間が確認するのか?ほどよいバランスを見極めていきたいですね。

参考

この記事をシェアする

FacebookHatena blogX

関連記事