Especificando a Arquitetura de Computação na Qual Executar Funções

Saiba mais sobre como especificar a arquitetura do processador na qual executar uma função com o OCI Functions.

Ao implantar uma função no OCI Functions, você pode especificar a arquitetura do processador das instâncias de computação nas quais deseja executar a função. Você pode limitar a função a ser executada em uma única arquitetura (como Arm) ou pode permitir que a função seja executada em várias arquiteturas (como Arm e x86).

Há três etapas para especificar a arquitetura do processador na qual uma função será executada:

Dependendo de como você optar por criar funções usando o OCI Functions, poderá concluir e combinar essas etapas de várias maneiras diferentes. Por exemplo:

  • Você pode usar a Console para criar um aplicativo com a forma apropriada primeiro e, em seguida, usar o comando fn deploy da CLI do Fn Project para criar e implantar a função (que cria automaticamente uma imagem adequada contendo as dependências necessárias).
  • Você pode usar um comando do Docker para criar uma imagem contendo as dependências necessárias primeiro, usar a CLI do OCI para criar um aplicativo com a forma apropriada e, em seguida, usar a Console para criar uma função no aplicativo com base na imagem.

Selecionando uma Forma de Aplicativo de Arquitetura Única ou de Várias Arquiteturas na qual uma Função será executada

Descubra como selecionar a forma de um aplicativo influencia a arquitetura do processador das instâncias de computação nas quais as funções são executadas com o OCI Functions.

Ao definir um aplicativo no OCI Functions, você seleciona a arquitetura do processador das instâncias de computação nas quais as funções serão implantadas e executadas no aplicativo. Todas as funções no aplicativo são implantadas e executadas em instâncias de computação com a mesma arquitetura.

Você especifica a arquitetura da instância de computação na qual deseja executar funções em um aplicativo selecionando uma forma para o aplicativo da seguinte forma:

  • Se você sempre quiser que as funções no aplicativo sejam executadas em instâncias de computação com uma arquitetura baseada em Arm, selecione a forma Generic_ARM. Se você selecionar essa única forma de arquitetura para o aplicativo, a imagem de cada função deverá conter as dependências necessárias para a arquitetura Arm (em uma única imagem de arquitetura ou em uma imagem de várias arquiteturas).
  • Se você sempre quiser que as funções no aplicativo sejam executadas em instâncias de computação com uma arquitetura baseada em x86, selecione a forma Generic_X86. Se você selecionar essa forma de arquitetura única para o aplicativo, a imagem de cada função deverá conter as dependências necessárias para a arquitetura x86 (em uma única imagem de arquitetura ou em uma imagem de várias arquiteturas).
  • Se você quiser que as funções sejam executadas em instâncias de computação com qualquer arquitetura que tenha capacidade suficiente, selecione a forma Generic_X86_ARM. Nesse caso, o OCI Functions seleciona a arquitetura na qual executar funções com base na capacidade disponível. Se você selecionar essa forma de várias arquiteturas para o aplicativo, a imagem de cada função deverá conter as dependências necessárias para a arquitetura Arm e a arquitetura x86 (em uma imagem de várias arquiteturas).

Quando você cria uma função em um aplicativo, a imagem na qual a função se baseia deve incluir as dependências necessárias para a forma do aplicativo:

  • Se você selecionar uma única forma de arquitetura para o aplicativo, a imagem da função deverá conter as dependências necessárias para a arquitetura correspondente (em uma única imagem de arquitetura ou em uma imagem de várias arquiteturas).
  • Se você selecionar uma forma de várias arquiteturas para o aplicativo, a imagem da função deverá conter as dependências necessárias para ambas as arquiteturas (em uma imagem de várias arquiteturas).

Para usar a mesma imagem para implantar e executar uma função em várias arquiteturas diferentes, você usa uma imagem de várias arquiteturas (também conhecida como lista de manifestos ou como uma "imagem de vários arquivos"). Você cria imagens de várias arquiteturas a partir de uma única árvore de origem, com uma tag de imagem que inclui imagens para arquiteturas x86 e Arm.

Se você usar o comando fn -v deploy --app <app-name> da CLI do Fn Project para criar uma função e suas dependências como uma imagem do Docker, a imagem será criada com as dependências necessárias para a forma do aplicativo. Se o aplicativo tiver uma forma de várias arquiteturas, a imagem da função será criada como uma imagem de várias arquiteturas. Você também pode criar imagens de várias arquiteturas usando o Docker Buildx e o Podman. Se você usar uma ferramenta diferente da CLI do Fn Project para criar uma imagem de várias arquiteturas, será sua responsabilidade verificar se a imagem é compatível com a forma do aplicativo.

Quando você seleciona uma forma de várias arquiteturas para um aplicativo, o OCI Functions avalia a capacidade disponível e determina a arquitetura na qual implantar e executar funções de acordo. Como uma função pode ser implantada em diferentes arquiteturas, ela deve ser baseada em uma imagem de várias arquiteturas. É sua responsabilidade verificar se uma função baseada em uma imagem de várias arquiteturas pode ser chamada com sucesso nas arquiteturas x86 e Arm. Para permitir que você faça isso, recomendamos que, além de criar tal função em um aplicativo com uma forma de arquitetura múltipla, você também crie funções com base em uma imagem de arquitetura múltipla em aplicativos com formas de arquitetura única. Para ajudar na depuração, a Oracle também recomenda que os logs de uma função incluam detalhes da arquitetura da instância de computação na qual a função está sendo executada.

Depois de criar um aplicativo, observe que você não pode alterar subsequentemente a forma do aplicativo. Se você quiser que uma função específica seja executada em uma arquitetura diferente, crie a função em um aplicativo diferente (crie um novo aplicativo, se necessário) e forneça a imagem de arquitetura única ou de várias arquiteturas apropriada. Por exemplo:

  • Se você selecionar uma única forma de arquitetura (Arm ou x86) para um aplicativo, mas quiser que uma função específica seja executada em outra arquitetura, crie a função em outro aplicativo que tenha a forma de arquitetura apropriada.
  • Se você selecionar uma forma de várias arquiteturas para um aplicativo, mas quiser que uma função específica seja sempre executada em uma arquitetura específica, crie a função em um aplicativo diferente que tenha a forma de arquitetura única apropriada.
  • Se você selecionar uma única forma de arquitetura (Arm ou x86) para o aplicativo, mas quiser que uma função específica seja executada em qualquer instância de computação, independentemente da arquitetura, crie a função em outro aplicativo que tenha uma forma de várias arquiteturas.

Construindo Imagens de Multi-Arquitetura (Multi-Arch)

Descubra como criar imagens de várias arquiteturas para funções em aplicativos que têm formas de várias arquiteturas.

Você pode criar imagens de várias arquiteturas de diferentes maneiras, incluindo:

Você pode criar funções com base em uma imagem de várias arquiteturas em aplicativos que têm uma forma de várias arquiteturas e em aplicativos que têm uma única forma de arquitetura, desde que a imagem de várias arquiteturas inclua as dependências necessárias (imagens filhas) para a forma do aplicativo.

Observação

Observe que, no ambiente de desenvolvimento do Cloud Shell, o OCI Functions não suporta a criação e a implantação de funções com base em imagens de várias arquiteturas, nem aplicativos com formas de várias arquiteturas. Além disso, a arquitetura da sessão do Cloud Shell deve ser igual à arquitetura do aplicativo (para obter mais informações sobre como selecionar a arquitetura da sessão do Cloud Shell, consulte Arquitetura do Cloud Shell).

Usando a CLI do Fn Project para criar uma imagem de várias arquiteturas (recomendado)

Você pode usar a CLI do Fn Project para criar uma imagem de várias arquiteturas ao implantar uma função em um aplicativo com uma forma de várias arquiteturas:

  1. Acesse o ambiente de desenvolvimento como desenvolvedor de funções.
  2. Se um aplicativo adequado com uma forma de arquitetura múltipla na qual criar a função ainda não existir, crie esse aplicativo agora. Consulte Criando Aplicativos.
  3. Se você ainda não tiver inicializado a função, siga as instruções em Usando Comandos da CLI do Fn Project para inicializar a função agora.
  4. No diretório da função, informe o seguinte comando do Fn Project para construir a função e suas dependências como uma imagem de várias arquiteturas do Docker, submeter a imagem ao registro Docker especificado e implantar a função no OCI Functions:
    fn -v deploy --app <app-name>

    em que <app-name> é o nome do aplicativo com a forma de várias arquiteturas, na qual você deseja criar a função.

    A imagem de várias arquiteturas é criada e inclui as dependências necessárias para as arquiteturas especificadas pela forma de várias arquiteturas do aplicativo.

Usando o plug-in buildx do Docker para criar uma imagem com várias arquiteturas

Pré-requisito: Para poder usar o plug-in buildx do Docker, faça download do plug-in e instale-o. Para obter instruções de download e instalação, consulte a documentação do Docker buildx no github.

Depois de fazer download e instalar o plug-in buildx do Docker, você pode usar o plug-in para criar uma imagem de várias arquiteturas na qual basear uma função a ser implantada em um aplicativo com uma forma única ou de várias arquiteturas. Para obter mais informações sobre o uso do plug-in buildx do Docker, consulte a documentação do buildx do Docker no github.

Por exemplo, você pode criar uma imagem de várias arquiteturas para uma imagem hello-world do Python da seguinte forma:

  1. Acesse o ambiente de desenvolvimento como desenvolvedor de funções.
  2. Em uma janela de terminal, crie um diretório no qual armazenar funções. Por exemplo:
    mkdir helloworld-python-dir
  3. Altere o diretório para o diretório recém-criado. Por exemplo:
    cd helloworld-python-dir
  4. Crie uma função helloworld Python digitando:
    fn init --runtime python helloworld-func

    Um diretório chamado helloworld-func é criado, contendo:

    • func.yaml: O arquivo de definição de função, contendo o volume mínimo de informações necessárias para construir e executar a função. Consulte a documentação do Fn Project para saber mais sobre os parâmetros adicionais que você pode incluir em um arquivo func.yaml.
    • requirements.txt: Uma lista de bibliotecas Python necessárias.
    • func.py: O arquivo de função real.
  5. Crie um novo arquivo chamado Dockerfile no mesmo diretório.

    Observe que você deve nomear o arquivo como Dockerfile .

  6. Abra o arquivo chamado Dockerfile em um editor de sua escolha e adicione as seguintes linhas:
    FROM fnproject/python:3.6-dev as build-stage
    WORKDIR /function
    ADD requirements.txt /function/
     
    RUN pip3 install --target /python/  --no-cache --no-cache-dir -r requirements.txt &&\
      rm -fr ~/.cache/pip /tmp* requirements.txt func.yaml Dockerfile .venv &&\
      chmod -R o+r /python
    ADD . /function/
    RUN rm -fr /function/.pip_cache
     
    FROM fnproject/python:3.6
    WORKDIR /function
    COPY --from=build-stage /python /python
    COPY --from=build-stage /function /function
    RUN chmod -R o+r /function
    ENV PYTHONPATH=/function:/python
    ENTRYPOINT ["/python/bin/fdk", "/function/func.py", "handler"]
  7. Salve o arquivo chamado Dockerfile. Agora você pode usar o arquivo Dockerfile como um Dockerfile personalizado.
  8. No arquivo func.yaml, altere o valor do parâmetro runtime: para runtime: docker.

    Por exemplo, altere:

    schema_version: 20180708
    name: helloworld-func
    version: 0.0.1
    runtime: python
    build_image: fnproject/python:3.9-dev
    run_image: fnproject/python:3.9
    entrypoint: /python/bin/fdk /function/func.py handler
    memory: 256

    para:

    schema_version: 20180708
    name: helloworld-func
    version: 0.0.1
    runtime: docker
    build_image: fnproject/python:3.9-dev
    run_image: fnproject/python:3.9
    entrypoint: /python/bin/fdk /function/func.py handler
    memory: 256
  9. Use o comando docker buildx para criar x86 e imagens baseadas em Arm e gerar uma imagem de várias arquiteturas a partir delas, digitando:
    docker buildx build --push --platform <platform1,platform2,..> --tag <manifest_name> <dockerfile_path>

    Por exemplo:

    docker buildx build --push --platform linux/arm64/v8,linux/amd64 --tag my-manifest-name:1.0.0-SNAPSHOT-X86-ARM .
  10. Envie a imagem de várias arquiteturas para o Oracle Cloud Infrastructure Registry. Por exemplo, informando:
    docker manifest push my-manifest-name:1.0.0-SNAPSHOT-X86-ARM

    Agora você pode basear uma função na imagem de várias arquiteturas.

  11. (Opcional) Crie uma nova função e defina a propriedade Image da função como o nome da imagem de várias arquiteturas. Por exemplo:
    • Ao usar a Console, especifique my-manifest-name:1.0.0-SNAPSHOT-X86-ARM no campo Imagem.
    • Ao usar a CLI do Fn Project, especifique my-manifest-name:1.0.0-SNAPSHOT-X86-ARM como o valor do argumento de imagem. Por exemplo:
      fn create function acmeapp acme-func phx.ocir.io/ansh81vru1zp/acme-repo/my-manifest-name:1.0.0-SNAPSHOT-X86-ARM

Criando Imagens de Arquitetura Única

Descubra como criar imagens de arquitetura única para funções em aplicativos que têm formas de arquitetura únicas.

Você pode criar imagens de arquitetura única de diferentes maneiras, incluindo:

Ao criar uma função com base em uma única imagem de arquitetura, você deve criar a função em um aplicativo que tenha uma forma de arquitetura única compatível.

Usando a CLI do Fn Project para criar uma única imagem de arquitetura

Você pode usar a CLI do Fn Project para criar uma única imagem de arquitetura ao implantar uma função em um aplicativo com uma única forma de arquitetura:

  1. Acesse o ambiente de desenvolvimento como desenvolvedor de funções.
  2. Se um aplicativo adequado com uma única forma de arquitetura na qual criar a função ainda não existir, crie esse aplicativo agora. Consulte Criando Aplicativos.
  3. Se você ainda não tiver inicializado a função, siga as instruções em Usando Comandos da CLI do Fn Project para inicializar a função agora.
  4. No diretório da função, informe o seguinte comando do Fn Project para construir a função e suas dependências como uma única imagem de arquitetura, submeter a imagem ao registro Docker especificado e implantar a função no OCI Functions:
    fn -v deploy --app <app-name>

    em que <app-name> é o nome do aplicativo com a forma de arquitetura única, na qual você deseja criar a função.

    A imagem de arquitetura única é criada e inclui as dependências necessárias para a arquitetura especificada pela forma de arquitetura única do aplicativo.

Usando o comando build do Docker para criar uma única imagem de arquitetura

Você pode usar o comando build do Docker para criar uma única imagem de arquitetura na qual basear uma função que deseja implantar em um aplicativo com uma única forma de arquitetura. Para obter mais informações, consulte o comando docker build na documentação do Docker.

Observe que quando você usa o comando de build do Docker para criar uma imagem, a imagem inclui as dependências necessárias para a arquitetura da plataforma atual na qual você executa o comando. Portanto, se você executar o comando de build do Docker em uma plataforma AMD (uma arquitetura x86), a imagem incluirá as dependências necessárias para a arquitetura x86. Se você quiser criar uma única imagem de arquitetura para uma arquitetura diferente da plataforma atual, use o plug-in buildx do Docker e especifique a arquitetura de destino único como o valor do argumento --platform. Consulte Usando o plug-in buildx do Docker para criar uma imagem com várias arquiteturas.