如何调用
aws secretsmanager list-secrets
命令并按标签过滤机密?我在这里没有看到这样的示例:https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/list-secrets.html
此外,亚马逊的文档似乎是错误的。该页面上写着
--max-items
,但实际上应该是 --max-results
。此外,该 wiki 页面上也没有提及如何进行过滤。
[原件:2019 年 12 月]
您可以使用jq,例如:
aws secretsmanager list-secrets \
| jq '.SecretList[] | select((.Tags[]|select(.Key=="Name")|.Value) | test("^Production$|^Staging$"))'
您还可以使用 awscli 的内置查询选项,例如:
aws secretsmanager list-secrets \
--query "SecretList[?Tags[?Key=='Name' && Value=='Production']]"
您可以将布尔测试与 awscli 的内置查询选项结合使用,例如:
aws secretsmanager list-secrets \
--query "SecretList[?Tags[?Key=='Name' && (Value=='Production' || Value='Staging')]]"
以下是使用 Python 和 boto3 的解决方案的概述:
from functools import partial
import boto3
def filter_tags(key, values, secret):
for tag in secret['Tags']:
if tag['Key'] == key and tag['Value'] in values:
return True
return False
sm = boto3.client('secretsmanager')
paginator = sm.get_paginator('list_secrets')
secrets_list_iterator = paginator.paginate()
filter_production = partial(filter_tags, 'Name', ['Production', 'Staging'])
for secrets in secrets_list_iterator:
for s in filter(filter_production, secrets['SecretList']):
print(s['Name'], s['Tags'])
[更新:2021 年 1 月]
aws Secretsmanager list-secrets 命令现在支持通过 --filters
选项进行过滤。但是..我建议您不要使用它,除非您了解它的实际工作原理(见下文)并且您将从其特定的实现中受益。以下是如何使用它来过滤名称为
以 Production 开始 的机密的示例:
aws secretsmanager list-secrets \
--filters Key=name,Values=Production
请注意,您不能使用 --filters
选项进行精确匹配,只能进行“开头为”匹配,因此使用时要小心。如果您的机密名称为 Production 和 Production-Old,则两者都将被返回。这可能不是您想要的,因此在这种情况下请使用上面描述的原始客户端查询。以下是如何使用它来过滤名称以
开头为 Production 或 Staging 的机密的示例:
aws secretsmanager list-secrets \
--filters Key=name,Values=Production,Staging
这里有一个示例,说明如何使用它来过滤秘密,其标签键以 开头 为 stage 或 标签值以 开头 dev:
aws secretsmanager list-secrets \
--filters Key=tag-key,Values=stage Key=tag-value,Values=dev
注意:--filters
选项实现逻辑“或”,而不是逻辑“与”。这是一个 boto3 示例,过滤以
开头的标签键 名称 或 以 开头的标签值 生产或暂存:
import boto3
sm = boto3.client('secretsmanager')
res = sm.list_secrets(Filters=[
{ 'Key': 'tag-key', 'Values': ['Name'] },
{ 'Key': 'tag-value', 'Values': ['Production', 'Staging'] },
])
for secret in res['SecretList']:
print(secret['Name'], secret['Tags'])
response = client.list_secrets(
IncludePlannedDeletion=True|False,
MaxResults=123,
NextToken='string',
Filters=[
{
'Key': 'description'|'name'|'tag-key'|'tag-value'|'primary-region'|'owning-service'|'all',
'Values': [
'string',
]
},
],
SortOrder='asc'|'desc'
)
现在,如果您希望使用具有特定值的标签来获取秘密,那么您可以使用以下语法格式来获取它们。ex 要获取具有特定值/键的秘密,您可以使用以下 Python 命令列出它们
def fetch_secrets_by_tag(tag_key, tag_value, region):
secrets_manager_client = boto3.client('secretsmanager', region_name=region)
listSecretJSON = secrets_manager_client.list_secrets(
Filters=[
{
'Key': 'tag-value',
'Values': [
tag_value,
]
},
]
)
matching_secrets = []
for secret in listSecretJSON['SecretList']:
matching_secrets.append(secret['Name'])
来源: