

# CloudWatch ソリューション: Amazon EC2 での Kafka ワークロード
<a name="Solution-Kafka-On-EC2"></a>

このソリューションは、EC2 インスタンスで実行されている Kafka ワークロード (ブローカー、プロデューサー、コンシューマー) の CloudWatch エージェントを使用して、すぐに使用できるメトリクス収集を設定するのに役立ちます。さらに、事前設定された CloudWatch ダッシュボードを設定するのに役立ちます。すべての CloudWatch オブザーバビリティソリューションの一般的な情報については、「[CloudWatch オブザーバビリティソリューション](Monitoring-Solutions.md)」を参照してください。

**Topics**
+ [要件](#Solution-Kafka-On-EC2-Requirements)
+ [利点](#Solution-Kafka-On-EC2-Benefits)
+ [コスト](#Solution-Kafka-On-EC2-Costs)
+ [このソリューションの CloudWatch エージェント設定](#Solution-Kafka-CloudWatch-Agent)
+ [ソリューションにエージェントをデプロイする](#Solution-Kafka-Agent-Deploy)
+ [Kafka ソリューションダッシュボードを作成する](#Solution-Kafka-Dashboard)
+ [同じインスタンスで複数の Kafka ロールのエージェントを設定する](#Kafka-Multiple-Roles)

## 要件
<a name="Solution-Kafka-On-EC2-Requirements"></a>

このソリューションは、以下の条件に適しています。
+ ワークロード: Kafka v0.8.2.x 以降
+ コンピューティング: Amazon EC2
+ 特定の AWS リージョン内の Kafka ワークロード全体で最大 500 個の EC2 インスタンスをサポート
+ CloudWatch エージェントの最新バージョン
+ EC2 インスタンスにインストールされた SSM エージェント
**注記**  
AWS Systems Manager (SSM エージェント) は、AWS および信頼できるサードパーティーが提供している一部の [Amazon マシンイメージ (AMI)](https://docs.aws.amazon.com/systems-manager/latest/userguide/ami-preinstalled-agent.html) にプリインストールされています。エージェントがインストールされていない場合は、使用しているオペレーティングシステムタイプの手順を使用して、手動でインストールできます。  
[Linux 用 EC2 インスタンスに SSM Agent を手動でインストールおよびアンインストールする](https://docs.aws.amazon.com/systems-manager/latest/userguide/manually-install-ssm-agent-linux.html)
[macOS 用の EC2 インスタンスに SSM Agent を手動でインストールおよびアンインストールする](https://docs.aws.amazon.com/systems-manager/latest/userguide/manually-install-ssm-agent-macos.html)
[Windows Server 用の EC2 インスタンスに SSM Agent を手動でインストールおよびアンインストールする](https://docs.aws.amazon.com/systems-manager/latest/userguide/manually-install-ssm-agent-windows.html)

## 利点
<a name="Solution-Kafka-On-EC2-Benefits"></a>

このソリューションでは Kafka サーバーをモニタリングしているため、以下のユースケースに役立つインサイトが得られます。
+ レプリケーションメトリクスと同期メトリクスを使用して Kafka クラスターのヘルスをモニタリングします。
+ ネットワークトラフィックとともに、リクエストの失敗とレイテンシーを通じてブローカーのパフォーマンスを追跡します。
+ プロデューサー/コンシューマーのエラー、レイテンシー、コンシューマー遅延をモニタリングします。
+ Kafka クラスターに対する基盤となる JVM パフォーマンスを分析します。
+ 同じアカウントでソリューションを介して設定された複数の Kafka クラスター、プロデューサー、コンシューマーを切り替えます。

ソリューションの主な利点を以下に示します。
+ CloudWatch エージェント設定を使用して Kafka と基盤となる JVM のメトリクス収集を自動化し、手動計測をなくします。
+ Kafka メトリクスと JVM メトリクス用の事前設定済みの統合 CloudWatch ダッシュボードが用意されています。ダッシュボードは、ダッシュボードを初めて作成するときにメトリクスが存在しない場合でも、ソリューションを使用して設定された新しい Kafka EC2 インスタンスからのメトリクスを自動的に処理します。また、メトリクスを論理アプリケーションにグループ化して、重点の絞り込みと管理を容易にすることもできます。

以下の画像は、このソリューションのダッシュボードの例です。

![\[Kafka クラスター dashboard showing metrics for partitions, producer/consumer performance, and broker status.\]](http://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/images/KafkaDashboard.png)


## コスト
<a name="Solution-Kafka-On-EC2-Costs"></a>

このソリューションは、アカウントでリソースを作成して使用します。標準使用には料金がかかります。これには以下を含みます。
+ CloudWatch エージェントによって収集されたすべてのメトリクスは、カスタムメトリクスとして課金されます。このソリューションで使用されるメトリクスの数は、EC2 ホストの数によって異なります。
  + ソリューション用に設定された各ブローカーホストは、33 個のメトリクスと、そのホストのディスクパス数によって各 EC2 ホストのメトリクス数が異なる 1 つのメトリクス (`disk_used_percent`) を公開します。
  + ソリューション用に設定された各プロデューサーホストは、`topic` ディメンションを持つ 3 つのメトリクスと、`topic` ディメンションを持たない 3 つのメトリクスを公開します。`topic` ディメンションを持つメトリクスの場合、各トピックは個別のメトリクスとしてカウントされます。
  + ソリューション用に設定された各コンシューマーホストは、`topic` ディメンションを持つ 2 つのメトリクスと、`topic` ディメンションを持たない 3 つのメトリクスを公開します。トピックディメンションを持つメトリクスの場合、各トピックは個別のメトリクスとしてカウントされます。
+ 1 つのカスタムダッシュボード。
+ CloudWatch エージェントによってメトリクスの公開がリクエストされた API オペレーション。このソリューションのデフォルト設定では、CloudWatch エージェントは EC2 ホストごとに毎分 1 回 **PutMetricData** を呼び出します。つまり、**PutMetricData** API は EC2 ホストごとに 30 日の月には `30*24*60=43,200` 回呼び出されます。

CloudWatch の料金の詳細については、「[Amazon CloudWatch の料金](https://aws.amazon.com/cloudwatch/pricing/)」をご覧ください。

料金計算ツールを使用すると、このソリューションを使用するためのおよその月額コストを見積もることができます。

**料金計算ツールを使用して毎月のソリューションのコストを見積もるには**

1. [Amazon CloudWatch 料金計算ツール](https://calculator.aws/#/createCalculator/CloudWatch)を開きます。

1. **[メトリクス]** セクションの **[メトリクスの数]** に **broker\$1metrics\$1count \$1 producer\$1metrics\$1count \$1 consumer\$1metrics\$1count** を入力します。これらを次のように計算します。
   + `broker_metrics_count` = (33 \$1 EC2 ホストあたりのディスクパスの平均数) \$1 number\$1of\$1ec2\$1broker\$1hosts 
   + `producer_metrics_count` = (3 \$1 average\$1number\$1of\$1topics\$1per\$1producer\$1host \$1 3) \$1 number\$1of\$1ec2\$1producer\$1hosts 
   + `consumer_metrics_count` = (2 \$1 average\$1number\$1of\$1topics\$1per\$1consumer\$1host \$1 3) \$1 number\$1of\$1ec2\$1consumer\$1hosts 

1. **[API]** セクションの **[API リクエストの数]** に **43200 \$1 number of EC2 instances configured for this solution** を入力します。

   デフォルトでは、CloudWatch エージェントは EC2 ホストごとに毎分 1 回 **PutMetricData** オペレーションを実行します。

1. **[ダッシュボードとアラーム]** セクションの **[ダッシュボードの数]** に「**1**」と入力します。

1. 毎月の見積コストは、料金計算ツールの下部に表示されます。

## このソリューションの CloudWatch エージェント設定
<a name="Solution-Kafka-CloudWatch-Agent"></a>

CloudWatch エージェントは、サーバー上およびコンテナ化された環境で継続的かつ自律的に実行されるソフトウェアです。インフラストラクチャとアプリケーションからメトリクス、ログ、トレースを収集し、CloudWatch と X-Ray に送信します。

CloudWatch エージェントの詳細については、「[CloudWatch エージェントを使用してメトリクス、ログ、トレースを収集する](Install-CloudWatch-Agent.md)」を参照してください。

このソリューションのエージェント設定では、Kafka、JVM、EC2 の基本的なメトリクスを収集します。CloudWatch エージェントは、ダッシュボードにデフォルトで表示されるよりも多くの Kafka メトリクスと JVM メトリクスを収集するように設定できます。収集できるすべての Kafka メトリクスのリストについては、「[Kafka メトリクスの収集](CloudWatch-Agent-JMX-metrics.md#CloudWatch-Agent-Kafka-metrics)」を参照してください。収集できるすべての JVM メトリクスのリストについては、「[JVM メトリクスの収集](CloudWatch-Agent-JMX-metrics.md#CloudWatch-Agent-JVM-metrics)」を参照してください。EC2 メトリクスのリストについては、「[Linux および macOS インスタンスで CloudWatch エージェントにより収集されるメトリクス](metrics-collected-by-CloudWatch-agent.md#linux-metrics-enabled-by-CloudWatch-agent)」を参照してください。

**Kafka ブローカーロール、プロデューサーロール、コンシューマーロールの JMX ポートを公開する**

CloudWatch エージェントは、JMX に依存して Kafka ブローカー、プロデューサー、コンシューマーに関連するメトリクスを収集します。これを実現するには、サーバーとアプリケーションの JMX ポートを公開する必要があります。

Kafka ブローカーの場合は、`JMX_PORT` 環境変数を使用してポートを設定する必要があります。この環境変数を設定した後、ブローカーを再起動する必要があります。アプリケーションの開始スクリプトと設定ファイルを確認して、これらの引数を追加する最適な場所を見つけます。

例えば、Linux および macOS システムでは、次のコマンドを使用して JMX ポートを設定できます。必ず未使用のポート番号を指定してください。

```
export JMX_PORT=port-number
```

Kafka プロデューサーとコンシューマーの場合、JMX ポートを公開する手順は、プロデューサーまたはコンシューマーの JVM アプリケーションに使用するワークロードタイプによって異なります。これらの手順については、アプリケーションのドキュメントを参照してください。

通常、モニタリングと管理のために JMX ポートを有効にするには、JVM アプリケーションに次のシステムプロパティを設定します。次の例では、認証されていない JMX を設定します。セキュリティポリシー/要件で、JMX を有効にするためにパスワード認証やリモートアクセスで SSL を有効にすることが必須の場合は、[JMX のドキュメント](https://docs.oracle.com/en/java/javase/17/management/monitoring-and-management-using-jmx-technology.html)を参照して必要なプロパティを設定します。

```
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=port-number
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false
```

JMX ポートを確認するには、`ps aux | grep jmxremote.port` を実行します。結果は、JMX ポートが JVM プロセスで設定されたことを示すはずです。

**このソリューションのエージェント設定**

エージェントによって収集されるメトリクスは、エージェント設定で定義されます。このソリューションには、ソリューションのダッシュボードに適したディメンションで推奨メトリクスを収集するためのエージェント設定が用意されています。ブローカー、プロデューサー、コンシューマーなどの各 Kafka ロールには、Kafka メトリクスと基盤となる JVM および EC2 メトリクスの収集を可能にする独自のエージェント設定があります。

ソリューションをデプロイする手順については、「[ソリューションにエージェントをデプロイする](#Solution-Kafka-Agent-Deploy)」で後述します。以下の情報は、環境に合わせてエージェント設定をカスタマイズする方法を理解するのに役立ちます。

環境に合わせて、次のエージェント設定の一部をカスタマイズする必要があります。
+ JMX ポート番号は、このドキュメントの前のセクションで設定したポート番号です。ポート番号は設定の `endpoint` 行にあります。
+ `ClusterName`– これは、収集されたブローカーメトリクスのディメンションとして使用されます。Kafka ブローカーを実行するインスタンスのクラスターグループを表す意味のある名前を指定します。
+ `ProcessGroupName`– これは、ブローカー用に収集された JVM メトリクスのディメンションとして使用されます。`ClusterName` に指定した値と同じ値を指定します。これにより、ソリューションダッシュボードのブローカーメトリクスと同じ Kafka ブローカーグループの JVM メトリクスを表示できます。
+ `ProducerGroupName`– これは、収集されたプロデューサーメトリクスのディメンションとして使用されます。プロデューサーインスタンスのグループを表す意味のある名前を指定します。この値には、ソリューションダッシュボードのプロデューサーメトリクスの統合ビューに使用するプロデューサーアプリケーションまたはサービスを指定できます。
+ `ConsumerGroupName`– これは、収集されたコンシューマーメトリクスのディメンションとして使用されます。コンシューマーインスタンスのグループを表す意味のある名前を指定します。これは Kafka でのコンシューマーグループの概念とは異なります。これは、ソリューションダッシュボードのコンシューマーメトリクスの統合ビューに使用するコンシューマーアプリケーションまたはサービスを指定できる単なるグループ化ディメンションです。

例えば、同じアカウントで実行されている Kafka クラスターが 2 つあり、1 つは `order-processing` アプリケーション用、もう 1 つは `inventory-management` アプリケーション用である場合、それに応じてブローカーインスタンスのエージェント設定で `ClusterName` と `ProcessGroupName` ディメンションを設定する必要があります。
+ `order-processing` クラスターブローカーインスタンスには、`ClusterName=order-processing` と `ProcessGroupName=order-processing` を設定します。
+ `inventory-management` クラスターブローカーインスタンスには、`ClusterName=inventory-management` と `ProcessGroupName=inventory-management` を設定します。
+ 同様に、それぞれのアプリケーションに基づいて、プロデューサーインスタンスには `ProducerGroupName` を、コンシューマーインスタンスには `ConsumerGroupName` を設定します。

上記のディメンションを正しく設定すると、ソリューションダッシュボードは、`ClusterName`、`ProducerGroupName`、および `ConsumerGroupName` の各ディメンションに基づいてメトリクスを自動的にグループ化します。ダッシュボードには、特定のクラスターとグループのメトリクスを選択および表示するドロップダウンオプションが含まれており、個々のクラスターとグループのパフォーマンスを個別にモニタリングできます。

関連するエージェント設定を正しい EC2 インスタンスにデプロイしてください。各設定は、「[ステップ 2: 推奨 CloudWatch エージェント設定ファイルを Systems Manager パラメータストアに保存する](#Solution-Kafka-Agent-Step2)」で後述するように、SSM のパラメータストアに別々のパラメータとして保存されます。

次の手順では、プロデューサー、コンシューマー、ブローカーの各ロールが重複することなく別々の EC2 インスタンスにデプロイされる状況について説明します。同じ EC2 インスタンスで複数の Kafka ロールを実行している場合、詳細については、「[同じインスタンスで複数の Kafka ロールのエージェントを設定する](#Kafka-Multiple-Roles)」を参照してください。

### Kafka ブローカーエージェントのエージェント設定
<a name="Solution-Kafka-Agent-Broker"></a>

Kafka ブローカーエージェントがデプロイされている EC2 インスタンスでは、次の CloudWatch エージェント設定を使用します。*ClusterName* を、これらのメトリクスをグループ化して統一された表示にするために使用するクラスターの名前に置き換えます。*ClusterName* に指定した値は、`ClusterName` ディメンションと `ProcessGroupName` ディメンションの両方として使用されます。*port-number* を Kafka サーバーの JMX ポートに置き換えます。JMX がリモートアクセス用のパスワード認証または SSL で有効になっている場合は、必要に応じて、TLS または認可を設定する方法について「[Java Management Extensions (JMX) メトリクスの収集](CloudWatch-Agent-JMX-metrics.md)」を参照してください。

この設定 (JMX ブロックの外部に示される設定) に示される EC2 メトリクスは、Linux インスタンスと macOS インスタンスでのみ機能します。Windows インスタンスを使用している場合は、設定でこれらのメトリクスを省略できます。Windows インスタンスで収集されたメトリクスについては、「[Windows Server インスタンスで CloudWatch エージェントにより収集されるメトリクス](metrics-collected-by-CloudWatch-agent.md#windows-metrics-enabled-by-CloudWatch-agent)」を参照してください。

```
{
  "metrics": {
    "namespace": "CWAgent",
    "append_dimensions": {
      "InstanceId": "${aws:InstanceId}"
    },
    "metrics_collected": {
      "jmx": [
        {
          "endpoint": "localhost:port-number",
          "kafka": {
            "measurement": [
              "kafka.request.time.avg",
              "kafka.request.failed",
              "kafka.request.count",
              "kafka.purgatory.size",
              "kafka.partition.under_replicated",
              "kafka.partition.offline",
              "kafka.network.io",
              "kafka.leader.election.rate",
              "kafka.isr.operation.count"
            ]
          },
          "append_dimensions": {
            "ClusterName": "ClusterName"
          }
        },
        {
          "endpoint": "localhost:port-number",
          "jvm": {
            "measurement": [
              "jvm.classes.loaded",
              "jvm.gc.collections.count",
              "jvm.gc.collections.elapsed",
              "jvm.memory.heap.committed",
              "jvm.memory.heap.max",
              "jvm.memory.heap.used",
              "jvm.memory.nonheap.committed",
              "jvm.memory.nonheap.max",
              "jvm.memory.nonheap.used",
              "jvm.threads.count"
            ]
          },
          "append_dimensions": {
            "ProcessGroupName": "ClusterName"
          }
        }
      ],
      "disk": {
        "measurement": [
          "used_percent"
        ]
      },
      "mem": {
        "measurement": [
          "used_percent"
        ]
      },
      "swap": {
        "measurement": [
          "used_percent"
        ]
      },
      "netstat": {
        "measurement": [
          "tcp_established",
          "tcp_time_wait"
        ]
      }
    }
  }
}
```

### Kafka プロデューサーのエージェント設定
<a name="Solution-Kafka-Agent-Producer"></a>

Kafka プロデューサーがデプロイされている Amazon EC2 インスタンスでは、次の CloudWatch エージェント設定を使用します。*ProducerGroupName* を、メトリクスをグループ化して統一された表示にするために使用するアプリケーションまたはグループの名前に置き換えます。*port-number* を Kafka プロデューサーアプリケーションの JMX ポートに置き換えます。

 ソリューションダッシュボードにプロデューサーの JVM に関連する JVM メトリクスが表示されないため、このソリューションでは Kafka プロデューサーの JVM メトリクスは有効になりません。エージェント設定をカスタマイズして JVM メトリクスを出力することもできますが、プロデューサーに関連する JVM メトリクスはソリューションダッシュボードに表示されません。

```
{
  "metrics": {
    "namespace": "CWAgent",
    "append_dimensions": {
      "InstanceId": "${aws:InstanceId}"
    },
    "metrics_collected": {
      "jmx": [
        {
          "endpoint": "localhost:port-number",
          "kafka-producer": {
            "measurement": [
              "kafka.producer.request-rate",
              "kafka.producer.byte-rate",
              "kafka.producer.request-latency-avg",
              "kafka.producer.response-rate",
              "kafka.producer.record-error-rate",
              "kafka.producer.record-send-rate"
            ]
          },
          "append_dimensions": {
            "ProducerGroupName": "ProducerGroupName"
          }
        }
      ]
    }
  }
}
```

### Kafka コンシューマーのエージェント設定
<a name="Solution-Kafka-Agent-Consumer"></a>

Kafka コンシューマーが実行されている EC2 インスタンスでは、次の CloudWatch エージェント設定を使用します。*ConsumerGroupName* を、これらのメトリクスをグループ化して統一された表示にするために使用するアプリケーションまたはグループの名前に置き換えます。*port-number* を Kafka コンシューマーアプリケーションの JMX ポートに置き換えます。

ソリューションダッシュボードにコンシューマーの JVM に関連する JVM メトリクスが表示されないため、このソリューションでは Kafka コンシューマーの JVM メトリクスは有効になりません。エージェント設定をカスタマイズして JVM メトリクスを出力することもできますが、コンシューマーに関連する JVM メトリクスはソリューションダッシュボードに表示されません。

```
{
  "metrics": {
    "append_dimensions": {
      "InstanceId": "${aws:InstanceId}"
    },
    "metrics_collected": {
      "jmx": [
        {
          "endpoint": "localhost:port-number",
          "kafka-consumer": {
            "measurement": [
              "kafka.consumer.fetch-rate",
              "kafka.consumer.total.bytes-consumed-rate",
              "kafka.consumer.records-consumed-rate",
              "kafka.consumer.bytes-consumed-rate",
              "kafka.consumer.records-lag-max"
            ]
          },
          "append_dimensions": {
            "ConsumerGroupName": "ConsumerGroupName"
          }
        }
      ]
    }
  }
}
```

## ソリューションにエージェントをデプロイする
<a name="Solution-Kafka-Agent-Deploy"></a>

ユースケースに応じて、CloudWatch エージェントをインストールするためのいくつかのアプローチがあります。このソリューションには Systems Manager を使用することをお勧めします。これにより、コンソール操作機能が提供され、1 つの AWS アカウント内のマネージドサーバーのフリートの管理が簡単になります。このセクションの手順では Systems Manager を使用し、CloudWatch エージェントを既存の設定で実行していない場合を想定しています。CloudWatch エージェントが実行されているかどうかは、「[CloudWatch エージェントが実行されていることを確認する](troubleshooting-CloudWatch-Agent.md#CloudWatch-Agent-troubleshooting-verify-running)」の手順に従って確認できます。

ワークロードがデプロイされている EC2 ホストで CloudWatch エージェントを既に実行していて、エージェント設定を管理している場合は、このセクションの手順をスキップし、既存のデプロイメカニズムに従って設定を更新できます。ロール (ブローカー、プロデューサー、コンシューマー) に従ってエージェント設定を既存のエージェント設定とマージしてから、マージされた設定をデプロイします。Systems Manager を使用して CloudWatch エージェントの設定を保存および管理している場合は、設定を既存のパラメータ値にマージできます。詳細については、「[CloudWatch エージェント設定ファイルの管理](https://docs.aws.amazon.com/prescriptive-guidance/latest/implementing-logging-monitoring-cloudwatch/create-store-cloudwatch-configurations.html)」を参照してください。

**注記**  
Systems Manager を使用して次の CloudWatch エージェント設定をデプロイすると、EC2 インスタンスの既存の CloudWatch エージェント設定がある場合は置き換えられるか、上書きされます。独自の環境やユースケースに合わせてこの設定を変更できます。このソリューションで定義されているメトリクスは、推奨されるダッシュボードに最小限必要なものです。

このデプロイプロセスには、以下のステップが含まれます。
+ ステップ 1: ターゲット EC2 インスタンスに必要な IAM アクセス許可があることを確認します。
+ ステップ 2: 推奨エージェント設定ファイルを Systems Manager パラメータストアに保存します。
+ ステップ 3: CloudFormation スタックを使用して 1 つまたは複数の EC2 インスタンスに CloudWatch エージェントをインストールします。
+ ステップ 4: エージェントのセットアップが正しく設定されていることを確認します。

ブローカー、プロデューサー、コンシューマーが同じ EC2 インスタンスにデプロイされているか、異なるインスタンスにデプロイされているかに基づいて、この手順を繰り返す必要があります。例えば、Kafka ブローカー、プロデューサー、コンシューマーが重複することなく別々のインスタンスにデプロイされている場合は、ブローカー、プロデューサー、コンシューマーの各 EC2 インスタンスの適切なエージェント設定でこの手順を 3 回繰り返す必要があります。

### ステップ 1: ターゲット EC2 インスタンスに必要な IAM アクセス許可があることを確認する
<a name="Solution-Kafka-Agent-Step1"></a>

CloudWatch エージェントをインストールして設定するためのアクセス許可を Systems Manager に付与する必要があります。また、EC2 インスタンスから CloudWatch にテレメトリを発行するアクセス許可を CloudWatch エージェントに付与する必要もあります。インスタンスにアタッチされた IAM ロールに **CloudWatchAgentServerPolicy** と **AmazonSSMManagedInstanceCore** の IAM ポリシーがアタッチされていることを確認します。
+ ロールを作成したら、ロールを EC2 インスタンスにアタッチします。新しい EC2 インスタンスの起動中にロールをアタッチするには、[IAM ロールを持つインスタンスの起動](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#launch-instance-with-role)に関するページの手順に従います。既存の EC2 インスタンスにロールをアタッチするには、[インスタンスへの IAM ロールのアタッチ](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#attach-iam-role)に関するページの手順に従います。

### ステップ 2: 推奨 CloudWatch エージェント設定ファイルを Systems Manager パラメータストアに保存する
<a name="Solution-Kafka-Agent-Step2"></a>

パラメータストアでは、設定パラメータを安全に保存および管理することで EC2 インスタンスへの CloudWatch エージェントのインストールが簡素化され、ハードコーディングされた値が不要になります。これにより、デプロイプロセスがより安全で柔軟になり、集中管理が可能になり、複数のインスタンスで設定を簡単に更新できるようになります。

以下の手順を使用して、パラメータストアに推奨 CloudWatch エージェント設定ファイルをパラメータとして保存します。

**CloudWatch エージェント設定ファイルをパラメータとして作成するには**

1. AWS Systems Manager コンソール ([https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)) を開きます。

1. ナビゲーションペインで **[アプリケーション管理]**、**[パラメータストア]** を選択します。

1. 以下の手順に従って、設定の新しいパラメータを作成します。

   1. **[パラメータの作成]** を選択します。

   1. プロデューサーには **AmazonCloudWatch-Kafka-Producer-Configuration**、コンシューマーには **AmazonCloudWatch-Kafka-Consumer-Configuration**、ブローカーには **AmazonCloudWatch-Kafka-Broker-Configuration** など、CloudWatch エージェント設定を保存するパラメータの名前を指定します。単一の EC2 に複数の Kafka ロールがある場合は、識別しやすいように、それに応じてロールに名前を付けます。この値は、EC2 インスタンスで実行されているエージェントにこの設定を配布するために後で使用されます。

   1. **[パラメータ階層]** で、**[標準]** を選択します。

   1. **[型]** で、**[文字列]** を選択します。

   1. **[データ型]** で、**[テキスト]** を選択します。

   1. **[値]** ボックスに、CloudWatch エージェント設定の全文を貼り付けます。このインスタンスがホストしている Kafka ロールの JSON ブロックを必ず選択してください。ブローカー、プロデューサー、コンシューマーの設定を保存する場合は、それぞれ「[Kafka ブローカーエージェントのエージェント設定](#Solution-Kafka-Agent-Broker)」、「[Kafka プロデューサーのエージェント設定](#Solution-Kafka-Agent-Producer)」、「[Kafka コンシューマーのエージェント設定](#Solution-Kafka-Agent-Consumer)」に記載されている設定を参照してください。同じ EC2 インスタンスで複数の Kafka ロールを実行している場合は、「[同じインスタンスで複数の Kafka ロールのエージェントを設定する](#Kafka-Multiple-Roles)」で同じインスタンスについて説明されているように、必要に応じて設定をマージしてください。

   1. **[パラメータの作成]** を選択します。

### ステップ 3: CloudWatch エージェントをインストールし、CloudFormation テンプレートを使用して設定を適用する
<a name="Solution-Kafka-Agent-Step3"></a>

AWS CloudFormation を使用してエージェントをインストールし、これまでの手順で作成した CloudWatch エージェント設定を使用するように設定できます。

**このソリューションの CloudWatch エージェントをインストールして設定するには**

1. 次のリンクを使用して、CloudFormation **[スタックのクイック作成]** ウィザードを開きます: [https://console.aws.amazon.com/cloudformation/home?\$1/stacks/quickcreate?templateURL=https://aws-observability-solutions-prod-us-east-1.s3.us-east-1.amazonaws.com/CloudWatchAgent/CFN/v1.0.0/cw-agent-installation-template-1.0.0.json](https://console.aws.amazon.com/cloudformation/home?#/stacks/quickcreate?templateURL=https://aws-observability-solutions-prod-us-east-1.s3.us-east-1.amazonaws.com/CloudWatchAgent/CFN/v1.0.0/cw-agent-installation-template-1.0.0.json)。

1. コンソールで選択したリージョンが Kafka ワークロードが実行されているリージョンであることを確認します。

1. **[スタック名]** にこのスタックを識別する名前 (**CWAgentInstallationStack** など) を入力します。

1. **[パラメータ]** セクションで、以下を指定します。

   1. **CloudWatchAgentConfigSSM** に、ブローカーには **AmazonCloudWatch-Kafka-Broker-Configuration**、プロデューサーには **AmazonCloudWatch-Kafka-Producer-Configuration**、コンシューマーには **AmazonCloudWatch-Kafka-Consumer-Configuration** など、前に作成したエージェント設定の Systems Manager パラメータの名前を入力します。

   1. ターゲットインスタンスを選択するには、2 つのオプションがあります。

      1. **[InstanceIds]** に、この設定で CloudWatch エージェントをインストールするインスタンス ID のカンマ区切りリストを指定します。1 つのインスタンスまたは複数のインスタンスを一覧表示できます。

      1. 大規模にデプロイする場合は、**[TagKey]** とそれに対応する **[TagValue]** を指定して、このタグと値を持つすべての EC2 インスタンスをターゲットにできます。**[TagKey]** を指定する場合は、対応する **[TagValue]** を指定する必要があります。(Auto Scaling グループの場合、Auto Scaling グループ内のすべてのインスタンスにデプロイするには、**[TagKey]** に **aws:autoscaling:groupName** を指定し、**[TagValue]** に Auto Scaling グループ名を指定します。)

         **[InstanceIds]** パラメータと **[TagKeys]** パラメータの両方を指定すると、**[InstanceIds]** が優先され、タグは無視されます。

1. 設定を確認し、**[スタックの作成]** を選択します。

まずテンプレートファイルを編集してカスタマイズする場合は、**[スタックの作成ウィザード]** の **[テンプレートファイルのアップロード]** オプションを選択して、編集したテンプレートをアップロードします。詳細については、「[CloudFormation コンソールからスタックを作成する](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-create-stack.html)」を参照してください。次のリンクを使用して、テンプレートをダウンロードできます: [https://aws-observability-solutions-prod-us-east-1.s3.us-east-1.amazonaws.com/CloudWatchAgent/CFN/v1.0.0/cw-agent-installation-template-1.0.0.json](https://aws-observability-solutions-prod-us-east-1.s3.us-east-1.amazonaws.com/CloudWatchAgent/CFN/v1.0.0/cw-agent-installation-template-1.0.0.json)。

**注記**  
このステップが完了すると、この Systems Manager パラメータは、ターゲットインスタンスで実行されている CloudWatch エージェントに関連付けられます。これにより、以下のように処理されます。  
Systems Manager パラメータが削除されると、エージェントは停止します。
Systems Manager パラメータを編集すると、設定の変更はスケジュールされた頻度 (デフォルトで 30 日) でエージェントに自動的に適用されます。
この Systems Manager パラメータに変更をすぐに適用する場合は、このステップを再度実行する必要があります。関連付けの詳細については、「[Systems Manager の関連付けの使用](https://docs.aws.amazon.com/systems-manager/latest/userguide/state-manager-associations.html)」を参照してください。

### ステップ 4: エージェントのセットアップが正しく設定されていることを確認する
<a name="Solution-Kafka-Agent-Step4"></a>

CloudWatch エージェントがインストールされているかどうかは、「[CloudWatch エージェントが実行されていることを確認する](troubleshooting-CloudWatch-Agent.md#CloudWatch-Agent-troubleshooting-verify-running)」の手順に従って確認できます。CloudWatch エージェントがインストールされておらず、実行されていない場合は、すべてが正しく設定されていることを確認してください。
+ 「[ステップ 1: ターゲット EC2 インスタンスに必要な IAM アクセス許可があることを確認する](Solution-Tomcat-On-EC2.md#Solution-Tomcat-Agent-Step1)」の説明に従って、EC2 インスタンスに正しいアクセス許可を持つロールがアタッチされていることを確認してください。
+ Systems Manager パラメータの JSON が正しく設定されていることを確認してください。「[CloudFormation での CloudWatch エージェントのインストールのトラブルシューティング](Install-CloudWatch-Agent-New-Instances-CloudFormation.md#CloudWatch-Agent-CloudFormation-troubleshooting)」のステップを実行してください。

すべてが正しく設定されている場合は、Kafka メトリクスが CloudWatch に公開されているはずです。CloudWatch コンソールをチェックして、公開されていることを確認します。

**Kafka メトリクスが CloudWatch に公開されていることを確認するには**

1. CloudWatch コンソールの [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) を開いてください。

1. **[メトリクス]**、**[すべてのメトリクス]** を選択します。

1. ソリューションをデプロイしたリージョンを選択したことを確認し、**[カスタム名前空間]**、**[CWAgent]** を選択します。

1. ブローカーには `kafka.partition.offline`、コンシューマーには `kafka.consumer.fetch.rate`、プロデューサーには `kafka.producer.request-rate` など、このドキュメントのエージェント設定セクションに記載されているメトリクスを検索します。これらのメトリクスの結果が表示された場合、メトリクスは CloudWatch に公開されています。

## Kafka ソリューションダッシュボードを作成する
<a name="Solution-Kafka-Dashboard"></a>

このダッシュボードには、Kafka と基盤となる JVM の両方に対して新しく出力されるメトリクスが表示されます。このダッシュボードには、プロデューサー、ブローカー、コンシューマー全体にわたる Kafka ワークロードのヘルスに寄与する上位の要因が表示されます。寄与する上位の要因のビューには、メトリクスウィジェットあたり上位 10 件が表示されます。これにより、外れ値を一目で特定できます。

ソリューションダッシュボードには EC2 メトリクスは表示されません。EC2 メトリクスを表示するには、EC2 自動ダッシュボードを使用して EC2 からのメトリクスを表示し、EC2 コンソールダッシュボードを使用して CloudWatch エージェントによって収集された EC2 メトリクスを表示する必要があります。AWS サービスの自動ダッシュボードの詳細については、「[単一の AWS サービスの CloudWatch ダッシュボードの表示](CloudWatch_Automatic_Dashboards_Focus_Service.md)」を参照してください。

ダッシュボードを作成するには、以下のオプションを使用できます。
+ CloudWatch コンソールを使用してダッシュボードを作成します。
+ AWS CloudFormation コンソールを使用してダッシュボードをデプロイします。
+ AWS CloudFormation インフラストラクチャをコードとしてダウンロードし、継続的インテグレーション (CI) オートメーションの一部として統合します。

CloudWatch コンソールを使用してダッシュボードを作成すると、実際に作成して課金される前にダッシュボードをプレビューできます。

**注記**  
このソリューションで CloudFormation を使用して作成されたダッシュボードには、ソリューションがデプロイされたリージョンのメトリクスが表示されます。JVM メトリクスと Kafka メトリクスが公開されるリージョンに CloudFormation スタックを必ず作成してください。  
CloudWatch エージェント設定で `CWAgent` 以外のカスタム名前空間を指定した場合は、ダッシュボードの CloudFormation テンプレートを変更して、`CWAgent` を、使用しているカスタマイズされた名前空間に置き換える必要があります。

**CloudWatch コンソールを使用してダッシュボードを作成するには**
**注記**  
現在、ソリューションダッシュボードには、最新の Java バージョンのデフォルトコレクターである G1 ガベージコレクターのガベージコレクション関連のメトリクスのみが表示されます。別のガベージコレクションアルゴリズムを使用している場合、ガベージコレクションに関連するウィジェットは空です。ただし、ダッシュボードの CloudFormation テンプレートを変更し、適切なガベージコレクションタイプをガベージコレクション関連のメトリクスの名前ディメンションに適用することで、これらのウィジェットをカスタマイズできます。例えば、並列ガベージコレクションを使用している場合は、ガベージコレクション数メトリクス `jvm.gc.collections.count` の **name=\$1"G1 Young Generation\$1"** を **name=\$1"Parallel GC\$1"** に変更します。

1. 次のリンクを使用して CloudWatch コンソールの **[ダッシュボードの作成]** を開きます: [https://console.aws.amazon.com/cloudwatch/home?\$1dashboards?dashboardTemplate=ApacheKafkaOnEc2&referrer=os-catalog](https://console.aws.amazon.com/cloudwatch/home?#dashboards?dashboardTemplate=ApacheKafkaOnEc2&referrer=os-catalog)。

1. コンソールで選択したリージョンが Kafka ワークロードが実行されているリージョンであることを確認します。

1. ダッシュボードの名前を入力し、**[ダッシュボードの作成]** を選択します。

   このダッシュボードを他のリージョンの類似のダッシュボードと簡単に区別するために、**KafkaDashboard-us-east-1** のように、ダッシュボード名にリージョン名を含めることをお勧めします。

1. ダッシュボードをプレビューし、**[保存]** を選択してダッシュボードを作成します。

**CloudFormation を使用してダッシュボードを作成するには**

1. 次のリンクを使用して、CloudFormation **[スタックのクイック作成]** ウィザードを開きます: [https://console.aws.amazon.com/cloudformation/home?\$1/stacks/quickcreate?templateURL=https://aws-observability-solutions-prod-us-east-1.s3.us-east-1.amazonaws.com/Kafka\$1EC2/CloudWatch/CFN/v1.0.0/dashboard-template-1.0.0.json](https://console.aws.amazon.com/cloudformation/home?#/stacks/quickcreate?templateURL=https://aws-observability-solutions-prod-us-east-1.s3.us-east-1.amazonaws.com/Kafka_EC2/CloudWatch/CFN/v1.0.0/dashboard-template-1.0.0.json)。

1. コンソールで選択したリージョンが Kafka ワークロードが実行されているリージョンであることを確認します。

1. **[スタック名]** にこのスタックを識別する名前 (**KafkaDashboardStack** など) を入力します。

1. **[パラメータ]** セクションで、**[DashboardName]** パラメータにダッシュボードの名前を指定します。

   このダッシュボードを他のリージョンの類似のダッシュボードと簡単に区別するために、**KafkaDashboard-us-east-1** のように、ダッシュボード名にリージョン名を含めることをお勧めします。

1. **[機能と変換]** で、変換のためのアクセス機能を承認します。CloudFormation は IAM リソースを追加しないことに注意してください。

1. 設定を確認し、**[スタックの作成]** を選択します。

1. スタックステータスが **CREATE\$1COMPLETE** になったら、作成したスタックの **[リソース]** タブを選択し、**[物理 ID]** のリンクを選択してダッシュボードに移動します。コンソールの左側のナビゲーションペインで **[ダッシュボード]** を選択し、**[カスタムダッシュボード]** でダッシュボード名を検索することで、CloudWatch コンソールでダッシュボードにアクセスすることもできます。

何らかの目的でテンプレートファイルを編集してカスタマイズする場合は、**[スタックの作成ウィザード]** の **[テンプレートファイルのアップロード]** オプションを使用して、編集したテンプレートをアップロードできます。詳細については、「[CloudFormation コンソールからスタックを作成する](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-create-stack.html)」を参照してください。次のリンクを使用して、テンプレートをダウンロードできます: [https://aws-observability-solutions-prod-us-east-1.s3.us-east-1.amazonaws.com/Kafka\$1EC2/CloudWatch/CFN/v1.0.0/dashboard-template-1.0.0.json](https://aws-observability-solutions-prod-us-east-1.s3.us-east-1.amazonaws.com/Kafka_EC2/CloudWatch/CFN/v1.0.0/dashboard-template-1.0.0.json)。

**注記**  
現在、ソリューションダッシュボードには、最新の Java バージョンのデフォルトコレクターである G1 ガベージコレクターのガベージコレクション関連のメトリクスのみが表示されます。別のガベージコレクションアルゴリズムを使用している場合、ガベージコレクションに関連するウィジェットは空です。ただし、ダッシュボードの CloudFormation テンプレートを変更し、適切なガベージコレクションタイプをガベージコレクション関連のメトリクスの名前ディメンションに適用することで、これらのウィジェットをカスタマイズできます。例えば、並列ガベージコレクションを使用している場合は、ガベージコレクション数メトリクス `jvm.gc.collections.count` の **name=\$1"G1 Young Generation\$1"** を **name=\$1"Parallel GC\$1"** に変更します。

### Kafka ダッシュボードの使用を開始する
<a name="Solution-Kafka-Dashboard-GetStarted"></a>

新しい Kafka ダッシュボードで試すことができるタスクをいくつか示します。これらのタスクにより、ダッシュボードが正しく機能していることの検証が可能になり、Kafka クラスターをモニタリングするためにダッシュボードを実際に使用する経験ができます。これらを試すと、ダッシュボードの操作に慣れ、可視化されたメトリクスを解釈できるようになっていきます。

**ドロップダウンリストの使用**

ダッシュボードの上部には、モニタリングする特定の Kafka クラスター、プロデューサー、コンシューマーの各グループをフィルタリングして選択するために使用できるドロップダウンリストが表示されます。
+ 特定の Kafka クラスターのメトリクスを表示するには、**[Kafka クラスター]** ドロップダウンリストでそのクラスター名を選択します。
+ 特定の Kafka プロデューサーグループのメトリクスを表示するには、**[Kafka プロデューサー]** ドロップダウンリストでそのプロデューサーグループ名を選択します。
+ 特定の Kafka コンシューマーグループのメトリクスを表示するには、**[Kafka コンシューマーグループ]** ドロップダウンリストでそのコンシューマーグループ名を選択します。

**クラスターのヘルスを確認する**

**[クラスターの概要]** セクションから、**[レプリケートされているパーティション]** ウィジェットと **[同期しているレプリカ]** ウィジェットを見つけます。これらは、理想的にはゼロまたは少数である必要があります。これらのメトリクスの値が大きい場合は、調査が必要な Kafka クラスターの問題を示している可能性があります。

**ブローカーのパフォーマンスを調査する**

**[ブローカー]** セクションで、**[失敗したフェッチリクエスト数]** ウィジェットと **[失敗したプロデューサーリクエスト数]** ウィジェットを見つけます。これらはそれぞれ、フェッチオペレーションとプロデュースオペレーションの失敗したリクエストの数を示しています。失敗の率が高い場合は、さらに調査が必要なブローカーやネットワーク接続の問題を示している可能性があります。

**プロデューサーのパフォーマンスをモニタリングする**

**[プロデューサーグループの概要]** セクションで、**[平均リクエスト率]**、**[平均リクエストレイテンシー]**、および **[平均レコード送信/エラー率]** の各ウィジェットを見つけます。これらは、選択したグループのプロデューサーのパフォーマンスの概要を示します。**[プロデューサー]** セクションで特定のプロデューサーとトピックのメトリクスを表示して詳細を確認することもできます。

**コンシューマーの遅延をモニタリングする**

**[コンシューマーグループの概要]** セクションで、**[コンシューマー遅延]** ウィジェットを見つけます。これは、サブスクライブしているパーティション内の最新のオフセットからのメッセージ処理においてコンシューマーが遅れている時間差を示しています。理想的には、コンシューマーの遅延は低いかゼロである必要があります。コンシューマーの遅延が大きい場合は、コンシューマーがデータ生成速度に追いつくことができないことを示している可能性があり、データの損失や処理の遅延につながる可能性があります。**[コンシューマー]** セクションで特定のコンシューマーとトピックのメトリクスを表示して詳細を確認することもできます。

## 同じインスタンスで複数の Kafka ロールのエージェントを設定する
<a name="Kafka-Multiple-Roles"></a>

[このソリューションの CloudWatch エージェント設定](#Solution-Kafka-CloudWatch-Agent) にリストされている Kafka ロールの個々の設定は、プロデューサー、コンシューマー、ブローカーの各ロールが重複することなく別々の EC2 インスタンスにデプロイされている場合にのみ適用されます。同じ Amazon EC2 インスタンスで複数の Kafka ロールを実行している場合は、次の 2 つのオプションがあります。
+ そのインスタンスにデプロイされたすべての Kafka ロールのすべてのメトリクスを一覧表示して設定する単一のエージェント設定ファイルを作成します。Systems Manager を使用してエージェント設定を管理する場合は、これが推奨オプションです。

  このオプションを選択し、複数の Kafka ロールが同じ JVM プロセスの一部である場合は、エージェント設定で各 Kafka ロールに同じエンドポイントを指定する必要があります。複数の Kafka ロールが異なる JVM プロセスの一部である場合、そのプロセスの JMX ポートセットに応じて、各ロールのエンドポイントが異なる場合があります。
+ Kafka ロールごとに別々のエージェント設定ファイルを作成し、両方の設定ファイルを適用するようにエージェントを設定します。複数の設定ファイルを適用する手順については、「[複数の CloudWatch エージェント設定ファイルを作成する](create-cloudwatch-agent-configuration-file.md#CloudWatch-Agent-multiple-config-files)」を参照してください。

次の例は、プロデューサーロールとコンシューマーロールが 1 つのインスタンスで同じ JVM プロセスの一部として実行されている CloudWatch エージェント設定を示しています。この場合、ポート番号は、以下の設定のプロデューサー部分とコンシューマー部分の両方で同じである必要があります。一方、2 つのロールが異なる JVM プロセスの一部として実行されていた場合は、個々の JVM プロセスの JMX ポートに従って、それぞれに異なるポート番号を指定できます。

```
{
  "metrics": {
    "namespace": "CWAgent",
    "append_dimensions": {
      "InstanceId": "${aws:InstanceId}"
    },
    "metrics_collected": {
      "jmx": [
        {
          "endpoint": "localhost:port-number",
          "kafka-producer": {
            "measurement": [
              "kafka.producer.request-rate",
              "kafka.producer.byte-rate",
              "kafka.producer.request-latency-avg",
              "kafka.producer.response-rate",
              "kafka.producer.record-error-rate",
              "kafka.producer.record-send-rate"
            ]
          },
          "append_dimensions": {
            "ProducerGroupName": "ProducerGroupName"
          }
        },
        {
          "endpoint": "localhost:port-number",
          "kafka-consumer": {
            "measurement": [
              "kafka.consumer.fetch-rate",
              "kafka.consumer.total.bytes-consumed-rate",
              "kafka.consumer.records-consumed-rate",
              "kafka.consumer.bytes-consumed-rate",
              "kafka.consumer.records-lag-max"
            ]
          },
          "append_dimensions": {
            "ConsumerGroupName": "ConsumerGroupName"
          }
        }
      ]
    }
  }
}
```