如果在aws的某一个zone里面,删掉默认的vpc,然后自己新建,那么当使用脚本去,例如boto,创建instance以及security groups的时候,会遇到:
The parameter groupName cannot be used with the parameter subnet
都是由于没有默认vpc惹的祸,网上有人说可以找AWS帮忙恢复默认的vpc,不过这样慢了一些,既然没有了默认vpc,但是我们有自己建立的vpc呀,难道就不能用boto生成security groups和 instances了么?
#!/usr/bin/env python
#coding:utf-8
import boto.ec2
import re
import json
import time
# 读取变量
## boto2
conn = boto.ec2.connect_to_region("us-west-2",aws_access_key_id='123',aws_secret_access_key='123/1sXcGipZXMo1GGGDY',debug=2)
def create_instance(info=[]):
# 创建seuciryt
instance_vpcid = "vpc-1e733579"
security_name = "security-%s"%info[0]
security_ports = info[7].split("__")
# 下面新加了vpc_id这个变量。 !!!!!!!!!!!!!!!!!!!!!!
web = conn.create_security_group(security_name, security_name, vpc_id = instance_vpcid)
for security_port in security_ports:
web.authorize('tcp', security_port, security_port, '0.0.0.0/0')
web.authorize('-1',-1,-1,'10.0.0.0/8')
# 创建instance
instance_name = info[0]
instance_type = info[1]
instance_disksize = info[2]
instance_imageid = info[4]
#instance_keyname = info[5]
instance_keyname = "zzlyzq"
instance_count = int(info[6])
instance_placements = [ info[3]+'b',info[3]+'c', info[3] + 'a']
#instance_placements = [ 'subnet-c2a33ea7', 'subnet-d242948b']
if info[8] == "public":
# 公有子网,每个可用区一个
instance_subnetids = [ 'subnet-e0d54a87', 'subnet-89ece6d1', 'subnet-a0f647e9' ]
elif info[8] == "private":
# 私有子网,每个可用区一个
instance_subnetids = [ 'subnet-d7d54ab0', 'subnet-a1ece6f9', 'subnet-56f9481f']
## 准备磁盘
dev_sda1 = boto.ec2.blockdevicemapping.EBSBlockDeviceType()
dev_sda1.size = instance_disksize # size in Gigabytes
dev_sda1.volume_type = "gp2"
bdm = boto.ec2.blockdevicemapping.BlockDeviceMapping()
bdm['/dev/sda1'] = dev_sda1
# 绑定security到instance
for count in range(instance_count):
instance_placement = instance_placements[count%3]
instance_subnetid = instance_subnetids[count%3]
print "instance subnetid: %s"%instance_subnetid
print "security Name : %s"%security_name
#reservation = conn.run_instances(image_id=instance_imageid, key_name=instance_keyname,instance_type=instance_type, placement = instance_placement, subnet_id = instance_subnetid, security_groups = [security_name], block_device_map = bdm )
# 下面和上面的写法主要是 sec group 是name还是id, 如果我们没有默认vpc,最后下面使用 security_group_ids
reservation = conn.run_instances(image_id=instance_imageid, key_name=instance_keyname,instance_type=instance_type, placement = instance_placement, subnet_id = instance_subnetid, security_group_ids = [web.id], block_device_map = bdm )
# 添加tag为主机名
instance = reservation.instances[0]
status = instance.update()
while status == 'pending':
time.sleep(10)
status = instance.update()
if status == 'running':
instance.add_tag("Name", instance_name)
else:
print('Instance status: ' + status)
return None
def main():
with open("./instances.csv") as f:
for line in f:
#print line
info = []
info = line.replace("\r","").replace("\n","").split(",")
print info
if len(info) == 9:
create_instance(info)
else:
print "该行不满足执行条件!"
continue
main()
#create_security()