Création et déploiement à l'aide d'une infrastructure sans serveur

AWS Lambda peut être créé et déployé à l'aide d'une infrastructure sans serveur. Il vous permet de créer des déclencheurs AWS Lambda et de les déployer également en créant les rôles requis. Le framework sans serveur permet de gérer plus facilement de gros projets. Les événements et les ressources requis sont écrits au même endroit et quelques commandes seulement aident à déployer toutes les fonctionnalités sur la console AWS.

Dans ce chapitre, vous apprendrez en détail comment démarrer avec le framework sans serveur AWS.

Installez Serverless Framework à l'aide de npm install

Pour commencer, vous devez d'abord installer nodejs. Vous pouvez vérifier nodejs comme suit -

Vous devrez utiliser la commande suivante pour installer sans serveur à l'aide du package npm -

npm install -g serverless

Une fois npm terminé, exécutez la commande sans serveur qui affiche la liste des commandes à utiliser pour créer et déployer la fonction AWS Lambda. Observez les captures d'écran ci-dessous -

Vous pouvez également utiliser sls au lieu de serverless. sls est la commande abrégée pour serverless.

Au cas où vous auriez besoin d'aide sur la commande sls, vous pouvez utiliser la commande suivante -

sls create --help

Pour créer un framework sans serveur, vous devez suivre les étapes ci-dessous -

Étape 1

Pour commencer à utiliser le framework sans serveur, nous devons ajouter les informations d'identification. Par cela, vous pouvez d'abord l'utilisateur dans la console AWS comme suit -

Étape 2

Cliquer sur Next:Permissionsbouton pour ajouter des autorisations. Vous devrez attacher les politiques existantes ou l'accès administrateur à cet utilisateur.

Étape 3

Cliquez sur Create Userpour ajouter l'utilisateur. Il affichera la clé d'accès et la clé secrète dont nous avons besoin pour configurer le framework sans serveur -

Configurer AWS Serverless Framework

Voyons comment configurer l'infrastructure sans serveur AWS. Vous pouvez utiliser la commande suivante à cet effet -

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

Notez que les détails des informations d'identification saisies, c'est-à-dire access key et secret key sont stockés dans le file /aws/credentials.

Commencez par créer un dossier dans lequel vous souhaitez stocker vos fichiers de projet.

Ensuite, nous commencerons le travail en aws-serverless dossier.

Créer AWS Lambda à l'aide d'une infrastructure sans serveur

Maintenant, créons une fonction Lambda avec le framework sans serveur en utilisant les étapes ci-dessous -

Étape 1

Voici les détails pour sans serveur create commande -

Étape 2

Maintenant, nous devons attribuer le modèle qui sont les suivants -

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

Étape 3

Nous utiliserons aws-nodejstemplate pour créer notre premier projet en utilisant un framework sans serveur. La commande dans le même but est comme indiqué ici -

sls create --template aws-nodejs

Notez que cette commande crée un passe-partout pour le modèle aws-nodejs.

Étape 4

Maintenant, ouvrez le dossier créé dans un IDE. Ici, nous utilisons le code Visual Studio et la structure des dossiers est la suivante -

Étape 5

Il y a 2 fichiers créés: handler.js et Serverless.yml

Les détails de la fonction de base AWS Lambda sont affichés dans handler.js comme suit -

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

Ce fichier Serverless.yml a les détails de configuration du framework sans serveur comme indiqué ci-dessous -

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

Maintenant, nous devons ajouter des modifications dans le fichier serverless.yml selon nos exigences. Vous pouvez utiliser les commandes comme indiqué ci-dessous -

Vous pouvez utiliser la commande suivante pour Service -

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

Maintenant, changez le service ici et ajoutez le nom donné à notre dossier comme indiqué -

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

Les détails du fournisseur sont comme indiqué -

provider:
   name: aws
   runtime: nodejs6.10

Le fournisseur est aws et le runtime est nodejs6.10. Nous devons ajouter leregion dans lequel nous travaillerons et le stage, C'est dev or prodenvironnement pour le projet. Voici donc les détails mis à jour du fournisseur: fournisseur -

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

Rôle IAM

le iam role, c'est-à-dire que le code d'autorisation de travailler avec Lambda est affiché ici dans le .yml fichier -

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

Notez que nous devons donner les détails du rôle, c'est-à-dire l'autorisation requise avec d'autres services AWS, dans la section ci-dessus.

Détails du gestionnaire AWS Lambda

Le nom de la fonction d'exportation dans handler.jsest bonjour. Ainsi, le gestionnaire est le nom du fichier suivi du nom de l'exportation.

functions:
   hello:
      handler: handler.hello

Les détails de la ressource sur le service s3 ajouté comme indiqué ci-dessous ici -

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

Déployer AWS Lambda à l'aide d'une infrastructure sans serveur

Déployons la fonction lambda ci-dessus sur la console AWS. Vous pouvez utiliser les étapes suivantes à cet effet -

Étape 1

Tout d'abord, vous devrez utiliser la commande suivante -

sls deploy

Étape 2

Maintenant, vous devriez voir la fonction dans la console AWS maintenant, comme indiqué. Les détails d'AWS sans serveur sont consignés dans la formation du cloud AWS. Pour cela, accédez au service AWS et sélectionnezCloudFormation. Les détails d'AWS Lambda sont affichés comme suit -

Notez que le nom donné est le nom du projet suivi de l'étape utilisée.

Étape 3

Il crée le rôle iam pour AWS Lambda et le groupe de journaux pour AWS cloudwatch. Un compartiment S3 est créé avec les détails du code stockés et les détails de la configuration.

Ceci est créé par la commande sls deploy. Vous n'avez pas besoin de spécifier le rôle iam, il est plutôt créé par défaut lors de ladeploy étape.

Étape 4

Le flux détaillé des événements est affiché ci-dessous dans le service de formation des nuages.

Code AWS Lambda

Le code AWS Lambda et ses paramètres d'exécution sont affichés dans la capture d'écran ci-dessous -

Lorsque vous testez la fonction Lambda, vous pouvez trouver la sortie suivante -

La sortie du journal pour la fonction ci-dessus est affichée ici -

Nous pouvons également tester la fonction AWS Lambda à l'aide de la commande sans serveur comme indiqué ci-dessous -

sls invoke --function hello

La syntaxe de la commande invoke est affichée ici -

sls invoke --function hello

Cette commande d'appel déclenche la fonction AWS Lambda et affiche la sortie dans l'invite de commande comme indiqué ci-dessous -

Vous pouvez également tester la fonction Lambda avant le déploiement et la commande pour la même en utilisant la commande suivante -

sls invoke local --function hello

Veuillez noter qu'il n'est pas toujours possible de tester localement car les ressources telles que S3 et DynanoDB ne peuvent pas être simulées sur l'environnement local. Seuls les appels de fonction de base peuvent être testés localement.

Utilisation d'API Gateway et d'AWS Lambda avec une infrastructure sans serveur

Voyons comment créer un nouveau projet pour fonctionner avec Lambda et la passerelle API. Vous pouvez utiliser la commande suivante à cet effet -

sls create --template aws-nodejs

Ouvert aws-apiprojet en code visuel. Vous pouvez voir que lehandler.js et serverless.ymlfichiers créés. Faisons les changements pour l'ajout de la passerelle API.

Vous devrez effectuer les modifications suivantes dans serverless.yml -

Maintenant, les détails des événements ajoutés pour l'activation de la passerelle API avec AWS Lambda -

Il y a une nouvelle chose ajoutée ici appelée events. Nous avons spécifié l'événement commehttp, avec son chemin et sa méthode.

Le chemin est le point final que nous utiliserons lorsque le chemin de la passerelle API est créé et que la méthode utilisée est GET.

Observez que le gestionnaire est handler.hello, et bonjour est le nom de l'exportation de handler.js.

Notez que vous n'avez pas à déployer la passerelle api ici, car le framework sans serveur l'exécutera.

Maintenant, nous allons lancer le sls deploy commande pour créer une fonction AWS Lambda avec un déclencheur comme api gateway.

sls deploy

Notez que les détails du déploiement sont répertoriés ci-dessus. Cela donne leGeturl avec le point final comme détails du chemin. La scène estproddonc la même chose est utilisée dans l'url. Le nom de la fonction estaws-api-prod-hello.

Frappons l'url et voyons la sortie. Vous pouvez voir ce qui suit, la réponse que nous obtenons de l'URL get api-gateway -

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

Les détails de l'événement sont également disponibles dans la sortie lorsque vous appuyez sur l'URL. Le httpMethod est GET et les queryStringParameters sont null car il n'y a rien de passé dans la chaîne de requête. Les détails de l'événement sont donnés àinput que nous avons spécifié dans le gestionnaire AWS Lambda -

La sortie que nous obtenons de la passerelle API n'est que body des détails tels que message et input. La réponse est totalement contrôlée par la passerelle API et comment l'afficher en sortie.

Maintenant, passons les entrées à l'url GET dans la chaîne de requête et voyons l'affichage -

Ensuite, vous pouvez voir la sortie de la chaîne de requête comme indiqué ci-dessous -

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

Modifions la fonction AWS Lambda pour afficher simplement les détails de la chaîne de requête comme indiqué ci-dessous -

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

Observez que nous avons modifié le message en fonction de la chaîne de requête display message. Cela déploiera à nouveau la fonction et vérifiera la sortie. Il affiche les détails présents dans le message d'affichage de la variable de chaîne de requête comme indiqué ci-dessous.

Ajoutons maintenant post méthode aux événements créés comme indiqué ci-dessous -

Maintenant, déployez les modifications apportées et vous pouvez voir la sortie suivante de la commande deploy -

Notez que tester directement l'URL de l'article dans le navigateur ne donnera pas les détails. Vous devriez tester l'URL du message danspostman.

Pour faire venir le facteur https://www.getpostman.com/apps. Téléchargez l'application selon votre système d'exploitation. Une fois installé, vous devriez pouvoir tester l'URL de votre message comme indiqué ci-dessous -

Cela affiche le message que nous avons ajouté dans la fonction Lambda.