如何通过AWS CLI按标签筛选RDS自动数据库快照
AWS CLI筛选带指定标签的RDS自动快照实现方案
你的整体实现思路是对的——因为AWS RDS的describe-db-snapshots接口确实不支持服务端直接按标签过滤,只能先拉取快照列表再逐个校验标签,但你写的两个命令都有语法错误,会直接导致查询结果不符合预期。
原有命令的问题
- 第一个获取快照列表的命令JMESPath语法错误:你把提取ARN的
.DBSnapshotArn写在了过滤方括号的外面,会导致查询语法解析失败;另外直接用2022-06-07这种纯日期字符串和SnapshotCreateTime(带时区的ISO时间戳类型)做比较,会出现类型不匹配的问题,容易漏算/多算快照。 - 第二个校验标签的命令有两个问题:一是
--query参数的单引号没有闭合,二是标签过滤的JMESPath写法完全错误——RDS返回的TagList是Key/Value结构的数组,不是直接把标签键作为对象属性,你写的[?PROD=YES]永远匹配不到结果。
修正后的可落地方案
1. 基础命令修正
首先修正获取指定时间后自动快照ARN的命令,注意时间用带时区的ISO 8601格式,JMESPath表达式写法正确:
aws rds describe-db-snapshots \ --snapshot-type automated \ --region us-east-1 \ --query 'DBSnapshots[?SnapshotCreateTime > `2022-06-07T00:00:00Z`].DBSnapshotArn' \ --output text
修正单个快照的标签校验命令,正确匹配PROD=YES标签,命令返回非空结果即代表标签存在:
aws rds list-tags-for-resource \ --resource-name 替换为实际快照ARN \ --region us-east-1 \ --query 'TagList[?Key == `PROD` && Value == `YES`]' \ --output text
2. 一键筛选脚本(兼容Linux/macOS)
不需要手动逐个校验,直接运行脚本就能自动输出所有满足「创建时间满30天+带PROD=YES标签」的自动快照ARN,脚本会自动计算30天前的时间节点,不需要手动写日期:
# 自动计算30天前的UTC时间戳(Linux环境用这句) CUTOFF_TIME=$(date -u -d "-30 days" +"%Y-%m-%dT%H:%M:%SZ") # macOS环境把上面那句替换成下面这句 # CUTOFF_TIME=$(date -u -v-30d +"%Y-%m-%dT%H:%M:%SZ") # 遍历符合时间要求的快照,筛选带目标标签的资源 for SNAP_ARN in $(aws rds describe-db-snapshots \ --snapshot-type automated \ --region us-east-1 \ --query "DBSnapshots[?SnapshotCreateTime > \`$CUTOFF_TIME\`].DBSnapshotArn" \ --output text); do TAG_MATCH=$(aws rds list-tags-for-resource \ --resource-name $SNAP_ARN \ --region us-east-1 \ --query 'length(TagList[?Key == `PROD` && Value == `YES`])' \ --output text) if [ $TAG_MATCH -gt 0 ]; then echo $SNAP_ARN fi done
如果账号下RDS快照数量较多,脚本运行时间会稍长,这是因为AWS没有提供快照维度的服务端标签过滤能力,必须逐个调用标签查询接口,没有更优的绕过方式。
内容的提问来源于stack exchange,提问作者Alfred
相关产品推荐
相关产品推荐

