使用resourcegroupstagingapi CLI 时过滤资源

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

我正在尝试根据某些标签条件在我的 AWS 中查找资源。我一直在使用

jq
来实现它,但是有没有办法使用
resourcegroupstaggingapi
所以它们提供了一种直接的方法来过滤缺少任何指定标签的资源。

我有 2 个用例,这就是我使用 jq 过滤它们的方式:

  1. 当 SV 标签存在但 DM 不存在时:
    aws resourcegroupstaggingapi get-resources --tags-per-page 100 | jq '.ResourceTagMappingList | map(select(.Tags[] | select(.Key == "SV") and select(.Key != "DM")))'
  2. 当 CostCenter、Environment 或 Team 标签不存在时:
    aws resourcegroupstaggingapi get-resources --tags-per-page 100 | jq '.ResourceTagMappingList | map(select(.Tags[] | (.Key | IN("CostCenter", "Environment", "Team",) | not)))'

我尝试在不使用 jq 的情况下做同样的事情:

  1. 当 SV 标签存在但 DM 不存在时:
    aws resourcegroupstaggingapi get-resources --tag-filters "Key=SV,Values=*" "Key=DM,Values=NULL"
  2. 当 CostCenter、Environment 或 Team 标签不存在时:
    aws resourcegroupstaggingapi get-resources --tag-filters "Key=CostCenter,Values=" "Key=Environment,Values=" "Key=Team,Values="

但是使用 jq 我可以获得两者的输出,但是如果没有 jq,我只会得到两者的空结果

{
    "ResourceTagMappingList": []
}

有人可以检查一下我到底做错了什么吗?任何帮助将不胜感激。谢谢你。

amazon-web-services aws-cli jmespath
3个回答
0
投票

AWS CLI

resourcegroupstaggingapi
确实是为了帮助用户根据标签获取资源而设计的。然而,与
resourcegroupstaggingapi
所能提供的过滤能力相比,
jq
的过滤能力有些有限。您可能遇到了其中一些限制。

--tag-filters

中的
resourcegroupstaggingapi
选项用于过滤具有特定值的特定标签的资源,但对于更复杂的条件(例如检查是否缺少某些标签)可能效果不佳。而且我认为您尝试使用的
Values=NULL
Values=
语法不支持表示缺少标签。

鉴于

resourcegroupstaggingapi
的局限性,继续 使用
jq
来满足您的过滤需求可能是谨慎的做法。它是用于此目的的强大工具,并且您已经为您的用例构建了工作命令。

但是,如果您必须使用

jq
,您可以考虑创建AWS Lambda 函数(使用
console.aws.amazon.com/lambda
)来自动执行过滤过程。这将允许您使用 Python 或 Go 等编程语言编写更复杂的逻辑,并且可以按计划或由 AWS 环境中的其他事件触发。

这意味着,您可以使用 AWS 开发工具包之一(例如,Boto3 for Python、AWS SDK for Go)来编写基于标签检索和过滤资源的脚本,而不是使用 CLI。这将为您提供更大的灵活性来实现复杂的逻辑。

在 Lambda 控制台的“执行角色”部分中,选择“创建具有基本 Lambda 权限的新角色”或使用具有必要权限的现有角色。
该角色需要调用

resourcegroupstaggingapi
以及您的函数将与之交互的任何其他 AWS 服务的权限。

# Python code snippet using Boto3
import boto3

def get_filtered_resources():
    client = boto3.client('resourcegroupstaggingapi')
    response = client.get_resources(
        TagFilters=[
            {
                'Key': 'SV',
                'Values': []
            },
        ],
        ResourcesPerPage=100
    )
    filtered_resources = [resource for resource in response['ResourceTagMappingList'] if not any(tag['Key'] == 'DM' for tag in resource['Tags'])]
    return filtered_resources

filtered_resources = get_filtered_resources()

aws lambda invoke --function-name YourFunctionName --payload '{ }' output.txt
进行测试。


0
投票

正如 VonC 所说,没有办法使用

resourcegroupstaggingapi
来过滤资源,但是对于当 SV 标签存在但 DM 不存在时的第一个用例,jq 查询应该是:

jq '.ResourceTagMappingList | map(select(any(.Tags[]; .Key == "SV") and all(.Tags[]; .Key != "DM")))'


0
投票

tag-filters选项似乎不支持否定。作为解决方法,您可以使用

--query
客户端过滤选项。

所以对于条件“当SV标签存在但DM不存在”你可以使用:

$ aws resourcegroupstaggingapi get-resources --tags-per-page 100 --query \
'ResourceTagMappingList[?not_null(Tags[?Key==`SV`]) && !not_null(Tags[?Key==`DM`])]'

对于条件 当 CostCenter、Environment 或 Team 标签不存在时,您可以使用:

$ aws resourcegroupstaggingapi get-resources --tags-per-page 100 --query \
'ResourceTagMappingList[?!not_null(Tags[?Key==`CostCenter`]) || !not_null(Tags[?Key==`Environment`]) || !not_null(Tags[?Key==`Team`])]'
© www.soinside.com 2019 - 2024. All rights reserved.