2016-05-18 8 views
6

मैं विभिन्न टैग कुंजी के टैग मानों पर उदाहरणों को सूचीबद्ध करने की कोशिश कर रहा हूं उदाहरण के लिए> एक टैग कुंजी - पर्यावरण, अन्य टैग कुंजी - भूमिका। इस स्क्रिप्ट चलाने के बादटैग टैग को कस्टमाइज़ करने के लिए बोटो 3 फ़िल्टर लिखने के सही तरीके क्या हैं?

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) 

: मेरे कोड नीचे दिया गया है अजगर script.py ARG1 ARG2

मैं निम्न त्रुटि

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'> 

उत्तर

9

यह परिचित लग रहा है, मैं के लिए इस संशोधित किया हो रही है कहीं कहीं ;-)। असल में मैंने जो कोड लिखा था वह जल्दी में परीक्षण नहीं किया गया है और (और मैं% स्ट्रिंग को संशोधित करने और str.format() के साथ प्रतिस्थापित करने में परेशान नहीं हूं। वास्तव में, फ़िल्टर पैरामीटर का उपयोग एडब्ल्यूएस में ठीक से दस्तावेज नहीं किया गया है।

सही बोटो फ़िल्टर विधि के बारे में अधिक जानने के लिए कृपया Russell Ballestrini ब्लॉग Filtering AWS resources with Boto3 देखें।

  1. फ़िल्टर सूची मूल्य स्वीकार करते हैं, और टैग के अंदर की जानकारी dict होना चाहिए। इस प्रकार [{}]
  2. Boto3 दस्तावेज़ टैग नाम निर्दिष्ट करने के तरीके पर बहुत अस्पष्ट है। यह उदाहरण के बिना भ्रमित है जब वे कहते हैं कि आप टैग: कुंजी का उपयोग कर सकते हैं। बहुत से लोग [{"tag:keyname","Values": [""] }] करेंगे और यह काम नहीं करता है। (असल में मूल कोड जो मुझे लगता है कि डेवलपर जानता है कि फ़िल्टर कैसे काम करता है, इसलिए मैं केवल संरचना में संशोधन करता हूं)।
  3. दरअसल, आपको स्पष्ट रूप से "नाम" और "मान" जोड़ी निर्दिष्ट करना होगा। तो टैग नाम निर्दिष्ट करने का सही तरीका [{"Name" :"tag:keyname", "Values":[""] }] है। यह मुश्किल है।

तो आप अपने उदाहरण

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

(अद्यतन) के लिए उपयोग और argparse स्ट्रिंग मान तक का समय लग सुनिश्चित करने के लिए करना चाहते हैं तो एक फिल्टर स्वरूपण का सही तरीका, तो आप सिर्फ तर्क लागू लेने के लिए स्ट्रिंग को महत्व देता

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

पर्यावरण और भूमिका को ठीक करें, के रूप में मुझे यकीन है कि मेरा नहीं या mootmoot का जवाब कर रहा हूँ काम करेंगे क्योंकि मान expects स्ट्रिंग्स के लिए सरणी।

reservervations = ec2.describe_instances(
     Filters=[ 
      {'Name': 'tag:environment', 'Values': ['%s'], 'Name': 'tag:role', 'Values': ['%s']} % (Env, Role), 
     ]] 
    ).get(
     'Reservations', [] 
    ) 
संबंधित मुद्दे