开发者指南:利用 Amazon MSK Serverless 进行本地测试

Olawale Olaleye
难度
200 - 中级
时间
30 分钟
前提条件

海外区域: 注册 / 登录 亚马逊云科技

上次更新时间
2024 年 9 月 11 日
相关产品

Amazon 托管式 Apache Kafka 流数据服务( Amazon MSK )是一项完全托管的服务,可简化在亚马逊云科技上创建和运行Kafka集群的流程。在使用 Amazon MSK 服务时,开发者希望能够在本地访问 Amazon MSK 服务。这样一来,开发者便可使用与生产环境配置相同的 Kafka 集群来测试应用程序,无需本地运行Kafka即可获得与实际运行环境一致的基础设施。

要访问 Amazon MSK Serverless 的私有DNS端点,仅可通过已配置连接的亚马逊虚拟私有云( Amazon VPC )进行访问。无法在本地开发环境中直接解析该端点。一个解决方案是使用AWS Direct ConnectAWS VPN从本地网络连接到 Amazon MSK Serverless。然而,该解决方案可能会增加成本和复杂性,并且需要平台团队加以设置。

本文提供了一种实用的方法,可通过堡垒主机和安全壳( SSH )隧道(一种常用的安全连接方法)访问 Amazon MSK 环境,从而满足您的开发需求。无论您使用的是不支持公共访问的 Amazon MSK Serverless,还是刻意保持私有化的预配置 MSK 集群,本文都将指导您通过建立安全连接来实现本地开发环境与 MSK 资源的无缝集成。

解决方案概述

该方案允许您直接从本地开发环境连接到 Amazon MSK Serverless 服务,无需使用 Direct Connect或VPN。访问该服务的具体机制是:经由引导服务器DNS端点(boot-<<xxxxxx>>.c<<x>>.kafka-serverless.<<region-name>>.amazonaws.com,端口号为9098),借助 SSH 隧道和堡垒主机,将连接路由至 Amazon MSK Serverless 集群。在下一步中,我们将探讨如何设置该连接。

该解决方案的流程如下:

  1. Kafka 客户端发送连接引导服务器的请求
  2. 将 MSK Serverless 端点的DNS查询路由至本地配置的DNS服务器
  3. 本地配置的DNS服务器将DNS查询路由至 localhost
  4. SSH 隧道通过亚马逊弹性计算云( Amazon EC2 )堡垒主机,将 localhost 9098端口的所有流量转发到 MSK Serverless 服务器

下图展示了该方案的架构。

先决条件

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

  1. 一个 MSK Serverless 集群,需配置亚马逊云科技身份和访问管理( IAM )身份验证。
  2. 一个堡垒主机实例,需获得对 MSK Serverless 集群的网络访问权限,并配置 SSH 公钥身份验证。
  3. 已配置 IAM 用户的 AWS CLI,能够在 Amazon MSK 上读取和创建主题。请使用 MSK Serverless 集群入门指南》中的“第 2 步:创建 IAM 角色 ”所述的 IAM 策略。
  4. Windows 用户需利用适用于 Linux 的 Windows 子系统( WSL 2 )在 Windows 系统上安装 Ubuntu 24.04 版 Linux 系统。请参阅《如何使用 WSL 在 Windows 系统上安装 Linux 系统》

本指南假定 MSK Serverless 集群部署在us-east-1区,但本方案适用于任何一个可访问 MSK Serverless 的亚马逊云科技区域。此外,本指南使用的是 OS X 操作系统。在后续步骤中,请将 msk-endpoint-url 替换成提供 IAM 身份验证的 MSK Serverless 端点 URL。MSK 端点的URL 格式为:boot-<<xxxxxx>>.c<<x>>.kafka-serverless.<<region-name>>.amazonaws.com。

操作步骤

要访问满足开发需求的 Amazon MSK 环境,请遵循以下操作步骤:

配置本地 DNS 服务器( OS X 系统版)

安装 Dnsmasq 作为本地DNS服务器,并配置 Amazon MSK 解析器。之所以使用 Dnsmasq,是因为它能够将 DNS 请求与数据库模式进行比较,并据此确定正确的响应。该功能可匹配任何以 kafka-serverless.us-east-1.amazonaws.com 结尾的请求,并返回 127.0.0.1 作为响应。请按照以下步骤安装 Dnsmasq:

1. 更新 brew,再通过 brew 命令安装 Dnsmasq

brew up
brew install dnsmasq

2. 启用 Dnsmasq 服务

sudo brew services start dnsmasq

3. 将所有指向 Serverless MSK ( kafka-serverless.us-east-1.amazonaws.com )的流量重路由至 127.0.0.1

echo address=/kafka-serverless.us-east-1.amazonaws.com/127.0.0.1 >> $(brew --prefix)/etc/dnsmasq.conf

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

sudo launchctl unload /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist
sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist
dscacheutil -flushcache

配置 OS X 解析器

DNS 服务器进入正常工作状态后,就可以配置操作系统来进行使用了。将服务器配置为仅将 .kafka-serverless.us-east-1.amazonaws.com 查询发送给 Dnsmasq。大多数类 UNIX 操作系统都有一个名为 /etc/resolv.conf 的配置文件,可用于控制 DNS 查询的执行方式,包括用于 DNS 查询的默认服务器。请按照以下步骤在 OS X 系统上配置解析器:

1. OS X系统还允许您在 /etc/resolver/ 目录下创建配置文件来配置额外的解析器。您的系统中可能不存在该目录,因此首先需要创建该目录:

sudo mkdir -p /etc/resolver

2. 在 /etc/resolver/ 目录下创建一个新文件,文件名与您的新顶级域名相同(如 kafka-serverless.us-east-1.amazonaws.com ),并添加 127.0.0.1 作为域名服务器( nameserver ),具体命令如下:

sudo tee /etc/resolver/kafka-serverless.us-east-1.amazonaws.com >/dev/null <<EOF
nameserver 127.0.0.1
EOF

配置本地 DNS 服务器( Windows 版)

在 Windows Subsystem for Linux 中,首先安装 Dnsmasq,再配置 Amazon MSK 解析器,最后添加 localhost 作为第一个域名服务器( nameserver )

1. 更新 apt,再通过 apt 安装 Dnsmasq。安装 telnet  工具以便稍后进行测试

sudo apt update
sudo apt install dnsmasq
sudo apt install telnet

2. 将所有指向 Serverless MSK( kafka-serverless.us-east-1.amazonaws.com )的流量重路由到 127.0.0.1

echo "address=/kafka-serverless.us-east-1.amazonaws.com/127.0.0.1" | sudo tee -a /etc/dnsmasq.conf

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

sudo /etc/init.d/dnsmasq restart

4. 打开 /etc/resolv.conf 文件,在第一行添加以下代码

nameserver 127.0.0.1

     其输出应类似于以下代码

#Some comments
nameserver 127.0.0.1
nameserver <<your_nameservers>>
..

创建 SSH 隧道

下一步是创建 SSH 隧道,这样通过 localhost:9098 在本地机器上建立的任何连接,均可经由 SSH 隧道转发到目标 Kafka 代理。按照以下步骤创建 SSH 隧道:

1. 将 bastion-host-dns-endpoint 替换为堡垒主机的公共 DNS 端点,格式类似于 <<xyz>>.compute-1.amazonaws.com,并将 ec2-key-pair.pem 替换为堡垒主机的密钥对。再输入以下命令创建 SSH 隧道:

ssh -i "~/<<ec2-key-pair.pem>>" ec2-user@<<bastion-host-dns-endpoint>> -L 127.0.0.1:9098:<<msk-endpoint-url>>:9098

2. 确保 SSH 处于运行状态,打开一个新的终端窗口

3. 输入以下命令,即可测试与 Amazon MSK 服务器的连接:

telnet <<msk-endpoint-url>> 9098

     输出示例如下:

Trying 127.0.0.1...
Connected to boot-<<xxxxxxxx>>.c<<x>>.kafka-serverless.us-east-1.amazonaws.com.
Escape character is '^]'.

测试

现在配置 Kafka 客户端使用 IAM 身份验证,再测试所进行的设置。您可在 Apache Kafka 下载站点下载最新的 Kafka 安装包。下载并解压后,将 Dafka 文件夹中的内容复制到 ~/kafka 目录中。

1. 下载 IAM 身份验证并解压

cd ~/kafka/libs
wget https://github.com/aws/aws-msk-iam-auth/releases/download/v2.2.0/aws-msk-iam-auth-2.2.0-all.jar
cd ~

2. 配置 Kafka 属性,使用 IAM 作为身份验证机制

cat <<EOF > ~/kafka/config/client-config.properties

# Sets up TLS for encryption and SASL for authN.

security.protocol = SASL_SSL

# Identifies the SASL mechanism to use.

sasl.mechanism = AWS_MSK_IAM

# Binds SASL client implementation.

sasl.jaas.config = software.amazon.msk.auth.iam.IAMLoginModule required;


# Encapsulates constructing a SigV4 signature based on extracted credentials.

# The SASL client bound by "sasl.jaas.config" invokes this class.

sasl.client.callback.handler.class = software.amazon.msk.auth.iam.IAMClientCallbackHandler

EOF

3. 在 ~/kafka/bin 目录下,输入以下命令以创建示例主题(请确保之前创建的 SSH 隧道仍处于开启和运行状态):

./kafka-topics.sh --bootstrap-server <<msk-endpoint-url>>:9098 --command-config ~/kafka/config/client-config.properties --create --topic ExampleTopic --partitions 10 --replication-factor 3 --config retention.ms=3600000

清理

要移除该解决方案,Mac 用户需执行以下步骤:

1. 删除文件 /etc/resolver/kafka-serverless.us-east-1.amazonaws.com

2. 删除条目

address=/kafka-serverless.us-east-1.amazonaws.com/127.0.0.1 in the file $(brew --prefix)/etc/dnsmasq.conf

3. 停止 Dnsmasq 服务:输入 sudo brew services stop dnsmasq

4. 移除 Dnsmasq 服务:输入 sudo brew uninstall dnsmasq

要移除该解决方案,WSL 用户需执行以下步骤:

1. 删除文件 /etc/dnsmasq.conf

2. 删除文件 /etc/resolv.conf 中的条目 nameserver 127.0.0.1

3. 移除 Dnsmasq 服务:输入 sudo apt remove dnsmasq

4. 移除 telnet 工具:输入 sudo apt remove telnet

总结

本文介绍了如何从本地环境连接到 Amazon MSK Serverless,这可通过 Amazon MSK 端点、SSH 隧道和堡垒主机来实现。利用这种方案,开发者无需设置单独 Kafka 集群即可进行本地试验和测试。

更多教程

快速搭建容量高达 35GB 的免费个人网盘

本教程将介绍如何搭建一个没有使用限制的免费私人网盘。

构建企业专属智能客服机器人

本文将演示如何结合多种服务,打造企业专属的智能客服。

使用生成式 AI 构建多语言问答知识库

使用多种服务,构建可汇总搜索结果的多语言知识库。

查看全部教程 >>

免费套餐

AWS 海外区域

拓展海外业务或个人体验
免费使用 100 余种云产品或服务, 长达 12 个月

AWS 中国区域

发展中国业务
免费使用 40 余种核心云服务产品,长达 12 个月