无法从EC2外部连接到在AWS上运行的kafka connect群集

时间:2019-11-20 23:31:25

标签: apache-kafka amazon-ecs apache-kafka-connect

我有一个ECS集群,其中有3个EC2实例都位于私有子网中。我创建了一个任务定义来运行Confluent提供的kafka-connect映像,并带有以下环境变量:

    CONNECT_CONFIG_STORAGE_TOPIC=quickstart-config
    CONNECT_GROUP_ID=quickstart
    CONNECT_INTERNAL_KEY_CONVERTER=org.apache.kafka.connect.json.JsonConverter
    CONNECT_INTERNAL_VALUE_CONVERTER=org.apache.kafka.connect.json.JsonConverter
    CONNECT_KEY_CONVERTER=org.apache.kafka.connect.json.JsonConverter
    CONNECT_OFFSET_STORAGE_TOPIC=quickstart-offsets
    CONNECT_PLUGIN_PATH=/usr/share/java
    CONNECT_REST_ADVERTISED_HOST_NAME=localhost
    CONNECT_REST_ADVERTISED_PORT=8083
    CONNECT_SECURITY_PROTOCOL=SSL
    CONNECT_SSL_ENDPOINT_IDENTIFICATION_ALGORITHM=
    CONNECT_STATUS_STORAGE_TOPIC=quickstart-status
    CONNECT_VALUE_CONVERTER=org.apache.kafka.connect.json.JsonConverter

我在群集的前面有一个应用程序负载平衡器,在端口8083上有一个侦听器。我已经正确设置了目标组,以包括运行kafka-connect的EC2实例。因此,负载平衡器应将请求转发到群集。确实如此,但是我总是得到一个502 Bad Gateway的回复。我可以进入EC2实例和curl localhost:8083并从kafka-connect返回响应,但是从EC2外部,我没有响应。

要排除负载平衡器和群集之间的网络问题,我创建了一个单独的任务定义,该定义在端口80上运行Nginx,并且能够通过负载平衡器从EC2实例外部成功命中它。

我感到自己没有将CONNECT_REST_ADVERTISED_HOST_NAME设置为正确的值。据我了解,这是客户端应连接的主机。但是,由于我的EC2实例位于专用子网中,因此我不知道将其设置为什么,这就是为什么将其设置为localhost的原因。我尝试将其设置为负载平衡器的DNS名称,但这不起作用。

1 个答案:

答案 0 :(得分:1)

您需要将CONNECT_REST_ADVERTISED_HOST_NAME设置为其他Kafka Connect工作者可以解析并连接到的主机或IP。

它用于工作人员之间的内部通信,如果它是localhost,则如果您的REST请求(通过负载平衡器)命中了不是集群当前领导者的工作人员,则该工作人员将尝试转发给领导者的请求-使用CONNECT_REST_ADVERTISED_HOST_NAME。但是如果CONNECT_REST_ADVERTISED_HOST_NAMElocalhost,那么工作人员将只是将请求转发给自己,因此事情将无法进行。

有关更多详细信息,请参见https://rmoff.net/2019/11/22/common-mistakes-made-when-configuring-multiple-kafka-connect-workers/