Was ist die richtige Weise zu schreiben Boto3 Filter zu verwenden, anpassen, tag-name?
Ich versuche, die Liste der Instanzen auf die tag-Werte der verschiedenen tag-Schlüssel
Für eg> ein-tag-key - Umgebung, die anderen Umbau-Schlüssel - Rolle.
Mein code ist unten angegeben :
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)
Nachdem dieses Skript ausgeführt : python script.py arg1 arg2
Erhalte ich folgenden Fehler
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'>
InformationsquelleAutor Abhi | 2016-05-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieser vertraut aussieht, hab ich Sie ändern dies für jemanden irgendwo 😉 . Eigentlich ist der code, den ich schrieb, in Eile und nicht richtig getestet (Und ich nicht die Mühe, zu ändern, % string formatieren und ersetzen Sie es mit str.format() ) . In der Tat,mit Filter-parameter ist nicht richtig dokumentiert in AWS.
Entnehmen Sie bitte Russell Ballestrini blog Filtern von AWS-Ressourcen mit Boto3 erfahren Sie mehr über die richtige boto-Filter-Methode.
[{"tag:keyname","Values": [""] }]
und es funktioniert nicht. (Eigentlich ist die Herkunft code ich nehme an, die Entwickler wissen, wie der Filter funktioniert, also habe ich Sie einfach ändern, nur die Struktur).[{"Name" :"tag:keyname", "Values":[""] }]
. Es ist heikel.Also die richtige Art der Formatierung, die ein Filter-wenn Sie möchten, verwenden Sie für Ihr Beispiel
(Update)
Und um sicherzustellen, dass argparse nehmen Zeichenfolge, die Sie gerade durchzusetzen, das argument zu string-Werte
InformationsquelleAutor mootmoot
In mein eigenes python-Skript verwende ich folgende:
InformationsquelleAutor A Bantly
Update der Env und der Rolle, da bin ich nicht sicher, mine oder mootmoot Antwort wird funktionieren, da das Array für Werte erwartet strings.
InformationsquelleAutor Zeretil