使用阿里函數計算同步七牛&OSS資源
阿里雲函數計算(FunctionCompute)是一個事件驅動的全託管計算服務。通過函數計算,您無需管理和維護伺服器,而是專註於業務邏輯的開發。當代碼上傳後,函數計算會為您準備好計算資源,以彈性的、可靠的方式運行您的代碼。更棒的是,您只需要為代碼實際運行消耗的資源付費 - 代碼未運行則不產生費用。
目前有一個需求:用戶上傳到oss的文件後,需要同步到七牛雲存儲。
一,思路
FC服務接收到OSS事件後,拼接地址並調用七牛的「第三方資源抓取」
二,實現
oss event模板:
{n "events": [n {n "eventName": "ObjectCreated:PutObject",n "eventSource": "acs:oss",n "eventTime": "2017-04-21T12:46:37.000Z",n "eventVersion": "1.0",n "oss": {n "bucket": {n "arn": "acs:oss:cn-shanghai:1237050315505689:bucketname",n "name": "bucketname",n "ownerIdentity": "1237050315505689",n "virtualBucket": ""n },n "object": {n "deltaSize": 122539,n "eTag": "688A7BF4F233DC9C88A80BF985AB7329",n "key": "image/a.jpg",n "size": 122539n },n "ossSchemaVersion": "1.0",n "ruleId": "9adac8e253828f4f7c0466d941fa3db81161e853"n },n "region": "cn-shanghai",n "requestParameters": {n "sourceIPAddress": "140.205.128.221"n },n "responseElements": {n "requestId": "58F9FF2D3DF792092E12044C"n },n "userIdentity": {n "principalId": "262561392693583141"n }n }n ]n}n
目錄結構:
.n├── config.jsonn├── libn│ └── qiniu.jsn├── node_modulesn│ └── axiosn├── package.jsonn├── qn_fetch.jsn├── test.jsn└── yarn.locknn3 directories, 6 filesn
qn_fetch.js代碼:
use strict;nnconst Qiniu = require(./lib/qiniu)nconst conf = require(./config)nconst qn = new Qiniu(conf)nnmodule.exports.handler = function (eventBuf, ctx, callback) { n const event = JSON.parse(eventBuf) n const ossEvent = event.events[0]nn let aliOssBucket = ossEvent.oss.bucket.namen let aliOssRegion = "oss-" + ossEvent.regionn let aliOssObject = ossEvent.oss.object.keynn let remoteUrl = `http://${aliOssBucket}.${aliOssRegion}.aliyuncs.com/${aliOssObject}`nn qn.fetch(remoteUrl, aliOssObject, callback)n}n
config.json
{n "bucket":{ n "hd": "insta360-xxxxxxx"n },n "auth": {n "ak": "ak",n "sk": "sk"n }n}n
lib/qiniu.js的:
use strict;nnvar url = require(url)nvar path = require(path)nvar crypto = require(crypto)nvar axios = require(axios)nnmodule.exports = class Qiniu {n constructor(options) {n const defaultOptions = {}n this.options = Object.assign(defaultOptions, options)n }nn hmacSha1(encodedFlags, secretKey) {n let hmac = crypto.createHmac(sha1, secretKey)n hmac.update(encodedFlags)n return hmac.digest(base64)n }nn urlSafeEncode(str) { n return str.replace(///g, _).replace(/+/g, -)n }nn urlSafeBase64Encode(str) {n let buf = new Buffer(str)n return buf.toString(base64).replace(///g, _).replace(/+/g, -)n }nn generateAccessToken(uri, body) {n const auth = this.options.authn let urlPath = url.parse(uri).pathn let access = urlPath + n + bodyn let digest = this.hmacSha1(access, auth.sk) n let safeDigest = this.urlSafeEncode(digest) n return QBox + auth.ak + : + safeDigestn }nn fetch(remoteUrl, ossObject, callback) {n // url根據不同的區域換一下地址n const fetch = http://iovip-z2.qbox.me/fetchn const bucket = this.options.bucket.hdn const encodedURL = this.urlSafeBase64Encode(remoteUrl)n const encodedEntryURI = this.urlSafeBase64Encode(`${bucket}:${ossObject}`)n const api = `${fetch}/${encodedURL}/to/${encodedEntryURI}`n const Authorization = this.generateAccessToken(api, )nn axios({n url: api,n method: post,n headers: {n Authorization: Authorization,n Content-Type: application/x-www-form-urlencodedn }n }).then(function (response) {n callback(null, response.data)n }).catch(function (error) {n callback(error)n })n }n}n
三,效果
上下為阿里雲OSS和七牛雲存儲的文件更新時間,可以看到share/b/6.png的時間幾乎是一秒內完成,還是很給力的~四,函數服務使用
第三方資源抓取
阿里雲函數服務和AWS的lamda比較基本類似,就目前的一些限制而言,不是很適合做 耗時任務 如視頻轉碼(視頻轉碼根據時長、碼率、preset等不同,時間差異非常大),但是就這次的小需求而言,非常合適,完全不需要考慮伺服器問題了,期待後續的表現以及能夠支持更多的event類型~
推薦閱讀:
※阿里雲和網易遊戲該如何選擇?
※《機器學習應用實踐》原作者線上交流會:一起聊聊機器學習哪些事
※阿里雲主機(VPS主機)上搭建Anki伺服器及Anki伺服器搭建方案分析
※雲棲大會Clouder Lab六劍齊發,學技能拿認證模式受熱捧
※阿里雲大學與中科院計算所成立「大數據與智能計算工作委員會」
TAG:阿里云 |