背景
平时在AWS EC2上跑了点东西,方便查学习资料(你懂的)。之所以选择AWS是因为它家提供1年免费套餐,另外海外节点稳定。起先一切看起来不错,可以实现自由冲浪。
但过不了多久就会被 王府井 屏蔽,没办法,多启几个容器吧(内存有限,一次启用5个不同的端口,发现不好用时手工切换本机客户端端口呗,5个端口都换完了就重新绑定个弹性IP,也算个解决办法。
但最近发现, 王府井 的效率变高了。基本上只要访问过一次受限网站,过不了几分钟这个端口就被封了,这让我怎么学习?没办法,不得不重新更换一个新的弹性IP地址。更换IP地址的过程是这样的:
登录AWS控制台(国内访问速度比较慢)
切换到EC2控制面板
分配新的弹性IP地址
将新地址绑定到EC2实例
释放旧的IP地址
一轮操作下来,一般要十几分钟。有时候半天登录不上,痛苦啊啊啊。。。
每次重复劳动,对于我这个希望用行动改变世界的码农来说,不是我性格啊。趁今天有空,研究了一下如何用AWS命令行工具(AWS CLI)自动替换EC2实例的弹性IP地址,节省我的时间。
编写处理脚本
关于如何配置AWS CLI,请参阅钢哥之前的博文《如何利用AWS CLI进行S3的上传下载》
这里假设你已经配置好了AWS CLI,可以通过命令行连接到你的AWS账户了。简单地通过 aws configure 可以验证你的CLI是否安装正常。
解决思路也很简单:
找到我的EC2实例ID (instance id)(我的EC2实例上有个标签,值为awsjp);
找到对应的IP地址分配的ID(allocation id);
通过命令行生成新的弹性IP地址;
将新IP绑定到EC2实例上;
释放旧的弹性IP地址;
以下是我的shell脚本内容,
#!/bin/sh
# get ec2 instance id by tag
InstanceId=$(aws ec2 describe-instances –filters “Name=key-name,Values=awsjp” –query “Reservations[*].Instances[*].[InstanceId]” –output text)
OldPublicIpAddress=$(aws ec2 describe-instances –filters “Name=key-name,Values=awsjp” –query “Reservations[*].Instances[*].[PublicIpAddress]” –output text)
# generate an elastic ip address
NewPublicIpAddress=$(aws ec2 allocate-address –domain vpc –query “PublicIp” –output text)
# associate an elastic ip to an existed ec2 instance
result=$(aws ec2 associate-address –instance-id $InstanceId –public-ip $NewPublicIpAddress)
# release an existed elastic ip address
aws ec2 release-address –allocation-id $(aws ec2 describe-addresses –filters “Name=public-ip,Values=$OldPublicIpAddress” –query “Addresses[*].[AllocationId]” –output text)
echo “New Elastic IP: “$NewPublicIpAddress
简单地运行脚本后,会提示新的弹性IP地址。更新到本机客户端,这样又可以愉快的上网了~
当然,你也可以选择其他云提供商,比如:Google,微软,都有免费套餐服务和对应的命令行工具,最主要的是要有稳定的海外节点。
什么?你不知道我在说什么?好吧,其实用 biying搜索 也不错。