通过NAT实例实现外部访问AWS的ElastiCache资源
ElastiCache作为AWS的内存缓存组建可以说做的一点也不友好了,
你可以通过ElastiCache创建redis,memcache的实例,却不能被外部访问。
背景
人傻钱多的客户总有人傻钱多的需求,他们本地做开发测试,需要用到redis,
于是他们决定在aws上创建一个redis的实例,用作本地开发测试。虽然我看不到价目表,但我想一台redis实例应该也得不少钱。
于是,我在public子网下创建了一个redis实例,原本以为可以通过终端节点的名称加端口号来访问到实例,结果我想多了。
官方给出的解释是:

好吧,我不是有意吐槽,至少它还是给出了解决方法。
没错就是通过NAT实例
创建NAT实例
我们先来说说要求:
- 首先你必须在相同vpc,相同子网下创建你的NAT实例以及你的缓存实例
- 且所在子网必须是公有子网,啥叫公有子网就是在路由表中该子网必须绑定了internet网关(igw)
- 然后你的NAT实例必须绑定一个弹性IP(EIP)
(可能你看到这就已经觉得很麻烦了。。。)
环境准备:
接下来假设你在一个叫“TEST-VPC”下的“public-subnet”子网下创建了一个Redis的实例,你可以通过ping它的主机名以获取它的内网IP地址后面会用到。
比如你的redis的内网ip是:192.168.1.110 端口: 6379
然后我们到EC2的界面选择——》实例——》启动实例

在选择AMI的时候搜索带有NAT标签的镜像(这里我就默认选择的第一个),资源怎么划分大家根据需求随意搭配
注意:
- 选择和之前redis实例相同的VPC,以及相同的子网
- 在创建安全组的时候开放TCP 6379的端口 以及ssh 22远程连接的端口
……省略创建EC2实例的过程
比如你已经创建好一个NAT实例了,IP地址为:192.168.1.120
接下来进入EC2界面——》弹性IP——》分配新地址,为你的实例关联一个弹性IP
到这里你已经成功了一大半了。
添加iptables规则
登录到NAT实例,为 NAT 实例启用 IP 转发。以下命令可用于确认这一点:
cat /proc/sys/net/ipv4/ip_forward
启用伪装:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
将 iptables 规则添加到 NAT 实例。
必须为群集中的每个节点将 iptables 规则添加到 NAT 表,以便将缓存端口从 NAT 实例转发到群集节点。
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 6379 -j DNAT --to 192.168.1.110:6379
你可以通过telnet测试是否成功:
telnet 203.0.113.73 6379
保存 iptables 配置。
在您测试和验证规则之后保存规则。如果您使用基于 Redhat 的 Linux 分发(例如 Amazon Linux),请运行以下命令:
service iptables save
到这里所有的配置就结束了
总结
接下来就是真正的吐槽时间了!
首先客户的提出的需求就已经是一个另类的需求了,想必大家并不多见。
如果是本地开发测试,并不介意将你的redis创建在公有云上并通过公网访问。
其次,我们来算一下你这次创建所需的花费:
- redis实例
- EC2实例
- 弹性IP
您的测试环境成本真的大,/不是礼貌的微笑
通过NAT实例实现外部访问AWS的ElastiCache资源的更多相关文章
- Django 中如何让外部访问本地的静态资源
简单使用 在Django中打开一个入口,让别人可以访问media文件 在settings中配置 MEDIA_ROOT=os.path.join(BASE_DIR,'media') 在路由中配置 fro ...
- 浅谈iptables 入站 出站以及NAT实例
--------------本文是自己工作上的笔记总结,适合的可以直接拿去用,不适合的,适当修改即可!--------------- iptbales默认ACCEPT策略,也称通策略,这种情况下可以做 ...
- 【转载】浅析从外部访问 Kubernetes 集群中应用的几种方式
一般情况下,Kubernetes 的 Cluster Network 是属于私有网络,只能在 Cluster Network 内部才能访问部署的应用.那么如何才能将 Kubernetes 集群中的应用 ...
- SignalR入门之从外部访问持久性连接或Hub
有的时候,需要从外部访问持久性连接或Hub服务. 比如,假设A和B两个客户端正在聊天,那么系统或第三方在不参与聊天的情况需要为他们发送系统消息,那么此时,就需要独立来访问持久性连接或Hub服务. 之前 ...
- [转帖] 外部访问k8s 里面pod的方式方法
https://jimmysong.io/posts/accessing-kubernetes-pods-from-outside-of-the-cluster/ 从外部访问Kubernetes中的P ...
- MySQL8.0允许外部访问
MySQL8.0允许外部访问 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/h99 ...
- centos7 打开mysql 3306端口并 设置外部访问
mysql安装后默认是localhost访问,如果需要外部访问可以设置一个新的账号把host改为%,意味着所有ip均可以访问 grant all privileges on *.* to 'outUs ...
- IIS Express 配置外部访问
IIS Express是Visual Stuido自带的微型Web服务器,简单易用. IIS Express默认只允许本机访问,通过Visual Studio调试Web程序时,我们有时需要通过外部访问 ...
- ubuntu系统lamp环境搭建、数据库迁移、设置数据库外部访问
sudo passwd root设置两次密码su输入设置的密码exit (退出root帐号) 1.sudo apt-get update 2.sudo apt-get install apache2 ...
随机推荐
- LeetCode 461 汉明距离/LintCode 365 统计二进制中1的个数
LeetCode 461. 汉明距离 or LintCode 365. 二进制中有多少个1 题目一:LeetCode 461. 汉明距离 LeetCode 461.明距离(Hamming Distan ...
- HRBUST 1313 火影忍者之~静音
优先队列. 每次将$n$个人压入优先队列,取出$5$个,最后排序. #include<cstdio> #include<cstring> #include<cmath&g ...
- redis的运行机制
从以前总结的redis一些基本性能中,可知redis是非关系型数据库(nosql):这一类的数据类型有以下特点: 非关系型的(sql语句对它不起作用,不需要建表存数据,它是直接存储),分布式(主从复制 ...
- mvc4 to mvc5 orEF5 to EF6 ,(升级EF6)
把后台MVC4 自动生成的网站从EF5.0 升级为 EF6.1.3 (6.0以上) 报错 找不到方法:“System.Data.Objects.ObjectContext System.Data.En ...
- Compass用法
一.什么是Compass? Compass是Sass的工具库,Compass在SASS的基础上,封装了一系列有用的模块去补充Sass的功能,类似Javascript和jQuery 二.安装 之前已经写 ...
- 关于 CommonJS AMD CMD UMD
1. CommonJS CommonJS 原来叫 ServerJS, 是服务器端模块的规范,Node.js采用了这个规范. 根据CommonJS规范,一个单独的文件就是一个模块.加载模块使用requi ...
- python基础之包与logging模块
包 1.什么是包? 包是模块的一种形式,包的本质就是一个含有__init__.py文件的文件夹 2.为什么要有包? 提高程序的结构性和可维护性 3.如何使用包? 导入包就是在导包下的__init__. ...
- spring quartz 配置
quartz简介 各种企业应用几乎都会碰到任务调度的需求,就拿论坛来说:每隔半个小时生成精华文章的RSS文件,每天凌晨统计论坛用户的积分排名,每隔30分钟执行锁定用户解锁任务.任务调度本身涉及到多线程 ...
- MATLAB/Octave中implicit conversion from real matrix to real scalar错误原因与解决
写程序时提示 implicit conversion from real matrix to real scalar的一个warning,主要问题在于将一个矩阵当成一个标量在使用.我的程序出现这个wa ...
- 大于非负整数N的第一个回文数 Symmetric Number
1.题目 如标题,求大于整数N(N>=0)的第一个回文数的字符串表示形式. 2.样例 1 --> 2 9 -->11 12345 -->12421 123456 --> ...