Creazione e distribuzione utilizzando Serverless Framework

AWS Lambda può essere creato e distribuito utilizzando un framework serverless. Ti consente di creare trigger AWS Lambda e distribuirli anche creando i ruoli richiesti. Il framework serverless consente di gestire grandi progetti in modo più semplice. Gli eventi e le risorse richieste sono scritti in un unico posto e solo pochi comandi aiutano a distribuire la piena funzionalità sulla console AWS.

In questo capitolo imparerai in dettaglio come iniziare con il framework serverless AWS.

Installa Serverless Framework utilizzando npm install

Per cominciare, devi prima installare nodejs. Puoi verificare la presenza di nodejs come segue:

Dovrai utilizzare il seguente comando per installare serverless utilizzando il pacchetto npm:

npm install -g serverless

Al termine di npm, esegui il comando serverless che mostra l'elenco dei comandi da utilizzare per creare e distribuire la funzione AWS Lambda. Osserva gli screenshot riportati di seguito:

Puoi anche usare sls invece di serverless. sls è il comando abbreviato per serverless.

Nel caso in cui hai bisogno di aiuto sul comando sls, puoi usare il seguente comando:

sls create --help

Per creare un framework senza server, devi seguire i passaggi indicati di seguito:

Passo 1

Per iniziare a utilizzare il framework senza server, è necessario aggiungere le credenziali. In questo modo, puoi prima l'utente nella console AWS come segue:

Passo 2

Clicca su Next:Permissionspulsante per aggiungere autorizzazioni. Dovrai allegare i criteri esistenti o l'accesso amministratore a questo utente.

Passaggio 3

Clic Create Userper aggiungere l'utente. Mostrerà la chiave di accesso e la chiave segreta di cui abbiamo bisogno per configurare il framework serverless -

Configura AWS Serverless Framework

Vediamo come configurare il framework serverless AWS. È possibile utilizzare il seguente comando per questo scopo:

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

Si noti che i dettagli delle credenziali immesse, ovvero il file access key e secret key sono memorizzati nel file file /aws/credentials.

Innanzitutto, crea una cartella in cui desideri memorizzare i file di progetto.

Successivamente, inizieremo il lavoro in aws-serverless cartella.

Crea AWS Lambda utilizzando Serverless Framework

Ora, creiamo una funzione Lambda con il framework serverless utilizzando i passaggi indicati di seguito:

Passo 1

Di seguito sono riportati i dettagli per serverless create comando -

Passo 2

Ora, dobbiamo assegnare il modello che è il seguente:

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

Passaggio 3

Faremo uso di aws-nodejstemplate per creare il nostro primo progetto utilizzando framework serverless. Il comando per lo stesso scopo è come mostrato qui -

sls create --template aws-nodejs

Tieni presente che questo comando crea un boilerplate per il modello aws-nodejs.

Passaggio 4

Ora apri la cartella creata in un IDE. Qui stiamo usando il codice di Visual Studio e la struttura delle cartelle è la seguente:

Passaggio 5

Sono stati creati 2 file: handler.js e Serverless.yml

I dettagli della funzione di base di AWS Lambda sono mostrati in handler.js come segue -

'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 });
};

Questa vita Serverless.yml ha i dettagli di configurazione del framework serverless come mostrato di seguito -

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

Ora, dobbiamo aggiungere modifiche nel file serverless.yml secondo i nostri requisiti. È possibile utilizzare i comandi come indicato di seguito:

È possibile utilizzare il seguente comando per Service -

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

Ora, cambia il servizio qui e aggiungi il nome dato alla nostra cartella come mostrato -

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

I dettagli del provider sono come mostrato -

provider:
   name: aws
   runtime: nodejs6.10

Il provider è aws e il runtime è nodejs6.10. Dobbiamo aggiungere il fileregion in cui lavoreremo e il stage, questo è dev or prodambiente per il progetto. Quindi ecco i dettagli aggiornati del provider: provider -

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

Ruolo IAM

Il iam role, ovvero il codice per l'autorizzazione a lavorare con Lambda è mostrato qui nel file .yml file -

#  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"
#            - "/*"

Tieni presente che dobbiamo fornire i dettagli del ruolo, ovvero l'autorizzazione richiesta con altri servizi AWS, nella sezione precedente.

Dettagli del gestore AWS Lambda

Il nome della funzione di esportazione in handler.jsè ciao. Quindi il gestore è il nome del file seguito dal nome dell'esportazione.

functions:
   hello:
      handler: handler.hello

I dettagli delle risorse sul servizio s3 aggiunti come mostrato di seguito qui -

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

Distribuisci AWS Lambda utilizzando Serverless Framework

Distribuiamo la funzione lambda sopra nella console AWS. È possibile utilizzare i seguenti passaggi per questo scopo:

Passo 1

Innanzitutto, dovrai utilizzare il seguente comando:

sls deploy

Passo 2

Ora dovresti vedere la funzione nella console AWS ora come mostrato. I dettagli di AWS serverless vengono registrati nella formazione cloud AWS. A tal fine, vai al servizio AWS e selezionaCloudFormation. I dettagli di AWS Lambda vengono visualizzati come segue:

Osserva che il nome dato è il nome del progetto seguito dalla fase utilizzata.

Passaggio 3

Crea il ruolo iam per AWS Lambda e il gruppo di log per AWS cloudwatch. Viene creato il bucket S3 che contiene i dettagli del codice memorizzati e i dettagli della configurazione.

Questo viene creato dal comando sls deploy. Non è necessario specificare il ruolo iam, invece viene creato per impostazione predefinita durante ildeploy palcoscenico.

Passaggio 4

Il flusso dettagliato degli eventi viene visualizzato di seguito nel servizio di formazione delle nuvole.

Codice AWS Lambda

Il codice AWS Lambda e le sue impostazioni di esecuzione sono mostrati nella schermata riportata di seguito:

Quando provi la funzione Lambda, puoi trovare il seguente output:

L'output del registro per la funzione di cui sopra è mostrato qui -

Possiamo anche testare la funzione AWS Lambda utilizzando il comando serverless come mostrato di seguito:

sls invoke --function hello

La sintassi del comando invoke è mostrata qui:

sls invoke --function hello

Questo comando invoke attiva la funzione AWS Lambda e visualizza l'output nel prompt dei comandi come mostrato di seguito:

Puoi anche testare la funzione Lambda prima della distribuzione e il comando per lo stesso utilizzando il seguente comando:

sls invoke local --function hello

Si noti che non è sempre possibile eseguire test in locale poiché le risorse come S3 eDynanoDB non possono essere simulate nell'ambiente locale. Solo le chiamate di funzione di base possono essere testate localmente.

Utilizzo di API Gateway e AWS Lambda con Serverless Framework

Vediamo come creare un nuovo progetto per lavorare con Lambda e api gateway. È possibile utilizzare il seguente comando per questo scopo:

sls create --template aws-nodejs

Ora aperto aws-apiprogetto in codice visivo. Puoi vedere che il filehandler.js e serverless.ymlfile creati. Facciamo le modifiche in questo per l'aggiunta del gateway API.

Dovrai apportare le seguenti modifiche in serverless.yml -

Ora, i dettagli degli eventi aggiunti per l'attivazione del gateway API con AWS Lambda -

C'è una nuova cosa aggiunta qui chiamata events. Abbiamo specificato l'evento comehttp, insieme al suo percorso e metodo.

Il percorso è l'end-point che useremo quando viene creato il percorso del gateway API e il metodo utilizzato è GET.

Osserva che il conduttore è handler.helloe ciao è il nome dell'esportazione da handler.js.

Si noti che non è necessario distribuire il gateway API qui, poiché lo eseguirà il framework serverless.

Ora eseguiremo il file sls deploy comando per creare la funzione AWS Lambda con trigger come api gateway.

sls deploy

Osserva che i dettagli della distribuzione sono elencati sopra. Dà ilGeturl con il punto finale come dettagli del percorso. Il palco èprodquindi lo stesso viene utilizzato nell'URL. Il nome della funzione èaws-api-prod-hello.

Premiamo l'URL e vediamo l'output. Puoi vedere quanto segue la risposta che otteniamo dall'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}}

I dettagli dell'evento sono disponibili anche nell'output quando si preme l'URL. HttpMethod è GET e queryStringParameters sono nulli poiché non viene passato nulla nella stringa di query. Vengono forniti i dettagli dell'eventoinput che abbiamo specificato nel gestore AWS Lambda -

L'output che otteniamo dal gateway API è solo il file body dettagli come message e input. La risposta è totalmente controllata dal gateway API e da come visualizzarla come output.

Ora, passiamo gli input all'URL GET nella stringa di query e vediamo il display -

Quindi puoi vedere l'output di querystring come mostrato di seguito -

{"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}}

Cambiamo la funzione AWS Lambda per visualizzare solo i dettagli della stringa di query come mostrato di seguito:

'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 });
};

Osserva che abbiamo modificato il messaggio in base alla stringa di query display message. Questo distribuirà nuovamente la funzione e controllerà l'output. Visualizza i dettagli presenti nel messaggio di visualizzazione della variabile della stringa di query come mostrato di seguito.

Aggiungiamo ora post metodo agli eventi creati come mostrato di seguito -

Ora, distribuisci le modifiche apportate e puoi vedere il seguente output dal comando deploy:

Nota che il test dell'URL del post direttamente nel browser non fornirà i dettagli. Dovresti testare l'URL del post inpostman.

Per ottenere il postino vai a https://www.getpostman.com/apps. Scarica l'app secondo il tuo sistema operativo. Una volta installato, dovresti essere in grado di testare l'URL del tuo post come mostrato di seguito -

Questo mostra il messaggio che abbiamo aggiunto nella funzione Lambda.