您可以连接到亚马逊以外的 Amazon ElastiСache Redis 吗?

Posted

技术标签:

【中文标题】您可以连接到亚马逊以外的 Amazon ElastiСache Redis 吗?【英文标题】:Can you connect to Amazon ElastiСache Redis outside of Amazon? 【发布时间】:2014-03-21 23:27:59 【问题描述】:

我能够从 EC2 实例 连接到 VPC 中的 ElastiCache Redis 实例。但我想知道是否有办法连接到 Amazon EC2 实例之外的 ElastiCache Redis 节点,例如从我的 本地 开发设置或其他供应商提供的 VPS 实例。

目前在我的本地设置中尝试时:

redis-cli -h my-node-endpoint -p 6379

我只是在一段时间后才超时。

【问题讨论】:

【参考方案1】:

SSH 端口转发应该可以解决问题。尝试从您的客户端运行它。

ssh -f -N -L 6379:<your redis node endpoint>:6379 <your EC2 node that you use to connect to redis>

然后来自您的客户

redis-cli -h 127.0.0.1 -p 6379

它对我有用。

请注意,redis 的默认端口是6379 而不是6739。并确保您允许用于连接到您的 redis 实例的 EC2 节点的安全组进入您的缓存安全组。

此外,AWS 现在支持访问您的集群更多信息here

【讨论】:

感谢您指出端口,只是一个错字。那么,您是说通过 EC2 的 SSH 隧道是访问 Amazon 以外的 elasticache 节点的唯一方法吗?谢谢, 就像另一个答案中提到的@E.J.Brennan 一样正确。 我们如何撤销 ssh 端口转发...? 你可以杀死 ssh 进程。在 Linux 上:kill -9 &lt;pid&gt;【参考方案2】:

2018 年更新

之前的答案在编写时是准确的,但是现在可以通过一些配置从外部使用根据 Accessing ElastiCache Resources from Outside AWS 的方向访问 redis 缓存


旧答案

不,你不能不求助于诸如隧道之类的“技巧”,这对于测试来说可能没问题,但会扼杀使用超高速缓存的任何真正好处,并增加延迟/开销。

在 VPC 内部使用 Amazon ElastiCache 与在外部使用它有何不同?

VPC 内部或外部的 Amazon ElastiCache 集群绝不允许从 Internet 访问

不过,这种语言在current faq中已经被删除了

【讨论】:

还是这样吗?文档不再这么说 - 他们声称 redis 受标准安全组策略的约束,但尽管如此,我仍然无法访问我的 redis 节点。打那个。刚刚移动的参考:部署在 VPC 内的 Amazon ElastiCache 节点永远无法从 Internet 或 VPC 外部的 EC2 实例访问。 我觉得'kill'有点强。例如,在 AWS 之外(通过这样的隧道)运行我们的应用程序时,我们没有受到明显的性能影响。与数据库操作、浏览器负载、磁盘 I/O 等相比,隧道的开销微不足道。 docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/…【参考方案3】:

我们使用 HAProxy 作为保留的代理服务器。

您在 AWS 之外的系统 ---> 互联网 --> 具有公共 IP 的 HAProxy --> Amazon Redis (Elasticache)

请注意,这样做(当时)还有另一个很好的理由

由于我们使用不支持 Amazon DNS 故障转移的 node.js 客户端,因此客户端驱动程序不再支持 dns 查找。 如果redis发生故障,客户端驱动会一直连接到旧的master,故障转移后是slave。

通过使用 HAProxy,它解决了这个问题。

现在使用最新的ioredis驱动,支持amazon dns failover。

【讨论】:

node.js 更新,现在 ioredis 支持 DNS 故障转移。如果您使用 DNS 主机名,它可以在没有 HAProxy 的情况下进行自动故障转移。【参考方案4】:

不是那么老的问题,我自己也遇到了同样的问题并解决了:

有时,出于开发原因,您需要从外部访问(可能是为了避免为了简单的错误修复而进行多次部署?)

亚马逊发布了一份使用 EC2 作为外部世界代理的新指南:

https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/accessing-elasticache.html#access-from-outside-aws

祝你好运!

【讨论】:

作为参考,亚马逊提到的方法是一个 NAT 实例。 仅供参考,来自文档:“此方法应仅用于测试和开发目的。不建议用于生产用途” 是的,这是真的@jasonjonesutah 我在回答中也提到了这一点。一个非常糟糕的生产想法,但非常适合开发。【参考方案5】:

这是一个可靠的节点脚本,将为您完成所有繁琐的工作。测试并验证它有效。

https://www.npmjs.com/package/uzys-elasticache-tunnel

如何使用 用法:uzys-elasticache-tunnel [选项] [命令]

命令:

start [filename]  start tunneling with configuration file (default: config.json)
stop              stop tunneling
status            show tunneling status

选项:

-h, --help     output usage information
-V, --version  output the version number

使用示例

开始 - uzys-elasticache-tunnel start ./config.json 停止 - uzys-elasticache-tunnel 停止 状态 - uzys-elasticache-tunnel 状态

【讨论】:

【参考方案6】:

无法从 VPC 实例直接访问经典集群。解决方法是在经典实例上配置 NAT。

NAT 需要一个简单的 tcp 代理

YourIP=1.2.3.4
YourPort=80
TargetIP=2.3.4.5
TargetPort=22

iptables -t nat -A PREROUTING --dst $YourIP -p tcp --dport $YourPort -j DNAT \
--to-destination $TargetIP:$TargetPort
iptables -t nat -A POSTROUTING -p tcp --dst $TargetIP --dport $TargetPort -j SNAT \
--to-source $YourIP
iptables -t nat -A OUTPUT --dst $YourIP -p tcp --dport $YourPort -j DNAT \
--to-destination $TargetIP:$TargetPort

【讨论】:

您在下面提到的帖子中也给出了相同的答案,但有不同的要求。它如何在给定的场景中也可以工作? ***.com/questions/38066908/…【参考方案7】:

顺便说一句,如果有人想要 Windows EC2 解决方案,请在 DOS 提示符下尝试这些(在所述 Windows EC2 机器上):

添加端口转发

C:\Users\Administrator>netsh interface portproxy add v4tov4 listenport=6379 listenaddress=10.xxx.64.xxx connectport=6379 connectaddress=xxx.xxxxxx.ng.0001.use1.cache.amazonaws.com

列出端口转发的端口

C:\Users\Administrator>netsh interface portproxy show all

在 ipv4 上监听:连接到 ipv4:

地址端口地址端口


10.xxx.128.xxx 6379 xxx.xxxxx.ng.0001.use1.cache.amazonaws.com 6379

移除端口转发

C:\Users\Administrator>netsh interface portproxy delete v4tov4 listenport=6379 listenaddress=10.xxx.128.xxx

【讨论】:

【参考方案8】:

这些答案已过时。

您可以按照以下步骤在 AWS 之外访问弹性缓存:

    在与缓存集群相同的 VPC 中创建 NAT 实例,但在 公共子网。 为缓存集群创建安全组规则并 NAT 实例。 验证规则。 将 iptables 规则添加到 NAT 实例。 确认受信任的客户端能够连接到 簇。 保存 iptables 配置。

有关更详细的说明,请参阅 aws 指南:

https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/accessing-elasticache.html#access-from-outside-aws

【讨论】:

我不想要 NAT 实例,我想检查一下。 Rico 的回答正是我想要的。 NAT 如何允许外部访问?文档指定了以下“将 ElastiCache 集群打开到 0.0.0.0/0 不会将集群公开到 Internet,因为它没有公共 IP 地址,因此无法从 VPC 外部访问”有没有办法通过NAT??【参考方案9】:

我使用这个亚马逊文档解决了它说你必须在你的另一台 ec2 机器上安装 stunnel。

https://aws.amazon.com/premiumsupport/knowledge-center/elasticache-connect-redis-node/

【讨论】:

这是不可访问的。您能在此处添加有关 stunnel 的详细信息吗?

以上是关于您可以连接到亚马逊以外的 Amazon ElastiСache Redis 吗?的主要内容,如果未能解决你的问题,请参考以下文章