· 7 years ago · Apr 23, 2018, 07:40 AM
1import argparse
2from ipaddress import IPv4Network
3import boto3
4
5
6def create_vpc(vpc_cidr, vpc_tag_name, subnet_cidr, ec2=None):
7 if not ec2:
8 ec2 = boto3.resource('ec2')
9
10 vpc = ec2.create_vpc(CidrBlock=vpc_cidr)
11 vpc.create_tags(Tags=[{"Key": "Name", "Value": vpc_tag_name}])
12 vpc.wait_until_available()
13
14 ig = ec2.create_internet_gateway()
15 vpc.attach_internet_gateway(InternetGatewayId=ig.id)
16
17 route_table = list(vpc.route_tables.all())[0]
18
19 subnet = ec2.create_subnet(CidrBlock=subnet_cidr, VpcId=vpc.id)
20 route_table.associate_with_subnet(SubnetId=subnet.id)
21
22 sec_group = list(vpc.security_groups.all())[0]
23 # enable a ping checking
24 sec_group.authorize_ingress(CidrIp='0.0.0.0/0', IpProtocol='icmp', FromPort=-1, ToPort=-1)
25 return vpc
26
27
28def create_peering(vpc, peer_owner_id, peer_region, peer_vpc_id, peer_vpc_cidr):
29 pc = vpc.request_vpc_peering_connection(PeerOwnerId=peer_owner_id, PeerVpcId=peer_vpc_id, PeerRegion=peer_region)
30 route_table = list(vpc.route_tables.all())[0]
31 route_table.create_route(DestinationCidrBlock=peer_vpc_cidr, VpcPeeringConnectionId=pc.id)
32 return pc.id
33
34
35def main(access_key, secret_key, vpc_region, vpc_cidr, vpc_tag_name, subnet_cidr, peer_owner_id,
36 peer_region, peer_vpc_id, peer_vpc_cidr):
37 ec2 = boto3.resource('ec2', aws_access_key_id=access_key, aws_secret_access_key=secret_key, region_name=vpc_region)
38
39 print('check overlapping')
40 vpc_cidr_net = IPv4Network(vpc_cidr)
41 for ex_vpc in ec2.vpcs.iterator():
42 if vpc_cidr_net.overlaps(IPv4Network(ex_vpc.cidr_block)):
43 raise ValueError(f'{vpc_cidr} overlaps {ex_vpc.cidr_block}')
44
45 print('create a vpc')
46 vpc = create_vpc(vpc_cidr, vpc_tag_name, subnet_cidr, ec2=ec2)
47
48 print('create a peer connection')
49 id_ = create_peering(vpc, peer_owner_id, peer_region, peer_vpc_id, peer_vpc_cidr)
50 print(f'finished. Accept the {id_} peer connection and make a route from an accepter VPC to requester VPC')
51
52
53def cidr_type(address):
54 try:
55 IPv4Network(address)
56 except Exception as e:
57 print('Error: ', e)
58 raise
59
60 return address
61
62
63if __name__ == '__main__':
64 parser = argparse.ArgumentParser()
65 parser.add_argument('access_key')
66 parser.add_argument('secret_key')
67 parser.add_argument('vpc_region')
68 parser.add_argument('vpc_cidr', type=cidr_type)
69 parser.add_argument('vpc_tag_name')
70 parser.add_argument('subnet_cidr', type=cidr_type)
71 parser.add_argument('peer_owner_id')
72 parser.add_argument('peer_region')
73 parser.add_argument('peer_vpc_id')
74 parser.add_argument('peer_vpc_cidr', type=cidr_type)
75 args = parser.parse_args()
76 main(**vars(args))