Ir para o conteúdo

Como soluciono os erros que recebo quando tento me conectar ao meu cluster do Amazon MSK?

15 minuto de leitura
0

Estou tendo problemas quando tento me conectar ao meu cluster do Amazon Managed Streaming for Apache Kafka (Amazon MSK).

Resolução

Erros que não estão relacionados a um tipo de autenticação específico

Ao tentar se conectar ao seu cluster do Amazon MSK, é possível receber uma das seguintes mensagens de erro que não estão relacionadas ao tipo de autenticação que você usa.

java.lang.OutOfMemoryError: Java heap space

Você recebe o erro OutOfMemoryError ao executar um comando para operações de cluster sem o arquivo de propriedades do cliente. Para resolver esse erro, inclua as propriedades apropriadas com base no tipo de autenticação no arquivo client.properties.

Exemplo de comando com apenas uma porta de autenticação do AWS Identity and Access Management (AWS IAM):

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

Exemplo de comando com uma porta de autenticação do IAM e o arquivo de propriedades do cliente:

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

org.apache.kafka.common.errors.TimeoutException: Timed out waiting for a node assignment. Call: createTopics

É possível receber o erro TimeoutException quando há uma configuração incorreta de rede entre a aplicação cliente e o cluster do Amazon MSK.

Para solucionar esse problema, execute o seguinte teste de conectividade na máquina cliente:

telnet bootstrap-broker port-number

Observação: substitua o bootstrap-broker por um dos endereços do agente do seu cluster do Amazon MSK. Substitua port-number pelo valor de porta apropriado com base na autenticação ativada para seu cluster.

Se a máquina cliente conseguir acessar os agentes, não haverá problemas de conectividade. Se a máquina cliente não conseguir acessar os agentes, revise a conectividade de rede. Verifique as regras de entrada e saída do grupo de segurança.

org.apache.kafka.common.errors.TopicAuthorizationException: Not authorized to access topics: [test_topic]

Você recebe o erro TopicAuthorizationException quando usa uma autenticação do IAM e sua política de acesso bloqueia operações de tópicos, como WriteData e ReadData.

Observação: os limites de permissão e as políticas de controle de serviços (SPCs) também bloqueiam a tentativa do usuário de se conectar ao cluster sem a autorização necessária.

Se você usa uma autenticação que não seja do IAM, verifique se adicionou listas de controle de acesso (ACLs) em nível de tópico que bloqueiam as operações.

Execute o comando a seguir para listar as ACLs aplicadas em um tópico:

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

ZooKeeperClientTimeoutException

É possível receber o erro ZooKeeperClientTimeoutException quando o cliente tentar se conectar ao cluster por meio da string do Apache ZooKeeper e a conexão não puder ser estabelecida. Você também pode receber esse erro quando a string do Apache ZooKeeper estiver incorreta.

Exemplo de uma string incorreta do 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)

Exemplo de saída:

[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)

Para resolver esse problema, realize as seguintes ações:

  • Verifique se você está usando a string correta do Apache ZooKeeper.
  • Certifique-se de que o grupo de segurança do seu cluster do Amazon MSK permite tráfego de entrada do grupo de segurança do cliente nas portas do Apache ZooKeeper.

O agente pode não estar disponível

"Topic 'topicName' not present in metadata after 60000 ms. or Connection to node -<node-id> (<broker-host>/<broker-ip>:<port>) could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)"

É possível receber a mensagem de o erro anterior quando uma das seguintes afirmações for verdadeira:

  • O produtor ou consumidor não consegue se conectar ao host e à porta do agente.
  • A string do agente está incorreta.

Se você receber essa mensagem de erro mesmo que a conectividade do cliente ou do agente tenha funcionado inicialmente, o agente pode não estar disponível.

Você também pode receber essa mensagem de erro ao usar a string do agente para produzir dados para acessar o cluster de fora da nuvem privada virtual (VPC).

Exemplo de string do agente do produtor:

./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

Exemplo de saída:

[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.

Exemplo de string do agente do consumidor:

./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

Exemplo de saída:

[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)

Para solucionar esse problema, realize as seguintes ações:

Tópico não presente nos metadados

"org.apache.kafka.common.errors.TimeoutException: Topic test not present in metadata after 60000 ms"

Você recebe a mensagem de erro anterior quando o tópico para o qual você está tentando gravar não existe no Amazon MSK. Verifique se o tópico existe em seu cluster do Amazon MSK. Verifique se você usou a string e a porta corretas do agente na configuração do seu cliente. Se o tópico não existir, crie o tópico no Amazon MSK ou defina auto.create.enable como true na configuração do seu cluster. Quando auto.create.enable é definido como true, os tópicos são criados automaticamente.

Você também pode receber essa mensagem de erro quando o tópico existe, mas a partição não. Por exemplo, você tem uma única partição[0] e seu produtor tenta enviar para a partição[1].

Certifique-se de que o grupo de segurança do seu cluster do Amazon MSK permita o tráfego de entrada do grupo de segurança da aplicação cliente nas portas apropriadas.

Se o erro ocorrer repentinamente após o sistema estar funcionando anteriormente, realize as seguintes ações para verificar o status de seus agentes do Amazon MSK:

  • Verifique a métrica ActiveControllerCount. O valor deve ser 1. Quando a métrica tem qualquer outro valor, um dos agentes do cluster não está disponível.
  • Verifique a métrica ZooKeeprSessionState para confirmar se os agentes estão em comunicação contínua com os nós do ZooKeeper.
  • Monitore a métrica KafkaDataLogsDiskUsed para se certificar de que o agente não tenha ficado sem espaço de armazenamento.

Verifique se você não tentou acessar o cluster de fora da VPC sem a configuração correta. Por padrão, os recursos do Amazon MSK são provisionados dentro da VPC. Você deve se conectar por meio de uma rede privada na mesma VPC.

Se você estiver tentando acessar o cluster de fora da VPC, certifique-se de definir as configurações de rede necessárias, como o AWS Client VPN ou o AWS Direct Connect.

Configuração incorreta do produtor ou consumidor do cliente Kafka

Para resolver a configuração incorreta de um produtor ou consumidor do cliente Kafka, verifique se a configuração do seu cliente inclui os servidores de bootstrap corretos. Confirme também se a configuração inclui as configurações de segurança necessárias e as versões de compatibilidade do cliente Kafka e do Spring Boot.

Erros específicos da autenticação do cliente TLS

O agente de bootstrap está desconectado

"Bootstrap broker <broker-host>:9094 (id: -<broker-id> rack: null) disconnected"

É possível receber a mensagem de erro anterior ao tentar se conectar a um cluster que tem a autenticação de cliente SSL/TLS ativada.

Você também pode receber essa mensagem de erro quando o produtor ou consumidor tenta se conectar a um cluster criptografado por SSL/TLS pela porta TLS 9094 e não é aprovado na configuração SSL/TLS. Para resolver esse problema, defina a configuração SSL/TLS.

No exemplo a seguir, ocorre um erro quando o produtor tenta se conectar ao cluster:

./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)

Exemplo de saída:

[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)

No exemplo a seguir, ocorre um erro quando o consumidor tenta se conectar ao cluster:

./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)

Exemplo de saída:

[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)

Se a autenticação do cliente estiver ativada em seu cluster, você deve incluir parâmetros adicionais para sua Autoridade de Certificação Privada da AWS. Para obter mais informações, consulte Autenticação mútua de cliente TLS para o Amazon MSK.

Erro de acesso ao armazenamento de chaves

"ERROR Modification time of key store could not be obtained: <configure-path-to-truststore>"

-ou-

"Failed to load keystore"

É possível receber as mensagens de erro anteriores ao configurar incorretamente o truststore e carregar os arquivos do truststore para o produtor e o consumidor. Para resolver esse problema, forneça o caminho correto para o arquivo truststore na configuração de SSL/TLS.

Exemplo de uma string incorreta do agente de consumidor:

./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

Exemplo de saída:

[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

Esse erro também pode ocorrer quando seu arquivo de armazenamento de chaves ou truststore está corrompido ou a senha do arquivo do truststore está incorreta.

Falha no handshake SSL/TLS

"Error when sending message to topic test with key: null, value: 0 bytes with error (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback) org.apache.kafka.common.errors.SslAuthenticationException: SSL handshake failed"

-ou-

"Connection to node -<broker-id> (<broker-hostname>/<broker-hostname>:9094) failed authentication due to: SSL handshake failed (org.apache.kafka.clients.NetworkClient)"

É possível receber uma das mensagens de erro anteriores ao configurar incorretamente o armazenamento de chaves do produtor ou do consumidor e ocorrer uma falha na autenticação. Certifique-se de configurar corretamente o armazenamento de chaves.

Exemplo de string de agente incorreta para o armazenamento de chaves do produtor:

./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

Exemplo de saída:

[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)

Exemplo de string de agente incorreta para o armazenamento de chaves do consumidor:

./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

Exemplo de saída:

[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

a senha do armazenamento de chaves está incorreta

 "java.io.IOException: keystore password was incorrect"

É possível receber a mensagem de erro anterior quando a senha do armazenamento de chaves ou do truststore está incorreta.

Para solucionar esse problema, execute o comando a seguir para verificar se a senha está correta:

keytool -list -keystore kafka.client.keystore.jksEnter 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

Se a senha estiver incorreta, você receberá a seguinte mensagem de erro:

"keytool error: java.io.IOException: keystore password was incorrect"

Para visualizar a saída detalhada do comando anterior, adicione o sinalizador -v:

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

Também é possível executar os comandos anteriores para verificar se o armazenamento de chaves está corrompido.

Você também pode receber essa mensagem de erro ao configurar incorretamente a chave secreta associada ao alias na configuração SSL/TLS do produtor e do consumidor. Para verificar se esse é o problema, execute o seguinte comando:

keytool -keypasswd -alias schema-reg -keystore kafka.client.keystore.jks

Se sua senha para o segredo do alias estiver correta, você deverá inserir uma nova senha para a chave secreta:

Enter keystore password:
Enter key password for <schema-reg>
New key password for <schema-reg>:
Re-enter new key password for <schema-reg>:

Caso contrário, o comando falhará com a seguinte mensagem:

"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."

Para verificar se um alias faz parte do armazenamento de chaves, execute o seguinte comando:

keytool -list -keystore kafka.client.keystore.jks -alias schema-reg

Exemplo de saída:

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

Erros específicos da autenticação do cliente IAM

Falha na autenticação, acesso negado

"Connection to node -1 (b-1.testcluster.abc123.c2.kafka.us-east-1.amazonaws.com/10.11.111.123:9098) failed authentication due to: Access denied"

-ou-

"org.apache.kafka.common.errors.SaslAuthenticationException: Access denied"

Você recebe uma das mensagens de erro anteriores quando políticas de acesso, limites de permissão e SCPs bloqueiam usuários que não são aprovados na autorização necessária.

Para resolver esse problema, use o controle de acesso do IAM para garantir que o perfil do IAM possa realizar operações de cluster.

SaslAuthenticationException

"org.apache.kafka.common.errors.SaslAuthenticationException: Too many connects"

-ou-

"org.apache.kafka.common.errors.SaslAuthenticationException: Internal error"

Você recebe as mensagens de erro anteriores quando executa seu cluster no tipo de agente kafka.t3.small com controle de acesso do IAM e excede a cota de conexão. O tipo de instância kafka.t3.small aceita apenas uma conexão TCP por agente por segundo. Quando você excede a cota de conexão, seu teste de criação falha. Para obter mais informações, consulte Como o Amazon MSK funciona com o IAM.

Para resolver esses problemas, realize as seguintes ações:

Erros específicos da autenticação do cliente SASL/SCRAM

O mecanismo SASL do cliente está desativado

"Connection to node -1 (b-1-testcluster.abc123.c7.kafka.us-east-1.amazonaws.com/3.11.111.123:9098) failed authentication due to: Client SASL mechanism 'SCRAM-SHA-512' not enabled in the server, enabled mechanisms are [AWS_MSK_IAM]"

-ou-

"Connection to node -1 (b-1-testcluster.abc123.c7.kafka.us-east-1.amazonaws.com/3.11.111.123:9096) failed authentication due to: Client SASL mechanism 'AWS_MSK_IAM' not enabled in the server, enabled mechanisms are [SCRAM-SHA-512]"

Você recebe as mensagens de erro anteriores quando o número da porta não corresponde ao mecanismo SASL (Simple Authentication and Security Layer) no arquivo de propriedades do cliente. Esse é o arquivo de propriedades que você usa no comando para executar operações de cluster.

Para se comunicar com agentes em um cluster que usa Simple Authentication and Security Layer/Salted Challenge Response Authentication Mechanism (SASL/SCRAM), use as seguintes portas:

  • Porta 9096 para acesso de dentro da AWS
  • Porta 9196 para acesso público

Para se comunicar com agentes em um cluster que usa controle de acesso do IAM, use as portas 9098 para acesso de dentro da AWS e a porta 9198 para acesso público.

Erro de autenticação de credencial SASL

"Connection to node -1 (b-3.testcluster.abc123.c2.kafka.us-east-1.amazonaws.com/10.11.111.123:9096) failed authentication due to: Authentication failed during authentication due to invalid credentials with SASL mechanism SCRAM-SHA-512"

Certifique-se de armazenar as credenciais do usuário no AWS Secrets Manager e associar essas credenciais ao cluster do Amazon MSK.

Quando você acessa o cluster pela porta 9096, o usuário e a senha no AWS Secrets Manager devem ser iguais às propriedades do cliente.

Ao executar o comando get-secret-value para recuperar os segredos, certifique-se de que a senha usada no AWS Secrets Manager não contém nenhum caractere especial.

ClusterAuthorizationException

"org.apache.kafka.common.errors.ClusterAuthorizationException: Request Request(processor=11, connectionId=INTERNAL_IP-INTERNAL_IP-0, session=Session(User:ANONYMOUS,/INTERNAL_IP), listenerName=ListenerName(REPLICATION_SECURE), securityProtocol=SSL, buffer=null) is not authorized"

Você recebe a mensagem de erro anterior quando as duas condições a seguir são verdadeiras:

  • A autenticação SASL/SCRAM está ativada em seu cluster do Amazon MSK.
  • resourceType foi definido como CLUSTER e a operação foi definida como CLUSTER_ACTION nas ACLs do seu cluster.

O cluster do Amazon MSK não oferece suporte às configurações anteriores porque as configurações impedem a replicação interna do Apache Kafka. As identidades dos agentes aparecem como ANONYMOUS para comunicação entre agentes. Se seu cluster precisar oferecer suporte às ACLs e usar a autenticação SASL/SCRAM, permita que o usuário ANONYMOUS use a operação ALL.

Execute o comando a seguir para conceder a operação ALL ao usuário ANONYMOUS:

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

Informações relacionadas

Conectar-se a um cluster do Amazon MSK Provisioned

Como soluciono problemas de autenticação e permissão ao usar meu cluster do Amazon MSK com a autenticação SASL/SCRAM ativada?