MuleSoft CloudHub 到 Amazon AWS RedShift 代理

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

我遇到过这样一种情况,我们需要将在 MuleSoft 的 CloudHub 中运行的 Mule ESB 流连接到 Amazon AWS Redshift 集群。这不是开箱即用的。我在下面概述了创建代理服务器的步骤。 这个 Gist 中 也提供了我所做的原始文章。

概述

以下是使用 Amazon AWS EC2 实例在 MuleSoft CloudHub 和 Amazon AWS Redshift 之间创建和配置代理所需的步骤。

问题

EC2 和 Redshift 实例配置为支持巨型帧(以太网接口的 MTU 为 9001)。但是,端点之间的某些路由器具有标准以太网 MTU 大小 (1500),这导致无法与公布的 TCP MSS 大小 (8961) 进行通信。出现此问题的原因是 PATH MTU 发现过程依赖于 ICMP,特别是 Type 3 Code 4 / Fragmentation Needed),目前在 Redshift 上所有 ICMP 流量都被拒绝(无论安全组配置如何)。

MuleSoft CloudHub 使用标准以太网 MTU (1500),默认情况下无法连接到 RedShift 集群。以下步骤记录了如何使用 EC2 实例创建轻量级 IP 代理。

配置详情

  1. 使用以下条件在与 RedShift 集群相同的可用区 (AZ) 中创建一个 AWS 实例:
    1. AMI: Ubuntu Server 14.04 LTS (HVM), SSD Volume Type - ami-d05e75b8 (或类似的)
    2. 实例类型: t2.micro
      • 初始性能测试表明这是足够的,因为代理不是 CPU/RAM 密集型。
    3. 实例详细信息:接受默认值或根据 VPC 配置进行修改
    4. 标记实例: cloudhub-redshift-proxy
    5. 配置安全组:
      1. 限制 SSH 访问受信任的 IP 范围
      2. 为将访问 Redshift 集群的每个静态 CloudHub IP 添加自定义 TCP 规则
        • 协议: TCP
        • 端口范围: 5439 (默认 RedShift 端口)
        • 自定义 IP(使用 CIDR 表示法): xxxx/32 (例如 54.127.64.101/32)
  2. 启动实例,并选择一个现有的 SSH 密钥对,以允许您通过 SSH 连接到该实例。
  3. 禁用源/目标检查
    1. 从 EC2 实例列表中选择实例
    2. 选择操作 > 网络 > 更改源/目标。查看
    3. 单击是,禁用按钮
  4. 启动实例后,使用公共 DNS/IP 连接到实例: ssh ubuntu@server.eu-west-1.compute.amazonaws.comssh ubuntu@54.152.137.105
  5. 启用 IP 数据包转发
    1. 在 vi 或 vim 中打开 /etc/sysctl.conf # sudo vi /etc/sysctl.conf
    2. 取消注释以下行: net.ipv4.ip_forward = 1
    3. 保存文件
    4. 使用以下命令应用更改: # sudo sysctl -p
  6. 应用 iptables 规则进行 TCP MSS 调整(假设使用默认的 RedShift 端口 5439) a.输入以下两个命令 sudo iptables -A PREROUTING -t mangle -p tcp --sport 5439 --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1460sudo iptables -A PREROUTING -t mangle -p tcp --dport 5439 --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1460
  7. 将 NAT 从“代理”转换为 RedShift 集群 IP( RS_IP 是集群 IP 地址, LOCAL_IP 是“代理”主机的 eth0 接口的 IP 地址)
    1. 您将需要 EC2 代理实例的私有 IP。您可以通过查看 AWS 实例详细信息或在 SSH 会话的命令行中键入 ifconfig 并查看 eth0 设备来找到它。
    2. 您还需要 RedShift 集群的 IP。
    3. 输入以下命令,将 RS_IP 替换为集群 IP,并将 LOCAL_IP 替换为 eth0 的 EC2 私有/本地 IP: sudo iptables -t nat -A PREROUTING -p tcp -d LOCAL_IP --dport 5439 -j DNAT --to-destination RS_IP 示例: sudo iptables -t nat -A PREROUTING -p tcp -d 171.25.2.35 --dport 5439 -j DNAT --to-destination 54.102.36.165
    4. 输入以下命令: sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
  8. 注销 SSH 会话。代理已配置。