Implantar funções do Lambda com imagens de contêiner - Recomendações da AWS

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

Ram Kandaswamy, Amazon Web Services

Resumo

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

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

Arquitetura de destino

Processo em quatro etapas para criar a função do Lambda.

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

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

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

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

Ferramentas

Serviços da AWS

  • AWS CloudFormationNa 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, que ajuda você a visualizar e editar CloudFormation modelos visualmente.

  • O AWS CodeBuild é 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) é um serviço gerenciado de registro de imagens de contêineres seguro, escalável e confiável.

  • O AWS Lambda é 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 é 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, GitLab, e o Bitbucket 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

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

Épicos

TarefaDescriptionHabilidades 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:

  1. Faça login no e abra Console de gerenciamento da AWS o CodeBuild console em https://console.aws.amazon.com/codesuite/ codebuild/.

  2. Criar um novo projeto da . Em Origem, escolha o repositório Git que você criou. Para obter informações sobre os diferentes tipos de integração com repositórios do Git, consulte a documentação Working with connections.

  3. Confirme se o modo privilegiado está ativado. Isso é necessário para criar imagens do Docker. Caso contrário, a imagem não será criada com êxito.

  4. Forneça valores para o nome e a descrição do projeto.

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. Caso contrário, ocorrerá um erro de bootstrap, dificultando o processo de empacotamento.

Para obter detalhes, consulte a seção Informações adicionais.

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:

aws ecr create-repository --cf-demo

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.

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.

Desenvolvedor
TarefaDescriptionHabilidades 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.

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.

Desenvolvedor de aplicativos

Solução de problemas

ProblemaSolução

A construção não está sendo bem-sucedida.

  1. Verifique se o modo privilegiado está ativado para o CodeBuild projeto.

  2. Certifique-se de que os comandos relacionados ao Docker tenham as permissões necessárias. Tente adicionar sudo aos comandos.

  3. Verifique se a função do IAM associada à CodeBuild tem uma política com ações apropriadas para interagir com o Amazon ECR, o Amazon S3 e os registros. CloudWatch

Recursos relacionados

Mais informações

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