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
2.ゲートウェイがないのにどうやってインターネットを使うのか--インターネットgateway
自分のプライベートなネットワーク空間があれば、どのようにしてインターネットの素晴らしい世界にアクセスすることができますか?インターネットgatewayが手伝ってあげる必要があります.このインターネットゲートウェイを作成するときは、生成したばかりのvpcを指定することに注意してください.
3.ゲートウェイ出口があってルートテーブルがなくてどのように出口--route table
上記はすでにこのvpcのためにインターネットgatewayを作成しています.私たちがしなければならないのは、ルーティングテーブルを作成してインターネットgatewayに出口が必要なトラフィックを指し、次のsubnetをこのルーティングテーブルに関連付けることで、外の世界に通じることができます.
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に入れるかを指定する必要があります.
5.メインディッシュテーブル--instance
securityグループ、ebs、public_など、多くのものを作成する必要があります.key、紙幅が限られているので、ここではbotoをどのように利用して作成するかは提供されていません.分からないことや興味のあることがあれば、私にプライベートで話してください.
基本的なネットワークが構築されているので、インターネットを作成して作成したばかりのsubnetに入れなければなりません.そうすれば、基本的にinstanceが一括して作成できます.
海外で機械室を建てるのは適切ではないので、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 '-----------------------------------------