
Bedrockナレッジベースに外部システムのAPI仕様を格納してDevOps Agentのログ調査に活用してみた
リテールアプリ共創部@大阪の岩田です。
先日こんなブログを書いたようにDevOps AgentはMCPサーバーと連携させることでAWS外の情報も踏まえた上で調査を進めてくれるようになります。
今回のブログでは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ペイメントサービス

複数社のAPI仕様を配置しているのは、Bedrock ナレッジベースの検索がうまく機能するかを確認したい意図です。
ドキュメントの準備が整ったので、Bedrockナレッジベースのデータソースを同期し、S3 Vectorsにドキュメントの情報を格納します。

DevOps Agentの設定
MCPサーバーの準備ができたので、DevOps Agentの環境を作成して設定します。詳細な手順は以下のブログを参照してください。
今回は以下の内容で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が出してきたレポートがこちらです。

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サーバーに問い合わせる際、エラーレスポンスの一部を抜粋して問い合わせを行っていたため、エラーコードに関する情報が取得できませんでした。

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

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








