[英]What is the correct ways to write Boto3 filters to use customise tag name?
我试图列出不同标签键的标签值的实例例如>一个标签键 - 环境,其他标签键 - 角色。 我的代码如下:
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博客使用 Boto3 过滤 AWS 资源以了解有关正确 boto 过滤器方法的更多信息。
[{"tag:keyname","Values": [""] }]
而它不起作用。 (实际上,我假设开发人员知道过滤器的工作原理是原始代码,所以我只是修改了结构)。[{"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');
虽然实际上不是您问题的答案,但不要,永远不要将您的 AWS 凭证硬编码到您的脚本中。 凭借您的 AWS 凭证,任何人都可以使用您的账户。 有机器人在 github 和其他 git 存储库中寻找硬编码的 AWS 凭证。
此外,在轮换凭据时,您的所有代码都将被破坏,或者您将很难更新所有代码。
一些替代方案改为硬编码您的 AWS 凭证:
遵循此处描述的最佳实践: 管理 AWS 访问密钥的最佳实践
现在,为了回答您的问题,这里有一个关于如何按标签过滤的示例:
argEnv = '<any_string_you_want_to_match_as_a_value_for_a_tag>'
ec2Client = boto3.client('ec2')
response = ec2Client.describe_instances(
Filters=[
{
'Name': 'tag:Projeto',
'Values': [argEnv]
}
]
)
确保 'Value' 是一个列表而不是一个字符串。 例如,如果 'argEnv' 是一个字符串,请确保使用 '[]' 来封装变量。
然后,如果您想查询 Tag:Name 并获取它的值(例如,您在控制台中为特定 EC2 实例设置的名称):
for reservation in res['Reservations']:
for instance in reservation['Instances']:
for tag in instance['Tags']:
if tag['Key'] == 'Name':
consoleName = tag['Value']
print(consoleName)
输出将是每个资源的名称标签的值。 如您所见,您必须遍历结果才能获得结果。 您可以在此处查看响应语法。
在我自己的 python 脚本中,我使用以下内容:
import boto3
ec2client = boto3.client('ec2','us-east-1')
response = ec2client.describe_instances(Filters=[{'Name' : 'instance-state-name','Values' : ['running']}])
修复 Env 和 Role,因为我不确定我的或没有实际意义的答案是否有效,因为值数组需要字符串。
reservervations = ec2.describe_instances(
Filters=[
{'Name': 'tag:environment', 'Values': ['%s'], 'Name': 'tag:role', 'Values': ['%s']} % (Env, Role),
]]
).get(
'Reservations', []
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.