2016-09-09 3 views
3

私はhttp://bluemix.netのBluemixメッセージハブインスタンスに接続しようとしています。私はサービスの資格情報オブジェクトmessagehubからkafka_brokers_sasl、sasl_plain_username、およびsasl_plain_passwordを持ってなぜkafka-pythonがBluemixメッセージハブサービスに接続できないのですか?

Traceback (most recent call last): 
    File "./test-mh.py", line 12, in <module> 
    producer = KafkaProducer(bootstrap_servers = kafka_brokers_sasl, sasl_plain_username = sasl_plain_username, sasl_plain_password = sasl_plain_password, sasl_mechanism = sasl_mechanism) 
    File "/usr/local/lib/python2.7/dist-packages/kafka/producer/kafka.py", line 328, in __init__ 
    **self.config) 
    File "/usr/local/lib/python2.7/dist-packages/kafka/client_async.py", line 202, in __init__ 
    self.config['api_version'] = self.check_version(timeout=check_timeout) 
    File "/usr/local/lib/python2.7/dist-packages/kafka/client_async.py", line 791, in check_version 
    raise Errors.NoBrokersAvailable() 
kafka.errors.NoBrokersAvailable: NoBrokersAvailable 

:この簡単なスクリプト

#!/usr/bin/env python 

from kafka import KafkaProducer 
from kafka.errors import KafkaError 

kafka_brokers_sasl = [ 
    "kafka01-prod01.messagehub.services.us-south.bluemix.net:9093", 
    "kafka02-prod01.messagehub.services.us-south.bluemix.net:9093", 
    "kafka03-prod01.messagehub.services.us-south.bluemix.net:9093", 
    "kafka04-prod01.messagehub.services.us-south.bluemix.net:9093", 
    "kafka05-prod01.messagehub.services.us-south.bluemix.net:9093" ] 
sasl_plain_username = "xxxxxxxxxxxxxxx" 
sasl_plain_password = "xxxxxxxxxxxxxxxxxxxxxxxxx" 
sasl_mechanism = 'SASL_PLAINTEXT' 

producer = KafkaProducer(bootstrap_servers = kafka_brokers_sasl, 
         sasl_plain_username = sasl_plain_username, 
         sasl_plain_password = sasl_plain_password, 
         sasl_mechanism = sasl_mechanism) 

は、以下の例外を除いて終了します。 私はkafka-python 1.3.1を使用しています。これはSASL認証メカニズムをサポートしているようです。 私は何が間違っているのでしょうか?ありがとう。

答えて

5

メッセージハブでは、クライアントがTLS 1.2接続を使用して接続する必要があります。つまり、のパラメータをKafkaProducerに、さらにのパラメータをssl_contextに設定すると、Python KafkaクライアントはデフォルトでSSLv23というコンテキストを作成するように見えます。ここで

は、接続するために必要な変更です:

import ssl 
from kafka import KafkaProducer 
from kafka.errors import KafkaError 

kafka_brokers_sasl = [ 
    "kafka01-prod01.messagehub.services.us-south.bluemix.net:9093", 
    "kafka02-prod01.messagehub.services.us-south.bluemix.net:9093", 
    "kafka03-prod01.messagehub.services.us-south.bluemix.net:9093", 
    "kafka04-prod01.messagehub.services.us-south.bluemix.net:9093", 
    "kafka05-prod01.messagehub.services.us-south.bluemix.net:9093" ] 
sasl_plain_username = "xxxxxxxxxxxxxxx" 
sasl_plain_password = "xxxxxxxxxxxxxxxxxxxxxxxxx" 

sasl_mechanism = 'PLAIN'  # <-- changed from 'SASL_PLAINTEXT' 
security_protocol = 'SASL_SSL' 

# Create a new context using system defaults, disable all but TLS1.2 
context = ssl.create_default_context() 
context.options &= ssl.OP_NO_TLSv1 
context.options &= ssl.OP_NO_TLSv1_1 

producer = KafkaProducer(bootstrap_servers = kafka_brokers_sasl, 
         sasl_plain_username = sasl_plain_username, 
         sasl_plain_password = sasl_plain_password, 
         security_protocol = security_protocol, 
         ssl_context = context, 
         sasl_mechanism = sasl_mechanism) 
関連する問題