使用阿里函数计算同步OSS增量对象到COS
在很多客户的对接中,都有增量数据从阿里OSS同步到COS的需求,这里就可以利用到阿里的函数计算来完成。本文以Python 2.7代码为例,给出了阿里函数计算来实现OSS增量数据同步到COS的方法。
一、阿里函数计算
阿里函数计算与腾讯云的SCF类似,都是无服务的执行环境,它支持配置OSS的触发器,借助该功能我们可以把阿里OSS的增量数据同步到COS上。
参考:https://help.aliyun.com/product/50980.html
- 创建服务
在创建函数前,必须先创建一个服务,选定区域,指定服务名称;
参考:https://help.aliyun.com/document_detail/73337.html
- 创建函数
函数是系统调度和运行的单位。函数必须从属于服务,同一个服务下的所有函数共享一些相同的设置,例如服务授权、日志配置。
参考:https://help.aliyun.com/document_detail/73338.html
二、创建并配置OSS触发器
创建OSS的对象存储触发器
,同时配置如下参数:
- Bucket列表:选择对应的OSS Bucket
- 触发事件:选择OSS相关的触发事件,比如所有create事件:
oss.ObjectCreated:*
- 触发规则:填写触发规则的前缀和后缀
角色创建方式:选择快捷创建
,创建的角色为AliyunOSSEventNotificationRole
参考:https://help.aliyun.com/document_detail/74765.html
注意:函数计算和管理的OSS Bucket必须在同一区域!
三、创建代码
阿里函数计算的执行环境里,默认包含了OSS的SDK,这里以Python 2.7环境为示例,展示在阿里函数计算里导入COS Python SDK,并把监听到的增量对象上传到COS里。
1. 创建代码目录
创建一个用于生成函数计算所需python代码的目录。
~ mkdir oss-python-cos
2. 安装cos python sdk
在创建的目录里,使用pip在该目录安装cos-python-sdk-v5。
~ cd oss-python-cos
~ pip install -t . cos-python-sdk-v5
...
3. 编写同步对象代码
如下,创建index.py文件,编写同步对象的代码。
调用OSS的Object流式下载和COS的流式上传接口,无需先下载对象到本地!
注意:函数计算默认的代码文件为index.py,入口函数为:handler()
➜ oss-python-cos cat index.py
# -*- coding: utf-8 -*-
import oss2
import json
from qcloud_cos import CosConfig
from qcloud_cos import CosS3Client
import sys
import logging
def handler(event, context):
"""
Replicate the object from OSS to tecent COS.
event: The OSS event json string. Including oss object uri and other information.
context: The function context, including credential and runtime info.
For detail info, please refer to https://help.aliyun.com/document_detail/56316.html#using-context
"""
logging.basicConfig(level=logging.INFO, stream=sys.stdout)
### Get the OSS object
# Configure with OSS value
endpoint = 'http://oss-cn-shanghai.aliyuncs.com'
auth = oss2.Auth('xxx', 'xxx')
# Parse the event to get the source object info
evt_list = json.loads(event)
evt = evt_list['events'][0]
bucket_name = evt['oss']['bucket']['name']
object_name = evt['oss']['object']['key']
#print "bucket %s, object %s" % (bucket_name, object_name)
oss_bucket = oss2.Bucket(auth, endpoint, bucket_name)
# Get the oss object output stream
try:
output_stream = oss_bucket.get_object(object_name)
except oss2.exceptions.NoSuchKey as e:
print('{0} not found: http_status={1}, request_id={2}'.format(key, e.status, e.request_id))
### Replicate the OSS object to Tencent COS
# Config with COS value
secret_id = 'xxx'
secret_key = 'xxx'
region = 'ap-shanghai'
cos_bucket = "bruins-1253766168"
# Create COS Client
cos_config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key)
cos_client = CosS3Client(cos_config)
# Upload COS object with:
# put_object() - simple upload interface, max object size is 5GB.
# upload_file_from_buffer() - upload file with simple upload or multipart upload automatically.
response = cos_client.put_object(Bucket=cos_bucket, Body=output_stream, Key=object_name)
#response = client.upload_file_from_buffer(Bucket=cos_bucket, Body=output_stream, Key=object_name)
print(response['ETag'])
4. 上传代码
把本地临时目录里的所有文件打包为zip文件,上传代码包到函数计算中,或者通过文件夹直接上传里面的文件;
上传后的函数代码结构如下:
5. 测试代码
在阿里OSS的Bucket上,上传新的Object,然后去COS对应Bucket上确认是否Object复制过来。
附件:
- 洛谷P1420 最长连号
- 各种读入方式速度比较
- 美团NLP实习面试总结一 基本知识4 数据结构二 NLP相关技术1 LSTM2 介绍实体链接与实体映射3 解释随机游走的原理及作用4 命名实体识别
- 【下载】苹果发布Turi Create机器学习框架,5行代码开发图像识别
- codevs 4163 hzwer与逆序对
- ASP.NET Core提供模块化Middleware组件
- CSS预处理器的对比 — sass、less和stylus
- Gensim实现Word2Vec的Skip-Gram模型简介快速上手对语料进行分词使用gensim的word2vec训练模型
- React第三方组件4(状态管理之Reflux的使用②TodoList上)
- 机器学习(六)Sigmoid函数和Softmax函数1 Sigmoid函数2 Softmax函数
- React第三方组件4(状态管理之Reflux的使用①简单使用)
- React第三方组件3(状态管理之Flux的使用⑤异步操作)
- 使用yo-get下载视频网站视频或其
- React多页面应用3(webpack4 多页面实现)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法