

A Amazon não CodeCatalyst está mais aberta a novos clientes. Os clientes atuais podem continuar usando o serviço normalmente. Para obter mais informações, consulte [Como migrar do CodeCatalyst](migration.md).

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

# Tutorial: Implantar uma aplicação sem servidor
<a name="deploy-tut-lambda"></a>

Neste tutorial, você aprende a criar, testar e implantar um aplicativo sem servidor como uma CloudFormation pilha usando um fluxo de trabalho.

A aplicação neste tutorial é uma aplicação web simples que gera uma mensagem “Hello World”. Ele consiste em uma AWS Lambda função e um Amazon API Gateway, e você o cria usando o [AWS Serverless Application Model (AWS SAM)](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html), que é uma extensão do [CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html).

**Topics**
+ [

## Pré-requisitos
](#deploy-tut-lambda-cfn-prereqs)
+ [

## Etapa 1: criar um repositório de origem
](#deploy-tut-lambda-cfn-source)
+ [

## Etapa 2: criar AWS funções
](#deploy-tut-lambda-cfn-roles)
+ [

## Etapa 3: adicionar AWS funções a CodeCatalyst
](#deploy-tut-lambda-cfn-roles-add)
+ [

## Etapa 4: criar um bucket do Amazon S3
](#deploy-tut-lambda-cfn-s3)
+ [

## Etapa 5: adicionar arquivos de origem
](#deploy-tut-lambda-cfn-files)
+ [

## Etapa 6: criar e executar um fluxo de trabalho
](#deploy-tut-lambda-cfn-workflow)
+ [

## Etapa 7: fazer uma alteração
](#deploy-tut-lambda-cfn-change)
+ [

## Limpeza
](#deploy-tut-lambda-cfn-clean-up)

## Pré-requisitos
<a name="deploy-tut-lambda-cfn-prereqs"></a>

Antes de começar
+ Você precisa de um CodeCatalyst **espaço** com uma AWS conta conectada. Para obter mais informações, consulte [Criar um espaço](spaces-create.md).
+ Em seu espaço, você precisa de um projeto vazio chamado:

  ```
  codecatalyst-cfn-project
  ```

  Use a opção **Começar do zero** para criar esse projeto.

  Para obter mais informações, consulte [Criando um projeto vazio na Amazon CodeCatalyst](projects-create.md#projects-create-empty).
+ Em seu projeto, você precisa de um CodeCatalyst **ambiente** chamado:

  ```
  codecatalyst-cfn-environment
  ```

  Configure esse ambiente da seguinte forma:
  + Escolha qualquer tipo, como **Não produção**.
  + Conecte sua AWS conta a ela.
  + Para o **Perfil do IAM padrão**, escolha qualquer perfil. Você especificará um perfil diferente posteriormente.

  Para obter mais informações, consulte [Implantação em e Contas da AWS VPCs](deploy-environments.md).

## Etapa 1: criar um repositório de origem
<a name="deploy-tut-lambda-cfn-source"></a>

Nesta etapa, você cria um repositório de origem no CodeCatalyst. Esse repositório é usado para armazenar os arquivos de origem do tutorial, como o arquivo da função do Lambda. 

Para ter mais informações sobre repositórios de origem, consulte [Criar um repositório de origem](source-repositories-create.md).

**Como criar um repositório de origem**

1. Em CodeCatalyst, no painel de navegação, escolha **Código** e, em seguida, escolha **Repositórios de origem**. 

1. Escolha **Adicionar repositório** e selecione **Criar repositório**.

1. Em **Nome do repositório**, insira:

   ```
   codecatalyst-cfn-source-repository
   ```

1. Escolha **Criar**.

Agora você criou um repositório chamado `codecatalyst-cfn-source-repository`.

## Etapa 2: criar AWS funções
<a name="deploy-tut-lambda-cfn-roles"></a>

Nesta etapa, você cria as seguintes funções AWS do IAM:
+ **Função de implantação** — concede permissão à ação CodeCatalyst **Deploy CloudFormation stack** para acessar sua AWS conta e CloudFormation serviço onde você implantará seu aplicativo sem servidor. A ação **Deploy CloudFormation stack** faz parte do seu fluxo de trabalho.
+ **Função de criação** — concede à ação de CodeCatalyst criação permissão para acessar sua AWS conta e gravar no Amazon S3, onde seu pacote de aplicativos sem servidor será armazenado. A ação de criação faz parte do seu fluxo de trabalho.
+ **Função do Stack** — concede CloudFormation permissão para ler e modificar os recursos especificados no AWS SAM modelo que você fornecerá posteriormente. Também concede permissão para CloudWatch.

Para ter informações sobre perfis do IAM, consulte [Perfis do IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html) no *Guia do usuário do AWS Identity and Access Management *.

**nota**  
Para economizar tempo, você pode criar um único perfil, chamado `CodeCatalystWorkflowDevelopmentRole-spaceName`, em vez dos três perfis listados anteriormente. Para obter mais informações, consulte [Criar o perfil **CodeCatalystWorkflowDevelopmentRole-*spaceName*** para a conta e o espaço](ipa-iam-roles.md#ipa-iam-roles-service-create). Entenda que o perfil `CodeCatalystWorkflowDevelopmentRole-spaceName` tem permissões bem amplas que podem representar um risco de segurança. Recomendamos que você use esse perfil apenas em tutoriais e em cenários em que a segurança seja menos preocupante. Este tutorial pressupõe que você esteja criando os três perfis listados anteriormente.

**nota**  
Um [perfil de execução do Lambda](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html) também é necessário, mas você não precisa criá-lo agora porque o arquivo `sam-template.yml` o cria quando você executa o fluxo de trabalho na etapa 5.



**Para criar um perfil de implantação**

1. Crie uma política para o perfil da seguinte maneira:

   1. Faça login em AWS.

   1. Abra o console do IAM em [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

   1. No painel de navegação, selecione **Políticas**.

   1. Escolha **Criar política**.

   1. Escolha a guia **JSON**.

   1. Exclua o código existente.

   1. Cole o seguinte código:
**nota**  
Na primeira vez em que o perfil for usado para executar ações de fluxo de trabalho, use o caractere curinga na declaração de política de recursos e defina o escopo da política com o nome do recurso depois que ele estiver disponível.  

      ```
      "Resource": "*"
      ```

   1. Escolha **Próximo: tags**.

   1. Selecione **Próximo: revisar**.

   1. Em **Nome**, insira:

      ```
      codecatalyst-deploy-policy
      ```

   1. Selecione **Criar política**.

      Agora você criou uma política de permissões.

1. Crie o perfil de implantação, da seguinte forma:

   1. No painel de navegação, escolha **Perfis** e **Criar perfil**.

   1. Selecione **Política de confiança personalizada**.

   1. Exclua a política de confiança personalizada existente.

   1. Adicione a política de confiança personalizada a seguir:

   1. Escolha **Próximo**.

   1. Em **Políticas de permissões**, procure `codecatalyst-deploy-policy` e marque a caixa de seleção.

   1. Escolha **Próximo**.

   1. Em **Nome do perfil**, insira:

      ```
      codecatalyst-deploy-role
      ```

   1. Em **Descrição do perfil**, insira:

      ```
      CodeCatalyst deploy role
      ```

   1. Selecione **Criar perfil**.

   Agora você criou um perfil de implantação com uma política de confiança e uma política de permissões.

1. Obtenha o ARN do perfil de implantação, da seguinte forma:

   1. No painel de navegação, selecione **Perfis**.

   1. Na caixa de pesquisa, insira o nome do perfil que você acabou de criar (`codecatalyst-deploy-role`).

   1. Escolha o perfil na lista.

      A página **Resumo** do perfil é exibida.

   1. Na parte superior, copie o valor do **ARN**.

   Agora você criou o perfil de implantação com as permissões apropriadas e obteve o ARN.

**Como criar um perfil de criação**

1. Crie uma política para o perfil da seguinte maneira:

   1. Faça login em AWS.

   1. Abra o console do IAM em [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

   1. No painel de navegação, selecione **Políticas**.

   1. Escolha **Criar política**.

   1. Escolha a guia **JSON**.

   1. Exclua o código existente.

   1. Cole o seguinte código:
**nota**  
Na primeira vez em que o perfil for usado para executar ações de fluxo de trabalho, use o caractere curinga na declaração de política de recursos e defina o escopo da política com o nome do recurso depois que ele estiver disponível.  

      ```
      "Resource": "*"
      ```

   1. Escolha **Próximo: tags**.

   1. Selecione **Próximo: revisar**.

   1. Em **Nome**, insira:

      ```
      codecatalyst-build-policy
      ```

   1. Selecione **Criar política**.

      Agora você criou uma política de permissões.

1. Crie o perfil de criação, da seguinte forma:

   1. No painel de navegação, escolha **Perfis** e **Criar perfil**.

   1. Selecione **Política de confiança personalizada**.

   1. Exclua a política de confiança personalizada existente.

   1. Adicione a política de confiança personalizada a seguir:

   1. Escolha **Próximo**.

   1. Em **Políticas de permissões**, procure `codecatalyst-build-policy` e marque a caixa de seleção.

   1. Escolha **Próximo**.

   1. Em **Nome do perfil**, insira:

      ```
      codecatalyst-build-role
      ```

   1. Em **Descrição do perfil**, insira:

      ```
      CodeCatalyst build role
      ```

   1. Selecione **Criar perfil**.

   Agora você criou um perfil de criação com uma política de confiança e uma política de permissões.

1. Obtenha o ARN do perfil de criação, da seguinte forma:

   1. No painel de navegação, selecione **Perfis**.

   1. Na caixa de pesquisa, insira o nome do perfil que você acabou de criar (`codecatalyst-build-role`).

   1. Escolha o perfil na lista.

      A página **Resumo** do perfil é exibida.

   1. Na parte superior, copie o valor do **ARN**.

   Agora você criou o perfil de criação com as permissões apropriadas e obteve o ARN.<a name="deploy-tut-lambda-cfn-roles-stack"></a>

**Para criar um perfil de pilha**

1. Faça login AWS usando a conta na qual você deseja implantar sua pilha.

1. Abra o console do IAM em [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

1. Crie o perfil de pilha, da seguinte forma:

   1. No painel de navegação, selecione **Perfis**.

   1. Escolha **Criar Perfil**.

   1. Selecione **Serviço da AWS **.

   1. Na seção **Caso de uso**, escolha na **CloudFormation**lista suspensa.

   1. Selecione o botão **CloudFormation**de rádio.

   1. Selecione **Avançar** na parte inferior.

   1. Usando a caixa de pesquisa, encontre as políticas de permissões a seguir e marque as respectivas caixas de seleção.
**nota**  
Se você procurar uma política e ela não aparecer, selecione **Limpar filtros** e tente novamente.
      + **CloudWatchFullAccess**
      + **AWS CloudFormationFullAccess**
      + **IAMFullAcesso**
      + **AWS Lambda\$1 FullAccess**
      + **APIGatewayAdministrador da Amazon**
      + **Amazon S3 FullAccess**
      + **AmazonEC2ContainerRegistryFullAccess**

      A primeira política permite o acesso para CloudWatch habilitar reversões de pilha quando ocorre um alarme.

      As políticas restantes permitem AWS SAM acessar os serviços e recursos na pilha que serão implantados neste tutorial. Para ter mais informações, consulte [Permissões](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-permissions.html) no *Guia do desenvolvedor do AWS Serverless Application Model *.

   1. Escolha **Próximo**.

   1. Em **Nome do perfil**, insira:

      ```
      codecatalyst-stack-role
      ```

   1. Selecione **Criar perfil**.

1. Obtenha o ARN do perfil de pilha, da seguinte forma:

   1. No painel de navegação, selecione **Perfis**.

   1. Na caixa de pesquisa, insira o nome do perfil que você acabou de criar (`codecatalyst-stack-role`).

   1. Escolha o perfil na lista.

   1. Na seção **Resumo**, copie o valor de **ARN**. Você precisará disso mais tarde.

   Agora você criou o perfil de pilha com as permissões apropriadas e obteve o ARN.

## Etapa 3: adicionar AWS funções a CodeCatalyst
<a name="deploy-tut-lambda-cfn-roles-add"></a>

Nesta etapa, você adiciona a função de criação (`codecatalyst-build-role`) e a função de implantação (`codecatalyst-deploy-role`) à conexão da CodeCatalyst conta em seu espaço.

**nota**  
Não é necessário adicionar o perfil de pilha (`codecatalyst-stack-role`) à conexão. Isso ocorre porque a função de pilha é usada por *CloudFormation*(não CodeCatalyst), *depois* que uma conexão já foi estabelecida entre CodeCatalyst e AWS usando a função de implantação. Como a função de pilha não é usada por CodeCatalyst para obter acesso AWS, ela não precisa ser associada a uma conexão de conta.

**Para adicionar perfis de criação e implantação à conexão da sua conta**

1. Dentro CodeCatalyst, navegue até seu espaço.

1. Selecione **Contas da AWS **. Uma lista de conexões de conta é exibida.

1. Escolha a conexão de conta que representa a AWS conta em que você criou suas funções de criação e implantação.

1. Escolha **Gerenciar funções no console de AWS gerenciamento**.

   A página **Adicionar função do IAM ao CodeCatalyst espaço da Amazon** é exibida. Talvez seja necessário fazer login para acessá-la.

1. Selecione **Adicionar um perfil existente que você criou no IAM**.

   Uma lista suspensa aparece. A lista exibe todos os perfis do IAM com uma política de confiança que inclui as entidades principais de serviço `codecatalyst-runner.amazonaws.com` e `codecatalyst.amazonaws.com`.

1. Na lista suspensa, selecione `codecatalyst-build-role` e **Adicionar perfil**.

1. Escolha **Adicionar perfil do IAM**, selecione **Adicionar um perfil existente que você criou no IAM** e, na lista suspensa, escolha `codecatalyst-deploy-role`. Escolha **Add role (adicionar função)**.

   Agora você adicionou os perfis de criação e implantação ao seu espaço.

1. Copie o valor do **nome de CodeCatalyst exibição da Amazon**. Esse valor será necessário posteriormente, ao criar seu fluxo de trabalho.

## Etapa 4: criar um bucket do Amazon S3
<a name="deploy-tut-lambda-cfn-s3"></a>

Nesta etapa, você cria um bucket do Amazon S3 no qual armazena o arquivo .zip do pacote de implantação da aplicação sem servidor.

**Como criar um bucket do Amazon S3**

1. Abra o console do Amazon S3 em [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/).

1. No painel principal, selecione **Criar bucket**.

1. Em **Nome do bucket**, insira:

   ```
   codecatalyst-cfn-s3-bucket
   ```

1. Na **região da AWS **, escolha uma região. Este tutorial pressupõe que você tenha escolhido o **Oeste dos EUA (Oregon) us-west-2**. Para ter informações sobre regiões com suporte do Amazon S3, consulte [Endpoints e cotas do Amazon Simple Storage Service](https://docs.aws.amazon.com/general/latest/gr/s3.html) na *Referência geral da AWS*.

1. Selecione **Criar bucket** na parte inferior da página.

Agora você criou um bucket chamado **codecatalyst-cfn-s3-bucket** na região Oeste dos EUA (Oregon), us-west-2.

## Etapa 5: adicionar arquivos de origem
<a name="deploy-tut-lambda-cfn-files"></a>

Nesta etapa, você adiciona vários arquivos de origem do aplicativo ao seu repositório CodeCatalyst de origem. A pasta `hello-world` contém os arquivos da aplicação que você implantará. A pasta `tests` contém testes de unidade. A estrutura de pastas é esta:

```
.
|— hello-world
|  |— tests
|     |— unit
|        |— test-handler.js
|  |— app.js
|— .npmignore
|— package.json
|— sam-template.yml
|— setup-sam.sh
```

### Arquivo .npmignore
<a name="deploy-tut-lambda-cfn-files-npmignore"></a>

O arquivo `.npmignore` indica quais arquivos e pastas o npm deve excluir do pacote da aplicação. Neste tutorial, o npm exclui a pasta `tests` porque ela não faz parte da aplicação.

**Como adicionar o arquivo .npmignore**

1. Abra o CodeCatalyst console em [https://codecatalyst.aws/](https://codecatalyst.aws/).

1. Selecione o projeto, `codecatalyst-cfn-project`

1. No painel de navegação, selecione **Código** e, depois, selecione **Repositórios de origem**.

1. Na lista de repositórios de origem, escolha o seu repositório, `codecatalyst-cfn-source-repository`. 

1. Em **Arquivos**, selecione **Criar arquivo**.

1. Em **Nome do arquivo**, insira:

   ```
   .npmignore
   ```

1. Na caixa de texto, insira o código a seguir:

   ```
   tests/*
   ```

1. Selecione **Confirmar** e, depois, escolha **Confirmar** novamente.

   Agora você criou um arquivo chamado `.npmignore` na raiz do repositório.

### Arquivo package.json
<a name="deploy-tut-lambda-cfn-files-package-json"></a>

O arquivo `package.json` contém metadados importantes sobre seu projeto Node, como nome do projeto, número da versão, descrição, dependências e outros detalhes que descrevem como interagir e executar a aplicação.

O `package.json` neste tutorial inclui uma lista de dependências e um script `test`. O script de teste faz o seguinte:
+ Usando [mocha](https://mochajs.org/), o script de teste executa os testes de unidade especificados em `hello-world/tests/unit/` e grava os resultados em um arquivo `junit.xml` usando o repórter [xunit]().
+ Usando [Istambul (nyc)](https://istanbul.js.org/), o script de teste gera um relatório de cobertura de código (`clover.xml`) usando o repórter [clover](https://openclover.org/doc/manual/4.2.0/general--about-openclover.html). Para ter mais informações, consulte [Uso de repórteres alternativos](https://istanbul.js.org/docs/advanced/alternative-reporters/#clover) na documentação do Istambul.

**Como adicionar o arquivo package.json**

1. No repositório, em **Arquivos**, selecione **Criar arquivo**.

1. Em **Nome do arquivo**, insira:

   ```
   package.json
   ```

1. Na caixa de texto, insira o código a seguir:

   ```
   {
     "name": "hello_world",
     "version": "1.0.0",
     "description": "hello world sample for NodeJS",
     "main": "app.js",
     "repository": "https://github.com/awslabs/aws-sam-cli/tree/develop/samcli/local/init/templates/cookiecutter-aws-sam-hello-nodejs",
     "author": "SAM CLI",
     "license": "MIT",
     "dependencies": {
       "axios": "^0.21.1",
       "nyc": "^15.1.0"
     },
     "scripts": {
       "test": "nyc --reporter=clover mocha hello-world/tests/unit/ --reporter xunit --reporter-option output=junit.xml"
     },
     "devDependencies": {
       "aws-sdk": "^2.815.0",
       "chai": "^4.2.0",
       "mocha": "^8.2.1"
     }
   }
   ```

1. Selecione **Confirmar** e, depois, escolha **Confirmar** novamente.

   Agora você adicionou um arquivo chamado `package.json` à raiz do repositório.

### Arquivo sam-template.yml
<a name="deploy-tut-lambda-cfn-files-sam-template-yml"></a>

O arquivo `sam-template.yml` contém as instruções para implantar a função do Lambda e o gateway de API e configurá-los juntos. Ele segue a [especificação do AWS Serverless Application Model modelo](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-specification.html), que estende a especificação do CloudFormation modelo.

Você usa um AWS SAM modelo neste tutorial em vez de um CloudFormation modelo normal porque AWS SAM oferece um tipo de recurso útil [AWS: :Serverless: :Function](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html). Esse tipo executa muitas behind-the-scenes configurações que você normalmente precisa escrever para usar a CloudFormation sintaxe básica. Por exemplo, o `AWS::Serverless::Function` cria uma função do Lambda, uma função de execução do Lambda e mapeamentos da origem do evento que iniciam a função. Você precisa codificar tudo isso se quiser escrevê-lo usando o básico CloudFormation.

Embora este tutorial use um modelo pré-escrito, você pode gerar um como parte do seu fluxo de trabalho usando uma ação de criação. Para obter mais informações, consulte [Implantação de uma pilha CloudFormation](deploy-action-cfn.md).

**Para adicionar o arquivo sam-template.yml**

1. No repositório, em **Arquivos**, selecione **Criar arquivo**.

1. Em **Nome do arquivo**, insira:

   ```
   sam-template.yml
   ```

1. Na caixa de texto, insira o código a seguir:

   ```
   AWSTemplateFormatVersion: '2010-09-09'
   Transform: AWS::Serverless-2016-10-31
   Description: >
     serverless-api
   
     Sample SAM Template for serverless-api
     
   # More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
   Globals:
     Function:
       Timeout: 3
   
   Resources:
     HelloWorldFunction:
       Type: AWS::Serverless::Function # For details on this resource type, see https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
       Properties:
         CodeUri: hello-world/
         Handler: app.lambdaHandler
         Runtime: nodejs12.x
         Events:
           HelloWorld:
             Type: Api # For details on this event source type, see https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
             Properties:
               Path: /hello
               Method: get
   
   Outputs:
     # ServerlessRestApi is an implicit API created out of the events key under Serverless::Function
     # Find out about other implicit resources you can reference within AWS SAM at
     # https://github.com/awslabs/serverless-application-model/blob/master/docs/internals/generated_resources.rst#api
     HelloWorldApi:
       Description: "API Gateway endpoint URL for the Hello World function"
       Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/"
     HelloWorldFunction:
       Description: "Hello World Lambda function ARN"
       Value: !GetAtt HelloWorldFunction.Arn
     HelloWorldFunctionIamRole:
       Description: "Implicit Lambda execution role created for the Hello World function"
       Value: !GetAtt HelloWorldFunctionRole.Arn
   ```

1. Selecione **Confirmar** e, depois, escolha **Confirmar** novamente.

   Agora você adicionou um arquivo chamado `sam-template.yml` à pasta raiz do repositório.

### Arquivo setup-sam.sh
<a name="deploy-tut-lambda-cfn-files-setup-sam"></a>

O `setup-sam.sh` arquivo contém as instruções para baixar e instalar o utilitário AWS SAM CLI. O fluxo de trabalho usa esse utilitário para empacotar a origem de `hello-world`.

**Para adicionar o arquivo setup-sam.sh**

1. No repositório, em **Arquivos**, selecione **Criar arquivo**.

1. Em **Nome do arquivo**, insira:

   ```
   setup-sam.sh
   ```

1. Na caixa de texto, insira o código a seguir:

   ```
   #!/usr/bin/env bash
   echo "Setting up sam"
   
   yum install unzip -y
   
   curl -LO https://github.com/aws/aws-sam-cli/releases/latest/download/aws-sam-cli-linux-x86_64.zip
   unzip -qq aws-sam-cli-linux-x86_64.zip -d sam-installation-directory
   
   ./sam-installation-directory/install; export AWS_DEFAULT_REGION=us-west-2
   ```

   No código anterior, *us-west-2* substitua por sua AWS região.

1. Selecione **Confirmar** e, depois, escolha **Confirmar** novamente.

   Agora você adicionou um arquivo chamado `setup-sam.sh` à raiz do repositório.

### Arquivo app.js
<a name="deploy-tut-lambda-cfn-files-app-js"></a>

O `app.js` contém o código da função do Lambda. Neste tutorial, o código retorna o texto `hello world`.

**Para adicionar o arquivo app.js**

1. No repositório, em **Arquivos**, selecione **Criar arquivo**.

1. Em **Nome do arquivo**, insira:

   ```
   hello-world/app.js
   ```

1. Na caixa de texto, insira o código a seguir:

   ```
   // const axios = require('axios')
   // const url = 'http://checkip.amazonaws.com/';
   let response;
   
   /**
    *
    * Event doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-input-format
    * @param {Object} event - API Gateway Lambda Proxy Input Format
    *
    * Context doc: https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-context.html 
    * @param {Object} context
    *
    * Return doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html
    * @returns {Object} object - API Gateway Lambda Proxy Output Format
    * 
    */
   exports.lambdaHandler = async (event, context) => {
       try {
           // const ret = await axios(url);
           response = {
               'statusCode': 200,
               'body': JSON.stringify({
                   message: 'hello world',
                   // location: ret.data.trim()
               })
           }
       } catch (err) {
           console.log(err);
           return err;
       }
   
       return response
   };
   ```

1. Selecione **Confirmar** e, depois, escolha **Confirmar** novamente.

   Agora você criou uma pasta chamada `hello-world` e um arquivo chamado `app.js`.

### Arquivo test-handler.js
<a name="deploy-tut-lambda-cfn-files-test-handler-js"></a>

O arquivo `test-handler.js` contém testes de unidade para a função do Lambda.

**Para adicionar o arquivo test-handler.js**

1. No repositório, em **Arquivos**, selecione **Criar arquivo**.

1. Em **Nome do arquivo**, insira:

   ```
   hello-world/tests/unit/test-handler.js
   ```

1. Na caixa de texto, insira o código a seguir:

   ```
   'use strict';
   
   const app = require('../../app.js');
   const chai = require('chai');
   const expect = chai.expect;
   var event, context;
   
   describe('Tests index', function () {
       it('verifies successful response', async () => {
           const result = await app.lambdaHandler(event, context)
   
           expect(result).to.be.an('object');
           expect(result.statusCode).to.equal(200);
           expect(result.body).to.be.an('string');
   
           let response = JSON.parse(result.body);
   
           expect(response).to.be.an('object');
           expect(response.message).to.be.equal("hello world");
           // expect(response.location).to.be.an("string");
       });
   });
   ```

1. Selecione **Confirmar** e, depois, escolha **Confirmar** novamente.

   Agora você adicionou um arquivo chamado `test-handler.js` abaixo da pasta `hello-world/tests/unit`.

Agora você adicionou todos os seus arquivos de origem.

Reserve um momento para verificar seu trabalho e garantir que colocou todos os arquivos nas pastas corretas. A estrutura de pastas é esta:

```
.
|— hello-world
|  |— tests
|     |— unit
|        |— test-handler.js
|  |— app.js
|— .npmignore
|— README.md
|— package.json
|— sam-template.yml
|— setup-sam.sh
```

## Etapa 6: criar e executar um fluxo de trabalho
<a name="deploy-tut-lambda-cfn-workflow"></a>

Nesta etapa, você cria um fluxo de trabalho que empacota o código-fonte do Lambda e o implanta. O fluxo de trabalho consiste nos seguintes blocos de compilação que são executados sequencialmente:
+ Um gatilho: esse gatilho inicia a execução automática do fluxo de trabalho quando você envia uma alteração ao seu repositório de origem. Para ter mais informações sobre gatilhos, consulte [Início da execução automática de um fluxo de trabalho usando gatilhos](workflows-add-trigger.md).
+ Uma ação de teste (`Test`) — No gatilho, essa ação instala o [gerenciador de pacotes Node (npm)](https://www.npmjs.com/) e, depois, executa o comando `npm run test`. Esse comando diz ao npm para executar o script `test` definido no arquivo `package.json`. O script `test`, por sua vez, executa os testes de unidade e gera dois relatórios: um relatório de teste (`junit.xml`) e um relatório de cobertura de código (`clover.xml`). Para obter mais informações, consulte [Arquivo package.json](#deploy-tut-lambda-cfn-files-package-json).

  Em seguida, a ação de teste transforma os relatórios XML em CodeCatalyst relatórios e os exibe no CodeCatalyst console, na guia **Relatórios** da ação de teste.

  Para ter mais informações sobre a ação de teste, consulte [Teste com fluxos de trabalhoTeste com fluxos de trabalho](test-workflow-actions.md).
+ Uma ação de construção (`BuildBackend`) — Ao concluir a ação de teste, a ação de compilação baixa e instala a AWS SAM CLI, empacota `hello-world` a fonte e copia o pacote em seu bucket do Amazon S3, onde o serviço Lambda espera que esteja. A ação também gera um novo arquivo de AWS SAM modelo chamado `sam-template-packaged.yml` e o coloca em um artefato de saída chamado. `buildArtifact`

  Para ter mais informações sobre a ação de criação, consulte [Criação com fluxos de trabalho](build-workflow-actions.md).
+ Uma ação de implantação (`DeployCloudFormationStack`) — Ao concluir a ação de criação, a ação de implantação procura o artefato de saída gerado pela ação de construção (`buildArtifact`), encontra o AWS SAM modelo dentro dela e, em seguida, executa o modelo. O AWS SAM modelo cria uma pilha que implanta o aplicativo sem servidor.

**Como criar um fluxo de trabalho**

1. No painel de navegação, escolha **CI/CD** e **Fluxos de trabalho**.

1. Selecione **Criar fluxo de trabalho**.

1. Em **Repositório de origem**, selecione `codecatalyst-cfn-source-repository`.

1. Em **Ramificação**, selecione `main`.

1. Escolha **Criar**.

1. Exclua o código de amostra YAML.

1. Adicione o seguinte código YAML:
**nota**  
No código YAML a seguir, você pode omitir as seções `Connections:` se quiser. Se você omitir essas seções, deverá garantir que o perfil especificado no campo **Perfil do IAM padrão** em seu ambiente inclua as permissões e as políticas de confiança dos dois perfis descritas em [Etapa 2: criar AWS funções](#deploy-tut-lambda-cfn-roles). Para ter mais informações sobre como configurar um ambiente com um perfil do IAM padrão, consulte [Criar um ambiente](deploy-environments-creating-environment.md).

   ```
   Name: codecatalyst-cfn-workflow
   SchemaVersion: 1.0
   
   Triggers:
     - Type: PUSH
       Branches:
         - main   
   Actions:
     Test:
       Identifier: aws/managed-test@v1
       Inputs:
         Sources:
           - WorkflowSource
       Outputs:
         Reports:
           CoverageReport:
             Format: CLOVERXML
             IncludePaths:
               - "coverage/*"
           TestReport:
             Format: JUNITXML
             IncludePaths:
               - junit.xml
       Configuration:
         Steps:
           - Run: npm install
           - Run: npm run test  
     BuildBackend:
       Identifier: aws/build@v1
       DependsOn:
         - Test
       Environment:
         Name: codecatalyst-cfn-environment
         Connections:
           - Name: codecatalyst-account-connection
             Role: codecatalyst-build-role
       Inputs:
         Sources:
           - WorkflowSource
       Configuration: 
         Steps:
           - Run: . ./setup-sam.sh
           - Run: sam package --template-file sam-template.yml --s3-bucket codecatalyst-cfn-s3-bucket --output-template-file sam-template-packaged.yml --region us-west-2
       Outputs:
         Artifacts:
           - Name: buildArtifact
             Files:
               - "**/*"
     DeployCloudFormationStack:
       Identifier: aws/cfn-deploy@v1
       DependsOn: 
         - BuildBackend
       Environment:
         Name: codecatalyst-cfn-environment
         Connections:
           - Name: codecatalyst-account-connection
             Role: codecatalyst-deploy-role
       Inputs:
         Artifacts:
           - buildArtifact
         Sources: []
       Configuration:
         name: codecatalyst-cfn-stack
         region: us-west-2
         role-arn: arn:aws:iam::111122223333:role/StackRole
         template: ./sam-template-packaged.yml
         capabilities: CAPABILITY_IAM,CAPABILITY_AUTO_EXPAND
   ```

   No código anterior, substitua:
   + Ambas as instâncias de *codecatalyst-cfn-environment* com o nome do seu ambiente.
   + Ambas as instâncias *codecatalyst-account-connection* com o nome de exibição da conexão da sua conta. O nome de exibição pode ser um número. Para obter mais informações, consulte [Etapa 3: adicionar AWS funções a CodeCatalyst](#deploy-tut-lambda-cfn-roles-add).
   + *codecatalyst-build-role* pelo nome do perfil de criação criado em [Etapa 2: criar AWS funções](#deploy-tut-lambda-cfn-roles).
   + *codecatalyst-cfn-s3-bucket*com o nome do bucket do Amazon S3 em que você criou. [Etapa 4: criar um bucket do Amazon S3](#deploy-tut-lambda-cfn-s3)
   + Ambas as instâncias são *us-west-2* com a região em que seu bucket do Amazon S3 reside (primeira instância) e onde sua pilha será implantada (segunda instância). Essas regiões podem ser diferentes. Este tutorial pressupõe que as duas regiões estejam definidas como `us-west-2`. Para obter detalhes sobre regiões suportadas pelo Amazon S3 CloudFormation, consulte [Pontos de extremidade e cotas de serviço](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html) no. *Referência geral da AWS*
   + *codecatalyst-deploy-role* pelo nome do perfil de implantação criado em [Etapa 2: criar AWS funções](#deploy-tut-lambda-cfn-roles).
   + *codecatalyst-cfn-environment*com o nome do ambiente em que você criou[Pré-requisitos](#deploy-tut-lambda-cfn-prereqs).
   + *arn:aws:iam::111122223333:role/StackRole*com o Amazon Resource Name (ARN) da função de pilha que você criou. [Etapa 2: criar AWS funções](#deploy-tut-lambda-cfn-roles)
**nota**  
Se você decidiu não criar, implantar e empilhar funções *codecatalyst-build-role**codecatalyst-deploy-role*, substitua e *arn:aws:iam::111122223333:role/StackRole* pelo nome ou ARN da `CodeCatalystWorkflowDevelopmentRole-spaceName` função. Para obter mais informações sobre essa função, consulte [Etapa 2: criar AWS funções](#deploy-tut-lambda-cfn-roles).

   Para ter informações sobre as propriedades no código mostrado anteriormente, consulte a [Ação “Implantar CloudFormation pilha” YAML](deploy-action-ref-cfn.md).

1. (Opcional) Selecione **Validar** para garantir que o código YAML seja válido antes de confirmar.

1. Selecione **Confirmar**.

1. Na caixa de diálogo **Confirmar fluxo de trabalho**, insira o seguinte:

   1. Em **Nome do arquivo do fluxo de trabalho**, mantenha o padrão, `codecatalyst-cfn-workflow`.

   1. Em **Confirmar mensagem**, insira:

      ```
      add initial workflow file
      ```

   1. Em **Repositório**, selecione **codecatalyst-cfn-source-repository**.

   1. Em **Nome da ramificação**, selecione **principal**.

   1. Selecione **Confirmar**.

   Agora você criou um fluxo de trabalho. A execução de um fluxo de trabalho é iniciada automaticamente devido ao gatilho definido na parte superior do fluxo de trabalho. Especificamente, quando você confirmou (e enviou) o arquivo `codecatalyst-cfn-workflow.yaml` ao repositório de origem, o gatilho iniciou a execução do fluxo de trabalho.

**Para visualizar a execução do fluxo de trabalho em andamento**

1. No painel de navegação, escolha **CI/CD** e **Fluxos de trabalho**.

1. Escolha o fluxo de trabalho que você acabou de criar: `codecatalyst-cfn-workflow`.

1. Escolha a guia **Execuções**.

1. Na coluna **ID da execução**, escolha o ID da execução.

1. Selecione **Teste** para ver o andamento dos testes.

1. Escolha **BuildBackend**ver o progresso da compilação.

1. Escolha **DeployCloudFormationStack**ver o progresso da implantação.

   Para ter mais informações sobre como visualizar os detalhes da execução, consulte o [Visualização do status e detalhes de execução do fluxo de trabalho](workflows-view-run.md).

1. Quando a **DeployCloudFormationStack**ação terminar, faça o seguinte:
   + Se a execução do fluxo de trabalho for bem-sucedida, vá para o próximo procedimento.
   + Se a execução do fluxo de trabalho falhar no **teste** ou na **BuildBackend**ação, escolha **Logs** para solucionar o problema.
   + Se a execução do fluxo de trabalho falhar na **DeployCloudFormationStack**ação, escolha a ação de implantação e, em seguida, escolha a guia **Resumo**. Role até a seção de **CloudFormation eventos** para ver a mensagem de erro detalhada. Se ocorrer uma reversão, exclua a `codecatalyst-cfn-stack` pilha por meio do CloudFormation console AWS antes de executar novamente o fluxo de trabalho.

**Como verificar a implantação**

1. Depois de uma implantação bem-sucedida, selecione **Variáveis (7)** na barra de menu horizontal próxima à parte superior. (Não selecione **Variáveis** no painel à direita.)

1. Em seguida **HelloWorldApi**, cole o `https://` URL em um navegador.

   Uma mensagem JSON **hello world** da função do Lambda é exibida, indicando que o fluxo de trabalho implantou e configurou a função do Lambda e o gateway de API.
**dica**  
Você pode CodeCatalyst exibir esse URL no diagrama do fluxo de trabalho com algumas configurações pequenas. Para obter mais informações, consulte [Exibir o URL da aplicação no diagrama do fluxo de trabalho](deploy-app-url.md).

**Para verificar os resultados do teste de unidade e a cobertura do código**

1. No diagrama do fluxo de trabalho, selecione **Teste** e, depois, escolha **Relatórios**.

1. Escolha **TestReport**visualizar os resultados do teste de unidade ou opte por **CoverageReport**visualizar os detalhes da cobertura de código dos arquivos que estão sendo testados, neste caso `app.js` `test-handler.js` e.

**Para verificar os recursos implantados**

1. Faça login no Console de gerenciamento da AWS e abra o console do API Gateway em [https://console.aws.amazon.com/apigateway/](https://console.aws.amazon.com/apigateway/). 

1. Observe a **codecatalyst-cfn-stack**API que o AWS SAM modelo criou. O nome da API vem do valor `Configuration/name` no arquivo de definição do fluxo de trabalho (`codecatalyst-cfn-workflow.yaml`).

1. Abra o AWS Lambda console em [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/).

1. Selecione **Funções** no painel de navegação.

1. Selecione a função do Lambda, `codecatalyst-cfn-stack-HelloWorldFunction-string`.

1. Você pode ver como o gateway de API é um gatilho para a função. Essa integração foi configurada automaticamente pelo tipo AWS SAM `AWS::Serverless::Function` de recurso.

## Etapa 7: fazer uma alteração
<a name="deploy-tut-lambda-cfn-change"></a>

Nesta etapa, você faz uma alteração no código-fonte do Lambda e o confirma. Essa confirmação inicia a execução de um novo fluxo de trabalho. Essa execução implanta a nova função do Lambda em um esquema azul esverdeado que usa a configuração padrão de mudança de tráfego especificada no console do Lambda.

**Para fazer uma alteração na origem do Lambda**

1. Em CodeCatalyst, navegue até seu projeto.

1. No painel de navegação, selecione **Código** e, depois, selecione **Repositórios de origem**.

1. Escolha seu repositório de origem `codecatalyst-cfn-source-repository`.

1. Altere o arquivo da aplicação:

   1. Escolha a pasta `hello-world`.

   1. Escolha o arquivo `app.js`.

   1. Escolha **Editar**.

   1. Na linha 23, altere `hello world` para **Tutorial complete\$1**.

   1. Selecione **Confirmar** e, depois, escolha **Confirmar** novamente.

      A confirmação faz com que uma execução do fluxo de trabalho seja iniciada. Essa execução falhará porque você não atualizou os testes de unidade para refletir a alteração do nome.

1. Atualize os testes de unidade:

   1. Selecione `hello-world\tests\unit\test-handler.js`.

   1. Escolha **Editar**.

   1. Na linha 19, altere `hello world` para **Tutorial complete\$1**.

   1. Selecione **Confirmar** e, depois, escolha **Confirmar** novamente.

      A confirmação faz com que outra execução do fluxo de trabalho seja iniciada. Essa execução será bem-sucedida.

1. No painel de navegação, escolha **CI/CD** e **Fluxos de trabalho**.

1. Selecione `codecatalyst-cfn-workflow` e **Execuções**.

1. Escolha o ID da última execução. O status ainda deve ser em andamento.

1. Escolha **Testar **BuildBackend****, e **DeployCloudFormationStack**para ver o progresso da execução do fluxo de trabalho.

1. Quando o fluxo de trabalho terminar, selecione **Variáveis (7)** na parte superior.

1. Em seguida **HelloWorldApi**, cole o `https://` URL em um navegador.

   Uma mensagem `Tutorial complete!` aparece no navegador, indicando que a nova aplicação foi implantada.

## Limpeza
<a name="deploy-tut-lambda-cfn-clean-up"></a>

Limpe os arquivos e serviços usados neste tutorial para evitar cobranças por eles.

**Para limpar no CodeCatalyst console**

1. Abra o CodeCatalyst console em [https://codecatalyst.aws/](https://codecatalyst.aws/).

1. Exclua `codecatalyst-cfn-workflow`.

1. Exclua `codecatalyst-cfn-environment`.

1. Exclua `codecatalyst-cfn-source-repository`.

1. Exclua `codecatalyst-cfn-project`.

**Para limpar no Console de gerenciamento da AWS**

1. Limpe da CloudFormation seguinte forma:

   1. Abra o CloudFormation console em [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

   1. Exclua o `codecatalyst-cfn-stack`.

      A exclusão da pilha remove todos os recursos do tutorial dos serviços do gateway de API e Lambda.

1. Limpe no Amazon S3, da seguinte forma:

   1. Abra o console do Amazon S3 em [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/).

   1. Selecione a `codecatalyst-cfn-s3-bucket`.

   1. Exclua os conteúdos do bucket.

   1. Exclua o bucket.

1. Limpe no IAM, da seguinte forma:

   1. Abra o console do IAM em [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

   1. Exclua o `codecatalyst-deploy-policy`.

   1. Exclua o `codecatalyst-build-policy`.

   1. Exclua o `codecatalyst-stack-policy`.

   1. Exclua o `codecatalyst-deploy-role`.

   1. Exclua o `codecatalyst-build-role`.

   1. Exclua o `codecatalyst-stack-role`.

Neste tutorial, você aprendeu a implantar um aplicativo sem servidor como uma CloudFormation pilha usando um CodeCatalyst fluxo de trabalho e uma ação **Deploy CloudFormation ** stack.