🎖️

Amazon Q Developer CLI で Kubernetes MCP サーバーを使って EKS のリソースをいじってみる

に公開

この記事でやること

  • Kubernetes の MCP サーバーをローカルに立ち上げます。
  • Amazon Q Developer CLI で Kubernetes MCP サーバーと接続します。
  • チャット形式で、EKS クラスターにある kubernetes リソースを操作してみます。

Amazon Q Developer CLI の MCP 対応について

Amazon Q Developer CLI は、2024年に Model Context Protocol (MCP) のサポートを発表しました。
MCP の説明については色々な方が発信していただいていますので、そちらにお任せしたいと思います。
https://aws.amazon.com/jp/blogs/news/extend-the-amazon-q-developer-cli-with-mcp/

Amazon Q Developer CLI における MCP サーバーの設定方法

Amazon Q Developer CLI で MCP サーバーを利用するには、設定ファイル(mcp.json)を使用して MCP サーバーを設定します。

この設定ファイルはホームディレクトリ(~/.aws/amazonq/mcp.json)に保存してマシン全体で使用するか、プロジェクトのルートディレクトリ(.amazonq/mcp.json)に保存してプロジェクト固有の設定として共有することができます。

Kubernetes MCP サーバーについて

https://github.com/Flux159/mcp-server-kubernetes

この MCP サーバーを使用することで、チャットインターフェースを通じて Kubernetes リソースを操作・管理できるようになります。

Kubernetes リソースの操作は kubectl を利用することが一般的でしたが、これをチャットベースで操作できるとなると非常に便利そうです!

必要な設定

Kubernetes クラスターにアクセスするための設定

上記 github に以下の要件が記載されています。

  1. kubectl installed and in your PATH
  2. A valid kubeconfig file with contexts configured
  3. Access to a Kubernetes cluster configured for kubectl (e.g. minikube, Rancher Desktop, GKE, etc.)
  4. Helm v3 installed and in your PATH (no Tiller required). Optional if you don't plan to use Helm.

今回は EKS を使用し、kubectl はすでにインストール済みである前提とします。
eksctl を使用すると kubeconfig の設定などもスキップできるので、eksctl コマンドによりクラスターを作成しました。

Helm は必須ではありませんが、色々と便利なので入れておきましょう。

Node.js/Bun

MCP Server Kubernetes はNode.js と Bunで実装されているため、ローカル環境でサーバーを立ち上げる場合はインストールが必要です。

Bun のインストールなどはこちらをどうぞ。
https://bun.sh/docs/installation

検証

EKS クラスターの用意

eksctl を使用して操作するクラスターを用意します。

eksctl create cluster --name mcp-sample-cluster

作成後、現在のコンテキストを確認しておきましょう。
作成したクラスター「mcp-sample-cluster」であればOKです。

kubectl config current-context

Kubernetes MCP サーバーの起動

まず Kubernetes MCP サーバーを起動します。

github の Local Development を参考に立ち上げてみます。

git clone https://github.com/Flux159/mcp-server-kubernetes.git
cd mcp-server-kubernetes
bun install
bun run dev // または bun run build

bun run dev コマンドで MCP サーバーも立ち上がるので、正常に起動するかみてみましょう。

bun run dev or bun run build コマンドを実行すると mcp-server-kubernetes/dist/index.js ファイルが作成されていることを確認します。

MCP の設定

設定ファイルはホームディレクトリ(~/.aws/amazonq/mcp.json)に保存してマシン全体で使用するか、プロジェクトのルートディレクトリ(.amazonq/mcp.json)に保存してプロジェクトで使用するかを選択できます。

どちらでも良いと思いますが、今回はホームディレクトリにて試してみました。

{
    "mcpServers": {
        "k8s-mcp": {
            "command": "node",
            "args": ["{cloneしたディレクトリのパス}/mcp-server-kubernetes/dist/index.js"]
        }
    }
}

node で mcp-server-kubernetes/dist/index.js を実行することで、ローカルに Kubernetes の MCP サーバーを構築して Amazon Q Developer CLI から使用できるようになります。

Q chat 起動

それでは Q とチャットをスタートします。
立ち上がる際に MCP サーバーをロードしていることが確認できますね。

% q chat
To learn more about MCP safety, see https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/command-line-mcp-security.html
✓ k_8_s_mcp loaded in 8.07 s
✓ 1 of 1 mcp servers initialized

Welcome to 

 █████╗ ███╗   ███╗ █████╗ ███████╗ ██████╗ ███╗   ██╗     ██████╗ 
██╔══██╗████╗ ████║██╔══██╗╚══███╔╝██╔═══██╗████╗  ██║    ██╔═══██╗
███████║██╔████╔██║███████║  ███╔╝ ██║   ██║██╔██╗ ██║    ██║   ██║
██╔══██║██║╚██╔╝██║██╔══██║ ███╔╝  ██║   ██║██║╚██╗██║    ██║▄▄ ██║
██║  ██║██║ ╚═╝ ██║██║  ██║███████╗╚██████╔╝██║ ╚████║    ╚██████╔╝
╚═╝  ╚═╝╚═╝     ╚═╝╚═╝  ╚═╝╚══════╝ ╚═════╝ ╚═╝  ╚═══╝     ╚══▀▀═╝ 
                                                        

╭───────────────────────── Did you know? ─────────────────────────╮
│                                                                 │
│  If you want to file an issue to the Q CLI team, just tell me,  │
│                         or run q issue                          │
│                                                                 │
╰─────────────────────────────────────────────────────────────────╯

/help all commands  •  ctrl + j new lines  •  ctrl + k fuzzy search
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

現在のコンテキストを聞いてみよう

立ち上がりました。まずは簡単な質問から。

> 現在のkubernetesコンテキストを教えてください。

現在のKubernetesコンテキストを確認します。

🛠️  Using tool: get_current_context from mcp server k_8_s_mcp
 ⋮ 
 ● Running get_current_context with the param:
 ⋮  {
 ⋮    "arguments": {
 ⋮      "detailed": true
 ⋮    },
 ⋮    "name": "get_current_context"
 ⋮  }
Allow this action? Use 't' to trust (always allow) this tool for the session. [y/n/t]:

> t
 ⋮ 
 ● Completed in 0.7s


現在のKubernetesコンテキストは以下の通りです:

• コンテキスト名: yk68-hanpen@mcp-sample-cluster.ap-northeast-1.eksctl.io
• クラスター: mcp-sample-cluster.ap-northeast-1.eksctl.io
• ユーザー: yk68-hanpen@mcp-sample-cluster.ap-northeast-1.eksctl.io
• 名前空間: default

このコンテキストはAmazon EKS(Elastic Kubernetes Service)のクラスターを指しており、ap-northeast-
1リージョン(東京リージョン)にあります。現在はデフォルトの名前空間で操作を行う設定になっています

おおー いい感じコンテキストが出力されました。

ちなみに以下のような出力が頻繁に出現します。

🛠️  Using tool: get_current_context from mcp server k_8_s_mcp
 ⋮ 
 ● Running get_current_context with the param:
 ⋮  {
 ⋮    "arguments": {
 ⋮      "detailed": true
 ⋮    },
 ⋮    "name": "get_current_context"
 ⋮  }
Allow this action? Use 't' to trust (always allow) this tool for the session. [y/n/t]: 

これは Amazon Q Developer CLI が MCP サーバーのツールを使用しようとしている際に表示される確認プロンプトです。
この場合、ツール「get_current_context」を使用して良いかを確認されています。
このセッション中は全て許可したいため、「t(trust)」を入力します。

以下の会話では、使用されるツールはすべて「t」として許可しています。

Namespace と Pods 一覧を出力してもらおう

次に、Namespace と Pods 一覧を出力してみます。

> EKSクラスター:mcp-sample-clusterの名前空間とそれぞれの名前空間ごとに起動しているPod名を教えてください。
...
まず、クラスター内の名前空間を確認しました。次に、各名前空間のPodを確認します。
...
EKSクラスター「mcp-sample-cluster」の名前空間とそれぞれの名前空間で実行中のPodは以下の通りです:

### 名前空間一覧
1. default
2. kube-node-lease
3. kube-public
4. kube-system

### 各名前空間のPod

#### default 名前空間
• Pod は実行されていません

#### kube-node-lease 名前空間
• Pod は実行されていません

#### kube-public 名前空間
• Pod は実行されていません

#### kube-system 名前空間
1. aws-node-hwvrs (実行中)
2. aws-node-p2cfs (実行中)
3. coredns-5d797594d7-249ms (実行中)
4. coredns-5d797594d7-87cfc (実行中)
5. kube-proxy-k49m7 (実行中)
6. kube-proxy-lcm5c (実行中)

現在、実際に稼働しているPodはすべて kube-system 名前空間にあり、これらはEKSクラスターの基本的なシステムコンポーネントです。aws-node はAmazon VPC CNIプラグイン、coredns はDNSサービス、kube-proxy はネットワークプロキシを提供しています。

ご丁寧な解説付きで助かります。

AWS Load Balancer Controller をインストールして、アプリを外部公開しよう

さて、一気に難易度を上げます。

EKS クラスターを立ち上げたばかりの状態から

  • AWS Load Balancer Controller をインストール
  • Deployment を作成して Pod を立ち上げ
  • Service や Ingress を起動して AWS リソースの ALB を起動
  • アプリケーションを外部公開する

までの流れを、一発でできるでしょうか?

入力プロンプトはこれだけ。

> AWS Load Balancer Controllerに関連する特定のリソース、コントローラーをインストールしてください。そして、namespace:default に nginx イメージを使用したPodを2つ起動し、外部からアクセスできるようにしてください。最終的に、作成されたALBのDNS名を教えてください。

だいぶ省略しますが、やっていることをざっくりと紹介していきます。

🛠️  Using tool: use_aws (trusted)
 ⋮ 
 ● Running aws cli command:

Service name: sts
Operation name: get-caller-identity
Parameters: 
Profile name: default
Region: ap-northeast-1
Label: Get AWS account ID
 ⋮ 
 ● Completed in 1.797s
...
🛠️  Using tool: execute_bash (trusted)
 ⋮ 
 ● I will run the following shell command: 
eksctl create iamserviceaccount \
    --cluster=mcp-sample-cluster \
    --namespace=kube-system \
    --name=aws-load-balancer-controller \
    --attach-policy-arn=arn:aws:iam::xxxxxxxxxxxxx:policy/AWSLoadBalancerControllerIAMPolicy \
    --override-existing-serviceaccounts \
    --region ap-northeast-1 \
    --approve

2025-05-08 15:54:36 [ℹ]  1 iamserviceaccount (kube-system/aws-load-balancer-controller) was included (based on the include/exclude rules)
2025-05-08 15:54:36 [!]  metadata of serviceaccounts that exist in Kubernetes will be updated, as --override-existing-serviceaccounts was set
2025-05-08 15:54:36 [ℹ]  1 task: { 
    2 sequential sub-tasks: { 
        create IAM role for serviceaccount "kube-system/aws-load-balancer-controller",
        create serviceaccount "kube-system/aws-load-balancer-controller",
    } }2025-05-08 15:54:36 [ℹ]  building iamserviceaccount stack "eksctl-mcp-sample-cluster-addon-iamserviceaccount-kube-system-aws-load-balancer-controller"
2025-05-08 15:54:37 [ℹ]  deploying stack "eksctl-mcp-sample-cluster-addon-iamserviceaccount-kube-system-aws-load-balancer-controller"
2025-05-08 15:54:37 [ℹ]  waiting for CloudFormation stack "eksctl-mcp-sample-cluster-addon-iamserviceaccount-kube-system-aws-load-balancer-controller"
2025-05-08 15:55:07 [ℹ]  waiting for CloudFormation stack "eksctl-mcp-sample-cluster-addon-iamserviceaccount-kube-system-aws-load-balancer-controller"
2025-05-08 15:55:07 [ℹ]  created serviceaccount "kube-system/aws-load-balancer-controller"
 ⋮ 
 ● Completed in 32.660s

サービスアカウントの作成まで終わりました。
OIDC プロバイダーも自動で作成してくれました... すごい

続いて Helm を使って helm install によりコントローラーのカスタムリソース定義 (CRD) を自動的にインストールしてくれています。

🛠️  Using tool: execute_bash (trusted)
 ⋮ 
 ● I will run the following shell command: 
helm repo add eks https://aws.github.io/eks-charts
"eks" already exists with the same configuration, skipping
...

NAME: aws-load-balancer-controller
LAST DEPLOYED: Thu May  8 15:55:37 2025
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
AWS Load Balancer controller installed!
 ⋮ 
 ● Completed in 4.69s

AWS Load Balancer controller が無事インストールされました。

kubernetes リソースの作成に入っていきます。
マニフェストファイルを作りながら、リソースが作られていきます。

🛠️  Using tool: get_events from mcp server k_8_s_mcp
 ⋮ 
 ● Running get_events with the param:
 ⋮  {
 ⋮    "arguments": {
 ⋮      "namespace": "kube-system"
 ⋮    },
 ⋮    "name": "get_events"
 ⋮  }
Allow this action? Use 't' to trust (always allow) this tool for the session. [y/n/t]:

...

🛠️  Using tool: fs_write
 ⋮ 
 ● Path: /Users/yk68-hanpen/gitlab/mcp-server-kubernetes/ingress.yaml

+     1: apiVersion: networking.k8s.io/v1
+     2: kind: Ingress
+     3: metadata:
+     4:   name: nginx-ingress
+     5:   namespace: default
+     6:   annotations:
+     7:     kubernetes.io/ingress.class: alb
+     8:     alb.ingress.kubernetes.io/scheme: internet-facing
+     9:     alb.ingress.kubernetes.io/target-type: ip
+    10: spec:
+    11:   rules:
+    12:     - http:
+    13:         paths:
+    14:           - path: /
+    15:             pathType: Prefix
+    16:             backend:
+    17:               service:
+    18:                 name: nginx-service
+    19:                 port:
+    20:                   number: 80


Allow this action? Use 't' to trust (always allow) this tool for the session. [y/n/t]:

> t
Creating: /Users/yk68-hanpen/gitlab/mcp-server-kubernetes/ingress.yaml
...
🛠️  Using tool: execute_bash (trusted)
 ⋮ 
 ● I will run the following shell command: 
kubectl get ingress nginx-ingress -n default

NAME            CLASS    HOSTS   ADDRESS                                                                       PORTS   AGE
nginx-ingress   <none>   *       k8s-default-nginxing-319a9c3204-1569676662.ap-northeast-1.elb.amazonaws.com   80      16s

 ⋮ 
 ● Completed in 0.318s

すべてのタスクが完了したようです。

最後に、ここまで何を行っているのか解説してくれています。

AWS Load Balancer Controllerをインストールし、nginxのデプロイメントを作成して外部からアクセスできるようにしました。以下に実施した手順と結果をまとめます。

## 1. AWS Load Balancer Controllerのインストール

1. IAM OIDCプロバイダーを作成
bash
   eksctl utils associate-iam-oidc-provider --region=ap-northeast-1 --cluster=mcp-sample-cluster --approve
   
2. IAMサービスアカウントを作成
bash
   eksctl create iamserviceaccount \
       --cluster=mcp-sample-cluster \
       --namespace=kube-system \
       --name=aws-load-balancer-controller \
       --attach-policy-arn=arn:aws:iam::xxxxxxxxxxxxx:policy/AWSLoadBalancerControllerIAMPolicy \
       --override-existing-serviceaccounts \
       --region ap-northeast-1 \
       --approve

3. Helmを使用してAWS Load Balancer Controllerをインストール
bash
   helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
     -n kube-system \
     --set clusterName=mcp-sample-cluster \
     --set serviceAccount.create=false \
     --set serviceAccount.name=aws-load-balancer-controller \
     --set region=ap-northeast-1 \
     --set vpcId=$(aws ec2 describe-vpcs --region ap-northeast-1 --filters "Name=tag:Name,Values=eksctl-mcp-sample-cluster-cluster/VPC" --query "Vpcs[0].VpcId" --output text)
   

## 2. Nginxデプロイメントの作成
1. 2つのレプリカを持つnginxデプロイメントを作成
  bash
   kubectl create deployment nginx-deployment --image=nginx --replicas=2
   
2. Nginxサービスを作成
  bash
   kubectl create service clusterip nginx-service --tcp=80:80
   
3. Ingressリソースを作成
yaml
   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
     name: nginx-ingress
     namespace: default
     annotations:
       kubernetes.io/ingress.class: alb
       alb.ingress.kubernetes.io/scheme: internet-facing
       alb.ingress.kubernetes.io/target-type: ip
   spec:
     rules:
       - http:
           paths:
             - path: /
               pathType: Prefix
               backend:
                 service:
                   name: nginx-service
                   port:
                     number: 80

## 3. 結果
AWS Load Balancer Controllerが正常にインストールされ、Application Load Balancer(ALB)が自動的に作成されました。

### 作成されたALBのDNS名
k8s-default-nginxing-319a9c3204-1569676662.ap-northeast-1.elb.amazonaws.com

このDNS名を使用して、ブラウザからnginxのデフォルトページにアクセスできます。ALBはインターネット向け(internet-facing)に設定されており、トラフィックをnginxポッドにルーティングします。

### 確認事項
• nginxポッドは正常に実行中(Running)です
• Ingressリソースは正常に作成され、ALBのDNS名が割り当てられています
• ALBはnginxサービスにトラフィックを転送するように設定されています

これで、外部からALBのDNS名を使用してnginxアプリケーションにアクセスできるようになりました。

ほんとでしょうか

確認

ちゃんと外部公開されているか確認してみます。

% curl http://k8s-default-nginxing-319a9c3204-1569676662.ap-northeast-1.elb.amazonaws.com/
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
...

提示された ALB の DNS にアクセスすると、Nginx が動いていることを確認できました。

AWS マネジメントコンソールから、ALB、ターゲットグループも作成されていることを確認しました。

完璧です...

感想

一発のプロンプトで完璧にアプリケーションを動かすとは...

MCP を使って色々なサービスが連携できるのは本当に便利なりますね。
Amazon Q Developer CLI が MCP をサポートしてくれて色々な作業が楽になりそうです!

Discussion