def scene()

in solution/tools/aliyun_subscribe_actiontrail/index.py [0:0]


def scene(context):
    """
    Params: context 格式
    {
        "accountId":"",
        "eventId:":"",
        "rgId":"",
        "resId":"",
        "resType":"disk"
    }
    场景一:有两个账号:
    1、日志账号,开通事件总线 + 函数计算 + RDS,用于响应事件。
    2、业务账号,开通事件总线,将事件总线消息推到日志账号。

    场景二:有三个账号:
    1、日志账号,开通事件总线 + 函数计算 + RDS,用于响应事件。
    2、资源管理账号,开通资源目录,在资源目录里面统一管理成员账号变更资源组。
    3、业务账号,开通事件总线,将事件总线消息推到日志账号。
    """
    if os.environ.get("AK") is None or os.environ.get("SK") is None or os.environ.get(
            "REGION") is None or os.environ.get("SCENE") is None:
        logger.error("没有配置程序用的AK/SK/Region,请检查环境变量")
        return
    else:
        ak = os.environ.get("AK")
        sk = os.environ.get("SK")

    region_id = os.environ.get("REGION")
    # 1. 先判断幂等
    pk_sql = "insert into pk_eventbridge(eb_id) values(%s)"
    params = (context.get("eventId"))
    if not save_transactional(pk_sql, params):
        logger.error("当前事件%s已处理过,忽略" % (context.get("eventId")))
        return

    # 2. 依据磁盘ID或实例ID查询快照列表
    resId = context.get("resId")

    # 需要判断一下是场景一还是场景二
    scene_type = os.environ.get("SCENE")
    if scene_type is not None and scene_type == "ma":
        # 需要先在MA账号里面AssumeRole到成员账号拿到STS_TOKEN
        resM = ResourceManage(ak, sk, region_id)
        sts_ak, sts_sk, sts_token = resM.AssumeRole(context.get("accountId"))
        ecs = ECS(sts_ak, sts_sk, sts_token, region_id)
    else:
        ecs = ECS(ak, sk, None, region_id)

    # 做多一步判断,如果是disk直接就查快照,如果是ECS实例则需要先查询出磁盘出来
    if context.get("resType") == "instance":
        resp = ecs.ListEcsDiskSnapshot(resId)
    if context.get("resType") == "disk":
        resp = ecs.ListDiskSnapshot(resId)
    if resp is None:
        return
    snap_object = json.loads(resp)
    if len(snap_object["Snapshots"]["Snapshot"]) == 0:
        logger.error("当前账号:%s,磁盘没有快照%s不需要处理,忽略" % (context.get("accountId"), context.get("resId")))
        return

    resources = []
    for item in snap_object["Snapshots"]["Snapshot"]:
        resources.append(
            {"ResourceId": item["SnapshotId"], "RegionId": region_id, "Service": "ecs", "ResourceType": "snapshot"})

    # 3. 批量转组
    ecs.MoveResources(context.get("rgId"), resources)