

Amazon ya no CodeCatalyst está abierto a nuevos clientes. Los clientes existentes pueden seguir utilizando el servicio con normalidad. Para obtener más información, consulte [Cómo migrar desde CodeCatalyst](migration.md).

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Tutorial: implementación de una aplicación sin servidor
<a name="deploy-tut-lambda"></a>

En este tutorial, aprenderá a crear, probar e implementar una aplicación sin servidor como una CloudFormation pila mediante un flujo de trabajo.

La aplicación de este tutorial es una aplicación web sencilla que genera un mensaje “Hello World”. Se compone de una AWS Lambda función y un Amazon API Gateway, y se crea mediante [AWS Serverless Application Model (AWS SAM)](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html), que es una extensión de [CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html).

**Topics**
+ [

## Requisitos previos
](#deploy-tut-lambda-cfn-prereqs)
+ [

## Paso 1: creación de un repositorio de código fuente
](#deploy-tut-lambda-cfn-source)
+ [

## Paso 2: Crear roles AWS
](#deploy-tut-lambda-cfn-roles)
+ [

## Paso 3: Añada AWS funciones a CodeCatalyst
](#deploy-tut-lambda-cfn-roles-add)
+ [

## Paso 4: creación de un bucket de Amazon S3
](#deploy-tut-lambda-cfn-s3)
+ [

## Paso 5: incorporación de archivos de código fuente
](#deploy-tut-lambda-cfn-files)
+ [

## Paso 6: creación y ejecución de un flujo de trabajo
](#deploy-tut-lambda-cfn-workflow)
+ [

## Paso 7: realización de un cambio
](#deploy-tut-lambda-cfn-change)
+ [

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

## Requisitos previos
<a name="deploy-tut-lambda-cfn-prereqs"></a>

Antes de empezar:
+ Necesita un CodeCatalyst **espacio** con una AWS cuenta conectada. Para obtener más información, consulte [Creación de un espacio](spaces-create.md).
+ En su espacio, necesita un proyecto vacío llamado:

  ```
  codecatalyst-cfn-project
  ```

  Use la opción **Empezar desde cero** para crear este proyecto.

  Para obtener más información, consulte [Crear un proyecto vacío en Amazon CodeCatalyst](projects-create.md#projects-create-empty).
+ En tu proyecto, necesitas un CodeCatalyst **entorno** llamado:

  ```
  codecatalyst-cfn-environment
  ```

  Configure este entorno de la siguiente manera:
  + Elija cualquier tipo, como **Sin producción**.
  + Conecta tu AWS cuenta a ella.
  + En **Rol de IAM predeterminado**, elija cualquier rol. Especificará un rol diferente más adelante.

  Para obtener más información, consulte [Implementación en Cuentas de AWS y VPCs](deploy-environments.md).

## Paso 1: creación de un repositorio de código fuente
<a name="deploy-tut-lambda-cfn-source"></a>

En este paso, crearás un repositorio de origen en CodeCatalyst. Este repositorio se utiliza para almacenar los archivos de código fuente del tutorial, como el archivo de funciones de Lambda. 

Para obtener más información sobre los repositorios de código fuente, consulte [Creación de un repositorio de código fuente](source-repositories-create.md).

**Creación de un repositorio de código fuente**

1. En CodeCatalyst, en el panel de navegación, elija **Código** y, a continuación, elija **Repositorios de origen**. 

1. Elija **Agregar repositorio** y, a continuación, elija **Crear repositorio**.

1. En **Nombre del repositorio**, escriba:

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

1. Seleccione **Crear**.

Ahora ha creado un repositorio llamado `codecatalyst-cfn-source-repository`.

## Paso 2: Crear roles AWS
<a name="deploy-tut-lambda-cfn-roles"></a>

En este paso, creará las siguientes funciones de AWS IAM:
+ **Función de implementación**: otorga a la acción CodeCatalyst **Deploy CloudFormation stack** el permiso para acceder a la AWS cuenta y al CloudFormation servicio en los que se implementará la aplicación sin servidor. La acción **Implementar CloudFormation pila** forma parte de tu flujo de trabajo.
+ **Función de creación**: concede a la acción de CodeCatalyst creación el permiso para acceder a su AWS cuenta y escribir en Amazon S3, donde se almacenará el paquete de aplicaciones sin servidor. La acción de compilación forma parte de su flujo de trabajo.
+ **Función de pila**: otorga CloudFormation permiso para leer y modificar los recursos especificados en la AWS SAM plantilla que proporcionará más adelante. También concede permiso a CloudWatch.

Para obtener más información sobre los roles de IAM, consulte [Roles de IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html) en la *Guía del usuario de AWS Identity and Access Management *.

**nota**  
Para ahorrar tiempo, puede crear un único rol, denominado rol `CodeCatalystWorkflowDevelopmentRole-spaceName`, en lugar de los tres roles indicados anteriormente. Para obtener más información, consulte [Creación del rol **CodeCatalystWorkflowDevelopmentRole-*spaceName*** para su cuenta y su espacio](ipa-iam-roles.md#ipa-iam-roles-service-create). Tenga en cuenta que el rol `CodeCatalystWorkflowDevelopmentRole-spaceName` tiene permisos muy amplios, lo que puede suponer un riesgo para la seguridad. Le recomendamos que utilice este rol solo en tutoriales y situaciones en las que la seguridad no sea un problema. En este tutorial se presupone que va a crear los tres roles indicados anteriormente.

**nota**  
También se requiere un [rol de ejecución de Lambda](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html), pero no es necesario que lo cree ahora porque el archivo `sam-template.yml` lo crea automáticamente cuando ejecuta el flujo de trabajo en el paso 5.



**Creación de un rol de implementación**

1. Cree una política para el rol del modo siguiente:

   1. Inicie sesión en AWS.

   1. Abra la consola de IAM en [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

   1. En el panel de navegación, seleccione **Políticas**.

   1. Elija **Crear política**.

   1. Seleccione la pestaña **JSON**.

   1. Elimine el código existente.

   1. Pegue el siguiente código:
**nota**  
La primera vez que utilice el rol para ejecutar acciones de flujo de trabajo, use el comodín en la instrucción de política de recursos y, a continuación, precise el ámbito de la política con el nombre del recurso cuando esté disponible.  

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

   1. Elija **Siguiente: Etiquetas**.

   1. Elija **Siguiente: Revisar**.

   1. En **Nombre**, escriba:

      ```
      codecatalyst-deploy-policy
      ```

   1. Elija **Crear política**.

      Ahora ha creado una política de permisos.

1. Cree el rol de implementación de la siguiente manera:

   1. En el panel de navegación, seleccione **Roles** y luego seleccione **Crear rol**.

   1. Elija **Política de confianza personalizada**.

   1. Elimine la política de confianza personalizada existente.

   1. Añada la siguiente política de confianza personalizada:

   1. Elija **Siguiente**.

   1. En **Políticas de permisos**, busque `codecatalyst-deploy-policy` y active su casilla de verificación.

   1. Elija **Siguiente**.

   1. En **Nombre del rol**, escriba:

      ```
      codecatalyst-deploy-role
      ```

   1. En **Descripción del rol**, escriba:

      ```
      CodeCatalyst deploy role
      ```

   1. Seleccione **Crear rol**.

   Ahora ha creado un rol de implementación con una política de confianza y una política de permisos.

1. Obtenga el ARN del rol de implementación de la siguiente manera:

   1. Seleccione **Roles** en el panel de navegación.

   1. En el cuadro de búsqueda, introduzca el nombre del rol que acaba de crear (`codecatalyst-deploy-role`).

   1. Elija el rol de la lista.

      Aparece la página **Resumen** del rol.

   1. En la parte superior, copie el valor de **ARN**.

   Ahora ha creado el rol de implementación con los permisos adecuados y ha obtenido su ARN.

**Creación de un rol de compilación**

1. Cree una política para el rol del modo siguiente:

   1. Inicie sesión en AWS.

   1. Abra la consola de IAM en [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

   1. En el panel de navegación, seleccione **Políticas**.

   1. Elija **Crear política**.

   1. Seleccione la pestaña **JSON**.

   1. Elimine el código existente.

   1. Pegue el siguiente código:
**nota**  
La primera vez que utilice el rol para ejecutar acciones de flujo de trabajo, use el comodín en la instrucción de política de recursos y, a continuación, precise el ámbito de la política con el nombre del recurso cuando esté disponible.  

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

   1. Elija **Siguiente: Etiquetas**.

   1. Elija **Siguiente: Revisar**.

   1. En **Nombre**, escriba:

      ```
      codecatalyst-build-policy
      ```

   1. Elija **Crear política**.

      Ahora ha creado una política de permisos.

1. Cree el rol de compilación de la siguiente manera:

   1. En el panel de navegación, seleccione **Roles** y luego seleccione **Crear rol**.

   1. Elija **Política de confianza personalizada**.

   1. Elimine la política de confianza personalizada existente.

   1. Añada la siguiente política de confianza personalizada:

   1. Elija **Siguiente**.

   1. En **Políticas de permisos**, busque `codecatalyst-build-policy` y active su casilla de verificación.

   1. Elija **Siguiente**.

   1. En **Nombre del rol**, escriba:

      ```
      codecatalyst-build-role
      ```

   1. En **Descripción del rol**, escriba:

      ```
      CodeCatalyst build role
      ```

   1. Seleccione **Crear rol**.

   Ahora ha creado un rol de compilación con una política de confianza y una política de permisos.

1. Obtenga el ARN del rol de compilación de la siguiente manera:

   1. Seleccione **Roles** en el panel de navegación.

   1. En el cuadro de búsqueda, introduzca el nombre del rol que acaba de crear (`codecatalyst-build-role`).

   1. Elija el rol de la lista.

      Aparece la página **Resumen** del rol.

   1. En la parte superior, copie el valor de **ARN**.

   Ahora ha creado el rol de compilación con los permisos adecuados y ha obtenido su ARN.<a name="deploy-tut-lambda-cfn-roles-stack"></a>

**Creación de un rol de pila**

1. Inicia sesión AWS con la cuenta en la que quieres implementar tu stack.

1. Abra la consola de IAM en [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

1. Cree el rol de pila de la siguiente manera:

   1. Seleccione **Roles** en el panel de navegación.

   1. Elija **Crear rol**.

   1. Elija **Servicio de AWS **.

   1. En la sección **Casos de uso**, elige una opción **CloudFormation**de la lista desplegable.

   1. Seleccione el botón de opción **CloudFormation**.

   1. En la parte inferior, elija **Siguiente**.

   1. En el cuadro de búsqueda, busque las siguientes políticas de permisos y, a continuación, active las casillas de verificación correspondientes.
**nota**  
Si busca una política y no aparece, asegúrese de seleccionar **Borrar filtros** e inténtelo de nuevo.
      + **CloudWatchFullAccess**
      + **AWS CloudFormationFullAccess**
      + **IAMFullAcceso**
      + **AWS Lambda\$1 FullAccess**
      + **APIGatewayAdministrador de Amazon**
      + **Amazon S3 FullAccess**
      + **AmazonEC2ContainerRegistryFullAccess**

      La primera política permite el acceso CloudWatch a para permitir la reversión de las pilas cuando se produce una alarma.

      Las políticas restantes permiten acceder AWS SAM a los servicios y recursos de la pila que se implementarán en este tutorial. Para obtener más información, consulte [Permisos](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-permissions.html) en la *Guía para desarrolladores de AWS Serverless Application Model *.

   1. Elija **Siguiente**.

   1. En **Nombre del rol**, escriba:

      ```
      codecatalyst-stack-role
      ```

   1. Seleccione **Crear rol**.

1. Obtenga el ARN del rol de pila de la siguiente manera:

   1. Seleccione **Roles** en el panel de navegación.

   1. En el cuadro de búsqueda, introduzca el nombre del rol que acaba de crear (`codecatalyst-stack-role`).

   1. Elija el rol de la lista.

   1. En la sección **Resumen**, copie el valor de **ARN**. Lo necesitará más adelante.

   Ahora ha creado el rol de pila con los permisos adecuados y ha obtenido su ARN.

## Paso 3: Añada AWS funciones a CodeCatalyst
<a name="deploy-tut-lambda-cfn-roles-add"></a>

En este paso, agrega el rol de creación (`codecatalyst-build-role`) y el rol de implementación (`codecatalyst-deploy-role`) a la conexión de CodeCatalyst cuentas de su espacio.

**nota**  
No es necesario añadir el rol de pila (`codecatalyst-stack-role`) a la conexión. Esto se debe a que el rol de pila lo usa *CloudFormation*(no CodeCatalyst), *después de* que ya se haya establecido una conexión entre CodeCatalyst y AWS utilizando el rol de despliegue. Como el rol de pila no lo utiliza CodeCatalyst para acceder a él AWS, no es necesario que esté asociado a una conexión de cuenta.

**Incorporación de roles de compilación e implementación a la conexión de cuenta**

1. En CodeCatalyst, navega hasta tu espacio.

1. Elija **Cuentas de AWS **. Aparecerá una lista de conexiones de cuenta.

1. Elija la conexión de cuenta que represente la AWS cuenta en la que creó sus funciones de creación e implementación.

1. Seleccione **Administrar roles en la consola de AWS administración**.

   Aparece la página **Añadir función de IAM a Amazon CodeCatalyst Space**. Es posible que tenga que iniciar sesión para acceder a la página.

1. Seleccione **Agregar un rol existente que haya creado en IAM**.

   Se muestra una lista desplegable. La lista muestra todos los roles de IAM con una política de confianza que incluye las entidades principales de los servicios `codecatalyst-runner.amazonaws.com` y `codecatalyst.amazonaws.com`.

1. En la lista desplegable, elija `codecatalyst-build-role` y, a continuación, elija **Agregar rol**.

1. Seleccione **Agregar rol de IAM**, seleccione **Agregar un rol existente que haya creado en IAM** y, en la lista desplegable, elija `codecatalyst-deploy-role`. Seleccione **Add role (Añadir rol)**.

   Ahora ha añadido los roles de compilación e implementación a su espacio.

1. Copia el valor del **nombre CodeCatalyst mostrado de Amazon**. Necesitará este valor más adelante, cuando cree el flujo de trabajo.

## Paso 4: creación de un bucket de Amazon S3
<a name="deploy-tut-lambda-cfn-s3"></a>

En este paso, creará un bucket de Amazon S3 en el que se almacenará el archivo .zip del paquete de implementación de la aplicación sin servidor.

**Creación de un bucket de Amazon S3**

1. Abra la consola de Amazon S3 en [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/).

1. En el panel principal, elija **Crear bucket**.

1. En **Nombre del bucket**, escriba:

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

1. En **AWS Región**, seleccione una región. En este tutorial, se asume que ha elegido **Oeste de EE. UU. (Oregón) us-west-2**. Para obtener más información sobre las regiones admitidas en Amazon S3, consulte [Puntos de conexión y cuotas de Amazon Simple Storage Service](https://docs.aws.amazon.com/general/latest/gr/s3.html) en la *Referencia general de AWS*.

1. En la parte inferior de la página, elija **Crear bucket**.

Ahora ha creado un bucket llamado **codecatalyst-cfn-s3-bucket** en la región Oeste de EE. UU. (Oregón) us-west-2.

## Paso 5: incorporación de archivos de código fuente
<a name="deploy-tut-lambda-cfn-files"></a>

En este paso, añadirá varios archivos fuente de la aplicación a su repositorio CodeCatalyst de código fuente. La carpeta `hello-world` contiene los archivos de la aplicación que va a implementar. La carpeta `tests` contiene las pruebas unitarias. La estructura de carpetas es la siguiente:

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

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

El `.npmignore` archivo indica qué archivos y carpetas debe excluir npm del paquete de la aplicación. En este tutorial, npm excluye la carpeta `tests` porque no forma parte de la aplicación.

**Adición del .npmignore**

1. Abra la CodeCatalyst consola en [https://codecatalyst.aws/](https://codecatalyst.aws/).

1. Elija el proyecto, `codecatalyst-cfn-project`.

1. En el panel de navegación, elija **Código** y, a continuación, elija **Repositorios de origen**.

1. En la lista de repositorios de código fuente, elija su repositorio, `codecatalyst-cfn-source-repository`. 

1. En **Archivos**, elija **Crear archivo**.

1. En **Nombre del archivo**, escriba:

   ```
   .npmignore
   ```

1. En el cuadro de texto, introduzca el siguiente código:

   ```
   tests/*
   ```

1. Seleccione **Confirmar** y, a continuación, vuelva a seleccionar **Confirmar**.

   Ahora ha creado un archivo llamado `.npmignore` en la raíz del repositorio.

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

El archivo `package.json` contiene metadatos importantes sobre su proyecto de Node, como el nombre del proyecto, el número de versión, la descripción, las dependencias y otros detalles que describen cómo interactuar con la aplicación y cómo ejecutarla.

El archivo `package.json` de este tutorial incluye una lista de dependencias y un script `test`. El script de prueba hace lo siguiente:
+ Mediante [mocha](https://mochajs.org/), el script de prueba ejecuta las pruebas unitarias especificadas en `hello-world/tests/unit/` y escribe los resultados en un archivo `junit.xml` mediante el generador de informes [xunit]().
+ Usando [Istanbul (nyc)](https://istanbul.js.org/), el script de prueba genera un informe de cobertura de código (`clover.xml`) utilizando el generador de informes [clover](https://openclover.org/doc/manual/4.2.0/general--about-openclover.html). Para obtener más información, consulte [Using alternative reporters](https://istanbul.js.org/docs/advanced/alternative-reporters/#clover) en la documentación de Istanbul.

**Adición del archivo package.json**

1. En el repositorio, en **Archivos**, seleccione **Crear archivo**.

1. En **Nombre del archivo**, escriba:

   ```
   package.json
   ```

1. En el cuadro de texto, introduzca el siguiente código:

   ```
   {
     "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. Seleccione **Confirmar** y, a continuación, vuelva a seleccionar **Confirmar**.

   Ahora ha añadido un archivo llamado `package.json` en la raíz del repositorio.

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

El archivo `sam-template.yml` contiene las instrucciones para implementar la función de Lambda y la instancia de API Gateway y configurarlas juntas. Sigue la [especificación de la AWS Serverless Application Model plantilla](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-specification.html), que amplía la especificación CloudFormation de la plantilla.

En este tutorial, utilizarás una AWS SAM plantilla en lugar de una CloudFormation plantilla normal porque AWS SAM ofrece un útil tipo de recurso [AWS: :Serverless: :Function](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html). Este tipo realiza una gran parte behind-the-scenes de la configuración que normalmente hay que escribir para usar la sintaxis básica. CloudFormation Por ejemplo, el recurso `AWS::Serverless::Function` crea una función de Lambda, un rol de ejecución de Lambda y asignaciones de orígenes de eventos que inician la función. Tienes que codificar todo esto si quieres escribirlo usando la básica CloudFormation.

Aunque en este tutorial se utiliza una plantilla prediseñada, puede generar una como parte de su flujo de trabajo mediante una acción de compilación. Para obtener más información, consulte [Implementación de una CloudFormation pila](deploy-action-cfn.md).

**Adición del archivo sam-template.yml**

1. En el repositorio, en **Archivos**, seleccione **Crear archivo**.

1. En **Nombre del archivo**, escriba:

   ```
   sam-template.yml
   ```

1. En el cuadro de texto, introduzca el siguiente código:

   ```
   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. Seleccione **Confirmar** y, a continuación, vuelva a seleccionar **Confirmar**.

   Ahora ha añadido un archivo llamado `sam-template.yml` en la carpeta raíz del repositorio.

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

El `setup-sam.sh` archivo contiene las instrucciones para descargar e instalar la utilidad AWS SAM CLI. El flujo de trabajo usa esta utilidad para empaquetar el código fuente de `hello-world`.

**Adición del archivo setup-sam.sh**

1. En el repositorio, en **Archivos**, seleccione **Crear archivo**.

1. En **Nombre del archivo**, escriba:

   ```
   setup-sam.sh
   ```

1. En el cuadro de texto, introduzca el siguiente código:

   ```
   #!/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
   ```

   En el código anterior, *us-west-2* sustitúyalo por tu AWS región.

1. Seleccione **Confirmar** y, a continuación, vuelva a seleccionar **Confirmar**.

   Ahora ha añadido un archivo llamado `setup-sam.sh` en la raíz del repositorio.

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

El archivo `app.js` contiene el código de la función de Lambda. En este tutorial, el código devuelve el texto `hello world`.

**Adición del archivo app.js**

1. En el repositorio, en **Archivos**, seleccione **Crear archivo**.

1. En **Nombre del archivo**, escriba:

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

1. En el cuadro de texto, introduzca el siguiente código:

   ```
   // 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. Seleccione **Confirmar** y, a continuación, vuelva a seleccionar **Confirmar**.

   Ahora ha creado una carpeta llamada `hello-world` y un archivo llamado `app.js`.

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

El archivo `test-handler.js` contiene pruebas unitarias para la función de Lambda.

**Adición del archivo test-handler.js**

1. En el repositorio, en **Archivos**, seleccione **Crear archivo**.

1. En **Nombre del archivo**, escriba:

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

1. En el cuadro de texto, introduzca el siguiente código:

   ```
   '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. Seleccione **Confirmar** y, a continuación, vuelva a seleccionar **Confirmar**.

   Ahora ha añadido un archivo llamado `test-handler.js` en la carpeta `hello-world/tests/unit`.

Ahora ha añadido todos los archivos de código fuente.

Dedique unos minutos a comprobar su trabajo y a asegurarse de que ha colocado todos los archivos en las carpetas correctas. La estructura de carpetas es la siguiente:

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

## Paso 6: creación y ejecución de un flujo de trabajo
<a name="deploy-tut-lambda-cfn-workflow"></a>

En este paso, creará un flujo de trabajo que empaquetará el código fuente de Lambda y lo implementará. El flujo de trabajo consta de los siguientes componentes que se ejecutarán en orden:
+ Un desencadenador: este desencadenador inicia la ejecución automática del flujo de trabajo cuando se introduce un cambio en el repositorio de código fuente. Para obtener más información acerca de los desencadenadores, consulte [Inicio de un flujo de trabajo y ejecución automática mediante desencadenadores](workflows-add-trigger.md).
+ Una acción de prueba (`Test`): al activarse, esta acción instala el [administrador de paquetes de Node (npm)](https://www.npmjs.com/) y, a continuación, ejecuta el comando `npm run test`. Este comando indica a npm que ejecute el script `test` definido en el archivo `package.json`. El script `test`, a su vez, ejecuta las pruebas unitarias y genera dos informes: un informe de prueba (`junit.xml`) y un informe de cobertura de código (`clover.xml`). Para obtener más información, consulte [Archivo package.json](#deploy-tut-lambda-cfn-files-package-json).

  A continuación, la acción de prueba transforma los informes XML en CodeCatalyst informes y los muestra en la CodeCatalyst consola, en la pestaña **Informes** de la acción de prueba.

  Para obtener más información sobre la acción de prueba, consulte [Pruebas con flujos de trabajoPruebas con flujos de trabajo](test-workflow-actions.md).
+ Una acción de compilación (`BuildBackend`): al finalizar la acción de prueba, la acción de compilación descarga e instala la AWS SAM CLI, empaqueta el `hello-world` código fuente y copia el paquete en su bucket de Amazon S3, donde el servicio Lambda espera que esté. La acción también genera un nuevo archivo de AWS SAM plantilla llamado `sam-template-packaged.yml` y lo coloca en un artefacto de salida denominado. `buildArtifact`

  Para obtener más información sobre la acción de compilación, consulte [Compilación con flujos de trabajo](build-workflow-actions.md).
+ Una acción de despliegue (`DeployCloudFormationStack`): al finalizar la acción de creación, la acción de despliegue busca el artefacto de salida generado por la acción de creación (`buildArtifact`), encuentra la AWS SAM plantilla que contiene y, a continuación, ejecuta la plantilla. La AWS SAM plantilla crea una pila que despliega la aplicación sin servidor.

**Para crear un flujo de trabajo**

1. En el panel de navegación, elija **CI/CD** y, a continuación, elija **Flujos de trabajo**.

1. Seleccione **Crear flujo de trabajo**.

1. En **Repositorio de código fuente**, elija `codecatalyst-cfn-source-repository`.

1. En **Ramificación**, elija `main`.

1. Seleccione **Crear**.

1. Elimine el código de ejemplo de YAML.

1. Añada el código de YAML siguiente:
**nota**  
En el código de YAML que se muestra a continuación, puede omitir las secciones `Connections:` si lo desea. Si omite estas secciones, debe asegurarse de que el rol especificado en el campo **Rol de IAM predeterminado** del entorno incluya los permisos y las políticas de confianza de ambos roles que se describen en [Paso 2: Crear roles AWS](#deploy-tut-lambda-cfn-roles). Para obtener más información sobre cómo configurar un entorno con un rol de IAM predeterminado, consulte [Creación de un entorno](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
   ```

   En el código anterior, sustituya:
   + Ambas instancias o *codecatalyst-cfn-environment* con el nombre de su entorno.
   + Ambas instancias *codecatalyst-account-connection* con el nombre visible de la conexión de su cuenta. El nombre de visualización puede ser un número. Para obtener más información, consulte [Paso 3: Añada AWS funciones a CodeCatalyst](#deploy-tut-lambda-cfn-roles-add).
   + *codecatalyst-build-role* por el nombre del rol de compilación que creó en [Paso 2: Crear roles AWS](#deploy-tut-lambda-cfn-roles).
   + *codecatalyst-cfn-s3-bucket*con el nombre del bucket de Amazon S3 en el que lo creaste[Paso 4: creación de un bucket de Amazon S3](#deploy-tut-lambda-cfn-s3).
   + Ambas instancias *us-west-2* con la región en la que reside su bucket de Amazon S3 (primera instancia) y en la que se implementará su pila (segunda instancia). Estas regiones pueden ser diferentes. En este tutorial se asume que ambas regiones están establecidas en `us-west-2`. Para obtener más información sobre las regiones compatibles con Amazon S3 CloudFormation, consulte los [puntos de enlace y las cuotas del *Referencia general de AWS*servicio](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html) en.
   + *codecatalyst-deploy-role* por el nombre del rol de implementación que creó en [Paso 2: Crear roles AWS](#deploy-tut-lambda-cfn-roles).
   + *codecatalyst-cfn-environment*con el nombre del entorno en [Requisitos previos](#deploy-tut-lambda-cfn-prereqs) el que creó.
   + *arn:aws:iam::111122223333:role/StackRole*con el nombre de recurso de Amazon (ARN) del rol de pila en el que creaste. [Paso 2: Crear roles AWS](#deploy-tut-lambda-cfn-roles)
**nota**  
Si decidió no crear funciones de creación, implementación y apilamiento *codecatalyst-build-role**codecatalyst-deploy-role*, sustituya y *arn:aws:iam::111122223333:role/StackRole* por el nombre o el ARN de la `CodeCatalystWorkflowDevelopmentRole-spaceName` función. Para obtener más información acerca de este rol, consulte [Paso 2: Crear roles AWS](#deploy-tut-lambda-cfn-roles).

   Para obtener información sobre las propiedades del código mostrado anteriormente, consulte el [Acción «Desplegar CloudFormation pila» YAML](deploy-action-ref-cfn.md).

1. (Opcional) Seleccione **Validar** para asegurarse de que el código de YAML del flujo de trabajo sea válido antes de confirmarlo.

1. Elija **Confirmar**.

1. En el cuadro de diálogo **Confirmar flujo de trabajo**, escriba lo siguiente:

   1. En **Nombre del archivo de flujo de trabajo**, deje el valor predeterminado, `codecatalyst-cfn-workflow`.

   1. En **Mensaje de confirmación**, escriba:

      ```
      add initial workflow file
      ```

   1. En **Repositorio**, elija **codecatalyst-cfn-source-repository**.

   1. En **Nombre de la ramificación**, elija **principal**.

   1. Elija **Confirmar**.

   Ahora ha creado un flujo de trabajo. La ejecución del flujo de trabajo se inicia automáticamente debido al desencadenador definido en la parte superior del flujo de trabajo. En concreto, cuando confirmó (e incorporó) el archivo `codecatalyst-cfn-workflow.yaml` en su repositorio de código fuente, el desencadenador inició la ejecución del flujo de trabajo.

**Consulta de la ejecución del flujo de trabajo en curso**

1. En el panel de navegación, elija **CI/CD** y, a continuación, elija **Flujos de trabajo**.

1. Elija el flujo de trabajo que acaba de crear: `codecatalyst-cfn-workflow`.

1. Elija la pestaña **Ejecuciones**.

1. En la columna **ID de ejecución**, elija el ID de ejecución.

1. Elija **Prueba** para ver el progreso de las pruebas.

1. Elija **BuildBackend**ver el progreso de la creación.

1. Elija **DeployCloudFormationStack**ver el progreso de la implementación.

   Para obtener más información sobre cómo ver los detalles de ejecución, consulte [Visualización del estado y los detalles de la ejecución de un flujo de trabajo](workflows-view-run.md).

1. Cuando finalice la **DeployCloudFormationStack**acción, haga lo siguiente:
   + Si la ejecución del flujo de trabajo se realizó correctamente, vaya al siguiente procedimiento.
   + Si la ejecución del flujo de trabajo falló en la **prueba** o la **BuildBackend**acción, selecciona **Registros** para solucionar el problema.
   + Si la ejecución del flujo de trabajo falló en la **DeployCloudFormationStack**acción, elija la acción de despliegue y, a continuación, elija la pestaña **Resumen**. Desplázate hasta la sección de **CloudFormation eventos** para ver el mensaje de error detallado. Si se ha producido una reversión, elimina la `codecatalyst-cfn-stack` pila a través de la CloudFormation consola AWS antes de volver a ejecutar el flujo de trabajo.

**Verificación de la implementación**

1. Tras una implementación correcta, seleccione **Variables (7)** en la barra de menú horizontal situada cerca de la parte superior. (No elija **Variables** en el panel de la derecha).

1. Junto a **HelloWorldApi**, pega la `https://` URL en un navegador.

   Aparece un mensaje JSON **hello world** de la función de Lambda, que indica que el flujo de trabajo implementó y configuró correctamente la función de Lambda y la instancia de API Gateway.
**sugerencia**  
Puedes hacer que se CodeCatalyst muestre esta URL en el diagrama de flujo de trabajo con unas cuantas configuraciones pequeñas. Para obtener más información, consulte [Visualización de la URL de la aplicación en el diagrama de flujo de trabajo](deploy-app-url.md).

**Verificación de los resultados de las pruebas unitarias y la cobertura del código**

1. En el diagrama de flujo de trabajo, elija **Probar** y, a continuación, elija **Informes**.

1. Elija **TestReport**ver los resultados de las pruebas unitarias o los detalles de la cobertura del código de los archivos que se están probando, en este caso, `app.js` y`test-handler.js`. **CoverageReport**

**Verificación de los recursos implementados**

1. Inicie sesión en la consola de API Gateway Consola de administración de AWS y ábrala en [https://console.aws.amazon.com/apigateway/](https://console.aws.amazon.com/apigateway/). 

1. Observe la **codecatalyst-cfn-stack**API que creó la AWS SAM plantilla. El nombre de la API proviene del valor `Configuration/name` del archivo de definición del flujo de trabajo (`codecatalyst-cfn-workflow.yaml`).

1. Abre la AWS Lambda consola en [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/).

1. Seleccione **Funciones** en el panel de navegación.

1. Elija su función de Lambda, `codecatalyst-cfn-stack-HelloWorldFunction-string`.

1. Puede ver cómo la instancia de API Gateway es un desencadenador de la función. Esta integración se configuró automáticamente según el tipo de AWS SAM `AWS::Serverless::Function` recurso.

## Paso 7: realización de un cambio
<a name="deploy-tut-lambda-cfn-change"></a>

En este paso, realizará un cambio en el código fuente de Lambda y lo confirmará. Esta confirmación inicia una nueva ejecución del flujo de trabajo. Esta ejecución implementa la nueva función de Lambda en un esquema azul-verde que usa la configuración de cambio de tráfico predeterminada especificada en la consola de Lambda.

**Realización de un cambio en el código fuente de Lambda**

1. En CodeCatalyst, navega hasta tu proyecto.

1. En el panel de navegación, elija **Código** y, a continuación, elija **Repositorios de origen**.

1. Elija su repositorio de código fuente `codecatalyst-cfn-source-repository`.

1. Cambie el archivo de la aplicación:

   1. Elija la carpeta `hello-world`.

   1. Seleccione el archivo `app.js`.

   1. Seleccione **Editar**.

   1. En la línea 23, cambie `hello world` por **Tutorial complete\$1**

   1. Seleccione **Confirmar** y, a continuación, vuelva a seleccionar **Confirmar**.

      La confirmación hace que se inicie una nueva ejecución del flujo de trabajo. Esta ejecución fallará porque no ha actualizado las pruebas unitarias para que reflejen el cambio de nombre.

1. Actualice las pruebas unitarias:

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

   1. Seleccione **Editar**.

   1. En la línea 19, cambie `hello world` por **Tutorial complete\$1**

   1. Seleccione **Confirmar** y, a continuación, vuelva a seleccionar **Confirmar**.

      La confirmación hace que se inicie otra ejecución del flujo de trabajo. Esta ejecución se realizará correctamente.

1. En el panel de navegación, elija **CI/CD** y, a continuación, elija **Flujos de trabajo**.

1. Elija `codecatalyst-cfn-workflow` y, a continuación, **Ejecuciones**.

1. Elija el ID de ejecución de la última ejecución. Debería estar todavía en curso.

1. Selecciona **Probar** y verás el progreso **DeployCloudFormationStack**de la ejecución del flujo de trabajo. **BuildBackend**

1. Cuando finalice el flujo de trabajo, elija **Variables** (7) cerca de la parte superior.

1. Junto a **HelloWorldApi**, pega la `https://` URL en un navegador.

   Aparece un mensaje `Tutorial complete!` en el navegador, lo que indica que la aplicación se ha implementado correctamente.

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

Limpie los archivos y servicios utilizados en este tutorial para evitar que le cobren por ellos.

**Para limpiar en la CodeCatalyst consola**

1. Abre la CodeCatalyst consola en [https://codecatalyst.aws/](https://codecatalyst.aws/).

1. Elimine `codecatalyst-cfn-workflow`.

1. Elimine `codecatalyst-cfn-environment`.

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

1. Elimine `codecatalyst-cfn-project`.

**Para limpiar en el Consola de administración de AWS**

1. Limpie en CloudFormation, de la siguiente manera:

   1. Abre la CloudFormation consola en [https://console.aws.amazon.com/cloudformation.](https://console.aws.amazon.com/cloudformation/)

   1. Elimine la `codecatalyst-cfn-stack`.

      Al eliminar la pila, se eliminan todos los recursos del tutorial de los servicios de API Gateway y Lambda.

1. Limpie Amazon S3 de la siguiente manera:

   1. Abra la consola de Amazon S3 en [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/).

   1. Elija el icono `codecatalyst-cfn-s3-bucket`.

   1. Elimine el contenido del bucket.

   1. Elimine el bucket .

1. Limpie IAM de la siguiente manera:

   1. Abra la consola de IAM en [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

   1. Elimine la `codecatalyst-deploy-policy`.

   1. Elimine la `codecatalyst-build-policy`.

   1. Elimine la `codecatalyst-stack-policy`.

   1. Elimine la `codecatalyst-deploy-role`.

   1. Elimine la `codecatalyst-build-role`.

   1. Elimine la `codecatalyst-stack-role`.

En este tutorial, aprendió a implementar una aplicación sin servidor como una CloudFormation pila mediante un CodeCatalyst flujo de trabajo y una acción de **implementación CloudFormation ** de una pila.