您可以连接到亚马逊以外的 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 吗?的主要内容,如果未能解决你的问题,请参考以下文章

从托管连接到 Amazon S3

如何通过 SSL 连接到 Amazon RDS?

尝试使用 Postgres 连接到数据库,但无法将 Amazon 服务器上的地址转换为 Amazon 数据库

使用 MySQL Workbench 安全组通过 EC2 实例连接到 Amazon RDS 实例

将 iOS 应用程序连接到 Amazon 上托管的 Ejabberd 服务器

在 Linux 中通过 SSH 连接到 Amazon EC2