OSS使用函数计算实现数据实时同步方案

实现原理

OSS和函数计算无缝集成,通过为OSS各种类型的事件设置处理函数,当OSS系统捕获到指定类型的事件后,会自动调用函数处理。例如,您可以设置函数来处理PutObject事件,当您调用OSS PutObject API上传图片到bucket后,相关联的函数会自动触发获取该图片实时同步上传到其他的bucket中。
OSS使用函数计算实现数据实时同步方案

准备工作

需要准备的内容有:
开通OSS服务:有对应的AccessKey ID,AccessKey Secret,OSS EndPoint;
授权:需要给函数计算的账号授权OSS的读写权限。

实现方式

我们需要在函数计算上实现的内容有:
1.创建函数计算的服务;
2.创建生成任务的函数,创建OSS触发器;
3.函数计算代码接收到回调后上传到文件到新bucket,完成同步;

实现步骤

1.创建新服务
在函数计算的控制台创建一个服务,可以在创建时进行高级配置,也可以创建后再行设置。
OSS使用函数计算实现数据实时同步方案
高级配置:在高级配置—>权限配置中,如果没有已有角色,需要创建一个新角色,选择AliyunOSSFullAccess,点击授权。
OSS使用函数计算实现数据实时同步方案
登录RAM访问控制 > RAM角色管理,找新创建的角色,点击添加权限,添加AliyunOSSFullAccess、AliyunSTSAssumeRoleAccess、AliyunLogFullAccess权限(如果已经授权,则不要添加)。
2 编写函数
在创建的服务下,创建一个函数,用于生成任务:
新建一个函数:bucket_synvc
函数入口:oss_sync.handler
运行环境:Python3
函数执行内存:512MB(选择最小值128MB已经够用,这个和函数计算的计费相关)
超时时间:600s
函数内容如下,需要用户替换的参数:
OSS账号相关的Bucket、OSS EndPoint(如果bucket同区域可以选择内网)

# -*- coding: utf-8 -*-
import json
import time
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.auth.credentials import StsTokenCredential
from aliyunsdkcore.request import CommonRequest
import oss2
import logging
ossEndPoint = "您的OSS EndPoint"            # oss账号EndPoint,请选择外网访问
remoteEndpoint = "目的bucket Endpoint"   
remoteBucket = "目的bucket" 
def handler(event, context):
    logger = logging.getLogger()
    logger.info(event)
    eventObj = json.loads(event)["events"]
    eventName=eventObj[0]["eventName"]
    bucketName=eventObj[0]["oss"]["bucket"]["name"]
    ossFileName=eventObj[0]["oss"]["object"]["key"]
    logger.info("eventName: %s" % eventName)
    logger.info("bucketName: %s" % bucketName)
    logger.info("ossFileName: %s" % ossFileName)
    appKey = fileTransAppkey
    # create file url
    auth = oss2.StsAuth(creds.accessKeyId, creds.accessKeySecret, creds.securityToken)
    bucket = oss2.Bucket(auth, ossEndPoint, bucketName)
    fileLink = bucket.sign_url('GET', ossFileName, 3600)
    logger.info("file link = " + fileLink)
    # 上传到目的bucket
    bucket1 = oss2.Bucket(auth, remoteEndpoint, remoteBucket)
    input = requests.get('http://www.aliyun.com')
    bucket.put_object(ossFileName, input)    
    logger.info("Sync upload Completed  ")
    

3 配置触发器
说明:由于上传音频文件到OSS的Bucket中,上传方式:Put、Post和分片上传,所以为了能触发所有的上传事件,需要选择所有的事件:
触发器类型:对象存储触发器;
触发器名称:可自定义;
触发事件:分别选择 oss:ObjectCreated:PutObject 和 oss:ObjectCreated:PostObject oss:ObjectCreated:CompleteMultipartUpload触发器;
触发规则:这里不设置匹配整个bucket (根据自己实际情况填写);
后缀:这里不设置匹配整个bucket(根据自己实际情况填写);
角色:如果已有合适角色,可直接选择;如果没有角色,则选择新建角色。
创建结果:
OSS使用函数计算实现数据实时同步方案
创建成功后,可以在OSS控制台对应Bucket的函数计算中找到该触发器。
4日志配置
在函数设置中可以开启日志存储到日志服务,从而查看上传日志信息
OSS使用函数计算实现数据实时同步方案
至此所有配置完成,可在OSS源bucket中上传文件进行测试是否同步到目的bucket。

上一篇:英特尔不再注重新一代芯片的性能提升?


下一篇:基于OSS作为存储实现加速访问和加速上传的方案实现