21

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

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

4 回答 4

23

该答案在撰写时是准确的,但现在已过时。AWS API 和库(例如 boto3)现在可以采用“TagSpecification”参数,允许您在运行“create_instances”调用时指定标签。


在创建实例之前无法制作标签。尽管该函数被称为 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.
于 2012-05-24T02:39:35.720 回答
12

您可以在创建时标记实例或卷

run_instances 文档

您可以在启动期间、启动后或同时标记实例和 EBS 卷。有关更多信息,请参阅创建标签标记您的 Amazon EC2 资源

使用标签AWS 文档包含一个表格,其中包含支持标记和创建时支持标记的资源(截至 2017 年 5 月 1 日,实例和 EBS 卷都支持)

以下是在 Python 中创建实例时标记实例的代码片段(此页面上列出了其他 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)
于 2017-05-01T17:42:26.923 回答
3

使用 boto 2.9.6,我可以在从 run_instances 获得响应后立即向实例添加标签。像这样的东西在没有睡眠的情况下工作:

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

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

于 2013-07-02T17:22:16.010 回答
1

这种方法对我有用:

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

sleep(1)

for instance in rsvn.instances:
   instance.add_tag('<tag name>', <tag value>)
于 2011-11-09T19:21:54.023 回答