python boto实现自动部署AWS

公司有些游戏业务在海外上线,因此需要使用aws来部署服务器,从而使外国友人也能愉快地玩我们司的游戏。

在海外自建机房很不合适,因此aws就是我们的不二之选了。要在aws租用服务器,那么就一定了解amazon提供的基本服务,例如VPC,EC2,S3...

那么随着公司海外业务的扩大,服务器的需求也越来越大,之前我们都是在aws提供的web console上点点拽拽生成各种服务与网络环境,机器少的时候还好说,多起来连点击都费劲,那么aws也友好地提供了各种API,供各路程序猿实现自动化部署自己的业务,这里选取了python boto来部署。

1. 工欲善其事,必先有其网络--VPC

AWS提供了virtual private cloud 与一个传统网络结构相似的虚拟网络,那么再从ec2上生成一个实例放进创建好的vpc里,我们就可以在云上创建属于自己的网络环境而不受外界影响
请在这里输入图片描述
请在这里输入图片描述

在web console上很容易就可以生成一个vpc,那么在python里是如何生成呢,just show me the code

import boto
import boto.vpc

region = 'us-west-1' #此region 为大湾区
vpc_name = 'g1'
vpc_cidr = '10.16.121.11/24' #即将创建vpc的网段!

Connections = namedtuple('Connections', ['ec2', 'vpc'])

def connect(): 
    vpc_conn = boto.vpc.connect_to_region(region) 
    ec2_conn = boto.ec2.connect_to_region(region) 
    return Connections(ec2_conn, vpc_conn) 

def create_vpc(conn, vpc_name, vpc_cidr): 
    datacenters = conn.vpc.get_all_vpcs(filters=[("cidrBlock", vpc_cidr)]) 
    if not len(datacenters): #判断之前是否已经创建了此vpc 
        datacenter = conn.vpc.create_vpc(cidr_block=vpc_cidr) 
        make_tag(datacenter, vpc_name) #给创建完的vpc打上标签 
        print "have created a vpc which name is %s and cidr is %s" %(datacenter.tags['Name'], datacenter.cidr_block) 
        print "----------------------------------" 
    else: datacenter = datacenters.pop(0) 
        print "the vpc you requested is already exists" 
        print "----------------------------------" 
    return datacenter

conn = connect()
create_vpc(conn, vpc_name, vpc_cidr)

2. 没网关怎么谈上网呢--internet gateway

有了属于自己的那片私密网络空间,那么如何才能访问互联网精彩的世界呢,这就需要internet gateway帮你忙了。要注意的就是创建这个internet gateway的时候要指定刚刚生成的那个vpc

def create_internet_gateway(conn, vpc, intgw_name): 
    i_gws = conn.vpc.get_all_internet_gateways(filters=[('tag:Name', intgw_name)]) 
    if not len(i_gws): #根据internet gw name判断之前有没创建 
        i_gw = conn.vpc.create_internet_gateway() 
        make_tag(i_gw, intgw_name) 
        conn.vpc.attach_internet_gateway(i_gw.id, vpc.id) 
        print "have created a internet gw attaching to the vpc which created before "
        print "-----------------------------------" 
    else: i_gw = i_gws.pop(0) 
        print "the internet gw u requested is already exists" 
        print "-----------------------------------" 
    return i_gw

vpc = create_vpc(conn, vpc_name, vpc_cidr)

3. 有了网关出口没有路由表如何出口--route table

上述已经为这个vpc创建好了Internet gateway,我们还要做的是创建好一个路由表然后把需要出口的流量指向internet gateway,然后下述的subnet再关联到此路由表,就能完成通往外面的世界了。

def create_route_table(conn, vpc, route_name, i_gw):
    route_tables = conn.vpc.get_all_route_tables(filters=[("tag:Name", route_name)])
    if not len(route_tables):
        route_table = conn.vpc.create_route_table(vpc.id)
        make_tag(route_table, route_name)
        conn.vpc.create_route(route_table.id, ANYWHERE, i_gw.id)    
        print "have created a route table for the vpc which created before"    
        print "-----------------------------------"
    else:    
        route_table = route_tables.pop(0)    
        print "the route table is exists already"    
        print "-----------------------------------"
    return route_table

4. 好歹有个子网--subnet

在第一部分我们划好的vpc掩码为10.16.121.0/24。那么这个vpc下可以创建255个instance,但是业务逻辑需要划分出三个子网,一个作为public subnet,另外两个为private subnet。所有就要利用boto来帮我创建好这些子网的环境。

要注意的是aws vpc里还有个概念叫available zone。在一个region里面至少都会有两个az,一般不同az都是部署在不同的物理机房内。我们创建subnet的时候因此也需要指定放在哪个az内。

def create_subnet(conn,        
                  vpc, 
                  route_table,        
                  subnet_name,        
                  sub_cidr,        
                  availability_zone):    
    subnets = conn.vpc.get_all_subnets(filters=[("cidrBlock", sub_cidr)])    
    if not len(subnets):        
        subnet = conn.vpc.create_subnet(vpc.id, sub_cidr, availability_zone)        
        make_tag(subnet, subnet_name)        
        conn.vpc.associate_route_table(route_table.id, subnet.id)        
        print "have created a subnet"        
        print "-----------------------------------"    
    else:        
        subnet = subnets.pop(0)        
        print "the subnet u requested is already exists"        
        print "-----------------------------------"    
    return subnet

5.主菜上桌--instance

其实还需要创建一堆东西,例如security group, ebs, public_key,因为篇幅有限这里就不提供如何利用boto来创建了,如果有不清楚或者感兴趣的再找我私聊。

基本的网络都搭建好了,那么就要创建intance放到我们刚刚创建好的subnet里面,这样基本上instance就可以批量创建喽。

parser = SafeConfigParser()
parser.read('/home/raingolee/aws.cfg')#我把要创建的instance信息都存在一个配置文件里  

def create_instance( conn, vpc, pub_subnet, pri_subnet, public_key, security_group):    
    with open('~/aws/user-data', 'r') as file:        
        user_data = file.read()    
    for ins in parser.sections(): #我把要创建的instance信息都存在一个配置文件里       
        if ins.startswith('instance'):            
            ami_id = parser.get(ins, 'ami_id')            
            ami_type = parser.get(ins, 'ami_type')            
            subnet = parser.get(ins, 'subnet')           
            if subnet == 'public':                
                subnet = pub_subnet            
            elif subnet == 'private':                
                subnet = pri_subnet            
            subnet_ip = parser.get(ins, 'subnet_ip')            
            instance_name = parser.get(ins, 'instance_name')           
            reservations = conn.ec2.get_all_instances(filters=[("tag:Name", instance_name)])            
            if not len(reservations):                
                bdm = create_ebs(conn)                
                reservation = conn.ec2.run_instances(ami_id,                    
                                                     instance_type=ami_type,                    
                                                     security_group_ids=[security_group.id],                                     
                                                     key_name=public_key.name,                    
                                                     subnet_id=subnet.id,                    
                                                     private_ip_address=subnet_ip,                              
                                                     block_device_map=bdm,                    
                                                     user_data=user_data)                
                                                     instance = reservation.instances[0]                     
                                                     instance.add_tag("Name", instance_name)                
                 print "have created a instance named is %s" % (instance_name)    
           print '-----------------------------------------

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,271评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,725评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,252评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,634评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,549评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,985评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,471评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,128评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,257评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,233评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,235评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,940评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,528评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,623评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,858评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,245评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,790评论 2 339

推荐阅读更多精彩内容