Este conteúdo foi traduzido por máquina para sua conveniência e a Huawei Cloud não pode garantir que o conteúdo foi traduzido com precisão. Para exibir o conteúdo original, use o link no canto superior direito para mudar para a página em inglês.
Central de ajuda> FunctionGraph> Guia de usuário> Gestão de dependências
Atualizado em 2022-11-16 GMT+08:00

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

  1. Entre ao console do FunctionGraph, e escolha Functions > Dependencies no painel de navegação.
  2. Clique em Create Dependency.
  3. 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.

  4. Clique em OK.

Configuração de dependências para uma Função

  1. Faça login no console do FunctionGraph e escolha Functions > Function List no painel de navegação.
  2. Clique no nome da função desejada.
  3. Na página de detalhes da função exibida, clique na guia Code, clique em Add na área Dependencies.
  4. 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

  1. Entre ao console do FunctionGraph, e escolha Functions > Dependencies no painel de navegação.
  2. Click Delete in the Operation column of the target dependency.
  3. Clique em Sim.

    Dependências referenciadas por funções não podem ser excluídas.

Bibliotecas dependentes

Supported Dependent Libraries

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:

  1. 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.
  2. Entre ao console do FunctionGraph, e escolha Functions > Dependencies no painel de navegação.
  3. Clique em Create Dependency.
  4. 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
  5. 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.
    Figura 3 Seleção de uma dependência

  6. 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.