前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >COS结合SCF的数据复制实践

COS结合SCF的数据复制实践

原创
作者头像
wainsun
发布2020-12-19 18:16:22
9460
发布2020-12-19 18:16:22
举报

我们在使用使用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秒。

验证成功。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档