python boto自動配置AWSを実現

7586 ワード

会社の一部のゲーム業務は海外でオンラインになっているので、awsを使ってサーバーを配置する必要があります.それによって、外国の友达も当社のゲームを楽しく游ぶことができます.
海外で機械室を建てるのは適切ではないので、awsは私たちの選択肢です.awsでサーバをレンタルするには、amazonが提供する基本的なサービス、例えばVPC、EC 2、S 3...
では、会社の海外業務の拡大に伴い、サーバーの需要もますます大きくなり、以前はawsが提供するweb consoleで様々なサービスとネットワーク環境を少しずつ引っ張って生成していました.機械が少ないときは言いやすいですが、クリックするのに苦労していました.awsも友好的に様々なAPIを提供し、各プログラム猿が自分の業務を自動化して配置するために、ここでpython botoを選んで配置しました.
1.仕事をよくしようとすると、まずそのネットワーク--VPCがある.
AWSはvirtual private cloudが従来のネットワーク構造に似た仮想ネットワークを提供しています.ec 2から作成した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.ゲートウェイがないのにどうやってインターネットを使うのか--インターネットgateway
自分のプライベートなネットワーク空間があれば、どのようにしてインターネットの素晴らしい世界にアクセスすることができますか?インターネット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のためにインターネットgatewayを作成しています.私たちがしなければならないのは、ルーティングテーブルを作成してインターネット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
第1部で作成したvpcマスクは10.16.121.0/24です.では、このvpcでは255個のinstanceを作成できますが、ビジネスロジックはpublic subnetとして3つのサブネットを分割する必要があります.もう2つはprivate subnetです.これらのサブネットを作成するためにbotoを利用するすべての環境.
aws vpcにはavailable zoneという概念があることに注意してください.1つのregionには少なくとも2つの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グループ、ebs、public_など、多くのものを作成する必要があります.key、紙幅が限られているので、ここではbotoをどのように利用して作成するかは提供されていません.分からないことや興味のあることがあれば、私にプライベートで話してください.
基本的なネットワークが構築されているので、インターネットを作成して作成したばかりの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 '-----------------------------------------