boto python API有没有办法在创建实例时指定标签?我试图避免必须创建一个实例,获取它然后添加标签。当我执行以下命令时,将实例预先配置为具有某些标签或指定标签会容易得多:
ec2server.create_instance(
ec2_conn, ami_name, security_group, instance_type_name, key_pair_name, user_data
)
boto python API有没有办法在创建实例时指定标签?我试图避免必须创建一个实例,获取它然后添加标签。当我执行以下命令时,将实例预先配置为具有某些标签或指定标签会容易得多:
ec2server.create_instance(
ec2_conn, ami_name, security_group, instance_type_name, key_pair_name, user_data
)
该答案在撰写时是准确的,但现在已过时。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.
您可以在启动期间、启动后或同时标记实例和 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)
使用 boto 2.9.6,我可以在从 run_instances 获得响应后立即向实例添加标签。像这样的东西在没有睡眠的情况下工作:
reservation = my_connection.run_instances(...)
for instance in reservation.instances:
instance.add_tag('Name', <whatever>)
成功添加标签后,我验证实例仍处于挂起状态。将这个逻辑包装在类似于原始帖子所要求的函数中会很容易。
这种方法对我有用:
rsvn = image.run(
... standard options ...
)
sleep(1)
for instance in rsvn.instances:
instance.add_tag('<tag name>', <tag value>)