AWS Lambda
Guia do desenvolvedor

Criação de um pipeline de entrega contínua para um aplicativo do Lambda com o AWS CodePipeline

Você pode usar o AWS CodePipeline para criar um pipeline de entrega contínua para seu aplicativo do Lambda. O CodePipeline combina o controle, a compilação e a implantação de recursos da origem para criar um pipeline que é executado sempre que você faz uma alteração no código-fonte do aplicativo.

Neste tutorial, você vai criar os recursos a seguir.

  • Repositório – um repositório Git no AWS CodeCommit. Quando você envia uma alteração, o pipeline copia o código-fonte em um bucket do Amazon S3 e o transmite para o projeto de compilação.

  • Projeto de compilação – uma compilação do AWS CodeBuild obtém o código-fonte do pipeline e empacota o aplicativo. A origem inclui uma especificação de compilação com comandos que instalam dependências e preparam um modelo do Modelo de aplicativo sem servidor da AWS (AWS SAM) para a implantação.

  • Configuração de implantação – o estágio de implantação do pipeline define um conjunto de ações que pega o modelo do AWS SAM da saída da compilação, cria um conjunto de alterações no AWS CloudFormation e executa o conjunto de alterações para atualizar a pilha do AWS CloudFormation do aplicativo.

  • Pilha no AWS CloudFormation – o estágio de implantação usa um modelo para criar uma pilha no AWS CloudFormation. O modelo é um documento em formato YAML que define os recursos do aplicativo do Lambda. O aplicativo inclui uma função Lambda e uma API do Amazon API Gateway que a invoca.

  • Funções – o pipeline, a compilação e a implantação têm uma função de serviço cada, que os permite gerenciar recursos da AWS. O console criará as funções de compilação e pipeline quando você criar esses recursos. Você cria a função que permite que o AWS CloudFormation gerencie a pilha de aplicativos.

O pipeline mapeia uma única ramificação em um repositório para uma única pilha do AWS CloudFormation. Você pode criar pipelines adicionais para adicionar ambientes para outras ramificações no mesmo repositório. Você também pode adicionar estágios ao pipeline para testes, preparação e aprovações manuais. Para obter mais informações sobre o AWS CodePipeline, consulte O que é o AWS CodePipeline.

Para obter um método alternativo de criação de um pipeline com o Modelo de aplicativo sem servidor da AWS e o AWS CloudFormation, assista a Automate Your Serverless Application Deployments no canal do YouTube da Amazon Web Services.

Pré-requisitos

Este tutorial pressupõe que você tenha algum conhecimento das operações básicas do Lambda e do console do Lambda. Caso ainda não tenha feito isso, siga as instruções em Conceitos básicos do AWS Lambda para criar sua primeira função do Lambda.

Para seguir os procedimentos neste manual, você precisa de um terminal de linha de comando ou de um shell para executar os comandos. Nas listagens, os comandos são mostrados precedidos por um símbolo de prompt ($) e pelo nome do diretório atual, quando apropriado:

~/lambda-project$ this is a command this is output

Para comandos longos, um caractere de escape (\) é usado para dividir um comando em várias linhas.

No Linux e no macOS, use seu gerenciador preferido de pacotes e de shell. No Windows 10, você pode instalar o Subsistema Windows para Linux para obter uma versão do Ubuntu integrada com o Windows e o Bash.

Durante a fase de compilação, o script de compilação faz upload dos artefatos para o Amazon Simple Storage Service (Amazon S3). É possível usar um bucket existente ou criar outro bucket para o pipeline. Use a AWS CLI para criar um bucket.

$ aws s3 mb s3://lambda-deployment-artifacts-123456789012

Criar uma função do AWS CloudFormation

Crie uma função que conceda ao AWS CloudFormation permissão para acessar os recursos da AWS.

Para criar uma função do AWS CloudFormation

  1. Abra a página Roles no console do IAM.

  2. Selecione Create role.

  3. Crie uma função com as seguintes propriedades.

    • Trusted entity (Entidade confiável)AWS CloudFormation

    • Permissions (Permissões)AWSLambdaExecute

    • Role name (Nome da função)cfn-lambda-pipeline

  4. Abra a função. Na guia Permissions (Permissões), escolha Add inline policy (Adicionar política em linha).

  5. Em Create Policy (Criar política), selecione a guia JSON e adicione a política a seguir.

    { "Statement": [ { "Action": [ "apigateway:*", "codedeploy:*", "lambda:*", "cloudformation:CreateChangeSet", "iam:GetRole", "iam:CreateRole", "iam:DeleteRole", "iam:PutRolePolicy", "iam:AttachRolePolicy", "iam:DeleteRolePolicy", "iam:DetachRolePolicy", "iam:PassRole", "s3:GetObjectVersion", "s3:GetBucketVersioning" ], "Resource": "*", "Effect": "Allow" } ], "Version": "2012-10-17" }

Configurar um repositório

Crie um repositório do AWS CodeCommit para armazenar os arquivos do seu projeto. Para obter mais informações, consulte Configuração no Guia do usuário do CodeCommit.

Para criar um repositório

  1. Abra o console de Ferramentas do desenvolvedor.

  2. Em Source (Origem), selecione Repositories (Repositórios).

  3. Escolha Create repository (Criar repositório).

  4. Siga as instruções para criar e clonar um repositório chamado lambda-pipeline-repo.

Crie os arquivos a seguir na pasta do repositório.

exemplo index.js

Uma função do Lambda que retorna a hora atual.

var time = require('time'); exports.handler = (event, context, callback) => { var currentTime = new time.Date(); currentTime.setTimezone("America/Los_Angeles"); callback(null, { statusCode: '200', body: 'The time in Los Angeles is: ' + currentTime.toString(), }); };

exemplo template.yml

O modelo do SAM que define o aplicativo.

AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: Outputs the time Resources: TimeFunction: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs10.x CodeUri: ./ Events: MyTimeApi: Type: Api Properties: Path: /TimeResource Method: GET

exemplo buildspec.yml

Uma especificação de compilação do AWS CodeBuild que instala os pacotes necessários e faz upload do pacote de implantação para o Amazon S3. Substitua o texto em destaque pelo nome do seu bucket.

version: 0.2 phases: install: runtime-versions: nodejs: 10 build: commands: - npm install time - export BUCKET=lambda-deployment-artifacts-123456789012 - aws cloudformation package --template-file template.yml --s3-bucket $BUCKET --output-template-file outputtemplate.yml artifacts: type: zip files: - template.yml - outputtemplate.yml

Confirme e envie os arquivos ao CodeCommit.

~/lambda-pipeline-repo$ git add . ~/lambda-pipeline-repo$ git commit -m "project files" ~/lambda-pipeline-repo$ git push

Criar um pipeline

Crie um pipeline que implanta seu aplicativo. O pipeline monitora as alterações do seu repositório, executa uma compilação do AWS CodeBuild para criar um pacote de implantação e implanta o aplicativo com o AWS CloudFormation. Durante o processo de criação do pipeline, você também cria o projeto de compilação do AWS CodeBuild.

Para criar um pipeline

  1. Abra o console de Ferramentas do desenvolvedor.

  2. Em Pipeline, selecione Pipelines.

  3. Selecione Create pipeline.

  4. Defina as configurações do pipeline e selecione Next (Próximo).

    • Pipeline name (Nome do pipeline)lambda-pipeline

    • Service role (Função de serviço)New service role (Nova função de serviço)

    • Artifact store (Armazenamento de artefatos)Default location (Local padrão)

  5. Defina as configurações do estágio de origem e selecione Next (Próximo).

    • Source provider (Provedor de origem)AWS CodeCommit

    • Repository name (Nome do repositório)lambda-pipeline-repo

    • Branch name (Nome da ramificação)master (mestre)

    • Change detection options (Alterar as opções de detecção)Amazon CloudWatch Events

  6. Para Build provider (Provedor de compilação), selecione AWS CodeBuild e selecione Create project (Criar projeto).

  7. Defina as configurações do projeto de compilação e selecione Continue to CodePipeline (Continuar para o CodePipeline).

    • Project name (Nome do projeto)lambda-pipeline-build

    • Operating system (Sistema operacional)Ubuntu

    • Runtime (Tempo de execução)Standard (Padrão)

    • Runtime version (Versão do tempo de execução)aws/codebuild/standard:2.0

    • Image version (Versão da imagem)Latest (Mais recente)

    • Buildspec name (Nome da especificação da compilação)buildspec.yml

  8. Escolha Next.

  9. Defina as configurações do estágio de implantação e selecione Next (Próximo).

    • Deploy provider (Fornecedor da implantação)AWS CloudFormation

    • Action mode (Modo de ação)Create or replace a change set (Criar ou substituir um conjunto de alterações)

    • Stack name (Nome da pilha)lambda-pipeline-stack

    • Change set name (Alterar nome do conjunto)lambda-pipeline-changeset

    • Template (Modelo)BuildArtifact::outputtemplate.yml

    • Capabilities (Recursos)CAPABILITY_IAM

    • Role name (Nome da função)cfn-lambda-pipeline

  10. Selecione Create pipeline.

O pipeline falhar na primeira vez em que é executado, pois ele precisa de permissões adicionais. Na próxima seção, você vai adicionar permissões para a função que é gerada para o estágio de compilação.

Atualizar a função o estágio de compilação

Durante o estágio de compilação, o AWS CodeBuild precisa de permissão para fazer upload da saída de compilação para o bucket do Amazon S3.

Para atualizar a função

  1. Abra a página Roles no console do IAM.

  2. Selecione code-build-lamba-pipeline-service-role.

  3. Escolha Attach policies (Anexar políticas).

  4. Anexe AmazonS3FullAccess.

Concluir o estágio de implantação

O estágio de implantação tem uma ação que cria um conjunto de alterações para a pilha do AWS CloudFormation que gerencia o aplicativo do Lambda. Um conjunto de alterações especifica as mudanças que são feitas na pilha, como adição de recursos novos e atualização de recursos já existentes. Os conjuntos de alterações permitem visualizar as mudanças antes de implementá-las e adicionar estágios de aprovação. Adicione uma segunda ação que executa o conjunto de alterações para concluir a implantação.

Para atualizar o estágio de implantação

  1. Abra o pipeline no console de Ferramentas do desenvolvedor.

  2. Selecione Edit.

  3. Ao lado de Deploy (Implantar), selecione Edit stage (Editar estágio).

  4. Selecione Add action group (Adicionar grupo de ação).

  5. Defina as configurações do estágio de implantação e selecione Next (Próximo).

    • Action name (Nome da ação)execute-changeset

    • Action provider (Fornecedor da ação)AWS CloudFormation

    • Input artifacts (Artefatos de entrada)BuildArtifact

    • Action mode (Modo de ação)Execute a change set (Executar um conjunto de alterações)

    • Stack name (Nome da pilha)lambda-pipeline-stack

    • Change set name (Alterar nome do conjunto)lambda-pipeline-changeset

  6. Escolha Concluído.

  7. Escolha Salvar.

  8. Selecione Release change (Liberar alteração) para executar o pipeline.

O pipeline está pronto. Envie as alterações para a ramificação principal para acionar uma implantação.

Testar o aplicativo

O aplicativo inclui uma API do API Gateway com um endpoint público que retorna a hora atual. Use o console do Lambda para visualizar o aplicativo e acessar a API.

Para testar a aplicação

  1. Selecione Applications (Aplicativos).

  2. Escolha lambda-pipeline-stack.

  3. Em Resources (Recursos), expanda ServerlessRestApi.

  4. Escolha Prod API endpoint (Endpoint de API de prod).

  5. Adicione /TimeResource ao final do URL. Por exemplo, https://l193nqxdjj.execute-api.us-east-2.amazonaws.com/Prod/TimeResource.

  6. Abra o URL.

A API retorna a hora atual no formato a seguir.

The time in Los Angeles is: Thu Jun 27 2019 16:07:20 GMT-0700 (PDT)