Creación e implementación usando Serverless Framework

AWS Lambda se puede crear e implementar mediante un marco sin servidor. Le permite crear activadores de AWS Lambda y también implementarlos mediante la creación de los roles necesarios. El marco sin servidor permite manejar grandes proyectos de una manera más fácil. Los eventos y recursos necesarios están escritos en un solo lugar y solo unos pocos comandos ayudan a implementar la funcionalidad completa en la consola de AWS.

En este capítulo, aprenderá en detalle cómo comenzar con el marco sin servidor de AWS.

Instale Serverless Framework usando npm install

Para empezar, primero debe instalar nodejs. Puede verificar nodejs de la siguiente manera:

Tendrá que usar el siguiente comando para instalar sin servidor usando el paquete npm:

npm install -g serverless

Una vez que haya finalizado npm, ejecute el comando sin servidor que muestra la lista de comandos que se utilizarán para crear e implementar la función AWS Lambda. Observe las capturas de pantalla que se muestran a continuación:

También puede utilizar sls en lugar de sin servidor. sls es el comando abreviado para serverless.

En caso de que necesite ayuda en el comando sls, puedes usar el siguiente comando:

sls create --help

Para crear un marco sin servidor, debe seguir los pasos que se detallan a continuación:

Paso 1

Para comenzar a usar el marco sin servidor, debemos agregar las credenciales. De esta manera, puede el usuario primero en la consola de AWS de la siguiente manera:

Paso 2

Haga clic en Next:Permissionsbotón para agregar permisos. Deberá adjuntar las políticas existentes o el acceso de administrador a este usuario.

Paso 3

Hacer clic Create Userpara agregar el usuario. Mostrará la clave de acceso y la clave secreta que necesitamos para configurar el marco sin servidor -

Configurar AWS Serverless Framework

Veamos cómo configurar el marco sin servidor de AWS. Puede utilizar el siguiente comando para este propósito:

sls config credentials --provider aws --key accesskey --secret secretkey

Tenga en cuenta que los detalles de las credenciales ingresadas, que es el access key y secret key se almacenan en el file /aws/credentials.

Primero, cree una carpeta donde desee almacenar los archivos de su proyecto.

A continuación, comenzaremos el trabajo en aws-serverless carpeta.

Cree AWS Lambda utilizando Serverless Framework

Ahora, creemos una función Lambda con el marco sin servidor siguiendo los pasos que se indican a continuación:

Paso 1

A continuación se muestran los detalles de serverless create comando -

Paso 2

Ahora, necesitamos asignar la plantilla que es la siguiente:

AWS-nodejs, aws-nodejs-typescript, aws-nodejs-ecma-script, aws-python, aws-python3, aws-groovy-gradle etc.

Paso 3

Haremos uso de aws-nodejsplantilla para crear nuestro primer proyecto utilizando un marco sin servidor. El comando para el mismo propósito es el que se muestra aquí:

sls create --template aws-nodejs

Tenga en cuenta que este comando crea un texto estándar para la plantilla aws-nodejs.

Paso 4

Ahora, abra la carpeta creada en un IDE. Aquí estamos usando el código de Visual Studio y la estructura de carpetas es la siguiente:

Paso 5

Hay 2 archivos creados: handler.js y Serverless.yml

Los detalles de la función básica de AWS Lambda se muestran en handler.js como sigue -

'use strict';

module.exports.hello = (event, context, callback) => {
   const response = {
      statusCode: 200,
      body: JSON.stringify({
         message: 'Go Serverless v1.0! Your function executed successfully!',
         input: event,
      }),
   };
   callback(null, response);

   // Use this code if you don't use the http event with the LAMBDA-PROXY integration
   // callback(null, { message: 'Go Serverless v1.0! Your function executed successfully!', event });
};

Este archivo Serverless.yml tiene los detalles de configuración del marco sin servidor como se muestra a continuación:

# Welcome to Serverless!
#
# This file is the main config file for your service.
# It's very minimal at this point and uses default values.
# You can always add more config options for more control.
# We've included some commented out config Examples here.
# Just uncomment any of them to get that config option.
#
# For full config options, check the docs:
#    docs.serverless.com
#
# Happy Coding!
service: aws-nodejs # NOTE: update this with your service name

# You can pin your service to only deploy with a specific Serverless version
# Check out our docs for more details
# frameworkVersion: "=X.X.X"

provider:
 name: aws
 runtime: nodejs6.10

# you can overwrite defaults here
#  stage: dev
#  region: us-east-1

# you can add statements to the Lambda function's IAM Role here
#  iamRoleStatements:
#    - Effect: "Allow"
#      Action:
#        - "s3:ListBucket"
#      Resource: { "Fn::Join" : ["", ["arn:aws:s3:::", { "Ref" : "ServerlessDeploymentBucket" } ] ]  }
#    - Effect: "Allow"
#      Action:
#        - "s3:PutObject"
#      Resource:
#        Fn::Join:
#          - ""
#          - - "arn:aws:s3:::"
#            - "Ref" : "ServerlessDeploymentBucket"
#            - "/*"

# you can define service wide environment variables here
#  environment:
#    variable1: value1

# you can add packaging information here
#package:
#  include:
#    - include-me.js
#    - include-me-dir/**
#  exclude:
#    - exclude-me.js
#    - exclude-me-dir/**

functions:
 hello:
   handler: handler.hello

#    The following are a few example events you can configure
#    NOTE: Please make sure to change your handler code to work with those events
#    Check the event documentation for details
#    events:
#      - http:
#          path: users/create
#          method: get
#      - s3: ${env:BUCKET}
#      - schedule: rate(10 minutes)
#      - sns: greeter-topic
#      - stream: arn:aws:dynamodb:region:XXXXXX:table/foo/stream/1970-01-01T00:00:00.000
#      - alexaSkill: amzn1.ask.skill.xx-xx-xx-xx
#      - alexaSmartHome: amzn1.ask.skill.xx-xx-xx-xx
#      - iot:
#          sql: "SELECT * FROM 'some_topic'"
#      - cloudwatchEvent:
#          event:
#            Example:
#              - "aws.ec2"
#            detail-type:
#              - "EC2 Instance State-change Notification"
#            detail:
#              state:
#                - pending
#      - cloudwatchLog: '/aws/lambda/hello'
#      - cognitoUserPool:
#          pool: MyUserPool
#          trigger: PreSignUp

#    Define function environment variables here
#    environment:
#      variable2: value2

# you can add CloudFormation resource templates here
#resources:
#  resources:
#    NewResource:
#      Type: AWS::S3::Bucket
#      Properties:
#        BucketName: my-new-bucket
#  Outputs:
#     NewOutput:
#       Description: "Description for the output"
#       Value: "Some output value"

Ahora, necesitamos agregar cambios en el archivo serverless.yml según nuestros requisitos. Puede utilizar los comandos que se indican a continuación:

Puede utilizar el siguiente comando para Service -

service: aws-nodejs # NOTE: update this with your service name

Ahora, cambie el servicio aquí y agregue el nombre dado a nuestra carpeta como se muestra:

service: aws-serverless # NOTE: update this with your service name

Los detalles del proveedor son los que se muestran:

provider:
   name: aws
   runtime: nodejs6.10

El proveedor es aws y el tiempo de ejecución es nodejs6.10. Necesitamos agregar elregion en el que estaremos trabajando y el stage, es decir dev or prodentorno para el proyecto. Así que aquí están los detalles actualizados del proveedor: proveedor -

name: aws
runtime: nodejs6.10
# you can overwrite defaults here
stage: prod
region: us-east-1

Rol de IAM

los iam role, es decir, el código de permiso para trabajar con Lambda se muestra aquí en la .yml archivo -

#  iamRoleStatements:
#    - Effect: "Allow"
#      Action:
#        - "s3:ListBucket"
#      Resource: { "Fn::Join" : ["", ["arn:aws:s3:::", { "Ref" : "ServerlessDeploymentBucket" } ] ]  }
#    - Effect: "Allow"
#      Action:
#        - "s3:PutObject"
#      Resource:
#        Fn::Join:
#          - ""
#          - - "arn:aws:s3:::"
#            - "Ref" : "ServerlessDeploymentBucket"
#            - "/*"

Tenga en cuenta que debemos proporcionar los detalles del rol, que es el permiso requerido con otros servicios de AWS, en la sección anterior.

Detalles del controlador AWS Lambda

El nombre de la función de exportación en handler.jses hola. Entonces, el controlador es el nombre del archivo seguido del nombre de exportación.

functions:
   hello:
      handler: handler.hello

Los detalles del recurso sobre el servicio s3 agregado como se muestra a continuación aquí:

# you can add CloudFormation resource templates here
#resources:
#  resources:
#    NewResource:
#      Type: AWS::S3::Bucket
#      Properties:
#        BucketName: my-new-bucket
#  Outputs:
#     NewOutput:
#       Description: "Description for the output"
#       Value: "Some output value"

Implemente AWS Lambda mediante Serverless Framework

Implementemos la función lambda anterior en la consola de AWS. Puede utilizar los siguientes pasos para este propósito:

Paso 1

Primero, tendrás que usar el siguiente comando:

sls deploy

Paso 2

Ahora, debería ver la función en la consola de AWS como se muestra. Los detalles de AWS sin servidor se registran en la formación de la nube de AWS. Para ello, vaya al servicio de AWS y seleccioneCloudFormation. Los detalles de AWS Lambda se muestran de la siguiente manera:

Observe que el nombre dado es el nombre del proyecto seguido de la etapa utilizada.

Paso 3

Crea el rol iam para AWS Lambda y el grupo de registros para AWS Cloudwatch. Se crea un bucket de S3 que tiene los detalles del código almacenados y los detalles de configuración.

Esto es creado por el comando sls deploy. No es necesario especificar el rol de iam, sino que se crea de forma predeterminada durante ladeploy etapa.

Paso 4

El flujo detallado de eventos se muestra a continuación en el servicio de formación de nubes.

Código AWS Lambda

El código AWS Lambda y su configuración de ejecución se muestran en la captura de pantalla que se muestra a continuación:

Cuando prueba la función Lambda, puede encontrar el siguiente resultado:

La salida de registro para la función anterior se muestra aquí:

También podemos probar la función AWS Lambda utilizando el comando sin servidor como se muestra a continuación:

sls invoke --function hello

La sintaxis del comando invoke se muestra aquí:

sls invoke --function hello

Este comando de invocación activa la función AWS Lambda y muestra el resultado en el símbolo del sistema como se muestra a continuación:

También puede probar la función Lambda antes de la implementación y el comando para la misma usando el siguiente comando:

sls invoke local --function hello

Tenga en cuenta que no siempre es posible realizar pruebas localmente, ya que los recursos como S3 y DynanoDB no se pueden simular en el entorno local. Solo las llamadas a funciones básicas se pueden probar localmente.

Uso de API Gateway y AWS Lambda con Serverless Framework

Veamos cómo crear un nuevo proyecto para trabajar con Lambda y API Gateway. Puede utilizar el siguiente comando para este propósito:

sls create --template aws-nodejs

Ahora abierto aws-apiproyecto en código visual. Puedes ver que elhandler.js y serverless.ymlarchivos creados. Hagamos los cambios en eso para agregar la puerta de enlace api.

Tendrá que hacer los siguientes cambios en serverless.yml -

Ahora, los detalles de los eventos agregados para la activación de la puerta de enlace de la API con AWS Lambda:

Hay algo nuevo agregado aquí llamado events. Hemos especificado el evento comohttp, junto con su ruta y método.

La ruta es el punto final que usaremos cuando se cree la ruta de la puerta de enlace de la API y el método utilizado es GET.

Observe que el manejador es handler.helloy hola es el nombre de exportación de handler.js.

Tenga en cuenta que no tiene que implementar la puerta de enlace API aquí, ya que el marco sin servidor lo hará.

Ahora, ejecutaremos el sls deploy comando para crear la función AWS Lambda con el disparador como api gateway.

sls deploy

Observe que los detalles de implementación se enumeran arriba. Da elGeturl con el punto final como detalles de la ruta. El escenario esprodlo mismo se usa en la URL. El nombre de la función esaws-api-prod-hello.

Presionemos la URL y veamos el resultado. Puede ver lo siguiente la respuesta que obtenemos del api-gateway get url -

{"message":"Go Serverless v1.0! Your function executed 
successfully!","input":{"resource":"/first-api","path":"/first-api","httpMethod":
"GET","headers":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,
image/webp,image/apng,*/*;q=0.8","Accept-Encoding":"gzip, deflate, br","Accept-Language":"en-US,en;q=0.9","CloudFront-Forwarded-Proto":
"https","CloudFront-Is-Desktop-Viewer":"true","CloudFront-Is-Mobile-Viewer":
"false","CloudFront-Is-SmartTV-Viewer":"false","CloudFront-Is-Tablet-Viewer":
"false","CloudFront-Viewer-Country":"IN","Host":"nvbhfdojfg.execute-api.us-east-1.
amazonaws.com","upgrade-insecure-requests":"1","User-Agent":"Mozilla/5.0 
(Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
 Chrome/66.0.3359.181 Safari/537.36","Via":"2.0 707912794802dbb4825c79b7d8626a5d.cloudfront.net (CloudFront)","X-Amz-Cf-Id":"j70MMqkWFp6kmvuauzp_nvTbI-WwKIQmm2Jl5hzSoN6gkdvX11hh-g==",
 "X-Amzn-Trace-Id":"Root=1-5b13f9ef-5b012e36b7f40b5013a326fc","X-Forwarded-For":"157.33.133.217, 54.182.242.73","X-Forwarded-Port":"443","X-Forwarded-Proto":"https"},
 "queryStringParameters":null,"pathParameters":null,"stageVariables":null,
 "requestContext":{"resourceId":"pes5sy","resourcePath":"/first-api","httpMethod":
 "GET","extendedRequestId":"H6P9fE-MoAMFdIg=","requestTime":"03/Jun/2018:14:23:
 43 +0000","path":"/prod/first-api","accountId":"625297745038","protocol":"HTTP/1.1",
 "stage":"prod","requestTimeEpoch":1528035823928,"requestId":"b865dbd6-6739-11e8-b135
 -a30269a8ec58","identity":{"cognitoIdentityPoolId":null,"accountId":null,
 "cognitoIdentityId":null,"caller":null,"SourceIp":"157.33.133.217","accessKey":null,
 "cognitoAuthenticationType":null,"cognitoAuthenticationProvider":null,"userArn":null,
 "userAgent":"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like
 Gecko) Chrome/66.0.3359.181 Safari/537.36","user":null},"apiId":"nvbhfdojfg"},"body":null,
 "isBase64Encoded":false}}

Los detalles del evento también están disponibles en la salida cuando presiona la URL. HttpMethod es GET y queryStringParameters son nulos ya que no se pasa nada en la cadena de consulta. Los detalles del evento se dan ainput que hemos especificado en el controlador AWS Lambda -

La salida que obtenemos de la puerta de enlace api es solo la body detalles como message y input. La respuesta está totalmente controlada por la puerta de enlace api y cómo mostrarla como salida.

Ahora, pasemos las entradas a la URL GET en la cadena de consulta y veamos la pantalla:

Luego puede ver la salida de la cadena de consulta como se muestra a continuación:

{"message":"Go Serverless v1.0! Your function executed 
successfully!","input":{"resource":"/first-api","path":"/first-api","httpMethod":
"GET","headers":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,
image/webp,image/apng,*/*;q=0.8","Accept-Encoding":"gzip, deflate, 
br","Accept-Language":"en-US,en;q=0.9","CloudFront-Forwarded-Proto":"https",
"CloudFront-Is-Desktop-Viewer":"true","CloudFront-Is-Mobile-Viewer":"false",
"CloudFront-Is-SmartTV-Viewer":"false","CloudFront-Is-Tablet-Viewer":"false",
"CloudFront-Viewer-Country":"IN","Host":"nvbhfdojfg.execute-api.us-east-1.amazonaws.com",
"upgrade-insecure-requests":"1","User-Agent":"Mozilla/5.0 (Windows NT 6.3; Win64; x64)
 AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36","Via":"2.0 
 8b1d3263c2fbd0a2c270b174d7aa3d61.cloudfront.net (CloudFront)","X-Amz-Cf-Id":"JIBZw3I-blKbnpHP8LYXPVolCgdW5KmEukZS4at9mi4vrWBMI-UKNw==",
 "X-Amzn-Trace-Id":"Root=1-5b13ff90-7d6e38d4c0e4a5d4e6184f30","X-Forwarded-For":
 "157.33.133.217, 54.182.242.127","X-Forwarded-Port":"443","X-Forwarded-Proto":"https"},"queryString
 Parameters":{"displaymessage":"Hello"},"pathParameters":null,"stageVariables":null,
 "requestContext":{"resourceId":"pes5sy","resourcePath":"/first-api","httpMethod":
 "GET","extendedRequestId":"H6TeiG34oAMFguA=","requestTime":"03/Jun/2018:14:47:44 +0000","path":"/prod/first-api","accountId":"625297745038","protocol":"HTTP/1.1",
"stage":"prod","requestTimeEpoch":1528037264252,"requestId":"12e5dca3-
673d-11e8-8966-69fcf43bd4db","identity":{"cognitoIdentityPoolId":null,"accountId":null,
"cognitoIdentityId":null,"caller":null,"exmpleIp":"157.33.133.217","accessKey":null,
"cognitoAuthenticationType":null,"cognitoAuthenticationProvider":null,"userArn":null,
"userAgent":"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like
 Gecko) Chrome/66.0.3359.181 Safari/537.36","user":null},"apiId":"nvbhfdojfg"},"body":
 null,"isBase64Encoded":false}}

Cambiemos la función de AWS Lambda para mostrar los detalles de la cadena de consulta como se muestra a continuación:

'use strict';
module.exports.hello = (event, context, callback) => {
   const response = {
      statusCode: 200,
      body: JSON.stringify({
         message:(event.queryStringParameters &&     event.queryStringParameters.displaymessage!="") ? event.queryStringParameters.displaymessage : 'Go Serverless v1.0! Your function executed successfully!'
      }),
   };
   callback(null, response);
   // Use this code if you don't use the http event with the LAMBDA-PROXY integration
   // callback(null, { message: 'Go Serverless v1.0! Your function executed successfully!', event });
};

Observe que hemos cambiado el mensaje en función de la cadena de consulta. display message. Esto implementará la función nuevamente y verificará la salida. Muestra los detalles presentes en el mensaje de visualización de variable de cadena de consulta como se muestra a continuación.

Ahora agreguemos post método a los eventos creados como se muestra a continuación -

Ahora, implemente los cambios realizados y podrá ver el siguiente resultado del comando deploy:

Tenga en cuenta que probar la URL de la publicación en el navegador directamente no proporcionará los detalles. Debes probar la URL de la publicación enpostman.

Para conseguir cartero ve a https://www.getpostman.com/apps. Descargue la aplicación según su sistema operativo. Una vez instalado, debería poder probar la URL de su publicación como se muestra a continuación:

Esto muestra el mensaje que hemos agregado en la función Lambda.