gpt4 book ai didi

python - 编写 Boto3 过滤器以使用自定义标签名称的正确方法是什么?

转载 作者:太空狗 更新时间:2023-10-29 17:56:42 25 4
gpt4 key购买 nike

我正在尝试列出不同标签键的标签值的实例例如>一个标签键 - 环境,另一个标签键 - 角色。我的代码如下:

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)

运行此脚本后:python 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'>

最佳答案

这看起来很眼熟,我是不是在某个地方为某人修改过它;-)。实际上我写的代码很匆忙,没有经过正确测试(而且我懒得修改 % 字符串格式并将其替换为 str.format() )。事实上,AWS 中没有正确记录使用 Filters 参数。

请引用Russell Ballestrini的博客Filtering AWS resources with Boto3了解更多关于正确的 boto 过滤器方法。

  1. 过滤器接受列表值,标签内的信息应该是字典。因此 [{}]
  2. Boto3 文档在如何使用指定标签名称方面含糊不清。当他们说您可以使用 tag:key 时,没有示例会令人困惑。很多人只会做 [{"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');

关于python - 编写 Boto3 过滤器以使用自定义标签名称的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37293366/

25 4 0