SSM description Instance Information在过滤器中只能接受1个值 &



我试图列出我所有的SSM实例(包括EC2和托管实例),但似乎我不能在一个过滤器中做到这一切?

我使用paginator函数来获取实例的信息,然后使用以下过滤器:

paginator = ssm_client.get_paginator('describe_instance_information')
response_iterator = paginator.paginate(
Filters=[
{
'Key': 'ResourceType',
'Values': [
'ManagedInstance'],
},
],
PaginationConfig={
# 'MaxItems': 100,
}
)

此过滤器只获取ManagedInstance列表。

'Key': 'ResourceType',
'Values': ['ManagedInstance'],

由于Values值接受一个列表,它不能接受多个值似乎很愚蠢。如果我这样写:

'Key': 'ResourceType',
'Values': ['ManagedInstance', 'EC2Instance'],

那么我将得到这个错误:

botocore.errorfactory.InvalidInstanceInformationFilterValue: An error occurred (InvalidInstanceInformationFilterValue) when calling the DescribeInstanceInformation operation: ResourceType filter may contain only one value.

稍后在我的脚本中,我将循环response_iterator变量。如果我想循环遍历所有实例(EC2和Managed),我不确定我的解决方案应该是什么。

我的循环看起来像这样:

for item in response_iterator:
for instance in item['InstanceInformationList']:
if instance.get('PingStatus') == 'Online':
instanceName = instance.get('ComputerName')
etc

绕过此限制的最佳选择是什么?

还有,这是boto3的限制还是来自AWS SDK?我还没弄明白。

编辑:因此,一个可能的解决方案如下:

import boto3
ssm_client = boto3.client('ssm')
ec2_client = boto3.client('ec2')
combined = []
rtypes = ['ManagedInstance', 'EC2Instance']
for rtype in rtypes:
paginator = ssm_client.get_paginator('describe_instance_information')
response_iterator = paginator.paginate(
Filters=[
{
'Key': 'ResourceType',
'Values': [rtype],
},
],
PaginationConfig={
# 'MaxItems': 10,
}
)
combined.append(list(response_iterator))
for item in combined:
for instance in item[0]['InstanceInformationList']:
if instance.get('PingStatus') == 'Online':
instanceName = instance.get('ComputerName')
print(instanceName)

似乎每个rtype只打印10个实例,这使我认为分页器在这里没有发挥它的魔力。这就好像我在使用常规的boto3describe_instance_information函数,实际上,它只返回SSM实例的第一页。

您可以运行分页器两次,并使用结果创建一个列表。迭代结果。我只有一个EC2实例运行验证嵌套的if语句结束时是很难做的。但这应该是你的开始。

combined = []
rtypes = ['ManagedInstance', 'EC2Instance']
for rtype in rtypes:
paginator = ssm_client.get_paginator('describe_instance_information')
response_iterator = paginator.paginate(
Filters=[
{
'Key': 'ResourceType',
'Values': [
rtype],
},
],
PaginationConfig={
# 'MaxItems': 100,
}
)
combined.append(list(response_iterator))

print(combined)
for r in combined:
# print(r)
if len(r[0]['InstanceInformationList']) > 0:
# print(r[0]['InstanceInformationList'])
for instance in r[0]['InstanceInformationList']:
if instance.get('PingStatus') == 'Online':
instanceName = instance.get('ComputerName')
print(instanceName)

看起来像我找到了一个解决方案。我没有使用内置分页器,而是找到了另一种自己创建页面的方法:

import boto3
ssm_client = boto3.client('ssm')
ec2_client = boto3.client('ec2')
def fetch_instance_pages():
token = ''
while True:
# for i in range(1): # Number of pages - 10 instances per page
page = ssm_client.describe_instance_information(NextToken=token)
yield page
token = page.get('NextToken')
if not token:
break
def fetch_instances():
for page in fetch_instance_pages():
for instance in page['InstanceInformationList']:
yield instance
counter = 0
for instance in fetch_instances():
if instance.get('PingStatus') == 'Online':
counter+=1
instanceName = instance.get('ComputerName')
print(counter, instanceName)

显然你不需要计数器,它只是为了方便你看打印出来的东西。

最新更新