+86 13541016684Mon. - Fri. 10:00-22:00

aws ec2实例eip实现自动切换

aws ec2实例eip实现自动切换

aws ec2实例eip实现自动切换

这篇文章主要将eip的设置,在开始前先讲下基本的概念,aws 对Ip管理分为 public_ip和eip两种,后者也叫弹性ip, 一般创建完一个实例后,会带一个public_ip地址,默认没有分配eip,那到底这两个ip有什么区别呢,这个概念如果不清楚,后续上了业务你是要吃 大亏的,既然这么重要,那咱们就不能绕过它们了,接下来咱们就细说下它们之间的区别:它们之间最大的区别就是eip分配到某实例后,实例不管如何操作,重 启,关机等,eip都不会变化,如果是public_ip,如果实例在关机重启后,ip就会不见了,会新分配一个ip给实例,这个地方就是比较坑爹的地 方,如果你不懂它们的区别,上了业务,不小心关机重启后,业务就出问题了,ip没了.

上面已经把这两个ip的区别讲了下,那下来,如果你业务需要固定Ip,那就必须要分配一个eip给这个实例,如何实现呢?其实只需简单2步即可,分配eip的思路基本是这样的:

1、获取一个eip

2、eip关联到某个实例

这就引出我们第一段代码:

#!/usr/bin/env python

import boto
from boto import ec2

region = ‘cn-north-1′

def allocate_ip():
ec2 = boto.ec2.connect_to_region(region)
address = ec2.allocate_address(domain=’vpc’,dry_run=False)
return address.public_ip,address.allocation_id

以上代码就是实现从aws ip库里分配一个eip出来,既然分配出来了,那第二段代码就是做与实例关联:

def eip_associate(instanceid):
ec2 = boto.ec2.connect_to_region(region)
address = ec2.get_all_addresses(addresses=’x.x.x.x’)
ec2.associate_address(instanceid,address[0].public_ip)

这段代码实现了与实例的关联,其中x.x.x.x是你需要关联实例的Ip地址(你刚获取的Ip)

经过以上各位看官都理解了吧,但还没完,你可能会想,能关联就能取消关联吧?没错,你猜的是对的,如果有一天业务不需要eip了,就可以取消关联:

def dis_eip_associate(public_ip):
ec2 = boto.ec2.connect_to_region(region)
address = ec2.get_all_addresses(addresses=’x.x.x.x’)
association_id = address[0].association_id
ec2.disassociate_address(public_ip=public_ip, association_id=association_id , dry_run=False)

这段代码就取消了eip关联,同样x.x.x.x是你的实例Ip地址(已经分配到实例上),dry_run参数的如果设置成True,代表不会正式运行,False就会正式运行并取消关联。

最后,既然实例都不用了,这些Ip怎么办呢,一般人可能都不去管了,就留在那里了,但看完我这篇文章后请不要不管了,你不理它,它会理你(在月初出 账单的时候),因为aws对空闲的Ip(未绑定到实例的eip)是按小时收费的,所以不用的Ip要尽快释放掉,归还给aws,同时也避免不必要的账单费用的产生,看代码:

def release_ip(public_ip):
ec2 = boto.ec2.connect_to_region(region)
address = ec2.get_all_addresses(addresses=[public_ip])
association_id = address[0].association_id
allocation_id = address[0].allocation_id
if association_id == None:
ec2.release_address(public_ip=None, allocation_id=allocation_id)
else:
print ‘The %s ip is be used’ % public_ip

在做释放的时候,做了一个判断,如果给出的public_ip有关联id,表示在用,就提示不能释放,eip还在使用,如果没有就将取消,在这里我说下,释放的时候需要

allocation_id,这个是eip的属性,可以从 dir(eip对象)中看到属性列表,然后调用就可以了。

这篇文章基本就把eip基本的管理讲完了,这些基本工作比较常用,而且如果重要业务可以自己写脚本实现eip的自动切换,就感觉像做了ha,实际使 用场景是这样的,有2台实例有相同的功能,正常情况下对外用户只访问其中一台,我们写一个脚本检查这台服务器的状态,如果发现这个机器宕机,可以通过取消 这台机器的eip关联,然后关联到另一台实例上,这样业务会尽快切换到新实例上, 对用户影响时间最短