我正在尝试根据某些标签条件在我的 AWS 中查找资源。我一直在使用
jq
来实现它,但是有没有办法使用 resourcegroupstaggingapi
所以它们提供了一种直接的方法来过滤缺少任何指定标签的资源。
我有 2 个用例,这就是我使用 jq 过滤它们的方式:
aws resourcegroupstaggingapi get-resources --tags-per-page 100 | jq '.ResourceTagMappingList | map(select(.Tags[] | select(.Key == "SV") and select(.Key != "DM")))'
aws resourcegroupstaggingapi get-resources --tags-per-page 100 | jq '.ResourceTagMappingList | map(select(.Tags[] | (.Key | IN("CostCenter", "Environment", "Team",) | not)))'
我尝试在不使用 jq 的情况下做同样的事情:
aws resourcegroupstaggingapi get-resources --tag-filters "Key=SV,Values=*" "Key=DM,Values=NULL"
aws resourcegroupstaggingapi get-resources --tag-filters "Key=CostCenter,Values=" "Key=Environment,Values=" "Key=Team,Values="
但是使用 jq 我可以获得两者的输出,但是如果没有 jq,我只会得到两者的空结果
{
"ResourceTagMappingList": []
}
有人可以检查一下我到底做错了什么吗?任何帮助将不胜感激。谢谢你。
AWS CLI
resourcegroupstaggingapi
确实是为了帮助用户根据标签获取资源而设计的。然而,与 resourcegroupstaggingapi
所能提供的过滤能力相比,jq
的过滤能力有些有限。您可能遇到了其中一些限制。
中的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
进行测试。
正如 VonC 所说,没有办法使用
resourcegroupstaggingapi
来过滤资源,但是对于当 SV 标签存在但 DM 不存在时的第一个用例,jq 查询应该是:
jq '.ResourceTagMappingList | map(select(any(.Tags[]; .Key == "SV") and all(.Tags[]; .Key != "DM")))'
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`])]'