如何對連線至 Amazon MSK 叢集時遇到的問題進行疑難排解?

6 分的閱讀內容
0

我在嘗試連線至 Amazon Managed Streaming for Apache Kafka (Amazon MSK) 叢集時遇到問題。

解決方法

當您嘗試連線至 Amazon MSK 叢集時,可能會遇到以下類型的錯誤:

  • 不特定於叢集身分驗證類型的錯誤
  • 特定於 TLS 用戶端身分驗證的錯誤
  • 特定於 AWS Identity and Access Management (IAM) 用戶端身分驗證的錯誤
  • 特定於簡易身分驗證和安全性階層/Salted Challenge Response Mechanism (SASL/SCARM) 用戶端身分驗證的錯誤

與特定身分驗證類型無關的錯誤

當您嘗試連線至 Amazon MSK 叢集時,無論您為叢集啟用的身分驗證類型如何,都可能會遇到以下錯誤之一。

java.lang.OutOfMemoryError: Java 堆積空間

執行使用任何身分驗證類型進行叢集作業的命令時,如果未提及用戶端屬性檔案,您會收到此錯誤:

例如,當您使用 IAM 身分驗證連接埠執行下列命令時,您會收到 OutOfMemoryError:

./kafka-topics.sh --create --bootstrap-server $BOOTSTRAP:9098 --replication-factor 3 --partitions 1 --topic TestTopic

不過,當您使用 IAM 身分驗證連接埠執行下列命令時,該命令會成功執行:

./kafka-topics.sh --create --bootstrap-server $BOOTSTRAP:9098  --command-config client.properties --replication-factor 3 --partitions 1 --topic TestTopic

若要解決此錯誤,請務必在 client.properties 檔案中包含基於身分驗證類型的適當屬性。

org.apache.kafka.common.errors.TimeoutException: 等候節點分配逾時。呼叫:createTopics

當用戶端應用程式和 Amazon MSK 叢集之間發生網路設定錯誤時,通常會收到此錯誤。

若要對此問題進行疑難排解,請執行下列連線測試來檢查網路連線。

從用戶端機器執行命令。

telnet bootstrap-broker port-number

請務必執行以下操作:

  • 使用 Amazon MSK 叢集中的其中一個代理程式地址取代 bootstrap-broker
  • 根據您的叢集啟用的身分驗證,使用適當的連接埠值取代 port-number

如果用戶端機器能夠存取代理程式,則不存在連線問題。若無法存取,請檢查網路連線,特別是安全群組的傳入和傳出規則。

org.apache.kafka.common.errors.TopicAuthorizationException: 未獲得存取主題的權限: [test_topic]

當您使用 IAM 身分驗證,且存取政策封鎖主題作業 (例如 WriteData 和 ReadData) 時,就會收到此錯誤。

請注意,許可界限和服務控制政策也會封鎖未獲得授權的使用者嘗試連線至叢集。

如果您使用非 IAM 身分驗證,請檢查是否已新增封鎖作業的主題層級存取控制清單 (ACL)。

執行下列命令以列出套用至主題的 ACL:

bin/kafka-acls.sh --bootstrap-server $BOOTSTRAP:PORT --command-config adminclient-configs.conf –-list –-topic testtopic

連線至節點 -1 (b-1-testcluster.abc123.c7.kafka.us-east-1.amazonaws.com/3.11.111.123:9098) 身分驗證失敗原因為: 伺服器未啟用用戶端 SASL 機制 'SCRAM-SHA-512',啟用的機制為 [AWS_MSK_IAM]

-或-

連線至節點 -1 (b-1-testcluster.abc123.c7.kafka.us-east-1.amazonaws.com/3.11.111.123:9096) 身分驗證失敗原因為: 伺服器未啟用用戶端 SASL 機制 'AWS_MSK_IAM',啟用的機制為 [SCRAM-SHA-512]

當您在用戶端屬性檔案中使用的連接埠號碼與 SASL 機制或通訊協定不相符時,就會收到這些錯誤。這是您在命令中用於執行叢集作業的屬性檔案。

  • 若要與設定為使用 SASL/SCRAM 的叢集中的代理程式進行通訊,請使用下列連接埠: 從 AWS 內部存取時,請使用 9096;公開存取請使用 9196
  • 若要與設定為使用 IAM 存取控制的叢集中的代理程式進行通訊,請使用下列連接埠: 從 AWS 內部存取時,請使用 9098;公開存取請使用 9198

等待連線逾時,狀態為: 連線中

當用戶端嘗試透過 Apache ZooKeeper 字串連線至叢集並且無法建立連線時,可能會遇到此錯誤。當 Apache ZooKeeper 字串錯誤時,也可能導致此錯誤。

當您使用不正確的 Apache ZooKeeper 字串連線至叢集時,會遇到以下錯誤:

./kafka-topics.sh --zookeeper z-1.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com:2181,z-2.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com:2181,z-3.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com:2181 --list
[2020-04-10 23:58:47,963] WARN Client session timed out, have not heard from server in 10756ms for sessionid 0x0 (org.apache.zookeeper.ClientCnxn)
[2020-04-10 23:58:58,581] WARN Client session timed out, have not heard from server in 10508ms for sessionid 0x0 (org.apache.zookeeper.ClientCnxn)
[2020-04-10 23:59:08,689] WARN Client session timed out, have not heard from server in 10004ms for sessionid 0x0 (org.apache.zookeeper.ClientCnxn)
Exception in thread "main" kafka.zookeeper.ZooKeeperClientTimeoutException: Timed out waiting for connection while in state: CONNECTING
at kafka.zookeeper.ZooKeeperClient.$anonfun$waitUntilConnected$3(ZooKeeperClient.scala:259)
at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
at kafka.utils.CoreUtils$.inLock(CoreUtils.scala:253)
at kafka.zookeeper.ZooKeeperClient.waitUntilConnected(ZooKeeperClient.scala:255)
at kafka.zookeeper.ZooKeeperClient.<init>(ZooKeeperClient.scala:113)
at kafka.zk.KafkaZkClient$.apply(KafkaZkClient.scala:1858)
at kafka.admin.TopicCommand$ZookeeperTopicService$.apply(TopicCommand.scala:321)
at kafka.admin.TopicCommand$.main(TopicCommand.scala:54)
at kafka.admin.TopicCommand.main(TopicCommand.scala)

若要解決此錯誤,請執行下列操作:

  • 驗證使用的 Apache ZooKeeper 字串是否正確。
  • 確認您的 Amazon MSK 叢集的安全群組在 Apache ZooKeeper 連接埠上允許來自用戶端安全群組的傳入流量。

主題 'topicName' 位於 60000 毫秒後顯示於中繼資料或連線至節點 -<node-id> (<broker-host>/<broker-ip>:<port>) 無法建立。代理程式可能無法使用。 (org.apache.kafka.clients.NetworkClient)

在以下任一情況下,可能會遇到此錯誤:

  • 生產者或取用者無法連線至代理程式主機和連接埠。
  • 代理程式字串無效。

如果您在用戶端或代理程式的連線最初能夠正常運作的情況下遇到此錯誤,則表示代理程式可能已當機。

當您嘗試使用代理程式字串從 Virtual Private Cloud (VPC) 外部存取叢集以產生資料時,會遇到以下錯誤:

./kafka-console-producer.sh --broker-list b-2.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com:9092,b-1.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com:9092 --topic test
[2020-04-10 23:51:57,668] ERROR Error when sending message to topic test with key: null, value: 1 bytes with error: (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback)
org.apache.kafka.common.errors.TimeoutException: Topic test not present in metadata after 60000 ms.

當您嘗試使用代理程式字串從 VPC 外部存取叢集以取用資料時,會遇到以下錯誤:

./kafka-console-consumer.sh --bootstrap-server b-2.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com:9092,b-1.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com:9092 --topic test
[2020-04-11 00:03:21,157] WARN [Consumer clientId=consumer-console-consumer-88994-1, groupId=console-consumer-88994] Connection to node -1 (b-2.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com/172.31.6.19:9092) could not be established. Broker may not
be available. (org.apache.kafka.clients.NetworkClient)
[2020-04-11 00:04:36,818] WARN [Consumer clientId=consumer-console-consumer-88994-1, groupId=console-consumer-88994] Connection to node -2 (b-1.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com/172.31.44.252:9092) could not be established. Broker may
not be available. (org.apache.kafka.clients.NetworkClient)
[2020-04-11 00:05:53,228] WARN [Consumer clientId=consumer-console-consumer-88994-1, groupId=console-consumer-88994] Connection to node -1 (b-2.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com/172.31.6.19:9092) could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)

若要對這些錯誤進行疑難排解,請執行以下操作:

  • 確認使用正確的代理程式字串和連接埠。
  • 如果錯誤是由於代理程式當機引起的,請檢查 Amazon CloudWatch 指標 ActiveControllerCount,以驗證控制器在整個期間處於啟用狀態。此指標的值必須為 1。任何其他值都可能表明叢集中有一個代理程式無法使用。此外,檢查指標 ZooKeeperSessionState 以確認代理程式一直在與 Apache ZooKeeper 節點通訊。若要了解代理程式失敗的原因,請檢視指標 KafkaDataLogsDiskUsed 指標,並檢查代理程式的儲存空間是否用盡。如需有關 Amazon MSK 指標和預期值的更多資訊,請參閱使用 CloudWatch 進行監控的 Amazon MSK 指標
  • 確認該錯誤不是由網路組態引起。Amazon MSK 資源是在 VPC 中佈建。因此,預設情況下,用戶端應連線至 Amazon MSK 叢集,或透過同一 VPC 中的私有網路從叢集中生產和使用。如果您從 VPC 外部存取叢集,則可能會遇到這些錯誤。如需有關在用戶端與叢集位於同一 VPC 時對錯誤進行疑難排解的資訊,請參閱無法從 AWS 內存取叢集:網路連結問題。如需從 VPC 外部存取叢集的相關資訊,請參閱如何從 VPC 外部連線至 Amazon MSK 叢集?

特定於 TLS 用戶端身分驗證的錯誤

當您嘗試連線至已啟用 TLS 用戶端身分驗證的叢集時,可能會遇到下列錯誤。這些錯誤可能是由 SSL 相關組態問題所引起。

啟動程序代理程式 <broker-host>:9094 (id: -<broker-id> rack: null) 已中斷連線

當生產者或取用者嘗試透過 TLS 連接埠 9094 連線至 TLS 加密叢集而不傳遞 SSL 組態時,可能會遇到此錯誤。

當生產者嘗試連線至叢集時,可能會遇到以下錯誤:

./kafka-console-producer.sh --broker-list b-2.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com:9094,b-1.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com:9094 --topic test
[2020-04-10 18:57:58,019] WARN [Producer clientId=console-producer] Bootstrap broker b-1.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com:9094 (id: -2 rack: null) disconnected (org.apache.kafka.clients.NetworkClient)
[2020-04-10 18:57:58,342] WARN [Producer clientId=console-producer] Bootstrap broker b-1.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com:9094 (id: -2 rack: null) disconnected (org.apache.kafka.clients.NetworkClient)
[2020-04-10 18:57:58,666] WARN [Producer clientId=console-producer] Bootstrap broker b-2.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com:9094 (id: -1 rack: null) disconnected (org.apache.kafka.clients.NetworkClient)

當取用者嘗試連線至叢集時,可能會遇到以下錯誤:

./kafka-console-consumer.sh --bootstrap-server b-2.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com:9094,b-1.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com:9094 --topic test
[2020-04-10 19:09:03,277] WARN [Consumer clientId=consumer-console-consumer-79102-1, groupId=console-consumer-79102] Bootstrap broker b-2.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com:9094 (id: -1 rack: null) disconnected (org.apache.kafka.clients.NetworkClient)
[2020-04-10 19:09:03,596] WARN [Consumer clientId=consumer-console-consumer-79102-1, groupId=console-consumer-79102] Bootstrap broker b-2.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com:9094 (id: -1 rack: null) disconnected (org.apache.kafka.clients.NetworkClient)
[2020-04-10 19:09:03,918] WARN [Consumer clientId=consumer-console-consumer-79102-1, groupId=console-consumer-79102] Bootstrap broker b-1.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com:9094 (id: -2 rack: null) disconnected (org.apache.kafka.clients.NetworkClient)

若要解決此錯誤,請設定 SSL 組態。如需詳細資訊,請參閱如何開始使用加密?

如果您的叢集已啟用用戶端身分驗證,則您必須新增與您的 ACM 私有 CA 憑證相關的其他參數。如需詳細資訊,請參閱相互 TLS 身分驗證

無法取得金鑰存放區的錯誤修改時間: <configure-path-to-truststore>

-或-

無法載入金鑰存放區

如果信任存放區組態存在問題,則在為生產者和取用者載入信任存放區檔案時可能會發生此錯誤。您可能會在日誌中看到類似於以下內容的資訊:

./kafka-console-consumer --bootstrap-server b-2.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com:9094,b-1.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com:9094 --topic test --consumer.config /home/ec2-user/ssl.config
[2020-04-11 10:39:12,194] ERROR Modification time of key store could not be obtained: /home/ec2-ser/certs/kafka.client.truststore.jks (org.apache.kafka.common.security.ssl.SslEngineBuilder)
java.nio.file.NoSuchFileException: /home/ec2-ser/certs/kafka.client.truststore.jks
[2020-04-11 10:39:12,253] ERROR Unknown error when running consumer: (kafka.tools.ConsoleConsumer$)
Caused by: org.apache.kafka.common.KafkaException: org.apache.kafka.common.KafkaException: org.apache.kafka.common.KafkaException: Failed to load SSL keystore /home/ec2-ser/certs/kafka.client.truststore.jks of type JKS

在此情況下,日誌會顯示載入信任存放區檔案時遇到問題。SSL 組態中的信任存放區檔案路徑設定錯誤。您可以透過在 SSL 組態中提供信任存放區檔案的正確路徑來解決此錯誤。

由於下列情況,也可能會發生此錯誤:

  • 您的信任存放區或金鑰存放區檔案已損壞。
  • 信任存放區檔案密碼錯誤。

傳送訊息至主題測試時出現錯誤,鍵值為空, 0 個位元組,錯誤訊息:(org.apache.kafka.clients.producer.internals.ErrorLoggingCallback)

org.apache.kafka.common.errors.SslAuthenticationException: SSL 交握失敗

-或-

連線至節點-<broker-id> (<broker-hostname>/<broker-hostname>:9094) 身分驗證失敗,原因為: SSL 交握失敗 (org.apache.kafka.clients.NetworkClient)

當生產者的金鑰存放區組態存在問題導致身分驗證失敗時,可能會遇到以下錯誤:

./kafka-console-producer --broker-list b-2.tlscluster.5818ll.c7.kafka.us-east-1.amazonaws.com:9094,b-1.tlscluster.5818ll.c7.kafka.us-east-1.amazonaws.com:9094,b-4.tlscluster.5818ll.c7.kafka.us-east-1.amazonaws.com:9094 --topic example --producer.config/home/ec2-user/ssl.config
[2020-04-11 11:13:19,286] ERROR [Producer clientId=console-producer] Connection to node -3 (b-4.tlscluster.5818ll.c7.kafka.us-east-1.amazonaws.com/172.31.6.195:9094) failed authentication due to: SSL handshake failed (org.apache.kafka.clients.NetworkClient)

當取用者的金鑰存放區組態存在問題導致身分驗證失敗時,可能會遇到以下錯誤:

./kafka-console-consumer --bootstrap-server b-2.tlscluster.5818ll.c7.kafka.us-east-1.amazonaws.com:9094,b-1.tlscluster.5818ll.c7.kafka.us-east-1.amazonaws.com:9094,b-4.tlscluster.5818ll.c7.kafka.us-east-1.amazonaws.com:9094 --topic example --consumer.config/home/ec2-user/ssl.config
[2020-04-11 11:14:46,958] ERROR [Consumer clientId=consumer-1, groupId=console-consumer-46876] Connection to node -1 (b-2.tlscluster.5818ll.c7.kafka.us-east-1.amazonaws.com/172.31.15.140:9094) failed authentication due to: SSL handshake failed (org.apache.kafka.clients.NetworkClient)
[2020-04-11 11:14:46,961] ERROR Error processing message, terminating consumer process: (kafka.tools.ConsoleConsumer$)
org.apache.kafka.common.errors.SslAuthenticationException: SSL handshake failed

若要解決此錯誤,請確認您已正確設定金鑰存放區相關組態。

java.io.IOException: 金鑰存放區密碼不正確

當金鑰存放區或信任存放區的密碼不正確時,可能會遇到此錯誤。

若要對此錯誤進行疑難排解,請執行以下操作:

透過執行以下命令,檢查金鑰存放區或信任存放區密碼是否正確:

keytool -list -keystore kafka.client.keystore.jks
Enter keystore password:
Keystore type: PKCS12
Keystore provider: SUN
Your keystore contains 1 entry
schema-reg, Jan 15, 2020, PrivateKeyEntry,
Certificate fingerprint (SHA1): 4A:F3:2C:6A:5D:50:87:3A:37:6C:94:5E:05:22:5A:1A:D5:8B:95:ED

如果金鑰存放區或信任存放區的密碼不正確,您可能會看到以下錯誤:

keytool -list -keystore kafka.client.keystore.jks
Enter keystore password:
keytool error: java.io.IOException: keystore password was incorrect

您可以透過新增 -v 旗標來檢視前述命令的詳細輸出:

keytool -list -v -keystore kafka.client.keystore.jks

您還可以使用這些命令來檢查金鑰存放區是否已損壞。

當生產者和取用者的 SSL 組態中未正確設定與別名相關的私密金鑰時,也可能會遇到此錯誤。若要驗證此根本原因,請執行以下命令:

keytool -keypasswd -alias schema-reg -keystore kafka.client.keystore.jks
Enter keystore password:
Enter key password for <schema-reg>
New key password for <schema-reg>:
Re-enter new key password for <schema-reg>:

如果您的別名 (例如:schema-reg) 密碼正確,則該命令會要求您輸入該私密金鑰的新密碼。否則,該命令將失敗,並顯示以下訊息:

keytool -keypasswd -alias schema-reg -keystore kafka.client.keystore.jks
Enter keystore password:
Enter key password for <schema-reg>
keytool error: java.security.UnrecoverableKeyException: Get Key failed: Given final block not properly padded. Such issues can arise if a bad key is used during decryption.

您還可以透過執行以下命令來驗證特定別名是否屬於金鑰存放區的一部分:

keytool -list -keystore kafka.client.keystore.jks -alias schema-reg
Enter keystore password:
schema-reg, Jan 15, 2020, PrivateKeyEntry,
Certificate fingerprint (SHA1): 4A:F3:2C:6A:5D:50:87:3A:37:6C:94:5E:05:22:5A:1A:D5:8B:95:ED

特定於 IAM 用戶端身分驗證的錯誤

連線至節點 -1 (b-1.testcluster.abc123.c2.kafka.us-east-1.amazonaws.com/10.11.111.123:9098) 身分驗證失敗原因為: 拒絕存取

-或-

org.apache.kafka.common.errors.SaslAuthenticationException: 拒絕存取

請確保存取 Amazon MSK 叢集的 IAM 角色允許 IAM 存取控制中所述的叢集作業。

除了存取政策之外,許可界限和服務控制政策會封鎖嘗試連線至叢集,但無法傳遞必要許可的使用者。

org.apache.kafka.common.errors.SaslAuthenticationException: 連線次數太多

-或-

org.apache.kafka.common.errors.SaslAuthenticationException: 內部錯誤

當您的叢集在具備 IAM 存取控制的 kafka.t3.small 代理程式類型上執行,且您超過連線限制時,就會收到這些錯誤。kafka.t3.small 執行個體類型只接受每個代理程式每秒一個 TCP 連線。超過此連線限制時,您的建立測試就會失敗,且您會收到此錯誤,表示憑證無效。如需詳細資訊,請參閱 Amazon MSK 如何與 IAM 搭配使用

若要解決此錯誤,請考慮下列方法:

特定於 SASL/SCRAM 用戶端身分驗證的錯誤

連線至節點 -1 (b-3.testcluster.abc123.c2.kafka.us-east-1.amazonaws.com/10.11.111.123:9096) 身分驗證失敗原因為: 使用 SASL 機制 SCRAM-SHA-512 進行身分驗證時,因無效憑證,身分驗證失敗

  • 請確認您已將使用者憑證儲存在 AWS Secrets Manager,並將這些憑證與 Amazon MSK 叢集建立關聯。
  • 當您透過連接埠 9096 存取叢集時,請確認 AWS Secrets Manager 中使用的使用者和密碼與用戶端屬性中的使用者和密碼相同。
  • 當您嘗試使用 get-secret-value API 擷取密碼時,請確認 AWS Secrets Manager 中使用的密碼不包含任何特殊字元,例如 (/])。

org.apache.kafka.common.errors.ClusterAuthorizationException: 要求要求 (processor=11, connectionId=INTERNAL_IP-INTERNAL_IP-0, session=Session(User:ANONYMOUS,/INTERNAL_IP), listenerName=ListenerName(REPLICATION_SECURE), securityProtocol=SSL, buffer=null) 未獲得授權

當下列兩個條件都成立時,就會遇到此錯誤:

  • 您已為您的 Amazon MSK 叢集啟用 SASL/SCRAM 身分驗證。
  • 您已在叢集的 ACL 中設定 resourceType=CLUSTER 和 operation=CLUSTER_ACTION。

Amazon MSK 叢集不支援此設定,因為此設定會防止內部 Apache Kafka 複寫。使用此設定時,代理程式的身分在代理程式之間的通訊會顯示為 ANONYMOUS (匿名)。如果您需要叢集在使用 SASL/SCRAM 身分驗證時支援這些 ACL,則必須授予 ANONYMOUS (匿名) 使用者所有操作的權限。如此可防止代理程式之間複寫的限制。

使用下列命令,將此權限授予 ANONYMOUS (匿名) 使用者:

./kafka-acls.sh --authorizer-properties
zookeeper.connect=example-ZookeeperConnectString --add --allow-principal
User:ANONYMOUS --operation ALL --cluster

相關資訊

連線至 Amazon MSK 叢集

如何對使用 Amazon MSK 叢集和 SASL/SCRAM 身分驗證時的常見問題進行疑難排解?

AWS 官方
AWS 官方已更新 1 年前