You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何过滤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

火山引擎 最新活动