2016-05-18 42 views
6

Farklı etiket anahtarlarının etiket değerleri üzerindeki örnekleri listelemeye çalışıyorum Örn.> Bir etiket tuşu - Ortam, diğer etiket tuşu - Rol. Kodum aşağıda verilmiştir:Etiket adı özelleştirmek için Boto3 filtreleri yazmanın doğru yolları nedir?

import argparse 
import boto3 

AWS_ACCESS_KEY_ID = '<Access Key>' 
AWS_SECRET_ACCESS_KEY = '<Secret Key>' 

def get_ec2_instances(Env,Role): 
    ec2 = boto3.client("ec2", region) 
    reservations = ec2.describe_instances(Filters={"tag:environment" : Env, "tag:role" : Role}) 
    for reservation in reservations["Reservations"] : 
     for instance in reservation["Instances"]: 
      print "%s" % (instance.tags['Name']) 

if __name__ == '__main__': 

    regions = ['us-east-1','us-west-1','us-west-2','eu-west-1','sa-east-1', 
       'ap-southeast-1','ap-southeast-2','ap-northeast-1'] 
    parser = argparse.ArgumentParser() 
    parser.add_argument('Env', default="environment", help='value for tag:environment'); 
    parser.add_argument('Role', default="role", help='value for tag:role'); 
    args = parser.parse_args() 

    for region in regions: get_ec2_instances(args.Env, args.Role) 

Bu komut dosyasını çalıştırdıktan sonra: piton script.py arg1 arg2

Ben Bu tanıdık görünüyor

Traceback (most recent call last): 
    File "script.py", line 27, in <module> 
    for region in regions: get_ec2_instances(args.Env, args.Role) 
    File "script.py", line 10, in get_ec2_instances 
    reservations = ec2.describe_instances(Filters={"tag:environment" : Env, "tag:role" : Role}) 
    File "/usr/local/lib/python2.7/dist-packages/botocore/client.py", line 258, in _api_call 
    return self._make_api_call(operation_name, kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/botocore/client.py", line 524, in _make_api_call 
    api_params, operation_model, context=request_context) 
    File "/usr/local/lib/python2.7/dist-packages/botocore/client.py", line 577, in _convert_to_request_dict 
    api_params, operation_model) 
    File "/usr/local/lib/python2.7/dist-packages/botocore/validate.py", line 270, in serialize_to_request 
    raise ParamValidationError(report=report.generate_report()) 
botocore.exceptions.ParamValidationError: Parameter validation failed: 
Invalid type for parameter Filters, value: {'tag:role': 'arg1', 'tag:environment': 'arg2'}, type: <type 'dict'>, valid types: <type 'list'>, <type 'tuple'> 

cevap

9

, ben bu değişiklik yaptım hatayı aşağıdaki alıyorum birisi bir yerlerde ;-). Aslında yazdığım kod acele etmekteydi ve düzgün bir şekilde test edilmedi (Ve% dize biçimlendirmeyi değiştirip str.format() ile değiştirmeyi zahmet etmiyorum). Aslında, Filtreler parametresini kullanmak AWS'de doğru şekilde belgelenmez.

Doğru boto Filtreler yöntemi hakkında daha fazla bilgi için Russell Ballestrini bloguna Filtering AWS resources with Boto3 bakın.

  1. Filtreler liste değerini kabul eder ve etiketin içindeki bilgi dikte edilmelidir. böylece [{}]
  2. Boto3 belgeleri, etiket adının nasıl kullanılacağı konusunda oldukça belirsizdir. Etiket: anahtarını kullanabileceğinizi söyledikleri zaman örnekler olmadan kafa karıştırıcıdır. Pek çok kişi sadece [{"tag:keyname","Values": [""] }] yapacak ve işe yaramıyor. (Aslında geliştiricinin, filtrelerin nasıl çalıştığını bildiğini düşündüğüm başlangıç ​​kodu), sadece yapıyı değiştiriyorum.
  3. Aslında, "Ad" ve "Değerler" çiftini açıkça belirtmeniz GEREKİR. Bu nedenle, etiket adını belirtmenin doğru yolu [{"Name" :"tag:keyname", "Values":[""] }]. Bu zor.

Yani dize değeri kadar sürebilir argparse sizin örnek

filters = [{'Name':'tag:environment', 'Values':[Env]}, 
      {'Name':'tag:role', 'Values':[Role]} 
      ] 

(Güncelleme) için kullanılacak Ve emin olmak için eğer bir filtre biçimlendirme doğru yolu, sadece almaya argüman zorlamak Ben çalışacaktır emin mayın veya mootmoot yanıtını olduğum gibi dize değerleri

parser.add_argument('Env', type=str, default="environment", help='value for tag:environment'); 
parser.add_argument('Role', type=str,default="role", help='value for tag:role'); 
0

, Çevre ve Rolü Fix çünkü Değerler expects dizeleri için dizisi.

reservervations = ec2.describe_instances(
     Filters=[ 
      {'Name': 'tag:environment', 'Values': ['%s'], 'Name': 'tag:role', 'Values': ['%s']} % (Env, Role), 
     ]] 
    ).get(
     'Reservations', [] 
    )