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
- Inicie sesión en la consola FunctionGraph y elija Functions > Dependencies en el panel de navegación.
- Haga clic en Create Dependency.
- 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.
- Haga clic en OK.
Configuración de dependencias para una función
- Inicie sesión en la consola FunctionGraph y seleccione Functions > Function List en el panel de navegación.
- Haga clic en el nombre de la función deseada.
- 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.
- 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.
- Después de configurar las dependencias, haga clic en Save en la esquina superior derecha.
Eliminación de una dependencia
- Inicie sesión en la consola FunctionGraph y elija Functions > Dependencies en el panel de navegación.
- Haga clic en Delete en la columna Operation de la dependencia de destino.
- 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.
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:
- Empaquete las bibliotecas dependientes en un archivo ZIP, cargue el archivo ZIP en un bucket OBS y obtenga la URL de enlace OBS.
- Inicie sesión en la consola FunctionGraph y elija Functions > Dependencies en el panel de navegación.
- Haga clic en Create Dependency.
- 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
- 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.
- 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.