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

Criado por Ram Kandaswamy (AWS)

Ambiente: produção

Tecnologias: Contêineres e microsserviços;; CloudNative DevelopmentAndTesting; Sem servidor

Workload: todas as outras workloads

Serviços da AWS: Amazon EC2 Container Registry; AWS Lambda

Resumo

O AWS Lambda oferece suporte a 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. O padrão usa a AWS CodeCommit como fonte, mas você também pode usar GitHub o Bitbucket ou 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

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

Pilha de tecnologias de destino

  • Linguagem de programação Python

  • AWS CodeBuild

  • AWS CodeCommit

  • Docker image (Imagem do Docker)

  • Amazon ECR

  • AWS Identity and Access Management (IAM)

  • AWS Lambda

  • CloudWatch Registros da Amazon

Arquitetura de destino

A descrição segue o diagrama.
  1. Você cria um repositório e confirma o código do aplicativo usando CodeCommit.

  2. O CodeBuild projeto é iniciado quando uma alteração é feita em CodeCommit, que é usada como provedor de origem.

  3. O CodeBuild projeto cria a imagem do Docker e a publica 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 a AWS CloudFormation, o 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

  • O AWS CloudFormation Designer fornece um editor JSON e YAML integrado que ajuda você a visualizar e editar CloudFormation modelos.

  • CodeBuildA AWS é um serviço de criação totalmente gerenciado que ajuda você a compilar o código-fonte, executar testes unitários e produzir artefatos prontos para implantação.

  • CodeCommitA AWS é um serviço de controle de versão que ajuda você a armazenar e gerenciar repositórios Git de forma privada, sem precisar gerenciar seu próprio sistema de controle de origem.

  • CodeStarA AWS é um serviço baseado em nuvem para criar, gerenciar e trabalhar com projetos de desenvolvimento de software na AWS. Para esse padrão, você pode usar a AWS CodeStar ou outro ambiente de desenvolvimento.

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

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

TarefaDescriçãoHabilidades necessárias

Crie um CodeCommit repositório.

Crie um CodeCommit repositório que conterá o Dockerfile, o arquivo e o buildspec.yaml código-fonte do aplicativo. Para obter mais informações, consulte a CodeCommit documentação da AWS.

Desenvolvedor

Crie um CodeBuild projeto.

No CodeBuild console, crie um novo projeto que use o CodeCommit repositório e o buildspec.yaml arquivo. Você usará o CodeBuild projeto para criar a imagem.

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.

Forneça valores para o nome e a descrição do projeto. Para o provedor de origem, escolha CodeCommit. Para obter mais informações, consulte a documentação da AWS.

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 no Amazon ECR.

Crie um repositório de contêineres no Amazon ECR. No exemplo de comando a seguir, o nome do repositório criado é cf-demo. O repositório será reutilizado no arquivo buildspec.yaml.

aws ecr create-repository --cf-demo
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
TarefaDescriçãoHabilidades 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 código a seguir mostra os comandos que você edita no Dockerfile.

FROM public.ecr.aws/lambda/python:3.11 # 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" ]

O valor do comando FROM corresponde à imagem base do Python 3.11 que está usando a função do Lambda 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.11 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