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

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

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

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

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

【问题讨论】:

    标签: amazon-web-services amazon-ec2 redis amazon-elasticache


    【解决方案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 等相比,隧道的开销微不足道。
    【解决方案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
      

      【讨论】:

      【解决方案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 之外访问弹性缓存:

        1. 在与缓存集群相同的 VPC 中创建 NAT 实例,但在 公共子网。
        2. 为缓存集群创建安全组规则并 NAT 实例。
        3. 验证规则。
        4. 将 iptables 规则添加到 NAT 实例。
        5. 确认受信任的客户端能够连接到 簇。
        6. 保存 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 的详细信息吗?
        猜你喜欢
        • 1970-01-01
        • 2012-02-01
        • 2022-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-03
        • 2016-10-11
        相关资源
        最近更新 更多