NTT東日本の自治体クラウドソリューション

「監視対象を登録して」で完了?Kiroとzabbix-mcpでZabbixを操作してみる

こんにちは、保坂です。

近年、AIエージェントが外部サービスと連携するための標準プロトコルであるMCP(Model Context Protocol)が注目されています。MCPに対応したサーバーさえあれば、AIエージェントから様々なサービスをそのまま操作できるようになります。

本コラムでは、このMCPを活用し、オープンソース監視ソフトウェアZabbixをAI開発環境であるKiroから操作してみます。ホストの登録から障害確認まで、自然言語による指示だけで完結する流れをご紹介します。

AIエージェントを活用したクラウド環境の監視方法について、NTT東日本のエンジニアがご相談にお応えしますので、お気軽にご連絡ください!

NTT東日本のクラウド事業をご紹介!登録不要・無料公開中、詳細はこちら

はじめに

MCPとは

MCP(Model Context Protocol)は、AIエージェントが外部ツールやサービスと連携するための規格です。

MCPに対応したサーバーを用意するだけで、AIエージェントが外部サービスのAPIを直接呼び出せるようになります。サービスごとに個別の連携開発をしなくても、共通のプロトコルで「つなぐ」ことができる仕組みです。

今回利用するzabbix-mcpは、Zabbix向けに実装されたMCPサーバーです。Kiroだけでなく、Claude DesktopやCursorなど、MCPに対応したさまざまなクライアントから利用できます。

主な特徴:

  • ホスト、テンプレート、トリガー、アイテム、ホストグループの柔軟なクエリ
  • 障害・イベント・アラートの取得(深刻度フィルタ対応)
  • ホストやテンプレートの作成・更新・削除
  • マクロ設定、メンテナンス期間管理
  • READ_ONLY_MODEによる安全な読み取り専用運用
  • Zabbix 5.4以降に対応

zabbix-mcpはホスト作成や更新などの書き込み操作にも対応しています。そのため、AIエージェントから自然言語で設定変更を実施することも可能です。一方で、本番環境ですぐに設定変更を許可することに不安を感じる方もいるかもしれません。

zabbix-mcpにはREAD_ONLY_MODEが用意されており、障害確認や設定参照などの読み取り操作のみに制限できます。まずは読み取り専用で運用を開始し、安全性を確認しながら段階的に活用範囲を広げるのがおすすめです。

Kiroとは

KiroはAWS が提供するAI搭載の開発環境(IDE)です。VS Codeベースのエディタに、AIエージェントが統合されています。

KiroはMCPクライアントに対応しており、MCPサーバーを登録するだけで外部サービスとの連携が可能になります。

本コラムではAWSが提供するKiroを利用しますが、前述のとおりzabbix-mcpは他のMCPクライアントからも利用可能です。今回はKiroへzabbix-mcpを設定し、チャットから自然言語でZabbixを操作してみます。

AIエージェントを活用したクラウド環境の監視方法について、NTT東日本のエンジニアがご相談にお応えしますので、お気軽にご連絡ください!

Zabbix環境の展開

本コラムで使用するZabbixや監視対象となるEC2インスタンスなどはCloudFormationテンプレートとして定義しています。

本コラムで試すZabbix環境:

CloudFormationテンプレートサンプル

検証環境を容易に再現できるよう、本コラムではCloudFormationテンプレートを用いて監視環境を一括構築します。テンプレートにはネットワーク環境(VPC・サブネット)に加え、Zabbix Serverと監視対象EC2インスタンスが含まれています。

zabbix-sample.yaml

AWSTemplateFormatVersion: 2010-09-09
Description: Zabbix 7.0 LTS sample template.

# ==============================================================================
# Parameters
# ==============================================================================
Parameters:
  AllowedCidr:
    Type: String
    Default: 0.0.0.0/0
    Description: CIDR block allowed to access Zabbix Web UI and SSH (restrict in production)
    AllowedPattern: ^(\d{1,3}\.){3}\d{1,3}/\d{1,2}$

  DBRootPassword:
    Type: String
    NoEcho: true
    MinLength: 8
    MaxLength: 41
    Description: MySQL root password
    AllowedPattern: ^[a-zA-Z0-9!@#$%^&*()_+=\-]*$

  DBZabbixPassword:
    Type: String
    NoEcho: true
    MinLength: 8
    MaxLength: 41
    Description: MySQL user password for Zabbix
    AllowedPattern: ^[a-zA-Z0-9!@#$%^&*()_+=\-]*$

# ==============================================================================
# Metadata
# ==============================================================================
Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      - Label:
          default: Network Settings
        Parameters:
          - AllowedCidr
      - Label:
          default: Database Settings
        Parameters:
          - DBRootPassword
          - DBZabbixPassword

# ==============================================================================
# Resources
# ==============================================================================
Resources:
  # ----------------------------------------------------------------------------
  # VPC
  # ----------------------------------------------------------------------------
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: !Sub "${AWS::StackName}-vpc"

  # ----------------------------------------------------------------------------
  # Internet Gateway
  # ----------------------------------------------------------------------------
  InternetGateway:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        - Key: Name
          Value: !Sub "${AWS::StackName}-igw"

  VPCGatewayAttachment:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId: !Ref VPC
      InternetGatewayId: !Ref InternetGateway

  # ----------------------------------------------------------------------------
  # Public Subnet
  # ----------------------------------------------------------------------------
  PublicSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.1.0/24
      MapPublicIpOnLaunch: true
      AvailabilityZone: !Select [0, !GetAZs ""]
      Tags:
        - Key: Name
          Value: !Sub "${AWS::StackName}-public-subnet"

  # ----------------------------------------------------------------------------
  # Public Route Table
  # ----------------------------------------------------------------------------
  PublicRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: !Sub "${AWS::StackName}-public-rt"

  PublicRoute:
    Type: AWS::EC2::Route
    DependsOn: VPCGatewayAttachment
    Properties:
      RouteTableId: !Ref PublicRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway

  PublicSubnetRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PublicSubnet
      RouteTableId: !Ref PublicRouteTable

  # ----------------------------------------------------------------------------
  # NAT Gateway (Elastic IP + NAT GW)
  # ----------------------------------------------------------------------------
  NatGatewayEIP:
    Type: AWS::EC2::EIP
    DependsOn: VPCGatewayAttachment
    Properties:
      Domain: vpc
      Tags:
        - Key: Name
          Value: !Sub "${AWS::StackName}-nat-eip"

  NatGateway:
    Type: AWS::EC2::NatGateway
    Properties:
      AllocationId: !GetAtt NatGatewayEIP.AllocationId
      SubnetId: !Ref PublicSubnet
      Tags:
        - Key: Name
          Value: !Sub "${AWS::StackName}-nat-gw"

  # ----------------------------------------------------------------------------
  # Private Subnet
  # ----------------------------------------------------------------------------
  PrivateSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.2.0/24
      AvailabilityZone: !Select [0, !GetAZs ""]
      Tags:
        - Key: Name
          Value: !Sub "${AWS::StackName}-private-subnet"

  # ----------------------------------------------------------------------------
  # Private Route Table
  # ----------------------------------------------------------------------------
  PrivateRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: !Sub "${AWS::StackName}-private-rt"

  PrivateRoute:
    Type: AWS::EC2::Route
    Properties:
      RouteTableId: !Ref PrivateRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      NatGatewayId: !Ref NatGateway

  PrivateSubnetRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PrivateSubnet
      RouteTableId: !Ref PrivateRouteTable

  # ----------------------------------------------------------------------------
  # Security Group - Zabbix Server
  # ----------------------------------------------------------------------------
  ZabbixSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Security group for Zabbix Server
      VpcId: !Ref VPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: !Ref AllowedCidr
          Description: Zabbix Web UI (HTTP)
      Tags:
        - Key: Name
          Value: !Sub "${AWS::StackName}-zabbix-sg"

  # ----------------------------------------------------------------------------
  # Security Group - Monitored Instance
  # ----------------------------------------------------------------------------
  MonitoredInstanceSG:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Security group for monitored instances
      VpcId: !Ref VPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 10050
          ToPort: 10050
          SourceSecurityGroupId: !Ref ZabbixSecurityGroup
          Description: Allow Zabbix Server passive checks
      Tags:
        - Key: Name
          Value: !Sub "${AWS::StackName}-monitored-sg"

  # ----------------------------------------------------------------------------
  # IAM Role - Zabbix
  # ----------------------------------------------------------------------------
  ZabbixInstanceRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Sub "${AWS::StackName}-zabbix-role"
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service: ec2.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
      Policies:
        - PolicyName: !Sub "${AWS::StackName}-zabbix-monitoring-policy"
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: Allow
                Action:
                  - cloudwatch:DescribeAlarms
                  - cloudwatch:GetMetricData
                  - cloudwatch:ListMetrics
                  - ec2:DescribeInstances
                  - ec2:DescribeRegions
                  - ec2:DescribeVolumes
                Resource: "*"
      Tags:
        - Key: Name
          Value: !Sub "${AWS::StackName}-zabbix-role"

  ZabbixInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Roles:
        - !Ref ZabbixInstanceRole

  # ----------------------------------------------------------------------------
  # EC2 Instance
  # ----------------------------------------------------------------------------
  ZabbixInstance:
    Type: AWS::EC2::Instance
    DependsOn: VPCGatewayAttachment
    Properties:
      ImageId: "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64}}"
      InstanceType: t3.medium
      IamInstanceProfile: !Ref ZabbixInstanceProfile
      NetworkInterfaces:
        - AssociatePublicIpAddress: true
          DeviceIndex: "0"
          SubnetId: !Ref PublicSubnet
          GroupSet:
            - !Ref ZabbixSecurityGroup
      BlockDeviceMappings:
        - DeviceName: /dev/xvda
          Ebs:
            VolumeSize: 30
            VolumeType: gp3
            Encrypted: true
      Tags:
        - Key: Name
          Value: !Sub "${AWS::StackName}-zabbix-server"
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash -xe
          exec > >(tee /var/log/zabbix-install.log) 2>&1

          echo "=========================================="
          echo " Zabbix 7.0 LTS Installation Start"
          echo "=========================================="

          # ------------------------------------------------------------------
          # 0. Wait for any existing dnf/rpm lock to be released
          # ------------------------------------------------------------------
          echo "Waiting for dnf/rpm lock to be released..."
          while fuser /var/lib/rpm/.rpm.lock /var/cache/dnf/metadata_lock.pid 2>/dev/null; do
            echo "  Another process is using dnf/rpm. Waiting 5 seconds..."
            sleep 5
          done
          echo "Lock released. Proceeding with installation."

          # ------------------------------------------------------------------
          # 1. System Update
          # ------------------------------------------------------------------
          dnf update -y

          # ------------------------------------------------------------------
          # 2. Install MySQL 8.4 LTS
          # ------------------------------------------------------------------
          dnf install -y https://dev.mysql.com/get/mysql84-community-release-el9-1.noarch.rpm
          dnf install -y mysql-community-server mysql-community-client

          systemctl enable mysqld --now

          # Retrieve temporary root password generated by MySQL
          TEMP_PASSWORD=$(grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}')

          # Secure MySQL: set root password and remove defaults
          mysql --connect-expired-password -uroot -p"$TEMP_PASSWORD" <<EOF
          ALTER USER 'root'@'localhost' IDENTIFIED BY '${DBRootPassword}';
          DELETE FROM mysql.user WHERE User='';
          DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
          DROP DATABASE IF EXISTS test;
          DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
          FLUSH PRIVILEGES;
          EOF

          # ------------------------------------------------------------------
          # 3. Install Zabbix 7.0 Repository & Packages
          # ------------------------------------------------------------------
          rpm -Uvh https://repo.zabbix.com/zabbix/7.0/amazonlinux/2023/x86_64/zabbix-release-latest-7.0.amzn2023.noarch.rpm
          dnf clean all
          dnf install -y zabbix-server-mysql zabbix-web-mysql zabbix-apache-conf zabbix-sql-scripts zabbix-selinux-policy zabbix-agent zabbix-web-japanese

          # ------------------------------------------------------------------
          # 4. Create Zabbix Database & User
          # ------------------------------------------------------------------
          mysql -uroot -p'${DBRootPassword}' <<EOF
          CREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
          CREATE USER 'zabbix'@'localhost' IDENTIFIED BY '${DBZabbixPassword}';
          GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'localhost';
          SET GLOBAL log_bin_trust_function_creators = 1;
          FLUSH PRIVILEGES;
          EOF

          # ------------------------------------------------------------------
          # 5. Import Initial Schema & Data
          # ------------------------------------------------------------------
          zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | \
            mysql --default-character-set=utf8mb4 -uzabbix -p'${DBZabbixPassword}' zabbix

          # Disable log_bin_trust_function_creators after import
          mysql -uroot -p'${DBRootPassword}' -e "SET GLOBAL log_bin_trust_function_creators = 0;"

          # ------------------------------------------------------------------
          # 6. Configure Zabbix Server - DB Password
          # ------------------------------------------------------------------
          sed -i "s/^# DBPassword=.*/DBPassword=${DBZabbixPassword}/" /etc/zabbix/zabbix_server.conf

          # ------------------------------------------------------------------
          # 7. Configure Zabbix PHP Frontend (bypass setup wizard)
          # ------------------------------------------------------------------
          cat > /etc/zabbix/web/zabbix.conf.php <<'PHPCONF'
          <?php
          $DB['TYPE']             = 'MYSQL';
          $DB['SERVER']           = 'localhost';
          $DB['PORT']             = '0';
          $DB['DATABASE']         = 'zabbix';
          $DB['USER']             = 'zabbix';
          PHPCONF

          # Append DB password separately to avoid heredoc interpolation issues
          echo "\$DB['PASSWORD']         = '${DBZabbixPassword}';" >> /etc/zabbix/web/zabbix.conf.php

          cat >> /etc/zabbix/web/zabbix.conf.php <<'PHPCONF'
          $DB['SCHEMA']           = '';
          $DB['ENCRYPTION']       = false;
          $DB['KEY_FILE']         = '';
          $DB['CERT_FILE']        = '';
          $DB['CA_FILE']          = '';
          $DB['VERIFY_HOST']      = false;
          $DB['CIPHER_LIST']      = '';
          $DB['VAULT_URL']        = '';
          $DB['VAULT_DB_PATH']    = '';
          $DB['VAULT_TOKEN']      = '';
          $DB['DOUBLE_IEEE754']   = true;

          $ZBX_SERVER             = 'localhost';
          $ZBX_SERVER_PORT        = '10051';

          $IMAGE_FORMAT_DEFAULT   = IMAGE_FORMAT_PNG;
          PHPCONF

          # Append server name separately to use CloudFormation stack name
          echo "\$ZBX_SERVER_NAME        = '${AWS::StackName}';" >> /etc/zabbix/web/zabbix.conf.php

          chown apache:apache /etc/zabbix/web/zabbix.conf.php
          chmod 640 /etc/zabbix/web/zabbix.conf.php

          # ------------------------------------------------------------------
          # 8. Set default language to Japanese for Admin user
          # ------------------------------------------------------------------
          mysql -uzabbix -p'${DBZabbixPassword}' zabbix <<EOF
          UPDATE users SET lang = 'ja_JP' WHERE username = 'Admin';
          UPDATE config SET default_lang = 'ja_JP';
          EOF

          # ------------------------------------------------------------------
          # 9. Start & Enable All Services
          # ------------------------------------------------------------------
          systemctl enable zabbix-server zabbix-agent httpd php-fpm --now

          # ------------------------------------------------------------------
          # 9. Installation Complete
          # ------------------------------------------------------------------
          echo "=========================================="
          echo " Zabbix 7.0 LTS Installation Complete!"
          echo " Web UI: http://<public-ip>/zabbix"
          echo " Default login: Admin / zabbix"
          echo "=========================================="

  # ----------------------------------------------------------------------------
  # IAM Role - Monitored Instance
  # ----------------------------------------------------------------------------
  MonitoredInstanceRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Sub "${AWS::StackName}-monitored-role"
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service: ec2.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
      Tags:
        - Key: Name
          Value: !Sub "${AWS::StackName}-monitored-role"

  MonitoredInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Roles:
        - !Ref MonitoredInstanceRole

  # ----------------------------------------------------------------------------
  # EC2 Instance - Monitored Target
  # ----------------------------------------------------------------------------
  MonitoredInstance:
    Type: AWS::EC2::Instance
    DependsOn: PrivateRoute
    Properties:
      ImageId: "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64}}"
      InstanceType: t3.micro
      IamInstanceProfile: !Ref MonitoredInstanceProfile
      SubnetId: !Ref PrivateSubnet
      SecurityGroupIds:
        - !Ref MonitoredInstanceSG
      Tags:
        - Key: Name
          Value: !Sub "${AWS::StackName}-monitored-instance"
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash -xe
          exec > >(tee /var/log/zabbix-agent-install.log) 2>&1

          echo "=========================================="
          echo " Zabbix Agent 7.0 Installation Start"
          echo "=========================================="

          # ------------------------------------------------------------------
          # 0. Wait for any existing dnf/rpm lock to be released
          # ------------------------------------------------------------------
          echo "Waiting for dnf/rpm lock to be released..."
          while fuser /var/lib/rpm/.rpm.lock /var/cache/dnf/metadata_lock.pid 2>/dev/null; do
            echo "  Another process is using dnf/rpm. Waiting 5 seconds..."
            sleep 5
          done
          echo "Lock released. Proceeding with installation."

          # ------------------------------------------------------------------
          # 1. System Update
          # ------------------------------------------------------------------
          dnf update -y

          # ------------------------------------------------------------------
          # 2. Install Zabbix Agent
          # ------------------------------------------------------------------
          rpm -Uvh https://repo.zabbix.com/zabbix/7.0/amazonlinux/2023/x86_64/zabbix-release-latest-7.0.amzn2023.noarch.rpm
          dnf clean all
          dnf install -y zabbix-agent

          # ------------------------------------------------------------------
          # 3. Configure Zabbix Agent
          # ------------------------------------------------------------------
          ZABBIX_SERVER_IP="${ZabbixInstance.PrivateIp}"

          cat > /etc/zabbix/zabbix_agentd.conf <<EOF
          # Zabbix Agent Configuration
          PidFile=/run/zabbix/zabbix_agentd.pid
          LogFile=/var/log/zabbix/zabbix_agentd.log
          LogFileSize=0

          # Zabbix Server connection
          Server=$ZABBIX_SERVER_IP
          ServerActive=$ZABBIX_SERVER_IP
          Hostname=$(hostname)

          # Security
          AllowKey=system.run[*]
          Include=/etc/zabbix/zabbix_agentd.d/*.conf
          EOF

          # ------------------------------------------------------------------
          # 4. Start & Enable Zabbix Agent
          # ------------------------------------------------------------------
          systemctl enable zabbix-agent --now

          # ------------------------------------------------------------------
          # 5. Installation Complete
          # ------------------------------------------------------------------
          echo "=========================================="
          echo " Zabbix Agent 7.0 Installation Complete!"
          echo " Server: $ZABBIX_SERVER_IP"
          echo "=========================================="

# ==============================================================================
# Outputs
# ==============================================================================
Outputs:
  ZabbixWebUrl:
    Description: Zabbix Web UI URL
    Value: !Sub "http://${ZabbixInstance.PublicIp}/zabbix"

  ZabbixServerPrivateIp:
    Description: Private IP address of the Zabbix Server
    Value: !GetAtt ZabbixInstance.PrivateIp

  MonitoredInstanceId:
    Description: Instance ID of the monitored target
    Value: !Ref MonitoredInstance

  MonitoredInstancePrivateIp:
    Description: Private IP address of the monitored instance
    Value: !GetAtt MonitoredInstance.PrivateIp

CloudFormationスタックの展開手順

1. CloudFormationのマネジメントコンソールを開き、「スタックの作成」を押下

2. スタックの作成にて、「テンプレートファイルのアップロード」を選択、「zabbix-sample.yaml」をアップロードし「次へ」を押下

3. スタックの詳細を指定にて、以下入力し「次へ」を押下

項目 入力内容
スタック名 スタック名を入力
パラメータ / AllowedCidr 自身の環境のグローバルIPアドレスを入力
パラメータ / DBRootPassword DBのrootユーザーのパスワードとして設定するものを入力
パラメータ / DBZabbixPassword DBのzabbixユーザーのパスワードとして設定するものを入力

4. スタックオプションの設定にて、最下部の「AWS CloudFormation によって IAM リソースがカスタム名で作成される場合があることを承認します。」のチェックボックスに同意し、「次へ」を押下

5. 確認して作成にて、入力した内容に誤りがない事を確認し「送信」を押下

6. 作成したスタックのステータスが「CREATE_COMPLETE」になれば展開完了

Zabbix Webインターフェースへのログインとアクセストークンの発行

1. CloudFormationスタックの展開が完了したら、作成したスタックの「出力」タブに記載された「ZabbixWebUrl」の値を確認および押下し、Zabbix WebインターフェースへWebブラウザでアクセス

スタック展開後にzabbix-serverなどがインストールされるため、アクセスできるようになるまでに時間がかかります。

2. ログイン画面にて、以下入力し「サインイン」を押下

項目 入力内容
ユーザー名 Admin
パスワード zabbix

3. ログイン後、左ペインより「ユーザー > APIトークン」を開き「APIトークンの作成」を押下

4. 新規APIトークン作成画面にて、以下を入力し「追加」を押下

項目 入力内容
名前 mcp
ユーザー Admin (Zabbix Administrator)
有効期限 任意の有効期限を設定

5. 作成後、「クリップボードにコピー」し「閉じる」を押下

AIエージェントを活用したクラウド環境の監視方法について、NTT東日本のエンジニアがご相談にお応えしますので、お気軽にご連絡ください!

KiroへのMCPサーバー設定

uvのインストール

Kiroにzabbix-mcpの設定を行う前に、Pythonのパッケージマネージャであるuvをインストールしておきます。

uvのインストール (Windowsの場合)

> powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
~省略~

インストール後の確認

> uv --version
uv 0.11.32 (3010295ae 2026-07-23 x86_64-pc-windows-msvc)

KiroへのMCPサーバー設定

Kiroにzabbix-mcpを設定します。

ワークスペースの.kiro/settings/mcp.jsonに以下の内容を記述します。

{
    "mcpServers": {
        "zabbix": {
            "command": "uvx",
            "args": ["zabbix-mcp"],
            "env": {
                "ZABBIX_URL": "<ZabbixWebUrl>/api_jsonrpc.php",
                "ZABBIX_TOKEN": "<発行したAPIトークン>"
            }
        }
    }
}

<ZabbixWebUrl>、<発行したAPIトークン>の置換を忘れないようにしてください

設定を保存すると、KiroがMCPサーバーを自動的に起動します。

zabbix-mcpの動作確認

設定が完了したら、Kiroのチャットで簡単な確認を行います。

チャットに「zabbixに登録されているホストの一覧を教えて」と入力してみましょう。

Kiroが@zabbix/host_getツールを呼び出し、登録されているホスト情報を取得して回答してくれます。初期状態では「Zabbix server」自身のみが登録されていることが確認できます。

これでKiroからZabbixを操作する準備が整いました。

AIエージェントを活用したクラウド環境の監視方法について、NTT東日本のエンジニアがご相談にお応えしますので、お気軽にご連絡ください!

チャットでの監視ホスト登録

それでは本題です。

今回は検証環境のため、AIエージェントにホスト登録を実施してもらいます。

なお、本番環境でまずは安全に活用したい場合は、前述のREAD_ONLY_MODEを利用し、障害確認や設定参照といった読み取り用途から始める方法もあります。

マネジメントコンソールでの確認

展開したCloudFormationスタックの「出力」タブに記載された「MonitoredInstanceId」、「MonitoredInstancePrivateIp」の値を確認しておきます。

Kiroへの指示

Kiroのチャットに以下のように指示しました。

zabbixにインスタンス:i-04ce4552c4f8aa3af、IPアドレス:10.0.2.143のホストをAWS HTTPテンプレートとzabbix-agentのテンプレートで監視できるようにして。

ホスト名はmonitored-instance、リージョンはap-northeast-3、CloudWatchAPIはZabbixServerのインスタンスプロファイルを利用できるように明示して登録してくれると嬉しい。

Kiroの動作

Kiroは指示された内容を解釈し、ホスト登録にあたって以下の順序で実施してくれました。

  1. テンプレートとホストグループの情報を取得(利用可能なテンプレートIDやグループIDの確認)
  2. ホストを作成(テンプレート「AWS EC2 by HTTP」と「Linux by Zabbix agent」を紐付け)
  3. 必要なマクロを設定(リージョン、インスタンスID、認証方式など)

また、完了報告としてZabbixに登録した内容を整理し表示してくれました。

Zabbix Webインターフェースでの確認

Zabbix Webインターフェースの「データ収集 > ホスト」を確認すると、Kiroが登録したホストが表示されており、テンプレートも「AWS EC2 by HTTP」と「Linux by Zabbix agent」の両方が紐づけられていることが確認できます。

前回のコラム:ZabbixでAWS EC2を監視してみよう~CloudWatch連携とZabbix Agentの比較~ではZabbix Webインターフェース上で手動で入力していた作業が、自然言語による指示で完了しました。

障害確認もチャットで

監視ホストの登録だけでなく、障害の確認もチャットで行えます。

「登録してもらったホストに障害は出てますか?」と聞いてみましょう。

Kiroは@zabbix/problem_getで障害情報を取得するだけでなく、発生しているアラートの意味や考えられる原因、確認すべきポイントまで整理して提示してくれました。

Zabbix Webインターフェースの「監視データ > 障害」から同じ障害を確認でき、Kiroの回答と一致していることがわかります。

AIエージェントを活用したクラウド環境の監視方法について、NTT東日本のエンジニアがご相談にお応えしますので、お気軽にご連絡ください!

さいごに

本コラムでは、zabbix-mcpとAI開発環境Kiroを組み合わせて、自然言語でZabbixを操作する方法をご紹介しました。

従来の手動操作と比較すると、MCPを活用することで以下のような変化があります。

観点 従来の手動操作 AIエージェント(Kiro) + MCP
ホスト登録 Webインターフェースで複数画面を遷移して入力 チャットで指示するだけ
障害確認 Webインターフェースにログインして確認 チャットで質問するだけ
API操作 JSON-RPCのリクエストを手書き 自然言語で指示
学習コスト ZabbixのAPI仕様を理解する必要あり AIが仕様を理解して実行

今回の例では、単純にZabbix APIを呼び出しただけではありません。

Kiroは利用可能なテンプレートやホストグループの情報を事前に取得し、それらを基に必要な設定を組み立てた上でホスト登録を実施しました。

従来のチャットボットのように単一の問い合わせへ応答するだけでなく、「監視対象を登録したい」という目的に対して、必要な情報収集や設定作業を自律的に実行している点は、AIエージェントとMCPの組み合わせならではの面白さだと感じます。

なお、本コラムの構成はあくまで検証目的になります。

本番環境への適用にはAPIトークンの権限設計やREAD_ONLY_MODEの活用、ネットワーク経路のアクセス制御など、運用ポリシーに合わせた追加のセキュリティ考慮が必要です。

AIエージェントとの連携により、監視ツールの操作がより直感的で手軽になります。複雑なAPI仕様を覚えなくても、「何をしたいか」を伝えるだけで操作が完了する体験は、監視運用の効率化に大きく貢献するのではないでしょうか。

MCPはZabbixに限らず、さまざまなサービスとAIエージェントを橋渡しするプロトコルです。今後もMCPサーバーが増えていくことで、AIエージェントを軸にした運用自動化の可能性がさらに広がっていくと思います。

本コラムが皆さまの監視運用の新しい選択肢として参考になれば幸いです。

AIエージェントを活用したクラウド環境の監視方法について、NTT東日本のエンジニアがご相談にお応えしますので、お気軽にご連絡ください!

本コラムに記載されてる会社名、サービス名、商品名は、各社の商標または登録商標です。

ページ上部へ戻る

相談無料!プロが中立的にアドバイスいたします

クラウド・AWS・Azureでお困りの方はお気軽にご相談ください。