Tutorial: Implementar una aplicación Hello World - AWS Serverless Application Model

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: Implementar una aplicación Hello World

En esta guía, descargará, compilará e implementará una aplicación de ejemplo de Hello World medianteAWS SAM. A continuación, se prueba la aplicación en elAWSCloud y, opcionalmente, pruébalo localmente en tu host de desarrollo.

Esta aplicación implementa un backend API básico. Se compone de un punto de enlace de Amazon API Gateway yAWS Lambdafunción. Cuando envía una solicitud GET al punto de enlace de API Gateway, se invoca la función Lambda. Esta función devuelve unhello worldmessage.

El siguiente diagrama muestra los componentes de esta aplicación:


      Diagrama de una función Lambda que se invoca cuando envía una solicitud GET al punto de enlace de API Gateway.

Cuando inicializa la aplicación de ejemplo, tiene la opción de elegir un tipo de paquete de implementación de Lambda, bienZipoImage. Para obtener más información acerca de los tipos de paquetes, consultePaquetes de implementación de Lambdaen laAWS LambdaGuía para desarrolladores.

A continuación se muestra una vista previa de los comandos que ejecuta para crear su aplicación Hello World. Para obtener más información acerca de cada uno de estos comandos, consulte las secciones más adelante en este tutorial.

#Step 1 - Download a sample application sam init #Step 2 - Build your application cd sam-app sam build #Step 3 - Deploy your application sam deploy --guided

Requisitos previos

En esta guía se supone que ha completado los pasos de su sistema operativo enInstalación de la CLI de AWS SAM, que incluye:

  1. Creación de unAWSaccount.

  2. ConfiguraciónAWS Identity and Access Managementpermisos (IAM).

  3. Instalar Docker. Nota: Docker es un requisito previo solo para probar su aplicación localmente.

  4. Instalar Homebrew. Nota: Homebrew es un requisito previo solo para Linux y macOS.

  5. Instalación deAWS SAMinterfaz de línea de comandos (CLI). Nota: Asegúrese de tener la versión 1.13.0 o posterior. Compruebe la versión ejecutando elsam --versioncomando.

Paso 1: Descargue un ejemploAWS SAMaplicación

Comando para ejecutar:

sam init

Siga las indicaciones que aparecen en pantalla. Para este tutorial, le recomendamos que elijaAWS Quick Start Templates, elZiptipo de paquete, el tiempo de ejecución de su elección y elHello World Example.

Ejemplo del resultado:

   
 -----------------------
 Generating application:
 -----------------------
 Name: sam-app
 Runtime: python3.7
 Dependency Manager: pip
 Application Template: hello-world
 Output Directory: .

 Next steps can be found in the README file at ./sam-app/README.md
        

¿Qué?AWS SAMestá haciendo:

Este comando crea un directorio con el nombre que proporcionó como nombre del proyecto. El contenido del directorio de proyectos es similar a este:

 
 sam-app/
   ├── README.md
   ├── events/
   │   └── event.json
   ├── hello_world/
   │   ├── __init__.py
   │   ├── app.py            #Contains your AWS Lambda handler logic.
   │   └── requirements.txt  #Contains any Python dependencies the application requires, used for sam build
   ├── template.yaml         #Contains the AWS SAM template defining your application's AWS resources.
   └── tests/
       └── unit/
           ├── __init__.py
           └── test_handler.py
        
nota

Estos contenidos del directorio de proyectos se crean cuando se elige uno de los tiempos de ejecución de Python yHello World Example.

Hay tres archivos especialmente importantes:

  • template.yaml: contiene elAWS SAMplantilla que define la de la aplicaciónAWSde AWS.

  • hello_world/app.py: Contiene su lógica de manejador Lambda real.

  • hello_world/requirements.txt: contiene las dependencias de Python que requiere la aplicación y se utiliza parasam build.

Paso 2: Cree su aplicación

Comando para ejecutar:

En primer lugar, cambie al directorio de proyectos, donde eltemplate.yamlse encuentra el archivo de la aplicación de ejemplo. (De forma predeterminada, este directorio essam-app.) Ejecute este comando:

sam build

Ejemplo del resultado:

  
 Build Succeeded

 Built Artifacts  : .aws-sam/build
 Built Template   : .aws-sam/build/template.yaml

 Commands you can use next
 =========================
 [*] Invoke Function: sam local invoke
 [*] Deploy: sam deploy --guided
       

¿Qué?AWS SAMestá haciendo:

LaAWS SAMLa CLI de viene con abstracciones para una serie de tiempos de ejecución de Lambda para crear sus dependencias y copia el código fuente en carpetas preliminares para que todo esté listo para empaquetarse e implementarse. Lasam buildcrea todas las dependencias que tiene la aplicación y copia el código fuente de la aplicación en carpetas bajo.aws-sam/buildpara ser comprimido y cargado en Lambda.

Puede ver el siguiente árbol de nivel superior en.aws-sam:

 
 .aws-sam/
   └── build/
       ├── HelloWorldFunction/
       └── template.yaml
            

HelloWorldFunctiones un directorio que contiene suapp.py, así como dependencias de terceros que utiliza su aplicación.

Paso 3: Implemente la aplicación en elAWSNube

Comando para ejecutar:

sam deploy --guided

Siga las indicaciones que aparecen en pantalla. Para aceptar las opciones predeterminadas proporcionadas en la experiencia interactiva, responda conEnter.

nota

Para el avisoHelloWorldFunction may not have authorization defined, Is this okay? [y/N],AWS SAMle informa de que la aplicación de ejemplo configura una API Gateway API sin autorización. Al implementar la aplicación de ejemplo,AWS SAMcrea una URL disponible públicamente.

Puede confirmar esta notificación respondiendo «Y» al mensaje. Para obtener información acerca de cómo configurar la autorización, consulteControlar el acceso a las API de API Gateway.

Ejemplo del resultado:

 
    Deploying with following values
    ===============================
    Stack name                 : sam-app
    Region                     : us-east-1
    Confirm changeset          : False
    Deployment s3 bucket       : sam-bucket
    Capabilities               : ["CAPABILITY_IAM"]
    Parameter overrides        : {}

 Initiating deployment
 =====================

 Waiting for changeset to be created..

 CloudFormation stack changeset
 ---------------------------------------------------------------------------------------------------------------------------------------------------
 Operation                                         LogicalResourceId                                 ResourceType
 ---------------------------------------------------------------------------------------------------------------------------------------------------
 + Add                                             HelloWorldFunctionHelloWorldPermissionProd        AWS::Lambda::Permission
 + Add                                             ServerlessRestApiDeployment47fc2d5f9d             AWS::ApiGateway::Deployment
 + Add                                             ServerlessRestApiProdStage                        AWS::ApiGateway::Stage
 + Add                                             ServerlessRestApi                                 AWS::ApiGateway::RestApi
 * Modify                                          HelloWorldFunctionRole                            AWS::IAM::Role
 * Modify                                          HelloWorldFunction                                AWS::Lambda::Function
 ---------------------------------------------------------------------------------------------------------------------------------------------------

 2019-11-21 14:33:24 - Waiting for stack create/update to complete

 CloudFormation events from changeset
 -------------------------------------------------------------------------------------------------------------------------------------------------
 ResourceStatus                       ResourceType                         LogicalResourceId                    ResourceStatusReason
 -------------------------------------------------------------------------------------------------------------------------------------------------
 UPDATE_IN_PROGRESS                   AWS::IAM::Role                       HelloWorldFunctionRole               -
 UPDATE_COMPLETE                      AWS::IAM::Role                       HelloWorldFunctionRole               -
 UPDATE_IN_PROGRESS                   AWS::Lambda::Function                HelloWorldFunction                   -
 UPDATE_COMPLETE                      AWS::Lambda::Function                HelloWorldFunction                   -
 CREATE_IN_PROGRESS                   AWS::ApiGateway::RestApi             ServerlessRestApi                    -
 CREATE_COMPLETE                      AWS::ApiGateway::RestApi             ServerlessRestApi                    -
 CREATE_IN_PROGRESS                   AWS::ApiGateway::RestApi             ServerlessRestApi                    Resource creation Initiated
 CREATE_IN_PROGRESS                   AWS::ApiGateway::Deployment          ServerlessRestApiDeployment47fc2d5   Resource creation Initiated
                                                                          f9d
 CREATE_IN_PROGRESS                   AWS::Lambda::Permission              HelloWorldFunctionHelloWorldPermis   Resource creation Initiated
                                                                          sionProd
 CREATE_IN_PROGRESS                   AWS::Lambda::Permission              HelloWorldFunctionHelloWorldPermis   -
                                                                          sionProd
 CREATE_IN_PROGRESS                   AWS::ApiGateway::Deployment          ServerlessRestApiDeployment47fc2d5   -
                                                                          f9d
CREATE_COMPLETE                      AWS::ApiGateway::Deployment          ServerlessRestApiDeployment47fc2d5   -
                                                                          f9d
 CREATE_IN_PROGRESS                   AWS::ApiGateway::Stage               ServerlessRestApiProdStage           -
 CREATE_IN_PROGRESS                   AWS::ApiGateway::Stage               ServerlessRestApiProdStage           Resource creation Initiated
 CREATE_COMPLETE                      AWS::ApiGateway::Stage               ServerlessRestApiProdStage           -
 CREATE_COMPLETE                      AWS::Lambda::Permission              HelloWorldFunctionHelloWorldPermis   -
                                                                          sionProd
 UPDATE_COMPLETE_CLEANUP_IN_PROGRES   AWS::CloudFormation::Stack           sam-app                              -
 S
 UPDATE_COMPLETE                      AWS::CloudFormation::Stack           sam-app                              -
 -------------------------------------------------------------------------------------------------------------------------------------------------

 Stack sam-app outputs:
 ---------------------------------------------------------------------------------------------------------------------------------------------------
 OutputKey-Description                                                     OutputValue
 ---------------------------------------------------------------------------------------------------------------------------------------------------
 HelloWorldFunctionIamRole - Implicit IAM Role created for Hello World     arn:aws:iam::123456789012:role/sam-app-
 function                                                                  HelloWorldFunctionRole-104VTJ0TST7M0
 HelloWorldApi - API Gateway endpoint URL for Prod stage for Hello World   https://0ks2zue0zh.execute-api.us-east-1.amazonaws.com/Prod/hello/
 function
 HelloWorldFunction - Hello World Lambda Function ARN                      arn:aws:lambda:us-east-1:123456789012:function:sam-app-
                                                                          HelloWorldFunction-1TY92MJX0BXU5
 ---------------------------------------------------------------------------------------------------------------------------------------------------

 Successfully created/updated stack - sam-app in us-east-1
        

¿Qué?AWS SAMestá haciendo:

Este comando implementa su aplicación en elAWSCloud. Toma los artefactos de despliegue que se crean con elsam build, empaquetarlos y cargarlos en un bucket de Amazon Simple Storage Service (Amazon S3) que elAWS SAMCLI crea e implementa la aplicación medianteAWS CloudFormation. En la salida de lasam deploy, puede ver los cambios que se están realizando en suAWS CloudFormationpila.

Si la aplicación creó un endpoint HTTP, los resultados quesam deploygenera también le muestra la URL del endpoint de la aplicación de prueba. Puede usarcurlpara enviar una solicitud a la aplicación mediante esa URL de endpoint. Por ejemplo:

curl https://<restapiid>.execute-api.us-east-1.amazonaws.com/Prod/hello/

Después de implementar correctamente la aplicación, verá una salida similar a esta:

 
 {"message": "hello world"}
        

Si ve{"message": "hello world"}después de ejecutar elcurl, ha implementado correctamente su aplicación sin servidor enAWS, y llamas a tu función Lambda en vivo. De lo contrario, consulte laSolución de problemasmás adelante en este tutorial.

Paso 4: (Opcional) Pruebe la aplicación de forma local

Cuando desarrollas tu aplicación, puede que te resulte útil realizar pruebas localmente. LaAWS SAMCLI proporciona elsam localpara ejecutar la aplicación mediante contenedores Docker que simulan el entorno de ejecución de Lambda. Dispone de dos opciones para hacerlo:

  • Hospeda tu API localmente

  • Invoque directamente su función de Lambda

En este paso, se describen ambas opciones.

Hospeda tu API localmente

Comando para ejecutar:

sam local start-api

Ejemplo del resultado:

 
 2019-07-12 15:27:58 Mounting HelloWorldFunction at http://127.0.0.1:3000/hello [GET]
 2019-07-12 15:27:58 You can now browse to the above endpoints to invoke your functions. You do not need to restart/reload SAM CLI while working on your functions, changes will be reflected instantly/automatically. You only need to restart SAM CLI if you update your AWS SAM template
 2019-07-12 15:27:58  * Running on http://127.0.0.1:3000/ (Press CTRL+C to quit)

 Fetching lambci/lambda:python3.7 Docker container image......................................................................................................................................................................................
 2019-07-12 15:28:56 Mounting /<working-development-path>/sam-app/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated inside runtime container
 START RequestId: 52fdfc07-2182-154f-163f-5f0f9a621d72 Version: $LATEST
 END RequestId: 52fdfc07-2182-154f-163f-5f0f9a621d72
 REPORT RequestId: 52fdfc07-2182-154f-163f-5f0f9a621d72  Duration: 4.42 ms       Billed Duration: 100 ms Memory Size: 128 MB     Max Memory Used: 22 MB
 2019-07-12 15:28:58 No Content-Type given. Defaulting to 'application/json'.
 2019-07-12 15:28:58 127.0.0.1 - - [12/Jul/2019 15:28:58] "GET /hello HTTP/1.1" 200 -
            

La imagen de Docker puede tardar un tiempo en cargarse. Después de cargarlo, puedes usarcurlpara enviar una solicitud a la aplicación que se ejecuta en el host local:

curl http://127.0.0.1:3000/hello

Ejemplo del resultado:

 
 2019-07-12 15:29:57 Invoking app.lambda_handler (python3.7)
 2019-07-12 15:29:57 Found credentials in shared credentials file: ~/.aws/credentials

 Fetching lambci/lambda:python3.7 Docker container image......
 2019-07-12 15:29:58 Mounting /<working-development-path>/sam-app/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated inside runtime container
 START RequestId: 52fdfc07-2182-154f-163f-5f0f9a621d72 Version: $LATEST
 END RequestId: 52fdfc07-2182-154f-163f-5f0f9a621d72
 REPORT RequestId: 52fdfc07-2182-154f-163f-5f0f9a621d72  Duration: 7.92 ms       Billed Duration: 100 ms Memory Size: 128 MB     Max Memory Used: 22 MB
 {"statusCode":200,"body":"{\"message\": \"hello world\"}"}
            

¿Qué?AWS SAMestá haciendo:

Lastart-apiinicia un endpoint local que replica el punto final de la API REST. Descarga un contenedor de ejecución en el que puedes ejecutar tu función localmente. El resultado final es el mismo resultado que vio cuando llamó a su función en elAWSCloud.

Invoque directamente su función de Lambda

Comando para ejecutar:

sam local invoke "HelloWorldFunction" -e events/event.json

Ejemplo del resultado:

 
 2019-07-01 14:08:42 Found credentials in shared credentials file: ~/.aws/credentials
 2019-07-01 14:08:42 Invoking app.lambda_handler (python3.7)

 Fetching lambci/lambda:python3.7 Docker container image...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
 2019-07-01 14:09:39 Mounting /<working-development-path>/sam-app/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated inside runtime container
 START RequestId: 52fdfc07-2182-154f-163f-5f0f9a621d72 Version: $LATEST
 END RequestId: 52fdfc07-2182-154f-163f-5f0f9a621d72
 REPORT RequestId: 52fdfc07-2182-154f-163f-5f0f9a621d72    Duration: 3.51 ms    Billed Duration: 100 ms    Memory Size: 128 MB    Max Memory Used: 22 MB    
 {"statusCode":200,"body":"{\"message\": \"hello world\"}"}
            

¿Qué?AWS SAMestá haciendo:

Lainvokeinvoca directamente sus funciones Lambda y puede pasar las cargas útiles de eventos de entrada que proporcione. Con este comando, pasa la carga útil del evento en el archivoevent.jsonque proporciona la aplicación de ejemplo.

La aplicación inicializada de viene con un valor predeterminadoaws-proxypara API Gateway. Se rellenan de forma predeterminada una serie de valores. En este caso, el campoHelloWorldFunctionno le importan los valores concretos, por lo que una solicitud falsa está bien. Puede especificar varios valores para sustituir a la solicitud para simular lo que esperaría de una solicitud real. A continuación se muestra un ejemplo de cómo generar su propio evento de entrada y comparar la salida con la predeterminada.event.jsonobjeto:

sam local generate-event apigateway aws-proxy --body "" --path "hello" --method GET > api-event.json diff api-event.json events/event.json

Ejemplo del resultado:

 
 <   "body": "",
 ---
 >   "body": "{\"message\": \"hello world\"}",
 4,6c4,6
 <   "path": "/hello",
 <   "httpMethod": "GET",
 <   "isBase64Encoded": true,
 ---
 >   "path": "/path/to/resource",
 >   "httpMethod": "POST",
 >   "isBase64Encoded": false,
 11c11
 <     "proxy": "/hello"
 ---
 >     "proxy": "/path/to/resource"
 56c56
 <     "path": "/prod/hello",
 ---
 >     "path": "/prod/path/to/resource",
 58c58
 <     "httpMethod": "GET",
 ---
 >     "httpMethod": "POST",
            

Solución de problemas

AWS SAMError CLI: «Restricciones de seguridad no satisfechas»

Cuando se ejecutasam deploy --guided, se te pide la preguntaHelloWorldFunction may not have authorization defined, Is this okay? [y/N]. Si responde a este mensaje conN(la respuesta predeterminada), verá el siguiente error:

 
Error: Security Constraints Not Satisfied
            

El mensaje le informa de que la aplicación que va a implementar podría tener una API de Amazon API Gateway configurada sin autorización. RespondiendoNa este mensaje, estás diciendo que esto no está bien.

Para solucionarlo, dispone de las siguientes opciones:

  • Configure su aplicación con autorización. Para obtener información acerca de cómo configurar la autorización, consulteControlar el acceso a las API de API Gateway.

  • Responda a esta pregunta conYpara indicar que está bien implementar una aplicación que tenga una API de API Gateway configurada sin autorización.

AWS SAMError de CLI: «no existe la opción: —app-template»

Al ejecutar sam init, verá el siguiente error:

 
Error: no such option: --app-template
            

Esto significa que está utilizando una versión anterior de la CLI de AWS SAM que no admite el parámetro --app-template. Para solucionar esto, puede actualizar su versión de la CLI de AWS SAM a 0.33.0 o posterior, u omitir el parámetro --app-template del comando sam init.

AWS SAMError de la CLI: «no existe la opción: —guided»

Al ejecutar sam deploy, verá el siguiente error:

 
Error: no such option: --guided
            

Esto significa que está utilizando una versión anterior de la CLI de AWS SAM que no admite el parámetro --guided. Para solucionar esto, puede actualizar su versión de la CLI de AWS SAM a 0.33.0 o posterior, u omitir el parámetro --guided del comando sam deploy.

AWS SAMError CLI: «Error al crear recursos administrados: No se pueden localizar las credenciales»

Al ejecutar sam deploy, verá el siguiente error:

 
Error: Failed to create managed resources: Unable to locate credentials
            

Esto significa que no ha configuradoAWScredenciales para habilitar elAWS SAMCLI para hacerAWSllamadas de servicio. Para solucionarlo, debe configurarAWSCredenciales de . Para obtener más información, consulte Configuración deAWScredenciales.

AWS SAMError CLI: «EjecutándoseAWSLos proyectos SAM a nivel local requieren Docker. ¿Lo tienes instalado?»

Al ejecutar sam local start-api, verá el siguiente error:

 
Error: Running AWS SAM projects locally requires Docker. Have you got it installed?
            

Esto significa que no tiene Docker correctamente instalado. Se requiere Docker para probar la aplicación de forma local. Para solucionarlo, siga las instrucciones para instalar Docker para su host de desarrollo. Vaya aInstalación de la CLI de AWS SAM, elija la plataforma adecuada y siga las instrucciones de la sección tituladaInstalar Docker.

Error de curl: «Falta token de autenticación

Al intentar invocar el punto de enlace de API Gateway, verá el siguiente error:

 
 {"message":"Missing Authentication Token"}
            

Esto significa que has intentado enviar una solicitud al dominio correcto, pero el URI no es reconocible. Para solucionarlo, verifique la URL completa y actualice lacurlcon la URL correcta.

Error de curl: «curl: (6) No se pudo resolver:...»

Al intentar invocar el punto de enlace de API Gateway, verá el siguiente error:

 
 curl: (6) Could not resolve: endpointdomain (Domain name not found)
            

Esto significa que has intentado enviar una solicitud a un dominio no válido. Esto puede suceder si la aplicación sin servidor no se ha implementado correctamente o si tiene un error tipográfico en sucurlcomando. Compruebe que la aplicación se ha implementado correctamente mediante elAWS CloudFormationla consola o laAWS CLIy verifique que sucurles correcto.

Eliminar recursos

Si ya no necesita elAWSrecursos que creó ejecutando este tutorial, puede eliminarlos eliminando elAWS CloudFormationpila que implementaste.

Para eliminar elAWS CloudFormationstack utilizando elAWS Management Console, siga estos pasos:

  1. Inicie sesión en la AWS Management Console y abra la consola de AWS CloudFormation en https://console.aws.amazon.com/cloudformation.

  2. En el panel de navegación izquierdo, elija Stacks (Pilas).

  3. En la lista de pilas, elijasam-app(o el nombre de la pila que creó).

  4. Elija Delete (Eliminar).

Cuando termine, el estado de la pila cambia aDELETE_COMPLETE.

También puede eliminar laAWS CloudFormationpila ejecutando lo siguienteAWS CLIcomando:

aws cloudformation delete-stack --stack-name sam-app --region region

Verificar la pila eliminada

Para ambos métodos de eliminación de laAWS CloudFormationpila, puede verificar que se eliminó yendo a laAWS CloudFormationconsola. En el panel de navegación izquierdo, elijaPilasy, a continuación, en la lista desplegable situada junto al cuadro de búsqueda, elijaDeleted (Eliminado). Debería ver el nombre de su pila en la lista de pilas eliminadas.

Conclusión

En este tutorial, ha realizado lo siguiente:

  1. Creación, compilación e implementación de una aplicación sin servidor paraAWSconAWS SAM.

  2. Probar la aplicación de forma local utilizando elAWS SAMCLI y Docker.

  3. Eliminado elAWSrecursos que ya no necesite.

Pasos siguientes

Ya está listo para comenzar a crear sus propias aplicaciones utilizando elAWS SAMCLI.

Para ayudarle a comenzar, puede descargar cualquiera de las aplicaciones de ejemplo de desde elAWS Serverless Application RepositoryEjemplosrepositorio en GitHub.