开发者指南:如何使用 Amazon MSK Serverless 进行本地测试 大数据博客


如何在本地测试 Amazon MSK Serverless

关键要点

在这篇文章中,我们将介绍开发人员如何在本地环境中访问 Amazon MSK Serverless。通过设置 SSH 隧道和堡垒主机,开发人员可以在本地测试他们的应用程序,而无需在本地运行 Kafka。以下是简单的步骤和配置方法,让您能够成功与 Amazon MSK Serverless 环境连接。

Amazon Managed Streaming for Apache Kafka (Amazon MSK) 是一项完全托管的服务,使得在 Amazon Web Services (AWS) 上构建和运行 Kafka 集群变得容易。开发人员需要在本地访问该服务,以便与生产环境中的 Kafka 集群进行相同配置的应用程序测试,从而提供与实际环境完全一致的基础设施,而无需在本地运行 Kafka。

一个 Amazon MSK Serverless 私有 DNS 端点仅能通过已配置连接的 Amazon Virtual Private Cloud (Amazon VPC) 进行访问,无法直接从您的本地开发环境解析。可以选择使用 AWS Direct Connect 或 AWS VPN 来 从本地网络连接 Amazon MSK Serverless。但这种解决方案可能会引入成本和复杂度,通常需由平台团队设置。

本篇文章提供了一种通过 堡垒主机 配合 Secure Shell (SSH) 隧道的实用方法,帮助您在开发过程中访问 Amazon MSK 环境。无论您是使用不可公开访问的 Amazon MSK Serverless 还是故意保留私有的已配置 MSK 集群,本文将引导您完成建立安全连接并无缝集成本地开发环境与 MSK 资源的步骤。

解决方案概述

该解决方案允许您从本地开发环境直接连接到 Amazon MSK Serverless 服务,而无需使用 Direct Connect 或 VPN。可以通过 bootltltxxxxxxgtgtcltltxgtgtkafkaserverlessltltregionnamegtgtamazonawscom 的引导服务器 DNS 端点于 9098 端口进行访问,并通过 SSH 隧道路由至堡垒主机,再与 MSK Serverless 集群连接。接下来,让我们探讨如何设置这个连接。

解决方案的流转如下:

Kafka 客户端发送连接引导服务器的请求。MSK Serverless 端点的 DNS 查询被路由到本地配置的 DNS 服务器。本地配置的 DNS 服务器将 DNS 查询转发至 localhost。SSH 隧道将所有 9098 端口的流量从 localhost 转发至 Amazon EC2 堡垒主机,再转发到 MSK Serverless 服务器。

以下是架构图:

前提条件

在部署解决方案之前,您需要在账户中部署以下资源:

配置了 AWS 身份与访问管理 (IAM) 身份验证的 MSK Serverless 集群。可以访问 MSK Serverless 集群并支持 SSH 公钥身份验证的 堡垒主机实例。配置了 AWS CLI 的 IAM 用户,并能够读取和创建 Amazon MSK 的主题。请使用 在让人使用 MSK Serverless 集群的过程中创建 IAM 角色 的 IAM 策略。对于 Windows 用户,安装 Windows 子系统 Linux 2 (WSL 2),使用 Ubuntu 2404。有关指导,请参见 如何在 Windows 上安装 Linux。

本指南假设在 useast1 部署了 MSK Serverless,但它可以在每个 AWS 的区域 中使用,前提是该区域支持 MSK Serverless。此外,我们使用 OS X 作为操作系统。接下来的步骤中,请用您配置的 MSK Serverless 端点 URL 替换 mskendpointurl,该 URL 格式为 bootltltxxxxxxgtgtcltltxgtgtkafkaserverlessltltregionnamegtgtamazonawscom。

解决方案操作指南

为了访问您的 Amazon MSK 环境进行开发,请使用以下操作指南。

配置本地 DNS 服务器 (OSX)

安装 Dnsmasq 作为本地 DNS 服务器,并配置解析函数以解析 Amazon MSK。该解决方案使用 Dnsmasq,因为它可以将 DNS 请求与模式数据库进行比较,以确定正确的响应。此功能可以匹配任何以 kafkaserverlessuseast1amazonawscom 结尾的请求并发送 127001 作为响应。按照以下步骤安装 Dnsmasq:

更新 brew 并使用 brew 安装 Dnsmasq

bashbrew upbrew install dnsmasq

开发者指南:如何使用 Amazon MSK Serverless 进行本地测试 大数据博客

启动 Dnsmasq 服务

bashsudo brew services start dnsmasq

将所有 Serverless MSK (kafkaserverlessuseast1amazonawscom) 的流量重定向至 127001

bashecho address=/kafkaserverlessuseast1amazonawscom/127001 gtgt (brew prefix)/etc/dnsmasqconf

重新加载 Dnsmasq 配置并清除缓存

飞驰vnp加速器

bashsudo launchctl unload /Library/LaunchDaemons/homebrewmxcldnsmasqplistsudo launchctl load /Library/LaunchDaemons/homebrewmxcldnsmasqplistdscacheutil flushcache

配置 OS X 解析器

一旦 DNS 服务器工作正常,您可以配置操作系统使用它。配置服务器仅将 kafkaserverlessuseast1amazonawscom 查询发送到 Dnsmasq。大多数类似 UNIX 的操作系统都有一个配置文件 /etc/resolvconf,控制 DNS 查询的执行方式,包括用于 DNS 查询的默认服务器。按照以下步骤配置 OS X 解析器:

OS X 还允许通过在 /etc/resolver/ 中创建配置文件来配置附加解析器。此目录可能在您的系统上不存在,因此您的第一步是创建它:

bashsudo mkdir p /etc/resolver

在 /etc/resolver/ 目录中,创建一个与您的新顶级域名 (kafkaserverlessuseast1amazonawscom) 具有相同名称的新文件,并添加 127001 作为 nameserver,输入以下命令。

bashsudo tee /etc/resolver/kafkaserverlessuseast1amazonawscom gt/dev/null ltltEOFnameserver 127001EOF

配置本地 DNS 服务器 (Windows)

在 Windows 子系统 Linux 中,首先安装 Dnsmasq,然后配置解析器以解析 Amazon MSK,最后将 localhost 添加为第一个 nameserver。

更新 apt 并使用 apt 安装 Dnsmasq。安装 telnet 实用工具以进行后续测试:

bashsudo apt updatesudo apt install dnsmasqsudo apt install telnet

将所有 Serverless MSK (kafkaserverlessuseast1amazonawscom) 的流量重定向至 127001。

bashecho address=/kafkaserverlessuseast1amazonawscom/127001 sudo tee a /etc/dnsmasqconf

重新加载 Dnsmasq 配置并清除缓存。

bashsudo /etc/initd/dnsmasq restart

打开 /etc/resolvconf 并在第一行添加以下代码。

bashnameserver 127001

输出应如下所示:

bash

一些注释

nameserver 127001nameserver ltgt

创建 SSH 隧道

下一步是创建 SSH 隧道,它将允许任何在本地机器上的 localhost9098 进行的连接通过 SSH 隧道转发到目标 Kafka 代理。使用以下步骤创建 SSH 隧道:

将 bastionhostdnsendpoint 替换为堡垒主机的公共 DNS 端点,该端点的格式为 ltltxyzgtgtcompute1amazonawscom,并将 ec2keypairpem 替换为堡垒主机的密钥对。然后通过输入以下命令创建 SSH 隧道。

bashssh i /ltltec2keypairpemgtgt ec2user@ltltbastionhostdnsendpointgtgt L 1270019098ltltmskendpointurlgtgt9098

保持 SSH 隧道正在运行并打开一个新终端窗口。

输入以下命令测试与 Amazon MSK 服务器的连接。

bashtelnet ltltmskendpointurlgtgt 9098

输出应如下例所示:

bashTrying 127001Connected to bootltltxxxxxxxxgtgtcltltxgtgtkafkaserverlessuseast1amazonawscomEscape character is ]

测试

现在配置 Kafka 客户端以使用 IAM 身份验证,然后测试该设置。可以在 Apache Kafka 下载网站 找到最新的 Kafka 安装,然后解压并将 Dafka 文件夹的内容复制到 /kafka。

下载 IAM 身份验证并解压。

bashcd /kafka/libswget https//githubcom/aws/awsmskiamauth/releases/download/v220/awsmskiamauth220alljarcd

配置 Kafka 属性以使用 IAM 作为身份验证机制。

bashcat lt /kafka/config/clientconfigproperties

设置 TLS 以进行加密,使用 SASL 进行身份验证

securityprotocol = SASLSSL

指定使用的 SASL 机制

saslmechanism = AWSMSKIAM

绑定 SASL 客户端实现

sasljaasconfig = softwareamazonmskauthiamIAMLoginModule required

封装基于提取的凭证构造 SigV4 签名

由 “sasljaasconfig” 绑定的 SASL 客户端调用此类。

saslclientcallbackhandlerclass = softwareamazonmskauthiamIAMClientCallbackHandler

EOF

在 /kafka/bin 输入以下命令创建示例主题。确保在前面的部分中创建的 SSH 隧道仍然开放并正在运行。

bash/kafkatopicssh bootstrapserver ltltmskendpointurlgtgt9098 commandconfig /kafka/config/clientconfigproperties create topic ExampleTopic partitions 10 replicationfactor 3 config retentionms=3600000

清理

对于 Mac 用户,移除解决方案的步骤如下:

删除文件 /etc/resolver/kafkaserverlessuseast1amazonawscom删除文件 (brew prefix)/etc/dnsmasqconf 中的条目 address=/kafkaserverlessuseast1amazonawscom/127001停止 Dnsmasq 服务 sudo brew services stop dnsmasq移除 Dnsmasq 服务 sudo brew uninstall dnsmasq

对于 WSL 用户,移除解决方案的步骤如下:

删除文件 /etc/dnsmasqconf删除文件 /etc/resolvconf 中的条目 nameserver 127001移除 Dnsmasq 服务 sudo apt remove dnsmasq移除 telnet 实用程序 sudo apt remove telnet

结论

在本文中,我向您展示了开发人员如何从本地环境连接到 Amazon MSK Serverless。连接是通过 SSH 隧道和堡垒主机使用 Amazon MSK 端点进行的。这使得开发人员能够在本地测试和实验,而无需设置单独的 Kafka 集群。