`aws Secretsmanager list-secrets` 命令返回机密并按标签过滤它们

问题描述 投票:0回答:2

如何调用

aws secretsmanager list-secrets
命令并按标签过滤机密?我在这里没有看到这样的示例:https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/list-secrets.html

此外,亚马逊的文档似乎是错误的。该页面上写着

--max-items
,但实际上应该是
--max-results
。此外,该 wiki 页面上也没有提及如何进行过滤。

amazon-web-services aws-cli aws-secrets-manager
2个回答
18
投票

[原件: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'])
    

0
投票
以下是请求语法格式

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'])
来源:

列出秘密

© www.soinside.com 2019 - 2024. All rights reserved.