Como soluciono problemas ao me conectar ao meu cluster Amazon MSK?

14 minuto de leitura
0

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

Resolução

Ao tentar se conectar a um cluster do Amazon MSK, você pode receber os seguintes tipos de erros:

  • Erros que não são específicos do tipo de autenticação do cluster
  • Erros específicos da autenticação do cliente TLS
  • Erros específicos da autenticação do cliente do AWS Identity and Access Management (IAM)
  • Erros específicos da autenticação do cliente Simple Authentication and Security Layer/Salted Challenge Response Mechanism (SASL/SCARM)

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

Ao tentar se conectar ao seu cluster Amazon MSK, você pode receber um dos seguintes erros, independentemente do tipo de autenticação habilitado para seu cluster.

java.lang.OutOfMemoryError: Java heap space

Você recebe esse erro quando não menciona o arquivo de propriedades do cliente ao executar um comando para operações de cluster usando qualquer tipo de autenticação:

Por exemplo, você recebe o OutOfMemoryError ao executar o seguinte comando com a porta de autenticação do IAM:

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

No entanto, o comando a seguir é executado com êxito quando você o executa com a porta de autenticação do IAM:

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

Para resolver esse erro, certifique-se de incluir propriedades apropriadas com base no tipo de autenticação no arquivo client.properties.

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

Normalmente, você recebe esse erro quando há uma configuração incorreta de rede entre o aplicativo cliente e o Amazon MSK Cluster.

Para solucionar esse problema, verifique a conectividade da rede executando o seguinte teste de conectividade.

Execute o comando na máquina cliente.

telnet bootstrap-broker port-number

Faça o seguinte:

  • Substitua o bootstrap-broker por um dos endereços do agente do seu cluster Amazon MSK.
  • Substitua o número da porta 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. Caso contrário, revise a conectividade de rede, especialmente 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 esse erro ao usar a autenticação do IAM e sua política de acesso bloqueia operações de tópicos, como WriteData e ReadData.

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

Se você estiver usando autenticação não IAM, verifique se você 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

A conexão com o nó -1 (b-1-testcluster.abc123.c7.kafka.us-east-1.amazonaws.com/3.11.111.123:9098) falhou na autenticação devido a: O mecanismo SASL do cliente 'SCRAM-SHA-512' não está habilitado no servidor; os mecanismos habilitados são [AWS_MSK_IAM]

-ou-

A conexão com o nó -1 (b-1-testcluster.abc123.c7.kafka.us-east-1.amazonaws.com/3.11.111.123:9096) falhou na autenticação devido a: O mecanismo SASL do cliente 'AWS_MSK_IAM' não está habilitado no servidor; os mecanismos habilitados são [SCRAM-SHA-512]

Esses erros ocorrem ao usar um número de porta que não corresponde ao mecanismo ou protocolo SASL no arquivo de propriedades do cliente. Esse é o arquivo de propriedades que você usou no comando para executar operações de cluster.

  • Para se comunicar com agentes em um cluster configurado para usar SASL/SCRAM, use as seguintes portas: 9096 para acesso de dentro da AWS e 9196 para acesso público
  • Para se comunicar com agentes em um cluster configurado para usar o controle de acesso do IAM, use as seguintes portas: 9098 para acesso de dentro da AWS e 9198 para acesso público

Expirou o tempo limite de espera pela conexão enquanto estava no estado: CONECTANDO

Você pode receber esse erro quando o cliente tenta se conectar ao cluster por meio da string Apache ZooKeeper e a conexão não pode ser estabelecida. Esse erro também pode ocorrer quando a string do Apache ZooKeeper está errada.

Você recebe o seguinte erro ao usar a string incorreta do Apache ZooKeeper para se conectar ao cluster:

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

Para resolver esse erro, faça o seguinte:

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

O tópico 'topicName' não está presente nos metadados após 60.000 ms ou Conexão com o nó -<node-id> (<broker-host>/<broker-ip>:<port>) não pôde ser estabelecido. O agente pode não estar disponível. (org.apache.kafka.clients.NetworkClient)

Você pode receber esse erro em qualquer uma das seguintes situações:

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

Se você receber esse erro mesmo se a conectividade do cliente ou do agente estava funcionando inicialmente, o agente pode estar inativo.

Você recebe o seguinte erro ao tentar acessar o cluster de fora da nuvem privada virtual (VPC) usando a string do agente para produzir dados:

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

Você recebe o seguinte erro ao tentar acessar o cluster de fora da VPC para consumir dados usando a string do agente:

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

Para solucionar esses erros, faça o seguinte:

  • Certifique-se de que a string e a porta corretas do agente sejam usadas.
  • Se o erro for causado pela inatividade do corretor, verifique a métrica ActiveControllerCount do Amazon CloudWatch para verificar se o controlador esteve ativo durante todo o período. O valor dessa métrica deve ser 1. Qualquer outro valor pode indicar que um dos agentes no cluster não está disponível. Além disso, verifique a métrica ZookeepSessionState para confirmar se os agentes estavam constantemente se comunicando com os nós do Apache ZooKeeper. Para entender por que o agente falhou, veja a métrica KafkaCatalogsDiskUsed e verifique se o agente ficou sem espaço de armazenamento. Para obter mais informações sobre as métricas do Amazon MSK e os valores esperados, consulte Métricas do Amazon MSK para monitoramento com o CloudWatch.
  • Certifique-se de que o erro não seja causado pela configuração da rede. Os recursos do Amazon MSK são provisionados dentro da VPC. Portanto, por padrão, espera-se que os clientes se conectem ao cluster Amazon MSK ou produzam e consumam do cluster em uma rede privada na mesma VPC. Se você acessar o cluster de fora da VPC, poderá receber esses erros. Para obter informações sobre como solucionar erros quando o cliente está na mesma VPC do cluster, consulte Não é possível acessar o cluster de dentro da AWS: problemas de rede. Para obter informações sobre como acessar o cluster de fora da VPC, consulte Como me conecto ao meu cluster Amazon MSK fora da VPC?

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

Você pode receber os seguintes erros ao tentar se conectar a esse cluster que tem a autenticação de cliente TLS habilitada. Esses erros podem ser causados devido a problemas com a configuração relacionada ao SSL.

Corretor Bootstrap <broker-host>:9094 (id: -<broker-id> rack: null) desconectado

Você pode receber esse erro quando o produtor ou consumidor tenta se conectar a um cluster criptografado por TLS pela porta TLS 9094 sem passar pela configuração SSL.

Você pode receber o seguinte 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)
[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)

Você pode receber o seguinte 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)
[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)

Para resolver esse erro, defina a configuração SSL. Para obter mais informações, consulte Como começo a usar a criptografia?

Se a autenticação de cliente estiver habilitada para seu cluster, você deverá adicionar parâmetros adicionais relacionados ao seu certificado de CA privada do ACM. Para obter mais informações, consulte Autenticação TLS mútua.

ERRO O tempo de modificação do armazenamento de chaves não pôde ser obtido: <configure-path-to-truststore>

-ou-

Falha ao carregar o keystore

Se houver um problema com a configuração do truststore, esse erro poderá ocorrer quando os arquivos do truststore forem carregados para o produtor e o consumidor. Você pode ver informações semelhantes às seguintes nos registros:

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

Nesse caso, os registros indicam um problema com o carregamento do arquivo truststore. O caminho para o arquivo truststore está configurado incorretamente na configuração SSL. Você pode resolver esse erro fornecendo o caminho correto para o arquivo truststore na configuração SSL.

Esse erro também pode ocorrer devido às seguintes condições:

  • Seu arquivo truststore ou de armazenamento de chaves está corrompido.
  • A senha do arquivo truststore está incorreta.

Erro ao enviar mensagem para o teste de tópico com chave: null, value: 0 bytes with error: (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback)

org.apache.kafka.common.errors.SslAuthenticationException: SSL handshake failed

-ou-

Conexão com o nó -<broker-id> (<broker-hostname>/<broker-hostname>:9094) falhou na autenticação devido a: Falha no handshake SSL (org.apache.kafka.clients.NetworkClient)

Você pode receber o seguinte erro quando há um problema com a configuração do armazenamento de chaves do produtor que leva à falha de autenticação:

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

Você pode receber o seguinte erro quando há um problema com a configuração do armazenamento de chaves do consumidor que leva à falha de autenticação:

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

Para resolver esse erro, verifique se você configurou corretamente a configuração relacionada ao armazenamento de chaves.

java.io.IOException: keystore password was incorrect

Você pode receber esse erro quando a senha do repositório de chaves ou do repositório confiável estiver incorreta.

Para solucionar esse erro, faça o seguinte:

Verifique se a senha do armazenamento de chaves ou do truststore está correta executando o seguinte comando:

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

Se a senha do repositório de chaves ou do armazenamento confiável estiver incorreta, você poderá ver o seguinte erro:

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

Você pode ver a saída detalhada do comando acima adicionando o sinalizador -v:

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

Você também pode usar esses comandos para verificar se o armazenamento de chaves está corrompido.

Você também pode receber esse erro quando a chave secreta associada ao alias estiver configurada incorretamente na configuração SSL do produtor e do consumidor. Para verificar essa causa raiz, execute o seguinte comando:

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>:

Se sua senha para o segredo do alias (exemplo: schema-reg) estiver correta, o comando solicitará que você insira uma nova senha para a outra chave secreta. Caso contrário, o comando falhará com a seguinte mensagem:

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.

Você também pode verificar se um alias específico faz parte do repositório de chaves executando o seguinte comando:

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

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

A conexão com o nó -1 (b-1.testcluster.abc123.c2.kafka.us-east-1.amazonaws.com/10.11.111.123:9098) falhou na autenticação devido a: Access denied

-ou-

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

Certifique-se de que o perfil do IAM que acessa o cluster Amazon MSK permite operações de cluster, conforme mencionado no controle de acesso do IAM.

Além das políticas de acesso, os limites de permissão e as políticas de controle de serviço bloqueiam o usuário que tenta se conectar ao cluster, mas não consegue transmitir a autorização necessária.

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

-ou-

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

Você recebe esses erros quando seu cluster está sendo executado em um tipo de agente kafka.t3.small com controle de acesso IAM e você excedeu o limite de conexão. O tipo de instância kafka.t3.small aceita somente uma conexão TCP por agente por segundo. Quando esse limite de conexão é excedido, seu teste de criação falha e você recebe esse erro, indicando credenciais inválidas. Para obter mais informações, consulte Como o Amazon MSK funciona com o IAM.

Para resolver esse erro, considere fazer o seguinte:

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

A conexão com o nó -1 (b-3.testcluster.abc123.c2.kafka.us-east-1.amazonaws.com/10.11.111.123:9096) falhou na autenticação devido a: A autenticação falhou durante a autenticação devido a credenciais inválidas com o mecanismo SASL SCRAM-SHA-512

  • Certifique-se de armazenar as credenciais do usuário no AWS Secrets Manager e associar essas credenciais ao cluster Amazon MSK.
  • Ao acessar o cluster pela porta 9096, certifique-se de que o usuário e a senha usados no AWS Secrets Manager sejam os mesmos das propriedades do cliente.
  • Ao tentar recuperar os segredos usando a API get-secret-value, certifique-se de que a senha usada no AWS Secrets Manager não contenha nenhum caractere especial, como (/]).

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 esse erro quando as duas condições a seguir são verdadeiras:

  • Você ativou a autenticação SASL/SCRAM para seu cluster Amazon MSK.
  • Você definiu ResourceType=cluster e operation=cluster_ACTION nas ACLs do seu cluster.

O cluster Amazon MSK não suporta essa configuração porque ela impede a replicação interna do Apache Kafka. Com essa configuração, a identidade dos corretores aparece como ANÔNIMA para comunicação entre agentes. Se precisar que seu cluster ofereça suporte a essas ACLs ao usar a autenticação SASL/SCRAM, você deverá conceder as permissões para ALL as operações ao usuário ANONYMOUS. Isso evita a restrição da replicação entre os agentes.

Execute o comando a seguir para conceder essa permissão ao usuário ANONYMOUS:

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

Informações relacionadas

Conectar a um cluster Amazon MSK

Como soluciono problemas comuns ao usar meu cluster Amazon MSK com autenticação SASL/SCRAM?

AWS OFICIAL
AWS OFICIALAtualizada há um ano