【问题标题】:How to Launch a exact same replica of a EC2 instance in VPC from the AMI of a previous EC2 instance如何从先前 EC2 实例的 AMI 启动 VPC 中 EC2 实例的完全相同的副本
【发布时间】:2015-09-29 15:38:19
【问题描述】:

我有一个不能重新启动的 EC2 实例 A,但问题是它将因维护而停机。我基本上使用我的代码创建了这个实例的 AMI,如下所示:

import boto.ec2
import time
import sys 
conn = boto.ec2.connect_to_region("ap-southeast-1")

image_id = conn.create_image(sys.argv[1], "nits", description="Testing", no_reboot=True, block_device_mapping=None, dry_run=False)
image = conn.get_all_images(image_ids=[image_id])[0]

while image.state != 'available':
    time.sleep(10)
    image.update()
    print "The image is being Created, Please wait!! state:%s" % (image.state) 

if image.state == 'available':
   print "AMI CREATED SUCCESSFULLY with AMI id = %s" % image_id   
else:
   print "Something Went Wrong!!" 

上述脚本运行良好,并创建了我作为系统参数提供的实例的 AMI。我需要启动实例“A”的完全相同的副本,即需要启动的实例需要具有相同的 VPC、sec 组、密钥名称等。 我在想我需要将实例 A 的详细信息存储在一个变量中,然后使用它们从 AMI 或类似的东西启动一个新实例..

P.S:以下代码有助于获取实例 A 的详细信息:

reservations=conn.get_all_instances(sys.argv[1])
instances = [i for r in reservations for i in r.instances]
for i in instances:
    print(i.__dict__)

【问题讨论】:

    标签: amazon-web-services boto


    【解决方案1】:

    下面的代码基本上会获取您将为其提供实例 id 的系统的 ami,然后它会获取现有系统的详细信息,并启动新的副本系统

    from boto.regioninfo import *
    from boto.ec2.connection import EC2Connection
    
    # Enter Instance ID here for which you want replication
    instance_id = 'i-XXXXXXXX'
    
    # AWS connect info
    aws_access_key_id='########## AWS Access Key ############'
    aws_secret_access_key='########### AWS Secret Key ############'
    region_name='ap-southeast-1'
    region_ec2_endpoint='ec2.ap-southeast-1.amazonaws.com'
    
    # Connect EC2
    aws_region = RegionInfo(name=region_name, endpoint=region_endpoint)
    conn = EC2Connection(aws_access_key_id,aws_secret_access_key,region=aws_region)
    
    # create ami
    print "Step 1 : Creating ami"
    ami_id = conn.create_image(instance_id,"testami",no_reboot=True)
    ami_status = "Pending"
    print "ami is being launched " + ami_id
    
    # check_ami_status
    image = conn.get_image(ami_id)
    while image.state == "pending":
        time.sleep(10)
        image = conn.get_image(ami_id)
        print "ami is in pending state, waiting for 10 sec before next check"
    
    image = conn.get_image(ami_id) 
    print "Image is now " + image.state
    
    reservations = conn.get_all_instances(instance_ids=[instance_id])
    instances = [i for r in reservations for i in r.instances]
    for i in instances:
        key_name = i.key_name
        security_group = []
        for each in i.groups:
            security_group.append(each.id)
        instance_type = i.instance_type
        subnet_name = i.subnet_id
        vpc_id = i.vpc_id
        reserve = conn.run_instances(image_id=ami_id,subnet_id=subnet_name ,key_name=key_name,instance_type=instance_type,security_group_ids =security_group)
        print "new replica system id is " + reserve.instances[0].id
    

    【讨论】:

    • InvalidParameterCombination参数组名不能与参数子网一起使用5242ae3a-03ea-491c-a230-5d86afcc3870 我需要在 VPC 中执行此操作
    • Nishant 尝试更新/编辑的答案,我们需要一个 sg_ids 数组,之前它是一个对象数组。
    • 我正在尝试使用硬编码的 sg 名称:instances = [i for r in reservations for i in r.instances] for i in instances:key_name = i.key_name #security_group = "sg-f05ee295" #i.groups instance_type = i.instance_type # print security_group[0] # subnet_name = i.subnet_id reserve = conn.run_instances(image_id=ami_id,key_name=key_name,instance_type=instance_type,security_group_ids =['sg-f05ee295']) print “新副本系统 id 是”+reserve.instances[0].id 仍然说我不能使用 VPC 子组进行非 Vpc 启动
    • 对于非 VPC ,使用 security_groups 而不是 security_group_ids ,并且不要给任何子网。
    • 谢谢兄弟.. 感激不尽
    猜你喜欢
    • 2022-01-10
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多