10分鐘上線 - API網關 + 函數計算實現圖片處理服務

摘要: 阿里雲函數計算服務(FunctionCompute,FC)是一個事件驅動的全託管計算服務。經過函數計算與雲端各個服務的普遍集成,開發者只須要編寫函數代碼,就可以快速地開發出彈性高可用的後端系統。接下來咱們利用 API網關 + FC,來快速實現一個圖片轉換服務。html

點此查看原文:http://click.aliyun.com/m/43686/python

阿里雲函數計算服務(FunctionCompute,FC)是一個事件驅動的全託管計算服務。經過函數計算與雲端各個服務的普遍集成,開發者只須要編寫函數代碼,就可以快速地開發出彈性高可用的後端系統。接下來咱們利用 API網關 + FC,來快速實現一個圖片轉換服務。後端

咱們先從最簡單的 hello word 開始,函數代碼以下:api

def my_handler(event, context):
    return 'hello world'

函數名dom

my_handler須要與建立函數時的」Handler」字段相對應:例如建立函數時指定的 Handler 爲main.my_handler,那麼函數計算會去加載main.py中定義的my_handler函數函數

event 參數阿里雲

event 參數是用戶調用函數時傳入的數據,其類型是str編碼

context 參數code

context 參數中包含一些函數的運行時信息(例如 request id/臨時 AK 等)。其類型是FCContext,具體結構和使用在下面的使用 context介紹orm

返回值

函數的返回值會做爲調用函數的結果返回給用戶,它能夠是任意類型:對於簡單類型會函數計算會把它轉換成 str 返回,對於複雜類型會把它轉換成 JSON 字符串返回

結合API 網關,開發者能夠方便地將本身的函數以 HTTP 的方式提供給別人使用。關於 API 網關和 FC 的交互協議細節,可參考這篇文章。下圖是圖片拼接和選擇服務的效果和代碼示例。當body內容爲二進制時,需在函數計算中對body內容進行Base64編碼,同時設置isBase64Encoded=true。若是body無需Base64編碼,isBase64Encoded能夠設置爲false。API網關會對isBase64Encoded=true的body內容進行Base64解碼後再透出給客戶端。

圖片描述

import base64
import logging
import random

import oss2
from wand.image import Image

TEMPLATE = open('/code/index.html').read()

def my_handler(event, context):
    logger = logging.getLogger()
    logger.info('event: %s', event)

    creds = context.credentials
    auth = oss2.StsAuth(creds.accessKeyId, creds.accessKeySecret, creds.securityToken)
    bucket = oss2.Bucket(auth, 'oss-cn-shanghai-internal.aliyuncs.com', 'rockuw-sh-2')

    fc_obj = bucket.get_object('fc.png')
    py_obj = bucket.get_object('python.png')

    with Image(file=fc_obj) as fc_img:
        with Image(file=py_obj) as py_img:
            img = Image()
            img.blank(fc_img.width + py_img.width + 20, py_img.height)
            img.composite(image=fc_img, left=0, top=0)
            img.composite(image=py_img, left=fc_img.width+20, top=0)
            img.rotate(random.randint(0, 360))
            img_enc = base64.b64encode(img.make_blob(format='png'))

    resp = {
        'isBase64Encoded': False,
        'statusCode': 200,
        'body': TEMPLATE.replace('{fc-py}', img_enc)
    }

    return resp

識別如下二維碼,閱讀更多幹貨 
圖片描述

相關文章
相關標籤/搜索