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 conAWS SAM. A continuación, pruebe la aplicación en elAWSCloud y, opcionalmente, pruébelo localmente en su host de desarrollo.

Esta aplicación implementa un backend API básico. Se compone de un punto de enlace de Amazon API Gateway y unAWS Lambdafunción. Al enviar una solicitud GET al punto de enlace de la 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 la API Gateway.

Cuando inicializa la aplicación de ejemplo, tiene la opción de elegir un tipo de paquete de implementación de Lambda, ya seaZiporImage. Para obtener más información sobre 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 se ejecutan para crear la aplicación Hello World. Para obtener más información sobre 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

Prerequisites

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

  1. Creación de unAWSaccount.

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

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

  4. Instalando Homebrew. Nota: Homebrew solo es un requisito previo 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 el comandosam --versioncomando.

Paso 1: Descargar una muestraAWS SAMrevisiones de

Comando a ejecutar:

sam init

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

Ejemplo de resultados:

   
 -----------------------
 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é esAWS SAMEstá haciendo:

Este comando crea un directorio con el nombre que proporcionó como nombre del proyecto. Los contenidos del directorio del proyecto son similares a los siguientes:

 
 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 del proyecto se crean cuando se elige uno de los tiempos de ejecución de Python y elHello World Example.

Hay tres archivos especialmente importantes:

  • template.yaml: Contiene elAWS SAMLa plantilla de que define la aplicaciónAWSde AWS.

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

  • hello_world/requirements.txt: Contiene cualquier dependencia de Python que la aplicación requiera, y se usa parasam build.

Paso 2: Cree su aplicación

Comando a ejecutar:

Primero, cambie al directorio del proyecto, donde eltemplate.yamlpara la aplicación de ejemplo. (De forma predeterminada, este directoriosam-app.) A continuación, ejecute este comando:

sam build

Ejemplo de resultados:

  
 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é esAWS 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 provisionales para que todo esté listo para empaquetarse e implementarse. Lasam buildEste comando genera todas las dependencias que tiene la aplicación y copia el código fuente de su aplicación en carpetas bajo.aws-sam/buildpara ser comprimido y subido a Lambda.

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

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

HelloWorldFunctionEs un directorio que contieneapp.py, así como las dependencias de terceros que utiliza su aplicación.

Paso 3: Implemente la aplicación en elAWSCloud

Comando a 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 mensajeHelloWorldFunction 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 API de API Gateway.

Ejemplo de resultados:

 
    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é esAWS SAMEstá haciendo:

Este comando implementa la aplicación en elAWSCloud. Toma los artefactos de implementación que construye con elsam buildEste comando, empaquetará y los subirá a un bucket de Amazon Simple Storage Service (Amazon S3) que elAWS SAMCLI crea e implementa la aplicación usandoAWS CloudFormation. En la salida desam deploy, puede ver los cambios que se están realizando en suAWS CloudFormationpila.

Si su aplicación creó un endpoint HTTP, las salidas quesam deploygenera también le muestran la URL del endpoint para su aplicación de prueba. Puede usarcurlpara enviar una solicitud a su aplicación utilizando 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á un resultado similar a este:

 
 {"message": "hello world"}
        

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

Paso 4: (Opcional) Pruebe la aplicación localmente

Cuando desarrolle su aplicación, puede que le resulte útil probar localmente. LaAWS SAMCLI proporciona elsam localpara ejecutar su aplicación utilizando contenedores Docker que simulan el entorno de ejecución de Lambda. Para ello, dispone de dos opciones:

  • Aloje su API localmente

  • Invoque directamente su función de Lambda

En este paso, se describen ambas opciones.

Aloje su API localmente

Comando a ejecutar:

sam local start-api

Ejemplo de resultados:

 
 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, puede usarcurlpara enviar una solicitud a la aplicación que se está ejecutando en el host local:

curl http://127.0.0.1:3000/hello

Ejemplo de resultados:

 
 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é esAWS SAMEstá haciendo:

Lastart-apiinicia un endpoint local que replica el extremo de la API REST. Descarga un contenedor de ejecución en el que puede ejecutar su 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 a ejecutar:

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

Ejemplo de resultados:

 
 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é esAWS SAMEstá haciendo:

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

Su aplicación inicializada viene con un valor predeterminadoaws-proxypara API Gateway. Una serie de valores ya están especificados. En este caso, el campoHelloWorldFunctionno se preocupan por los valores particulares, por lo que una solicitud estallada está bien. Puede especificar un número de valores para sustituir a la solicitud para simular lo que esperaría de una solicitud real. El siguiente es un ejemplo de la generación de su propio evento de entrada y la comparación de la salida con elevent.jsonobjeto:

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

Ejemplo de resultados:

 
 <   "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",
            

Troubleshooting

AWS SAMError de CLI: «Restricciones de seguridad no satisfechas»

Cuando se ejecutasam deploy --guided, se le pedirá 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 está a punto de implementar puede tener una API de Amazon API Gateway configurada sin autorización. RespondiendoNa este mensaje, estás diciendo que esto no está bien.

Para solucionar esto, 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 API de API Gateway.

  • Responda a esta pregunta conYpara indicar que está de acuerdo con la implementación de una aplicación que tiene una API de API Gateway configurada sin autorización.

AWS SAMError de la CLI de: «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 de: «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 de 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 configuradoAWSpara habilitar elAWS SAMCLI para hacerAWSllamadas de servicio. Para solucionarlo, debe configurarAWSCredenciales de . Para obtener más información, consulte Configuración deAWScredenciales.

AWS SAMError de CLI: RunningAWSLos proyectos SAM localmente 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 localmente. Para solucionar esto, siga las instrucciones para instalar Docker para su host de desarrollo. Vaya aInstalación de la CLI de AWS SAMElija la plataforma adecuada y siga las instrucciones que se detallan en la sección tituladaInstalar Docker.

Error de curl: Falta token de autenticación

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

 
 {"message":"Missing Authentication Token"}
            

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

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

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

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

Esto significa que ha intentado enviar una solicitud a un dominio no válido. Esto puede suceder si su aplicación sin servidor no se implementó correctamente, o si tiene un error tipográfico en sucurlcomando. Compruebe que la aplicación se ha implementado correctamente mediante el comandoAWS CloudFormationLa consola deAWS CLIy compruebe que sucurlEl comando es correcto.

Eliminar recursos

Si ya no necesita elAWSLos recursos que creó ejecutando este tutorial, puede eliminarlos eliminando el archivoAWS CloudFormationque ha implementado.

Para eliminar elAWS CloudFormationmediante laAWS Management ConsoleSiga estos pasos:

  1. Inicie sesión en laAWS Management Consoley abraAWS CloudFormationenhttps://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 Eliminar.

Cuando termine, el estado de la pila cambia aDELETE_COMPLETE.

También puede eliminar elAWS CloudFormationmediante la ejecución de la siguienteAWS CLIComando de la :

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

Verificar la pila eliminada

Para ambos métodos de eliminar elAWS CloudFormation, puede verificar que se eliminó yendo a laAWS CloudFormationconsole. 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.

Conclusion

En este tutorial, ha realizado lo siguiente:

  1. Creó, compiló e implementó una aplicación sin servidor paraAWSconAWS SAM.

  2. Pruebe su aplicación localmente utilizando elAWS SAMCLI y Docker.

  3. Se eliminó elAWSRecursos que ya no necesite.

Pasos siguientes

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

Para ayudarle a empezar, puede descargar cualquiera de las aplicaciones de ejemplo de laAWS Serverless Application RepositoryEjemplosRepositorio en GitHub.