

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon MSK レプリケーターのトラブルシューティング
<a name="msk-replicator-troubleshooting"></a>

以下の情報は、MSK レプリケーターに関する問題のトラブルシューティングに役立ちます。その他の Amazon MSK 機能[Amazon MSK クラスターをトラブルシューティングする](troubleshooting.md)については、「」を参照してください。[AWS re:Post](https://repost.aws/) に問題を投稿することもできます。

## レプリケーターの状態が CREATING から FAILED に変わる
<a name="msk-replicator-ts-failed-state"></a>

MSK レプリケーターの作成失敗の一般的な原因:

1. ターゲットクラスターに指定したセキュリティグループに、ターゲットクラスターのセキュリティグループへのトラフィックを許可するアウトバウンドルールがあり、ターゲットクラスターのセキュリティグループに、レプリケーターセキュリティグループからのトラフィックを受け入れるインバウンドルールがあることを確認します。

1. クロスリージョンレプリケーションでは、ソースクラスターで IAM アクセスコントロール用にマルチ VPC 接続が有効になっていること、およびクラスターポリシーがソースクラスターで設定されていることを確認します。

1. 作成時に提供される IAM ロールに、トピックへの書き込みアクセス許可を含め、ソースクラスターとターゲットクラスターの読み取りと書き込みに必要なアクセス許可があることを確認します。

1. ネットワーク ACLs MSK レプリケーターとクラスター間の接続をブロックしていないことを確認します。

1. MSK レプリケーターが接続しようとしたときに、ソースクラスターまたはターゲットクラスターが完全に使用できない可能性があります。これは、過剰な負荷、ディスク使用率、または CPU 使用率が原因である可能性があります。ブローカーの問題を修正し、レプリケーターの作成を再試行してください。

上記の検証を実行したら、MSK レプリケーターを再度作成します。

## レプリケーターが CREATING 状態でスタックしているように見える
<a name="msk-replicator-ts-stuck-creating"></a>

MSK レプリケーターの作成には最大 30 分かかる場合があります。30 分間待ってから、レプリケーターの状態を再度確認してください。

## レプリケーターがデータをレプリケートしていない、または部分的なデータのみをレプリケートしていない
<a name="msk-replicator-ts-not-replicating"></a>

1. Amazon CloudWatch の `AuthError`メトリクスを使用して、レプリケーターで認証エラーが発生していないことを確認します。このメトリクスが 0 を超える場合は、IAM ロールポリシーをチェックし、クラスターのアクセス許可に拒否アクセス許可が設定されていないことを確認します。

1. ソースクラスターとターゲットクラスターで問題が発生していない (接続が多すぎる、ディスクがフルキャパシティーである、または CPU 使用率が高い) ことを確認します。

1. `KafkaClusterPingSuccessCount` メトリクスを使用して、クラスターが到達可能であることを確認します。このメトリクスが 0 であるか、データポイントがない場合は、ネットワークと IAM ロールのアクセス許可を確認してください。

1. レプリケーターで `ReplicatorFailure`メトリクスを使用して障害が発生していないことを確認します。0 を超える場合は、IAM ロールでトピックレベルのアクセス許可を確認します。

1. 許可リストの正規表現がレプリケートするトピックの名前と一致し、トピックが拒否リストによって除外されていないことを確認します。

1. レプリケーターが新しいトピックを検出して作成するまでに最大 30 秒かかる場合があります。トピックがターゲットクラスターで作成される前に生成されたメッセージは、開始位置が*最新* (デフォルト) の場合、レプリケートされません。

## メッセージのオフセットがターゲットクラスターとソースクラスターとで異なる
<a name="msk-replicator-ts-offset-mismatch"></a>

MSK レプリケーターは、ソースクラスターからのメッセージを消費してターゲットクラスターに生成するため、オフセットが異なる可能性があります。コンシューマーグループのオフセット同期を有効にしている場合、MSK レプリケーターはオフセットを自動的に変換し、フェイルオーバー後にコンシューマーが中断した場所から処理を再開できるようにします。

## レプリケーターがコンシューマーグループのオフセットを同期していない
<a name="msk-replicator-ts-consumer-groups"></a>

1. データレプリケーションが期待どおりに動作していることを確認します。

1. 許可リストの正規表現が、レプリケートするコンシューマーグループと一致することを確認します。

1. MSK Replicator がターゲットクラスターにトピックを作成したことを確認します。ソースクラスターのコンシューマーグループが、レプリケートされていないメッセージのみを消費している場合、コンシューマーグループはターゲットクラスターにレプリケートされません。コンシューマーグループが新しくレプリケートされたメッセージの読み取りを開始すると、MSK レプリケーターは自動的にコンシューマーグループをレプリケートします。

**注記**  
MSK レプリケーターは、トピックパーティションの末尾近くから読み取るコンシューマーのコンシューマーグループオフセット同期を最適化します。コンシューマーグループがソースクラスターで遅延している場合、ターゲットで遅延が高くなることがあります。コンシューマーによる処理がキャッチアップすると、MSK Replicator は自動的に遅延を小さくします。

## レプリケーションのレイテンシーが高い、または増加し続けている
<a name="msk-replicator-ts-high-latency"></a>

1. パーティションの数が適切であることを確認します。次の表は、希望するスループットに推奨されるパーティションの最小数を示しています。  
**スループットと推奨される最小パーティション数**    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/msk/latest/developerguide/msk-replicator-troubleshooting.html)

1. クラスターに十分な読み取りおよび書き込み容量があることを確認します。MSK レプリケーターは、ソースクラスター (エグレス) のコンシューマーとして、またターゲットクラスター (イングレス) のプロデューサーとして機能します。他のトラフィックに加えてレプリケーショントラフィックをサポートするようにクラスター容量をプロビジョニングします。

1. レプリケーションレイテンシーは、リージョンペアの距離によって異なります。

1. レプリケーターが `ThrottleTime`メトリクスを使用してスロットリングされていないことを確認します。0 を超える場合は、Kafka クォータを調整します。「[Kafka クォータによるスループットの管理](msk-replicator-bp-quotas.md)」を参照してください。

1. リージョンの [AWS MSK サービスイベントのサービスヘルスダッシュボード](https://health.aws.amazon.com/health/status)を確認します。

## ReplicatorFailure メトリクスを使用したトラブルシューティング
<a name="msk-replicator-ts-replicator-failure"></a>

`ReplicatorFailure` メトリクスは、レプリケーションの問題のモニタリングと検出に役立ちます。通常、ゼロ以外の値は、メッセージサイズの制限、タイムスタンプ範囲違反、またはレコードバッチサイズの問題によって発生したレプリケーションの失敗を示します。レプリケーターにログ配信を設定している場合は、配信されたログメッセージを使用して特定の障害を特定できます。詳細については、[MSK レプリケーターログ](msk-replicator-logs.md)を参照してください。ログ配信が設定されていない場合は、以下の手順に従ってレプリケーターのステータストピックにエラーメッセージをクエリします。

`ReplicatorFailure` メトリクスがゼロ以外の値を報告する場合は、以下の手順に従ってトラブルシューティングを行います。

1. ターゲット MSK クラスターに接続でき、Apache Kafka CLI ツールをセットアップするクライアントを設定します。「[Amazon MSK プロビジョニングされたクラスターに接続する](client-access.md)」を参照してください。

1. [https://console.aws.amazon.com/msk/home?region=us-east-1\#/home/](https://console.aws.amazon.com/msk/home?region=us-east-1#/home/) で Amazon MSK コンソールを開きます。

   MSK レプリケーターとターゲット MSK クラスターの ARNs を取得し、ターゲット MSK クラスターの[ブローカーエンドポイントを取得します](get-bootstrap-console.md)。

1. MSK レプリケーター ARN とブローカーエンドポイントをエクスポートします。

   ```
   export TARGET_CLUSTER_SERVER_STRING=<BootstrapServerString>
   export REPLICATOR_ARN=<ReplicatorARN>
   export CONSUMER_CONFIG_FILE=<ConsumerConfigFile>
   ```

1. `<path-to-your-kafka-installation>/bin` ディレクトリに、次のスクリプトを として保存します**query-replicator-failure-message.sh**。

   ```
   #!/bin/bash
   
   # Script: Query MSK Replicator Failure Message
   # Description: This script queries exceptions from AWS MSK Replicator status topics
   # It takes a replicator ARN and bootstrap server as input and searches for replicator exceptions
   # in the replicator's status topic, formatting and displaying them in a readable manner
   #
   # Required Arguments:
   #   --replicator-arn: The ARN of the AWS MSK Replicator
   #   --bootstrap-server: The Kafka bootstrap server to connect to
   #   --consumer.config: Consumer config properties file
   # Usage Example:
   #   ./query-replicator-failure-message.sh --replicator-arn <replicator-arn> --bootstrap-server <bootstrap-server> --consumer.config <consumer.config>
   
   print_usage() {
     echo "USAGE: $0 ./query-replicator-failure-message.sh --replicator-arn <replicator-arn> --bootstrap-server <bootstrap-server> --consumer.config <consumer.config>"
     echo "--replicator-arn <String: MSK Replicator ARN>      REQUIRED: The ARN of AWS MSK Replicator."
     echo "--bootstrap-server <String: server to connect to>  REQUIRED: The Kafka server to connect to."
     echo "--consumer.config <String: config file>            REQUIRED: Consumer config properties file."
     exit 1
   }
   
   # Initialize variables
   replicator_arn=""
   bootstrap_server=""
   consumer_config=""
   
   # Parse arguments
   while [[ $# -gt 0 ]]; do
     case "$1" in
       --replicator-arn)
         if [ -z "$2" ]; then
           echo "Error: --replicator-arn requires an argument."
           print_usage
         fi
         replicator_arn="$2"; shift 2 ;;
       --bootstrap-server)
         if [ -z "$2" ]; then
           echo "Error: --bootstrap-server requires an argument."
           print_usage
         fi
         bootstrap_server="$2"; shift 2 ;;
       --consumer.config)
         if [ -z "$2" ]; then
           echo "Error: --consumer.config requires an argument."
           print_usage
         fi
         consumer_config="$2"; shift 2 ;;
       *) echo "Unknown option: $1"; print_usage ;;
     esac
   done
   
   # Check for required arguments
   if [ -z "$replicator_arn" ] || [ -z "$bootstrap_server" ] || [ -z "$consumer_config" ]; then
     echo "Error: --replicator-arn, --bootstrap-server, and --consumer.config are required."
     print_usage
   fi
   
   # Extract replicator name and suffix from ARN
   replicator_arn_suffix=$(echo "$replicator_arn" | awk -F'/' '{print $NF}')
   replicator_name=$(echo "$replicator_arn" | awk -F'/' '{print $(NF-1)}')
   echo "Replicator name: $replicator_name"
   
   # List topics and find the status topic
   topics=$(./kafka-topics.sh --command-config client.properties --list --bootstrap-server "$bootstrap_server")
   status_topic_name="__amazon_msk_replicator_status_${replicator_name}_${replicator_arn_suffix}"
   
   # Check if the status topic exists
   if echo "$topics" | grep -Fq "$status_topic_name"; then
     echo "Found replicator status topic: '$status_topic_name'"
     ./kafka-console-consumer.sh --bootstrap-server "$bootstrap_server" --consumer.config "$consumer_config" --topic "$status_topic_name" --from-beginning | stdbuf -oL grep "Exception" | stdbuf -oL sed -n 's/.*Exception:\(.*\) Topic: \([^,]*\), Partition: \([^\]*\).*/ReplicatorException:\1 Topic: \2, Partition: \3/p'
   else
     echo "No topic matching the pattern '$status_topic_name' found."
   fi
   ```

   このスクリプトを実行して、MSK レプリケーターの失敗メッセージをクエリします。

   ```
   <path-to-your-kafka-installation>/bin/query-replicator-failure-message.sh --replicator-arn $REPLICATOR_ARN --bootstrap-server $TARGET_CLUSTER_SERVER_STRING --consumer.config $CONSUMER_CONFIG_FILE
   ```

   このスクリプトは、例外メッセージと影響を受けるトピックパーティションを含むすべてのエラーを出力します。トピックには過去の失敗メッセージがすべて含まれているため、最後のメッセージを使用して調査を開始します。失敗メッセージの例を次に示します。

   ```
   ReplicatorException: The request included a message larger than the max message size the server will accept. Topic: test, Partition: 1
   ```

**一般的な障害と解決策**  
以下に、一般的な MSK レプリケーターの障害とその軽減方法について説明します。

**max.request.size より大きいメッセージサイズ**  
*原因:* 個々のメッセージサイズが 10 MB (デフォルトの最大値) を超えています。  
以下は、この失敗メッセージの種類の例です。  

```
ReplicatorException: The message is 20635370 bytes when serialized which is larger than 10485760, which is the value of the max.request.size configuration. Topic: test, Partition: 1
```
*解決策:* トピック内の個々のメッセージサイズを減らします。できない場合は、[制限の引き上げをリクエスト](limits.md#request-msk-quota-increase)する手順に従ってください。

**サーバーが受け入れるメッセージの最大サイズより大きいメッセージサイズ**  
*原因:* メッセージサイズがターゲットクラスターの最大メッセージサイズを超えています。  
以下は、この失敗メッセージの種類の例です。  

```
ReplicatorException: The request included a message larger than the max message size the server will accept. Topic: test, Partition: 1
```
*解決策:* ターゲットクラスターまたはトピック`max.message.bytes`の設定を増やします。[max.message.bytes](https://kafka.apache.org/documentation/#topicconfigs_max.message.bytes) を参照してください。

**タイムスタンプが範囲外です**  
*原因:* メッセージタイムスタンプがターゲットクラスターの許容範囲外です。  
以下は、この失敗メッセージの種類の例です。  

```
ReplicatorException: Timestamp 1730137653724 of message with offset 0 is out of range. The timestamp should be within [1730137892239, 1731347492239] Topic: test, Partition: 1
```
*解決策:* ターゲットクラスター`message.timestamp.before.max.ms`の設定を更新します。[message.timestamp.before.max.ms](https://kafka.apache.org/documentation/#topicconfigs_message.timestamp.before.max.ms) を参照してください。

**レコードバッチが大きすぎる**  
*原因:* レコードバッチサイズがターゲットクラスターのトピックに設定されているセグメントサイズを超えています。MSK レプリケーターは、最大バッチサイズ 1 MB をサポートします。  
以下は、この失敗メッセージの種類の例です。  

```
ReplicatorException: The request included message batch larger than the configured segment size on the server. Topic: test, Partition: 1
```
*解決策:* ターゲットクラスターの を少なくとも 1048576 (1 MB) `segment.bytes`に更新します。segment[.bytes](https://kafka.apache.org/documentation/#topicconfigs_segment.bytes) を参照してください。

**注記**  
これらのソリューションを適用した後も`ReplicatorFailure`メトリクスがゼロ以外の値を引き続き出力する場合は、メトリクスがゼロを出力するまでトラブルシューティングプロセスを繰り返します。

## セルフマネージド Kafka クラスターからのレプリケーションのトラブルシューティング
<a name="msk-replicator-ts-external"></a>

### MSK レプリケーターがセルフマネージド Kafka クラスターに接続できない
<a name="msk-replicator-ts-external-connect"></a>

MSK レプリケーターがセルフマネージド Kafka クラスターに接続できないかどうかについて、次のチェックを実行します。

1. VPN または Direct Connect 接続がアクティブで、ルートテーブルが正しいことを確認します。

1. セキュリティグループが SASL\_SSL ポート (通常は 9096) の MSK レプリケーターサブネットからのインバウンドトラフィックを許可していることを確認します。

1. VPC からセルフマネージド型クラスターブローカーのホスト名への DNS 解決を検証します。

1. Amazon CloudWatch の `KafkaClusterPingSuccessCount`メトリクスを確認します。値 0 は接続の失敗を示します。

### SASL/SCRAM 認証の失敗
<a name="msk-replicator-ts-external-sasl"></a>

`AuthError` メトリクスがゼロ以外の場合、またはレプリケーターログに SASL/SCRAM エラーが表示されている場合:

1.  AWS Secrets Manager に保存されている認証情報が、セルフマネージドクラスターの SCRAM ユーザー認証情報と一致していることを確認します。

1. SCRAM ユーザーに必要な ACL アクセス許可があることを確認します (トピックで読み取り、説明、コンシューマーグループで読み取り、説明、クラスターで説明）。

1. `AuthError` メトリクスをチェックして認証エラーを確認し、 `ClusterAlias`ディメンションを使用してソースクラスターまたはターゲットクラスターが影響を受けているかどうかを確認します。

### SSL 証明書の問題
<a name="msk-replicator-ts-external-ssl"></a>

レプリケーターがセルフマネージドクラスターへの安全な接続を確立できない場合:

1.  AWS Secrets Manager の `certificate`値に、PEM 形式の完全な CA 証明書チェーンが含まれていることを確認します。

1. SSL リスナーがすべてのセルフマネージド型クラスターブローカーで設定されていることを確認します。

1. 証明書の有効期限が切れておらず、信頼できる CA によって発行されていることを確認します。

### セルフマネージドクラスターのコンシューマーグループのオフセット同期の失敗
<a name="msk-replicator-ts-external-offsets"></a>

コンシューマーグループのオフセットが正しく同期されていない場合:

1. `ConsumerGroupOffsetSyncFailure` メトリクスを検証する — 0 である必要があります。

1. コンシューマーグループがソースクラスターでアクティブに消費していることを確認します (非アクティブなコンシューマーグループは同期されない場合があります）。

1. 双方向レプリケーションの場合は、両方のレプリケーター`true`で `synchroniseConsumerGroupOffsets`が に設定されていることを確認します。