Estos contenidos se han traducido de forma automática para su comodidad, pero Huawei Cloud no garantiza la exactitud de estos. Para consultar los contenidos originales, acceda a la versión en inglés.
Centro de ayuda/ FunctionGraph/ Guía del usuario/ Gestión de dependencias
Actualización más reciente 2022-11-07 GMT+08:00

Gestión de dependencias

FunctionGraph le permite gestionar la dependencias de manera unificada. Puede cargar dependencias desde una ruta local o a través de OBS si son demasiado grandes, y especificar nombres para ellas.

Para obtener más información, consulte ¿Cómo puedo crear dependencias de función?

  • El nombre de cada archivo en el paquete de dependencias no puede terminar con una tilde (~).
  • Un paquete de dependencias puede contener hasta archivos 30,000.
  • Si su dependencia privada es grande, se recomienda establecer el tiempo de ejecución de la función en un valor grande.

Creación de una dependencia

  1. Inicie sesión en la consola FunctionGraph y elija Functions > Dependencies en el panel de navegación.
  2. Haga clic en Create Dependency.
  3. Establezca los siguientes parámetros:

    • Name: Introduzca un nombre de dependencia.
    • Runtime: seleccione un tiempo de ejecución.
    • Description: Introduzca una descripción para la dependencia. Este parámetro es por elección.
    • Upload Mode: Sube un archivo ZIP o sube un archivo desde OBS.

  4. Haga clic en OK.

Configuración de dependencias para una función

  1. Inicie sesión en la consola FunctionGraph y seleccione Functions > Function List en el panel de navegación.
  2. Haga clic en el nombre de la función deseada.
  3. En la página de detalles de función mostrada, haga clic en la ficha Code y haga clic en Add en el área Dependencies.
  4. En el cuadro de diálogo Select Dependency que se muestra, seleccione dependencias y haga clic en OK.

    • Puede agregar un máximo de 20 dependencias para una función.
    • Excepto sus dependencias privadas, el FunctionGraph proporciona algunas dependencias comunes, que puede elegir al crear una función.

  5. Después de configurar las dependencias, haga clic en Save en la esquina superior derecha.

Eliminación de una dependencia

  1. Inicie sesión en la consola FunctionGraph y elija Functions > Dependencies en el panel de navegación.
  2. Haga clic en Delete en la columna Operation de la dependencia de destino.
  3. En el cuadro de diálogo Delete Dependency, haga clic en Yes.

    Las dependencias a las que hacen referencia las funciones no se pueden eliminar.

Bibliotecas dependientes

Bibliotecas dependientes admitidas

FunctionGraph es compatible con bibliotecas estándar y de terceros.

  • Bibliotecas estándar

    Si utiliza bibliotecas estándar, puede importarlas a su código o paquete en línea y subirlas a FunctionGraph.

  • Bibliotecas no estándar admitidas

    FunctionGraph ofrece componentes integrados de terceros enumerados en Tabla 1 y Tabla 2. Puede importar estas bibliotecas al código en línea de la misma manera que importa bibliotecas estándar.

    Tabla 1 Componentes de terceros integrados con el tiempo de ejecución de Node.js

    Nombre

    Uso

    Versión

    q

    Encapsulación de método asincrónico

    1.5.1

    co

    Control de proceso asincrónico

    4.6.0

    lodash

    Biblioteca común de herramientas y métodos

    4.17.10

    esdk-obs-nodejs

    SDK de OBS

    2.1.5

    express

    Marco de desarrollo de aplicaciones basado en web simplificado

    4.16.4

    fgs-express

    Proporciona un marco de aplicación Node.js para FunctionGraph y API Gateway para ejecutar aplicaciones sin servidor y las REST API. Este componente proporciona un ejemplo del uso del framework Express para crear aplicaciones o servicios web sin servidor y API RESTful.

    1.0.1

    request

    Simplifica la invocación de HTTP y admite HTTPS y redirección.

    2.88.0

    Tabla 2 Bibliotecas no estándar soportadas por el tiempo de ejecución de Python

    Módulo

    Uso

    Versión

    dateutil

    Fecha y hora de procesamiento

    2.6.0

    requests

    Biblioteca de HTTP

    2.7.0

    httplib2

    Cliente de HTTP

    0.10.3

    numpy

    Cómputo matemática

    1.13.1

    redis

    Cliente de Redis

    2.10.5

    obsclient

    Cliente de OBS

    -

    smnsdk

    Acceso de SMN

    1.0.1

  • Otras bibliotecas de terceros (FunctionGraph no tiene bibliotecas integradas de terceros no estándar, excepto las enumeradas en la tabla anterior.)

    Para usar funciones de bibliotecas de terceros, empaquete estas bibliotecas y cárguelas en un bucket OBS especificado, y pegue la URL de enlace OBS de estas bibliotecas al crear una función.

Importación de bibliotecas dependientes

El código para procesar imágenes es el siguiente:

# -*- 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 = 'china'
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'

Para las bibliotecas estándar y las bibliotecas no estándar compatibles, puede usarlas directamente en su función.

Para las bibliotecas de terceros no estándar que no son proporcionadas por FunctionGraph puede usarlas siguiendo los siguientes pasos:

  1. Empaquete las bibliotecas dependientes en un archivo ZIP, cargue el archivo ZIP en un bucket OBS y obtenga la URL de enlace OBS.
  2. Inicie sesión en la consola FunctionGraph y elija Functions > Dependencies en el panel de navegación.
  3. Haga clic en Create Dependency.
  4. Establezca el nombre de la dependencia y el tiempo de ejecución, especifique el vínculo OBS y haga clic en OK.
    Para obtener más información sobre cómo obtener la URL de enlace OBS, consulte Acceso a un objeto mediante su URL. (La siguiente figura se incluye solo para referencia. Por favor, utilice la URL real del paquete de archivo subido.)
    Figura 1 Obtención de la URL del enlace OBS
    Figura 2 Establecer la dependencia
  5. En la página de detalles de la función, haga clic en la ficha Code, haga clic en Select junto a Dependencies, seleccione la dependencia creada en 4(ver Figura 3), y haga clic en OK.
    Figura 3 Selección de una dependencia

  6. Haga clic en Save.

    Cada paquete de dependencias no puede contener un archivo con el mismo nombre que un archivo de código. De lo contrario, los dos archivos pueden fusionarse o sobrescribirse incorrectamente. Por ejemplo, si el paquete de dependencias depends.zip contiene un archivo llamado index.py, el controlador de una función no se puede establecer en index.handler. De lo contrario, se generará un archivo de código también llamado index.py.