認可が取り消された

Confluent CLI を使用して、プロデューサーに付与されている、トピックへの書き込みの認可を取り消します。

このシナリオでは、Metrics API からの Confluent Cloud メトリクス、およびクライアントアプリケーションの MBean オブジェクト kafka.producer:type=producer-metrics,client-id=producer-1 からのクライアントメトリクスを確認します。

障害のシナリオの導入

  1. サービスアカウントにトピックへの書き込みを許可していた ACL を削除します。184498 の部分には実際のサービスアカウント ID を挿入します。

    confluent kafka acl delete --service-account 184498 --operation write  --topic '*' --allow
    

問題の診断

  1. Web ブラウザーで Grafana ダッシュボード(http://localhost:3000)に移動し、ユーザー名 admin およびパスワード password を使用してログインします。

  2. Producer Client Metrics ダッシュボードに移動します。2 分待ってから、以下の点を観察します。

    • 最上部のパネルの Record error raterecord-error-rate)が赤色になっています。これは、何か問題があることをわかりやすく示しています。
    • Outgoing byte rateoutgoing-byte-rate)などのスループットは、プロデューサーからブローカーに正常にメッセージが送信されていることを示しています。これは技術的に正しい状態です。プロデューサーはレコードのバッチをクラスターに送信していますが、認可が不足しているため、ブローカーのログには書き込まれていません。

    プロデューサーの認可の問題

  3. Confluent Cloud クラスターの状態、具体的には、リクエストを受け付けていることを確認します。Confluent Cloud ダッシュボードに移動します。

  4. Confluent Cloud ダッシュボードで、上部のパネルを確認します。すべて緑色で表示されています。これは、クラスターがリソースの範囲内で問題なく動作していることを意味します。

    Confluent Cloud パネル

  5. demo-topic-1 のみが表示されるようにトピックフィルターを変更します。以下を確認します。

    • Topic received bytesio.confluent.kafka.server/received_bytes)は高いままです。これは、Confluent Cloud は、認可エラーで拒否されるまでは、依然としてレコードを受信し、ネットワーク帯域幅を使用しているためです。
    • Topic retained bytesio.confluent.kafka.server/retained_bytes)は上がっていません。プロデューサーから送信されたレコードはログに書き込まれていないためです。
    • Topic sent bytesio.confluent.kafka.server/sent_bytes)は、コンシューマーに送信されたレコードを示し、この値はゼロに下がっています。新しいレコードが送信されていないためです。

    Confluent Cloud ダッシュボード

  6. どこに問題があるのかについて詳しくは、プロデューサーのログを確認します。プロデューサーのログを取得するには、次の Docker コマンドを使用します。

    docker-compose logs producer
    
  7. 以下のようなログメッセージが表示されることを確認します。

    org.apache.kafka.common.errors.TopicAuthorizationException: Not authorized to access topics: [demo-topic-1]
    

    ログにより、何が起きているかが明確にわかることを確認してください(org.apache.kafka.common.errors.TopicAuthorizationException)。これは想定どおりです。ここで使用した障害のシナリオでは、サービスアカウントがトピックに書き込むことを許可する ACL を削除したためです。

  8. Callback() を使用してこの例外をキャッチするソースコードを確認します(ccloud-observability/src)。

    producer.send(new ProducerRecord<String, PageviewRecord>(topic, key, record), new Callback() {
        @Override
        public void onCompletion(RecordMetadata m, Exception e) {
          if (e != null) {
            e.printStackTrace();
          } else {
            System.out.printf("Produced record to topic %s%n", topic);
          }
        }
    });
    

障害のシナリオの解決

  1. トピックへの書き込みを許可する ACL を追加します。184498 の部分には実際のサービスアカウント ID を挿入します。

    confluent kafka acl create --service-account 184498 --operation write  --topic '*' --allow
    
  2. producer コンテナで org.apache.kafka.common.errors.TopicAuthorizationException のログメッセージが出力されなくなったことを確認します。

    docker-compose logs producer