您可以连接到亚马逊以外的 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 <pid>
【参考方案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 吗?的主要内容,如果未能解决你的问题,请参考以下文章
尝试使用 Postgres 连接到数据库,但无法将 Amazon 服务器上的地址转换为 Amazon 数据库
使用 MySQL Workbench 安全组通过 EC2 实例连接到 Amazon RDS 实例