我正在尝试使用create_tags为现有的ec2实例添加标记。
ec2 = boto3.resource('ec2', region_name=region)
instances = ec2.instances.filter(Filters=[{'Name': 'instance-state-name',
'Values': ['running']}])
for instance in instances:
ec2.create_tags([instance.id], {"TagName": "TagValue"})
这给了我这个错误:
TypeError: create_tags() takes exactly 1 argument (3 given)
答案 0 :(得分:6)
首先,你不能像这样使用boto3.resource(" ec2")。 boto3.resource是一个与特定资源相关联的高级层。因此,以下已经返回特定实例资源。集合文档总是如下所示
# resource will inherit associate instances/services resource.
tag = resource.create_tags(
DryRun=True|False,
Tags=[
{
'Key': 'string',
'Value': 'string'
},
]
)
因此,在您的代码中,您必须直接在资源集合上引用它:
for instance in instances:
instance.create_tags(Tags={'TagName': 'TagValue'})
接下来,是标记格式,请点击the documentation。您可以获得正确的过滤格式,但不能使用create tag dict
response = client.create_tags(
DryRun=True|False,
Resources=[
'string',
],
Tags=[
{
'Key': 'string',
'Value': 'string'
},
]
)
另一方面,boto3.client()是需要显式资源ID的低级客户端。
import boto3
ec2 = boto3.client("ec2")
reservations = ec2.describe_instances(
Filters=[{'Name': 'instance-state-name',
'Values': ['running']}])["Reservations"]
mytags = [{
"Key" : "TagName",
"Value" : "TagValue"
},
{
"Key" : "APP",
"Value" : "webapp"
},
{
"Key" : "Team",
"Value" : "xteam"
}]
for reservation in reservations :
for each_instance in reservation["Instances"]:
ec2.create_tags(
Resources = [each_instance["InstanceId"] ],
Tags= mytags
)
(更新) 使用资源的一个原因是通用对象的代码重用,即,使用以下包装器可以为任何资源创建标记。
def make_resource_tag(resource , tags_dictionary):
response = resource.create_tags(
Tags = tags_dictionary)