Облачная платформаAdvanced

Управление зависимостями

Язык статьи: Русский
Показать оригинал
Страница переведена автоматически и может содержать неточности. Рекомендуем сверяться с английской версией.

FunctionGraph позволяет управлять зависимостями единым способом. Вы можете загружать зависимости из локального пути или через OBS, если они слишком велики, и указывать для них имена.

Создание зависимости

  1. Войдите в консоль FunctionGraph, и выберите Functions > Dependencies в панели навигации.
  2. Нажмите Create Dependency.
  3. Установите следующие параметры:

    • Name: Введите имя зависимости.
    • Runtime: Выберите среду выполнения.
    • Description: Введите описание зависимости. Этот параметр необязателен.
    • Upload Mode: Загрузите ZIP‑файл или загрузите файл из OBS.

  4. Нажмите OK.

Настройка зависимостей для функции

  1. Войдите в консоль FunctionGraph, и выберите Functions > Function List в панели навигации.
  2. Нажмите имя нужной функции.
  3. На отображаемой странице сведений о функции нажмите вкладку Code, нажмите Add в области Dependencies.
  4. В диалоговом окне Select Dependency выберите зависимости и нажмите OK.

    Note
    • Можно добавить максимум 20 зависимостей для функции.
    • Кроме ваших приватных зависимостей, FunctionGraph предоставляет некоторые общие зависимости, которые можно выбрать при создании функции.

  5. После настройки зависимостей нажмите Save в правом верхнем углу.

Удаление зависимости

  1. Войдите в консоль FunctionGraph и выберите Functions > Dependencies в панели навигации.
  2. Нажмите название целевой зависимости, чтобы перейти на страницу Versions.
  3. Нажмите значок delete в строке версии. Повторите эту операцию, если у зависимости несколько версий.

    Note

    Зависимости, на которые ссылаются функции, нельзя удалить.

Зависимые библиотеки

Поддерживаемые зависимые библиотеки

FunctionGraph поддерживает как стандартные, так и сторонние библиотеки.

  • Стандартные библиотеки

    При использовании стандартных библиотек вы можете импортировать их в ваш inline code или пакет и загрузить их в FunctionGraph.

  • Поддерживаемые нестандартные библиотеки

    FunctionGraph предоставляет встроенные сторонние компоненты, перечисленные в Table 1 и Table 2. Вы можете импортировать эти библиотеки в ваш inline code так же, как импортируете стандартные библиотеки.

    Table 1Сторонние компоненты, интегрированные с Node.js runtime

    Имя

    Использование

    Версия

    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

    Table 2 Нестандартные библиотеки, поддерживаемые средой выполнения Python

    Модуль

    Использование

    Версия

    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

  • Другие сторонние библиотеки (FunctionGraph не имеет встроенных нестандартных сторонних библиотек, за исключением перечисленных в предыдущей таблице.)

    Чтобы использовать функции сторонних библиотек, упакуйте эти библиотеки и загрузите их в указанный OBS bucket, а при создании функции вставьте OBS link URL этих библиотек.

Импорт зависимых библиотек

Код для обработки изображений выглядит следующим образом:

# -*- coding: utf-8 -*-
from PIL import Image, ImageEnhance
from com.obs.client.obs_client import ObsClient
import sys
import os
current_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, objName
return bucket, objName
def 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 im
def 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 False
x = (im.size[0] - mark.size[0]) / 2
y = (im.size[1] - mark.size[1]) / 2
layer = 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 False
def 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/" + outFileName
if out:
out = out.convert('RGB')
out.save(outFilePath)
else:
print "Sorry, Save watermarked file Failed."
return outFileName, outFilePath
def handler(event, context):
srcBucket, srcObjName = getObjInfoFromObsEvent(event)
outputBucket = context.getUserData('obs_output_bucket')
client = newObsClient(context)
# download file uploaded by user from obs
localFile = "/tmp/" + srcObjName
downloadFile(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, вы можете использовать их, выполнив следующие шаги:

  1. Упакуйте зависимые библиотеки в ZIP‑файл, загрузите ZIP‑файл в OBS bucket и получите OBS link URL.
  2. Войдите в консоль FunctionGraph и выберите Functions > Dependencies в панели навигации.
  3. нажмите Create Dependency.
  4. Установите имя зависимости и среду выполнения, укажите URL‑ссылку OBS, и нажмите OK.
  5. На странице сведений о функции нажмите вкладку Code, нажмите Add, выберите зависимость, созданную в 4, и нажмите OK.

  6. нажмите Save.
    Warning

    Каждый пакет зависимости не может содержать файл с тем же именем, что и файл кода. В противном случае два файла могут быть некорректно объединены или перезаписаны. Например, если пакет зависимости depends.zip содержит файл с именем index.py, обработчик функции нельзя задать как index.handler. В противном случае будет сгенерирован файл кода с тем же именем index.py.