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)