2016-05-24 3 views
2

create_tagsを使用して既存のec2インスタンスにタグを追加しようとしています。boto3:ec2インスタンスのcreate_tagsはTypeErrorを返します

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) 

答えて

5

まず、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に続く、タグ形式です。あなたは)(boto3.client、インクルードが一方

response = client.create_tags(
    DryRun=True|False, 
    Resources=[ 
     'string', 
    ], 
    Tags=[ 
     { 
      'Key': 'string', 
      'Value': 'string' 
     }, 
    ] 
) 

タグ辞書を作成するフィルタの形式が正しく取得ではなく、明示的なリソースの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) 
+0

第4行 'reservations = ...'は有効なpythonではありません。 –

+0

@ BrunoBronosky:ありがとう。一定。 :-) – mootmoot

+0

以前の状態であっても、実際これは非常に役に立ちました。私はすべてのためにクライアントパターンを使用していた。私はこれに遭遇した直後に、クライアントを持っていないVolumeウェイターを使用する必要があったため、リソースを使用するように切り替えました。リソースのように低レベルで、クライアントは抽象的だと感じています。 –

-1

者は、キーワード引数のみです。

関連する問題