aws secretsmanager list-secrets 命令返回秘密并按标签过滤它们

red*_*888 2 amazon-web-services aws-cli aws-secrets-manager

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

此外,亚马逊的文档很糟糕。它在该页面上说--max-items 但实际上应该是--max-results。也没有提到如何在该维基页面上进行过滤

jar*_*mod 7

[更新:2021 年 1 月]

在AWS secretsmanager列表秘密命令支持通过过滤--filters选项。

以下是如何使用它来过滤名称为 Production 的机密的示例:

aws secretsmanager list-secrets \
    --filters Key=name,Values=Production
Run Code Online (Sandbox Code Playgroud)

这是一个如何使用它来过滤带有 stage=dev 标签的机密的示例:

aws secretsmanager list-secrets \
    --filters Key=tag-key,Values=stage Key=tag-value,Values=dev
Run Code Online (Sandbox Code Playgroud)

这是一个 boto3 示例,对标签 Name=Production 或 Name=Staging 进行过滤:

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'])
Run Code Online (Sandbox Code Playgroud)

[原件:2019 年 12 月]

您可以使用jq,例如:

aws secretsmanager list-secrets \
    | jq '.SecretList[] | select((.Tags[]|select(.Key=="Name")|.Value) | test("^Production$|^Staging$"))'
Run Code Online (Sandbox Code Playgroud)

您还可以使用 awscli 的内置查询选项,例如:

aws secretsmanager list-secrets \
    --query "SecretList[?Tags[?Key=='Name' && Value=='Production']]"
Run Code Online (Sandbox Code Playgroud)

您可以将布尔测试与 awscli 的内置查询选项一起使用,例如:

aws secretsmanager list-secrets \
    --query "SecretList[?Tags[?Key=='Name' && (Value=='Production' || Value='Staging')]]"
Run Code Online (Sandbox Code Playgroud)

以下是使用 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'])
Run Code Online (Sandbox Code Playgroud)