boto3:ec2实例上的create_tags给出了TypeError

时间:2016-05-24 17:52:48

标签: python boto3

我正在尝试使用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)

1 个答案:

答案 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)