Gestão de dependências
O FunctionGraph permite gerenciar dependências de maneira unificada. Você pode carregar dependências de um caminho local ou por meio do OBS, se elas forem muito grandes, e especificar nomes para elas.
Para obter detalhes, consulte Como posso criar dependências de função?
- O nome de cada arquivo no pacote de dependência não pode terminar com um til (~).
- Um pacote de dependência pode conter até 30.000 arquivos.
- Se sua dependência privada for grande, é aconselhável definir o tempo de execução da função para um valor grande.
Criação de uma dependência
- Entre ao console do FunctionGraph, e escolha Functions > Dependencies no painel de navegação.
- Clique em Create Dependency.
- Defina os seguintes parâmetros:
- Name: Digite um nome de dependência.
- Runtime: Selecione um tempo de execução.
- Description: Insira uma descrição para a dependência. Este parâmetro é opcional.
- Upload Mode: Carregue um arquivo ZIP ou carregue um arquivo do OBS.
- Clique em OK.
Configuração de dependências para uma Função
- Faça login no console do FunctionGraph e escolha Functions > Function List no painel de navegação.
- Clique no nome da função desejada.
- Na página de detalhes da função exibida, clique na guia Code, clique em Add na área Dependencies.
- Na caixa de diálogo Select Dependency exibida, selecione dependências e clique em OK.
- Você pode adicionar um máximo de 20 dependências para uma função.
- Exceto suas dependências privadas, o FunctionGraph fornece algumas dependências públicas, que você pode escolher ao criar uma função.
Exclusão de uma dependência
- Entre ao console do FunctionGraph, e escolha Functions > Dependencies no painel de navegação.
- Click Delete in the Operation column of the target dependency.
- Clique em Sim.
Dependências referenciadas por funções não podem ser excluídas.
O FunctionGraph oferece suporte a bibliotecas padrão e de terceiros.
- Bibliotecas padrão
Ao usar bibliotecas padrão, você pode importá-las para seu código ou pacote embutido e enviá-las para FunctionGraph.
- Bibliotecas não-padrão suportadas
O FunctionGraph fornece componentes de terceiros integrados listados em Tabela 1 e Tabela 2. Você pode importar essas bibliotecas para o código embutido da mesma maneira que importa bibliotecas padrão.
Tabela 1 Componentes de terceiros integrados com o runtime do Node.js Nome
Uso
Versão
q
Encapsulamento assíncrono do método
1.5.1
co
Controle assíncrono do processo
4.6.0
lodash
Biblioteca de ferramentas e métodos comuns
4.17.10
esdk-obs-nodejs
SDK do OBS
2.1.5
express
Framework simplificado de desenvolvimento de aplicativos baseado na web
4.16.4
fgs-express
Fornece uma estrutura de aplicativos Node.js para FunctionGraph e API Gateway para executar aplicativos sem servidor e as API de REST. Este componente fornece um exemplo do uso da estrutura Express para criar aplicativos ou serviços da web sem servidor e as API de RESTful.
1.0.1
request
Simplifica a invocação HTTP e suporta HTTPS e redirecionamento.
2.88.0
Tabela 2 Bibliotecas não-padrão suportadas pelo tempo de execução do Python Módulo
Uso
Versão
dateutil
Processamento de data e hora
2.6.0
requests
Biblioteca HTTP
2.7.0
httplib2
Cliente HTTP
0.10.3
numpy
Computação matemática
1.13.1
redis
Cliente Redis
2.10.5
obsclient
Cliente de OBS
-
smnsdk
Acesso a SMN
1.0.1
- Outras bibliotecas de terceiros (O FunctionGraph não tem bibliotecas internas de terceiros não padrão, exceto as listadas na tabela anterior.)
Para usar funções de bibliotecas de terceiros, empacote essas bibliotecas e carregue-as em um intervalo OBS especificado e cole o URL do link OBS dessas bibliotecas ao criar uma função.
Importing Dependent Libraries
O código para processamento de imagens é o seguinte:
# -*- 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 = 'your 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'
Para bibliotecas padrão e bibliotecas não-padrão suportadas, você pode usá-las diretamente em sua função.
Para bibliotecas de terceiros não padrão que não são fornecidas pelo FunctionGraph você pode usá-las executando as seguintes etapas:
- Empacote as bibliotecas dependentes em um arquivo ZIP, faça o upload do arquivo ZIP em um bucket do OBS e obtenha o URL do link do OBS.
- Entre ao console do FunctionGraph, e escolha Functions > Dependencies no painel de navegação.
- Clique em Create Dependency.
- Defina o nome da dependência e o tempo de execução, especifique a URL do link do OBS e clique em OK.
Para obter detalhes sobre como obter a URL do link OBS, consulte Acesso de um objeto por usar seu URL. (A figura a seguir é apenas para referência. Use o URL real do pacote de arquivos carregado.)Figura 1 Obtenção do URL do link do OBS
Figura 2 Configuração da dependência
- Na página Detalhes da função, clique na guia Code, clique em Add na área Dependencies, selecione a dependência criada em 4 (consulte Figura 3), e clique em OK.
- Clique em Save.
Cada pacote de dependência não pode conter um arquivo com o mesmo nome de um arquivo de código. Caso contrário, os dois arquivos podem ser mesclados ou substituídos incorretamente. Por exemplo, se o pacote de dependência depends.zip contém um arquivo chamado index.py, o manipulador de uma função não pode ser definido como index.handler. Caso contrário, um arquivo de código também chamado index.py será gerado.