Amazon Bedrock Agents と Kubernetes MCP Server を使って Amazon EKS クラスターを操作してみよう
Author : 鈴木 祥太
AWS ソリューションアーキテクトの鈴木です。普段は WEB 業界のお客様のご支援をしております。
みなさまは、最近話題になっている Model Context Protocol (MCP) をご存知でしょうか?MCP は大規模言語モデル (LLM) が外部ツールやデータソースなどと接続する方法を標準化することを目的として、Anthropic 社が主体となり策定が進められているオープンプロトコルです。オープンプロトコルのため、開発者は誰でも MCP に準拠した AI アプリケーションや外部ツールやデータソースに接続する MCP サーバーを構築することができます。AWS ブログでも「Harness the power of MCP servers with Amazon Bedrock Agents」というブログ記事で、Amazon Bedrock Inline Agent を使った MCP の活用例が紹介されています。
今回は、上記ブログでも紹介されている Amazon Bedrock Inline Agent SDK と GitHub にてオープンソースとして公開されている、Kubernetes クラスターを操作するための MCP サーバーである Flux159/mcp-server-kubernetes を活用しながら、自然言語で Amazon Elastic Kubernetes Service (EKS) クラスターの操作を試してみたいと思います。
目次
1. 注意点
2. 前提条件
3. 前提知識
3-1. Model Context Protocol (MCP) について
3-2. Amazon Bedrock Inline Agent について
3-3. Amazon Bedrock Inline Agent SDK について
4. 手順
4-1. 今回作成するサンプルアプリケーション
4-2. 操作する Amazon EKS クラスターの作成
4-3. Amazon Bedrock Inline Agent SDK と Kubernetes MCP Server を利用したサンプルアプリケーションの作成
4-4. 動作確認
5. クリーンアップ
6. まとめ
ご注意
本記事で紹介する AWS サービスを起動する際には、料金がかかります。builders.flash メールメンバー特典の、クラウドレシピ向けクレジットコードプレゼントの入手をお勧めします。

このクラウドレシピ (ハンズオン記事) を無料でお試しいただけます »
毎月提供されるクラウドレシピのアップデート情報とともに、クレジットコードを受け取ることができます。
1. 注意点
本記事で作成する AWS 環境やコードは学習のみを目的としたものになっています。本番環境で推奨される設定などが省略されている場合があるため、学習目的でのみご利用ください。また、この記事に従って AWS 環境を構築すると、Amazon Bedrock と Amazon EKS、Amazon EC2 等の料金が発生するためご注意ください。
2.前提条件
本手順を実施するには、下記が必要になります。
- AWS アカウントとアカウントに対する管理者権限
- eksctl
- kubectl
- npm
- Amazon Bedrock Inline Agent SDK の Prerequisites を満たしていること
3.前提知識
3-1. Model Context Protocol について
下の図は MCP に利用したアプリケーションを示した概念図になります。

生成 AI を利用したアプリケーションを指し示すホストでは MCP クライアントが実装されます。MCP クライアントは、MCP のプロトコルに従って MCP サーバーと通信を行います。この通信では、MCP サーバーがどのような処理を行うことができるかといったケイパビリティを MCP クライアントに伝えたり、実際に MCP クライアントから MCP サーバーに処理の実行依頼を行ったりします。
生成 AI を利用したアプリケーションはユーザーからの命令などを受けて、その命令を処理すべき MCP サーバーの判断や MCP サーバーからのレスポンスを基にしたユーザーへの応答の生成などを LLM を利用して実行します。
3-2. Amazon Bedrock Inline Agent について
Amazon Bedrock Inline Agent は、開発者が Amazon Bedrock Agents をその実行時に動的に定義できる機能です。従来はAmazon Bedrock Agents を利用する際に、予め Agent の定義を事前に行った上でアプリケーションなどからその Agent を呼び出す必要がありました。Inline Agent の機能を利用することで、Agent の実行時に同時に Agent の定義自体も行うことができるため、様々な設定を素早く試したりその場で動的に Agent を更新したりすることができ柔軟性や制御性が向上します。
例えば、本記事で紹介するサンプルアプリケーションの例では MCP サーバーから取得した情報を基に、Agent の Action Group の設定を動的に定義しています。
なお、Amazon Bedrock Agents の詳細については下記 AWS Black Belt Online Seminar をご覧ください。また、Amazon Bedrock Inline Agent の詳細については こちらのドキュメント をご覧ください。
3-3. Amazon Bedrock Inline Agent SDK について
Amazon Bedrock Inline Agent SDK は Inline Agent をより容易に開発するために提供されている SDK です。この、Amazon Bedrock Inline Agent SDK は MCP にも対応しており、MCP を活用したアプリケーションも簡単に構築することが可能です。
下の図は Amazon Bedrock Inline Agent SDK を利用して構築された Inline Agent の動作イメージになります。

Amazon Bedrock Inline Agent SDK 、① 各 MCP サーバーの起動を行った後、② MCP のプロトコルに従い各 MCP サーバーのケイパビリティを取得します。その後、③ 取得したケイパビリティを Agent の Action Group として設定します。これにより、Agent はユーザーからの命令に基づいて MCP サーバーに対してどのような処理の実行を依頼すべきかの決定ができるようになります。Action Group の登録が完了したら、④ Agent に対してユーザーからの命令を問い合わせして実行すべき処理を取得します。その後、⑤ MCP サーバーに対してその処理を実際に依頼して処理結果を取得した後、⑥ Agent に対してその処理結果を送信し、ユーザーの命令に対する最終的なレスポンスを取得する流れとなります。
なお、各 MCP サーバーのケイパビリティを Action Group に登録する際は Return Control という設定を Action Group に対して行う仕組みになっています。通常、Action Group は Lambda 関数を関連付けることで、ユーザーからの命令に基づいて Lambda 関数を Agent から呼び出し処理を実行します。しかし、Return of control を利用することで、Lambda の実行をせずにどのような処理を実行すれば良いかの情報だけを呼び出し元アプリケーションに返却し、実際の処理はアプリケーション側に委任することができます。この仕組みを使って、Agent から実行すべき処理の情報のみを受け取り、実際の処理は MCP サーバーに依頼をする、といったフローを実現しています。
4.手順
4-1.今回作成するサンプルアプリケーション
下の図は今回作成するサンプルアプリケーションの構成図です。

基本的な処理の流れは 3-3 で示した図と同様なので詳しい説明は省略しますが、サンプルアプリケーションではKubernetes MCP Server を利用しているため、3-3 で示した図の ⑤ のフローで Kubernetes MCP Server が処理の依頼を受け取ると、Kubernetes MCP Server は EKS クラスターに対して処理を実行します。また、Kubernetes MCP Server は Amazon Bedrock Inline Agent SDK によってローカル PC 上に起動されます。
4-2.操作する EKS クラスターの作成
今回は、eksctl を利用してシンプルな EKS クラスターを作成します。次のコマンドを実行します。
$ eksctl create cluster
EKS クラスターの作成が完了すると kubeconfig に自動的にクラスターの情報が登録され、カレントコンテキストも作成した EKS クラスターに設定されていると思います。カレントコンテキストの確認および作成した EKS クラスターにカレントコンテキストを設定する方法は次のコマンドの通りです。
$ kubectl config current-context <= カレントコンテキストの確認
$ kubectl config get-contexts <= コンテキストの一覧取得
$ kubectl config use-context <<作成した EKS のコンテキスト名>> <= 作成した EKS クラスターにコンテキストを設定
カレントコンテキストの確認ができたら、試しに次のコマンドを実行して EKS クラスターに正常に接続できる確認します。No resources found in default namespace. と表示されれば EKS クラスターとの通信が正常にできています。
$ kubectl get pods
4-3. Amazon Bedrock Inline Agent SDK と Kubernetes MCP Server を利用したサンプルアプリケーションの作成
まず初めに、Amazon Bedrock Inline Agent SDK の Setup を参考に SDK のセットアップを行います。任意のディレクトリで次のコマンドを実行します。
$ git clone https://github.com/awslabs/amazon-bedrock-agent-samples.git
$ cd amazon-bedrock-agent-samples/src/InlineAgent
$ python -m venv .venvsource .venv/bin/activate
$ python -m pip install -e .
SDK のインストールが完了したら、サンプルアプリケーションの作成を行っていきます。次のコマンドを実行して、サンプルアプリケーション用のディレクトリを作成します。
$ mkdir examples/mcp/mcp_k8s
$ cd examples/mcp/mcp_k8s
サンプルアプリケーション用のディレクトリを作成したら、まずは Amazon Bedrock Inline Agent SDK で Flux159/mcp-server-kubernetes を起動するためのコンフィグを定義します。Flux159/mcp-server-kubernetes の Usage with Claude Desktop を参考にすると、mcp-server-kubernetes という npm パッケージを npx で起動できることがわかります。Amazon Bedrock Inline Agent SDK でも同様のコマンドを利用して Kubernetes MCP Server を起動します。
次の内容で、config.py を作成します。
from mcp import StdioServerParameters
k8s_server_params = StdioServerParameters(
command="npx",
args=[
"mcp-server-kubernetes"
],
)
次に、このコンフィグを使って Inline Agent の設定を行った上で Agent に問い合わせを行います。
次の内容で、main.py を作成します。
from InlineAgent.tools import MCPStdio
from InlineAgent.action_group import ActionGroup
from InlineAgent.agent import InlineAgent
from config import k8s_server_params
async def main():
k8s_server_mcp_client = await MCPStdio.create(server_params=k8s_server_params, tools_to_use={"describe_pod", "list_nodes", "list_pods"})
try:
k8s_action_group = ActionGroup(
name="KubernetesActionGroup",
description="Helps user operate a Kubernetes cluster.",
mcp_clients=[k8s_server_mcp_client],
)
await InlineAgent(
foundation_model="apac.anthropic.claude-3-haiku-20240307-v1:0",
instruction="""You are a friendly assistant that is responsible for resolving user kubernetes operation queries.
You have access to a Kubernetes cluster.
""",
agent_name="kubernetes_agent",
action_groups=[
k8s_action_group
],
).invoke(
input_text="ここに任意の命令を定義する"
)
finally:
# LIFO
await k8s_server_mcp_client.cleanup()
if __name__ == "__main__":
import asyncio
asyncio.run(main())
ここで、本サンプルアプリケーションにおけるいくつかの制約について補足をします。
Amazon Bedrock Inline Agent SDK は Agent の Action Group の定義に Function Schema を利用しています。Agent の Action Group の定義には OpenAPI Schema と Function Schema が対応していますが、Function Schema は OpenAPI Schema と比較してより簡素化された定義方法になります。一方で、ドキュメントに記載されているように、parameters の type に object 型を指定できない、定義できるパタメータの数が 5 つまでといった制約があります。
Flux159/mcp-server-kubernetes は src/tools/ で実装されているケイパビリティを備えていますが、その多くがプロパティに object 型を指定していたりパラメータが 6 つ以上になっており、object 型を利用していない且つパラメータが 5 つまでのものは限られています。上記の制約を超える処理を Action Group に登録しようとするエラーになってしまうため、Amazon Bedrock Inline Agent SDK 経由で設定した Agent を利用して実行できる処理も限られます。
Action Group に登録する処理は MCPStdio.create の tools_to_use という引数で選択できます。今回は、制約に引っかからない describe_pod と list_nodes 、list_pods のみを登録してサンプルアプリケーションを作成しています。
4-4.動作確認
動作確認では、上記で設定した describe_pod と list_nodes 、list_pods のオペレーションの範囲内で実行可能なオペレーションを確認します。
まず初めに、ステータスが Ready 状態のノードと Not Ready 状態のノードをそれぞれ調査する例を想定します。main.py の input_text に下記の命令を設定します。
input_text="クラスターのノードのうちステータスがReadyのノードとNot Readyのノードをそれぞれ一覧化して教えてください。"
コードの編集が終わったら、次のコマンドを実行してサンプルアプリケーションを実行します。
python main.py
すると、Agent が以下のような回答をすると思います。また、回答に加えて Agent の振る舞いに関する情報などのログも出力されていることが確認できると思います。私の環境では、最終的に下記のような回答が返却されました。
Ready Nodes:
ip-xxx-xxx-xxx-xxx.ap-northeast-1.compute.internal
ip-xxx-xxx-xxx-xxx.ap-northeast-1.compute.internal
NotReady Nodes:
次に、kube-system ネームスペースの中で DNS の役割を担っている Pod を一覧する例を想定します。main.py の input_text に下記の命令を設定します。
input_text="kube-systemネームスペース内でDNSに関連するPodの一覧を教えてください。"
コードの編集が終わったら、次のコマンドを実行してサンプルアプリケーションを実行します。
python main.py
こちらも 1 つ目の例と同様、Agent が回答したと思います。私の環境では、最終的に以下のような回答が返却されました。
The DNS-related pods in the kube-system namespace are:
- coredns-5cb878ffc-4r586
- coredns-5cb878ffc-wngwj
このように Amazon Bedrock Inline Agent と Kubernetes MCP Server を利用して、自然言語を利用して EKS クラスターの操作ができることを確認できました。
最後に、coredns-5cb878ffc-4r586 が具体的にどのような設定がされている Pod なのか知る例を想定します。main.py の input_text に下記の命令を設定します。
input_text="kube-systemネームスペース内で動作しているcoredns-5cb878ffc-4r586という名前のPodはどのような設定がされているか説明してください。"
コードの編集が終わったら、次のコマンドを実行してサンプルアプリケーションを実行します。
python main.py
こちらも 1 つ目の例と同様、Agent が回答したと思います。私の環境では、最終的に以下のような回答が返却されました。
- Podの名前は "coredns-5cb878ffc-4r586"、ネームスペースは "kube-system" です。
- Podには1つのコンテナが含まれており、そのコンテナの名前は "coredns" です。
- コンテナのイメージは "602401143452.dkr.ecr.ap-northeast-1.amazonaws.com/eks/coredns:v1.10.1-eksbuild.15" です。
- コンテナはUDP 53番ポート、TCP 53番ポート、TCP 9153番ポートを公開しています。
- コンテナのリソース制限は、メモリが170MiBです。リクエストは、CPUが100m、メモリが70MiBです。
5.クリーンアップ
本記事で作成した EKS クラスターを削除するため、次のコマンドを実行します。
eksctl delete cluster --name <<4-1 の手順で作成したクラスター名>>
6.まとめ
本記事では、Amazon Bedrock Agents でどのように MCP の活用ができるのか、および MCP の活用によって Kubernetes を自然言語で操作する方法を紹介しました。
kubectl コマンドの知見など Kubernetes のオペレーションスキルが十分でないオペレーターでも、自然言語を利用することで EKS クラスターの基本的な操作を実行することができます。
また、Amazon Bedrock Inline Agent SDK を利用することで、簡単に Amazon Bedrock Agents での MCP の活用がスタートできます。これにより、アプリケーションに MCP を活用した機能をすぐに組み込むことができます。
ぜひ、Amazon Bedrock Agents および Amazon Bedrock Inline Agent SDK を活用して有意義なコンテナライフを送ってください!
筆者プロフィール

鈴木 祥太
アマゾン ウェブ サービス ジャパン合同会社
ソリューションアーキテクト
普段は Web 業界のお客様を中心にアーキテクチャ設計や構築をサポートしています。好きな AWS サービスは Amazon Elastic Kubernetes Service (Amazon EKS) です。
AWS を無料でお試しいただけます