Boto EC2:使用标签创建实例

时间:2011-11-09 19:06:12

标签: python amazon-ec2 amazon-web-services boto

有没有办法用boto python API在创建实例时指定标签?我试图避免必须创建一个实例,获取它然后添加标签。将实例预先配置为具有某些标记或在执行以下命令时指定标记会更容易:

ec2server.create_instance(
        ec2_conn, ami_name, security_group, instance_type_name, key_pair_name, user_data
    )

4 个答案:

答案 0 :(得分:24)

在创建实例之前无法创建标记。即使该函数被称为create_instance,它实际上正在做的是保留和实例。然后可以启动或不启动该实例。 (通常是,但有时......)

因此,在启动标记之前,您无法添加标记。并且没有办法判断它是否在没有轮询的情况下启动。像这样:

reservation = conn.run_instances( ... )

# NOTE: this isn't ideal, and assumes you're reserving one instance. Use a for loop, ideally.
instance = reservation.instances[0]

# Check up on its status every so often
status = instance.update()
while status == 'pending':
    time.sleep(10)
    status = instance.update()

if status == 'running':
    instance.add_tag("Name","{{INSERT NAME}}")
else:
    print('Instance status: ' + status)
    return None

# Now that the status is running, it's not yet launched. The only way to tell if it's fully up is to try to SSH in.
if status == "running":
    retry = True
    while retry:
        try:
            # SSH into the box here. I personally use fabric
            retry = False
        except:
            time.sleep(10)

# If we've reached this point, the instance is up and running, and we can SSH and do as we will with it. Or, there never was an instance to begin with.

答案 1 :(得分:5)

You can tag instance or volume on creation

来自run_instances docs

  

您可以在启动期间,启动后或两者中标记实例和EBS卷。有关详情,请参阅CreateTagsTagging Your Amazon EC2 Resources

Using Tags AWS doc包含一个表,其中包含支持标记和支持标记创建的资源(截至2017年5月1日的实例和EBS卷支持)

以下是在Python中创建时标记实例的代码段(this page上列出了其他SDK引用):

from pkg_resources import parse_version
import boto3
assert parse_version(boto3.__version__) >= parse_version('1.4.4'), \
    "Older version of boto3 installed {} which doesn't support instance tagging on creation. Update with command 'pip install -U boto3>=1.4.4'".format(boto3.__version__)
import botocore
assert parse_version(botocore.__version__) >= parse_version('1.5.63'), \
   "Older version of botocore installed {} which doesn't support instance tagging on creation. Update with command 'pip install -U botocore>=1.5.63'".format(botocore.__version__)
ec2 = boto3.resource('ec2')
tag_purpose_test = {"Key": "Purpose", "Value": "Test"}
instance = ec2.create_instances(
    ImageId=EC2_IMAGE_ID,
    MinCount=1,
    MaxCount=1,
    InstanceType=EC2_INSTANCE_TYPE,
    KeyName=EC2_KEY_NAME,
    SecurityGroupIds=[EC2_DEFAULT_SEC_GROUP],
    SubnetId=EC2_SUBNET_ID,
    TagSpecifications=[{'ResourceType': 'instance',
                        'Tags': [tag_purpose_test]}])[0]

我用过

Python 2.7.13
boto3 (1.4.4)
botocore (1.5.63)

答案 2 :(得分:3)

使用boto 2.9.6,我可以在从run_instances获取响应后立即向实例添加标签。像这样的东西没有睡觉:

reservation = my_connection.run_instances(...)
for instance in reservation.instances:
    instance.add_tag('Name', <whatever>)

我在成功添加标记后验证了实例仍处于暂挂状态。将这个逻辑包装在一个类似于原始帖子所要求的函数中是很容易的。

答案 3 :(得分:0)

这种方法对我有用:

rsvn = image.run(
  ... standard options ...
)

sleep(1)

for instance in rsvn.instances:
   instance.add_tag('<tag name>', <tag value>)