

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Implantar funções do Lambda com imagens de contêiner
<a name="deploy-lambda-functions-with-container-images"></a>

*Ram Kandaswamy, Amazon Web Services*

## Resumo
<a name="deploy-lambda-functions-with-container-images-summary"></a>

AWS Lambda suporta imagens de contêineres como modelo de implantação. Esse padrão mostra como implantar funções do Lambda por meio de imagens de contêiner. 

O Lambda é um serviço de computação com tecnologia sem servidor e orientado a eventos que você pode usar para executar código para praticamente qualquer tipo de aplicativo ou serviço de backend sem provisionar ou gerenciar servidores. Com o suporte a imagens de contêiner para funções do Lambda, você obtém os benefícios de até 10 GB de armazenamento para o artefato do seu aplicativo e a capacidade de usar ferramentas familiares de desenvolvimento de imagens de contêiner.

O exemplo desse padrão usa Python como linguagem de programação subjacente, mas você pode usar outras linguagens, como Java, Node.js ou Go. Para a fonte, considere um sistema baseado em Git GitHub, como, ou Bitbucket GitLab, ou use o Amazon Simple Storage Service (Amazon S3).

## Pré-requisitos e limitações
<a name="deploy-lambda-functions-with-container-images-prereqs"></a>

**Pré-requisitos **
+ Amazon Elastic Container Registry (Amazon ECR) ativado
+ Código do aplicativo
+ Imagens do Docker com o cliente de interface de runtime e a versão mais recente do Python
+ Conhecimento prático de Git

**Limitações**
+ O tamanho máximo de imagem suportado é 10 GB.
+ O runtime máximo para uma implantação de contêiner baseado em Lambda é de 15 minutos.

## Arquitetura
<a name="deploy-lambda-functions-with-container-images-architecture"></a>

**Arquitetura de destino**

![\[Processo em quatro etapas para criar a função do Lambda.\]](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/images/pattern-img/e421cc58-d33e-493d-b0bb-c3ffe39c2eb9/images/7f36d3d8-d161-497a-b036-26d886a16c69.png)


 

1. Você cria um repositório Git e confirma o código da aplicação nele.

1. O AWS CodeBuild projeto é acionado por alterações de confirmação.

1. O CodeBuild projeto cria a imagem do Docker e publica a imagem criada no Amazon ECR.

1. Você cria a função do Lambda usando a imagem no Amazon ECR.

**Automação e escala**

Esse padrão pode ser automatizado usando AWS CloudFormation AWS Cloud Development Kit (AWS CDK), ou operações de API de um SDK. O Lambda pode ser escalado automaticamente com base no número de solicitações, e você pode ajustá-lo usando os parâmetros de simultaneidade. Para obter mais informações, consulte a[ documentação do Lambda](https://docs.aws.amazon.com/lambda/latest/dg/lambda-concurrency.html).

## Ferramentas
<a name="deploy-lambda-functions-with-container-images-tools"></a>

**Serviços da AWS**
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)Na AWS, CloudFormationhelps você configura AWS recursos, os provisiona de forma rápida e consistente e os gerencia durante todo o ciclo de vida em Contas da AWS e. Regiões da AWS Esse padrão usa o [AWS CloudFormation Application Composer](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/app-composer-for-cloudformation.html), que ajuda você a visualizar e editar CloudFormation modelos visualmente.
+ O [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) é um serviço de compilação totalmente gerenciado que permite compilar o código-fonte, realizar testes de unidade e produzir artefatos preparados para a implantação.
+ O [Amazon Elastic Container Registry (Amazon ECR)](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html) é um serviço gerenciado de registro de imagens de contêineres seguro, escalável e confiável.
+ O [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) é um serviço de computação que ajuda a executar código sem exigir provisionamento ou gerenciamento de servidores. Ele executa o código somente quando necessário e dimensiona automaticamente, assim, você paga apenas pelo tempo de computação usado.

**Outras ferramentas**
+ O [Docker](https://www.docker.com/) é um conjunto de produtos de plataforma como serviço (PaaS) que usam a virtualização no nível do sistema operacional para fornecer software em contêineres.
+ [GitHub](https://docs.github.com/en/repositories/creating-and-managing-repositories/quickstart-for-repositories), [GitLab](https://docs.gitlab.com/ee/user/get_started/get_started_projects.html), e o [Bitbucket](https://support.atlassian.com/bitbucket-cloud/docs/tutorial-learn-bitbucket-with-git/) são alguns dos sistemas de controle de código-fonte baseados em Git comumente usados para acompanhar as alterações no código-fonte.

## Práticas recomendadas
<a name="deploy-lambda-functions-with-container-images-best-practices"></a>
+ Torne sua função o mais eficiente e reduzida possível para evitar o carregamento de arquivos desnecessários.
+ Esforce-se para ter camadas estáticas no topo da sua lista de arquivos do Docker e coloque as camadas que mudam com mais frequência na parte inferior. Isso melhora o armazenamento em cache, o que aumenta o desempenho.
+ O proprietário da imagem é responsável por atualizar e corrigir a imagem. Adicione essa cadência de atualização aos seus processos operacionais. Para obter mais informações, consulte a [documentação do AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/best-practices.html#function-code).

## Épicos
<a name="deploy-lambda-functions-with-container-images-epics"></a>

### Crie um projeto em CodeBuild
<a name="create-a-project-in-codebuild"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Crie um repositório Git. | Crie um repositório Git para armazenar o código-fonte da aplicação, o Dockerfile e o arquivo `buildspec.yaml`.  | Desenvolvedor | 
| Crie um CodeBuild projeto. | Para usar um CodeBuild projeto para criar a imagem Lambda personalizada, faça o seguinte: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/deploy-lambda-functions-with-container-images.html) | Desenvolvedor | 
| Edite o Dockerfile. | O Dockerfile deve estar localizado no diretório de nível superior em que você está desenvolvendo o aplicativo. O código Python deve estar na pasta `src`.Ao criar imagens, use as imagens [oficiais suportadas pelo Lambda](https://gallery.ecr.aws/lambda?page=1). Caso contrário, ocorrerá um erro de bootstrap, dificultando o processo de empacotamento.Para obter detalhes, consulte a seção [Informações adicionais](#deploy-lambda-functions-with-container-images-additional). | Desenvolvedor | 
| Crie um repositório do Amazon ECR. | Crie um repositório de contêineres no Amazon ECR. No seguinte comando de exemplo, o nome do repositório criado é `cf-demo`:<pre>aws ecr create-repository --cf-demo </pre>O repositório será referenciado no arquivo `buildspec.yaml`. | Administrador da AWS, desenvolvedor | 
| Envie a imagem para o Amazon ECR. | Você pode usar CodeBuild para realizar o processo de criação de imagens. CodeBuild precisa de permissão para interagir com o Amazon ECR e trabalhar com o S3. Como parte do processo, a imagem do Docker é criada e enviada para o registro do Amazon ECR. Para obter detalhes sobre o modelo e o código, consulte a seção [Informações adicionais](#deploy-lambda-functions-with-container-images-additional). | Desenvolvedor | 
| Verifique se a imagem está no repositório. | Para verificar se a imagem está no repositório, selecione **Repositórios** no console do Amazon ECR. A imagem deve ser listada, com tags e com os resultados de um relatório de verificação de vulnerabilidade, caso esse atributo tenha sido ativado nas configurações do Amazon ECR.  Para obter mais informações, consulte a [documentação da AWS](https://docs.aws.amazon.com/cli/latest/reference/ecr/put-registry-scanning-configuration.html). | Desenvolvedor | 

### Crie a função do Lambda para executar a imagem
<a name="create-the-lambda-function-to-run-the-image"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Criar a função do Lambda. | No console do Lambda, selecione **Criar função** e, em seguida, selecione **Imagem do contêiner**. Insira o nome da função e o URI da imagem que está no repositório do Amazon ECR e selecione **Criar função**. Para obter mais informações, consulte a [documentação do AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/API_CreateFunction.html). | Desenvolvedor de aplicativos | 
| Testar a função do Lambda. | Para invocar e testar a função, escolha **Testar**. Para obter mais informações, consulte a [documentação do AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/testing-functions.html). | Desenvolvedor de aplicativos | 

## Solução de problemas
<a name="deploy-lambda-functions-with-container-images-troubleshooting"></a>


| Problema | Solução | 
| --- | --- | 
| A construção não está sendo bem-sucedida. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/deploy-lambda-functions-with-container-images.html) | 

## Recursos relacionados
<a name="deploy-lambda-functions-with-container-images-resources"></a>
+ [Imagens de base para o Lambda](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-images.html)
+ [Amostra do Docker para CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/sample-docker.html)
+ [Passe credenciais temporárias](https://aws.amazon.com/premiumsupport/knowledge-center/codebuild-temporary-credentials-docker/)

## Mais informações
<a name="deploy-lambda-functions-with-container-images-additional"></a>

**Edite o Dockerfile**

O seguinte código apresenta os comandos que você edita no Dockerfile:

```
FROM public.ecr.aws/lambda/python:3.xx

# Copy function code
COPY app.py ${LAMBDA_TASK_ROOT} 
COPY requirements.txt  ${LAMBDA_TASK_ROOT} 

# install dependencies
RUN pip3 install --user -r requirements.txt

# Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile)
CMD [ "app.lambda_handler" ]
```

No comando `FROM`, utilize o valor adequado para a versão do Python compatível com o Lambda (por exemplo, `3.12`). Esta será a imagem base disponível no repositório público de imagens do Amazon ECR. 

O comando `COPY app.py ${LAMBDA_TASK_ROOT}` copia o código para o diretório raiz da tarefa, que a função do Lambda usará. Esse comando usa a variável de ambiente para que não precisemos nos preocupar com o caminho real. A função a ser executada é passada como argumento para o comando `CMD [ "app.lambda_handler" ]`.

O comando `COPY requirements.txt` captura as dependências necessárias para o código. 

O comando `RUN pip install --user -r requirements.txt` instala as dependências no diretório local do usuário. 

Para construir sua imagem, execute o seguinte comando.

```
docker build -t <image name> .
```

**Adicione a imagem no Amazon ECR**

No código a seguir, substitua `aws_account_id` pelo número da conta e substitua `us-east-1` se você estiver usando uma região diferente. O `buildspec` arquivo usa o número da CodeBuild compilação para identificar de forma exclusiva as versões da imagem como um valor de tag. Você pode alterar isso de acordo com as suas necessidades.

*O código personalizado do buildspec*

```
phases:
  install:
    runtime-versions:
       python: 3.xx
  pre_build:
    commands:
      - python3 --version
      - pip3 install --upgrade pip
      - pip3 install --upgrade awscli
      - sudo docker info
  build:
    commands:
      - echo Build started on `date`
      - echo Building the Docker image...
      - ls
      - cd app
      - docker build -t cf-demo:$CODEBUILD_BUILD_NUMBER .
      - docker container ls
  post_build:
    commands:
      - echo Build completed on `date`
      - echo Pushing the Docker image...
      - aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.us-east-1.amazonaws.com
      - docker tag cf-demo:$CODEBUILD_BUILD_NUMBER aws_account_id.dkr.ecr.us-east-1.amazonaws.com/cf-demo:$CODEBUILD_BUILD_NUMBER
      - docker push aws_account_id.dkr.ecr.us-east-1.amazonaws.com/cf-demo:$CODEBUILD_BUILD_NUMBER
```