如何过滤AWS账号内亚马逊官方拥有的公共EC2快照?
过滤AWS EC2快照中的亚马逊官方公共快照
我懂你的痛点——当前代码会把AWS官方托管的公共快照也纳入检查范围,但这些快照根本不属于你的账号,完全不需要处理。解决这个问题的关键是只针对你自己账号拥有的快照进行标签校验,我们可以通过快照的owner_id属性来实现过滤。
核心思路
每个EC2快照对象都包含owner_id字段,这个值对应快照所属的AWS账号ID:
- 你自己账号的快照,
owner_id就是你的AWS账号ID(字符串形式,比如123456789012) - AWS官方的公共快照,
owner_id通常是amazon或者特定的AWS官方账号ID
我们只需要在遍历快照的第一步,过滤掉非本账号的快照即可。
修改后的完整代码
首先定义你的AWS账号ID,然后在循环中加入过滤逻辑:
# 替换成你的AWS账号ID(可以从AWS控制台或aws sts get-caller-identity命令获取) MY_AWS_ACCOUNT_ID = "your-aws-account-id-here" # 如果需要检查多个关联账号,改成列表形式:ALLOWED_ACCOUNT_IDS = ["id1", "id2"] # 优化后的辅助函数(统一支持实例和快照) def has_costreference_tag(resource): # 检查资源是否存在CostReference标签 if resource.tags is None: print("[INFO]: No Tags have been set yet:") return False for tag in resource.tags: if tag['Key'] == 'CostReference': return True return False def get_costreference_value(resource): # 获取CostReference标签的值,不存在则返回None for tag in resource.tags: if tag['Key'] == "CostReference": return str(tag['Value']) return None # 主遍历逻辑(加入账号过滤) count_snapshot = 0 missingtagginginfo = "" for snapshot in snapshots: # 第一步:过滤非本账号的快照(包括AWS官方公共快照) if snapshot.owner_id != MY_AWS_ACCOUNT_ID: # 如果是多账号场景,改成:if snapshot.owner_id not in ALLOWED_ACCOUNT_IDS: continue # 原有的标签校验逻辑 if not has_costreference_tag(snapshot): print(f"[SNAPSHOT] {snapshot}") print("[INFO]: No CostReferenceTag!! \n") missingtagginginfo += f"{snapshot}: No CostReferenceTag\n" count_snapshot += 1 continue costreference_value = get_costreference_value(snapshot) if costreference_value not in managedpsp: print(f"[SNAPSHOT] {snapshot}") print(f"[INFO]: The PSP: {costreference_value} of: {snapshot} is WRONG! \n") missingtagginginfo += f"{snapshot} {costreference_value}: Wrong PSP\n" count_snapshot += 1 print(count_snapshot)
额外说明
- 获取AWS账号ID的方式:
- 登录AWS控制台,右上角点击你的账号名称,查看账号ID
- 使用AWS CLI执行命令:
aws sts get-caller-identity,返回结果中的Account字段就是你的账号ID
- 多账号场景适配:如果需要检查多个关联账号的快照,只需把
MY_AWS_ACCOUNT_ID改成账号ID列表,然后判断snapshot.owner_id in ALLOWED_ACCOUNT_IDS即可 - 辅助函数优化:我把原函数名改成了更清晰的命名,并且将返回值
False调整为None(更符合“没有值”的语义),同时让函数同时支持EC2实例和快照对象(因为两者的标签结构一致)
内容的提问来源于stack exchange,提问作者Lukas Scholz




