COS结合SCF的数据复制实践

2020-12-19 18:16:22 浏览数 (1)

我们在使用使用COS上传数据后,会遇到如下场景。

1.上传的数据目录不合适,但是现有代码调整需要发布,临时处理方法可以将A目录的数据复制一份到B目录。

2.上传到BUCKET A的数据,希望实时同步到BUCKET B。

3.目录A的数据作为原始数据,需要私密保存。目录B的数据是经过处理的目录A的数据,可以公开对外。

基于以上几种场景,我们可以使用SCF-COS的方式,通过事件触发,来实现以上功能。具体用法:

1.创建一个SCF函数

起名copyobjects,语言选择python2.7,这是因为下面的函数代码以及COS SDK我们使用python2.7环境实现。

2.写入我们的函数代码

代码语言:javascript复制
# -*- coding: utf8 -*-
# SCF configures the COS trigger, obtains the file uploading information from COS, and downloads it to the local temporary disk 'tmp' of SCF.
# SCF配置COS触发,从COS获取文件上传信息,并下载到SCF的本地临时磁盘tmp
from qcloud_cos_v5 import CosConfig
from qcloud_cos_v5 import CosS3Client
from qcloud_cos_v5 import CosServiceError
from qcloud_cos_v5 import CosClientError
import sys
import logging
logging.basicConfig(level=logging.INFO, stream=sys.stdout)
appid = 1259680000 # Please replace with your APPID. 请替换为您的 APPID
secret_id = u'AKIDXszKUScWAAHL9ggA1e3HFxPbbrXXX' # 请替换为您的 SecretId
secret_key = u'3d1A6FB2FBqFRQ9nRqzsVrwoRxXXXX' # 请替换为您的 SecretKey
region = u'ap-beijing' # Please replace with the region where COS bucket located. 请替换为您bucket 所在的地域
token = ''
config = CosConfig(Secret_id=secret_id, Secret_key=secret_key, Region=region, Token=token)
client = CosS3Client(config)
logger = logging.getLogger()
def main_handler(event, context):
    logger.info("start main handler")
 for record in event['Records']:
 try:
            bucket = record['cos']['cosBucket']['name']   '-'   str(appid)
            key = record['cos']['cosObject']['key']
            key = key.replace('/'   str(appid)   '/'   record['cos']['cosBucket']['name']   '/', '', 1)
            logger.info("Key is "   key)
 # copy object from cos
            logger.info("Get from [%s] to download file [%s]" % (bucket, key))
            download_path = '/tmp/{}'.format(key)
 try:
                response = client.copy(
                    Bucket='wainsunbj-1259681344', #这里是目标bucket
                    Key= key.replace('upload/', '', 1), #这里是目标对象名,我们这里把upload/替换为空,所以是复制到bucket根目录上
                    CopySource={
 'Bucket': bucket, 
 'Key': key, 
 'Region': 'ap-beijing'
                    }
                )
 except CosServiceError as e:
 print(e.get_error_code())
 print(e.get_error_msg())
 print(e.get_resource_location())
 return "Fail"
            logger.info("copy file [%s] Success" % key)
 except Exception as e:
 print(e)
 print('Error copy object {} from bucket {}. '.format(key, bucket))
 raise e
 return "Fail"
 return "Success"

这里几个参数的说明

(1)我们需要输入管理COS的AK和密钥,以及appid信息,这里可以替换成我们自己的。

(2)我们复制对象使用的方法是COS API的objectcopy接口https://cloud.tencent.com/document/product/436/10881

(3)client.copy 方法里写的是目标端的信息。

配置好函数后,我们设置触发事件

注意:如果是相同桶内资源复制,触发事件一定要带上前缀,否则会导致循环触发复制。造成生成大量无用文件。

如果是跨桶复制资源,触发时可以选择根目录触发。

3.完成后测试

我们在upload目录下上传了一个10MB的文件。

看到在根目录同时复制了一个相同文件,耗时大约为1秒。

验证成功。

copyobjects_a288c1f6-ec49-440d-b300-3c908c5f359b.zip

0 人点赞