FunctionGraph позволяет управлять зависимостями единым способом. Вы можете загружать зависимости из локального пути или через OBS, если они слишком велики, и указывать для них имена.
Зависимости, на которые ссылаются функции, нельзя удалить.
Поддерживаемые зависимые библиотеки
FunctionGraph поддерживает как стандартные, так и сторонние библиотеки.
При использовании стандартных библиотек вы можете импортировать их в ваш inline code или пакет и загрузить их в FunctionGraph.
FunctionGraph предоставляет встроенные сторонние компоненты, перечисленные в Table 1 и Table 2. Вы можете импортировать эти библиотеки в ваш inline code так же, как импортируете стандартные библиотеки.
Имя | Использование | Версия |
|---|---|---|
q | Асинхронное инкапсулирование методов | 1.5.1 |
co | Асинхронное управление процессом | 4.6.0 |
lodash | Библиотека общих инструментов и методов | 4.17.10 |
esdk-obs-nodejs | OBS SDK | 2.1.5 |
express | Упрощённый фреймворк для разработки веб‑приложений | 4.16.4 |
fgs-express | Предоставляет фреймворк Node.js для FunctionGraph и API Gateway для запуска безсерверных приложений и REST API. Этот компонент предоставляет пример использования фреймворка Express для создания безсерверных веб‑приложений или сервисов и RESTful API. | 1.0.1 |
request | Упрощает вызов HTTP и поддерживает HTTPS и перенаправление. | 2.88.0 |
Модуль | Использование | Версия |
|---|---|---|
dateutil | Обработка даты и времени | 2.6.0 |
requests | HTTP‑библиотека | 2.7.0 |
httplib2 | HTTP‑клиент | 0.10.3 |
numpy | Математические вычисления | 1.13.1 |
redis | Redis client | 2.10.5 |
obsclient | OBS client | - |
smnsdk | SMN access | 1.0.1 |
Чтобы использовать функции сторонних библиотек, упакуйте эти библиотеки и загрузите их в указанный OBS bucket, а при создании функции вставьте OBS link URL этих библиотек.
Импорт зависимых библиотек
Код для обработки изображений выглядит следующим образом:
# -*- coding: utf-8 -*-from PIL import Image, ImageEnhancefrom com.obs.client.obs_client import ObsClientimport sysimport oscurrent_file_path = os.path.dirname(os.path.realpath(__file__))# append current path to search paths, so that we can import some third party libraries.sys.path.append(current_file_path)region = '******'obs_server = 'obs.xxxxxxcloud.com'def newObsClient(context):ak = context.getAccessKey()sk = context.getSecretKey()return ObsClient(access_key_id=ak, secret_access_key=sk, server=obs_server,path_style=True, region=region, ssl_verify=False, max_retry_count=5, timeout=20)def downloadFile(obsClient, bucket, objName, localFile):resp = obsClient.getObject(bucket, objName, localFile)if resp.status < 300:print 'download file', file, 'succeed'else:print('download failed, errorCode: %s, errorMessage: %s, requestId: %s' % resp.errorCode, resp.errorMessage,resp.requestId)def uploadFileToObs(client, bucket, objName, file):resp = client.putFile(bucket, objName, file)if resp.status < 300:print 'upload file', file, 'succeed'else:print('upload failed, errorCode: %s, errorMessage: %s, requestId: %s' % resp.errorCode, resp.errorMessage,resp.requestId)def getObjInfoFromObsEvent(event):s3 = event['Records'][0]['s3']eventName = event['Records'][0]['eventName']bucket = s3['bucket']['name']objName = s3['object']['key']print "*** obsEventName: %s, srcBucketName: %s, objName: %s", eventName, bucket, objNamereturn bucket, objNamedef set_opacity(im, opacity):"""Set the transparency."""if im.mode != "RGBA":im = im.convert('RGBA')else:im = im.copy()alpha = im.split()[3]alpha = ImageEnhance.Brightness(alpha).enhance(opacity)im.putalpha(alpha)return imdef watermark(im, mark, opacity=0.6):"""Add a watermark."""try:if opacity < 1:mark = set_opacity(mark, opacity)if im.mode != 'RGBA':im = im.convert('RGBA')if im.size[0] < mark.size[0] or im.size[1] < mark.size[1]:print "The mark image size is larger size than original image file."return Falsex = (im.size[0] - mark.size[0]) / 2y = (im.size[1] - mark.size[1]) / 2layer = Image.new('RGBA', im.size, )layer.paste(mark, (x, y))return Image.composite(layer, im, layer)except Exception as e:print ">>>>>>>>>>> WaterMark EXCEPTION: " + str(e)return Falsedef watermark_image(localFile, fileName):im = Image.open(localFile)watermark_image_path = os.path.join(current_file_path, "watermark.png")mark = Image.open(watermark_image_path)out = watermark(im, mark)print "**********finish water mark"name = fileName.split('.')outFileName = name[0] + '-watermark.' + name[1]outFilePath = "/tmp/" + outFileNameif out:out = out.convert('RGB')out.save(outFilePath)else:print "Sorry, Save watermarked file Failed."return outFileName, outFilePathdef handler(event, context):srcBucket, srcObjName = getObjInfoFromObsEvent(event)outputBucket = context.getUserData('obs_output_bucket')client = newObsClient(context)# download file uploaded by user from obslocalFile = "/tmp/" + srcObjNamedownloadFile(client, srcBucket, srcObjName, localFile)outFileName, outFile = watermark_image(localFile, srcObjName)# Upload converted files to a new OBS bucket.uploadFileToObs(client, outputBucket, outFileName, outFile)return 'OK'
Для стандартных библиотек и поддерживаемых нестандартных библиотек вы можете использовать их напрямую в своей функции.
Для нестандартных сторонних библиотек, которые не предоставляются FunctionGraph, вы можете использовать их, выполнив следующие шаги:
Каждый пакет зависимости не может содержать файл с тем же именем, что и файл кода. В противном случае два файла могут быть некорректно объединены или перезаписаны. Например, если пакет зависимости depends.zip содержит файл с именем index.py, обработчик функции нельзя задать как index.handler. В противном случае будет сгенерирован файл кода с тем же именем index.py.