我们在使用使用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秒。
验证成功。