Criação e implantação usando Serverless Framework

O AWS Lambda pode ser criado e implantado usando uma estrutura sem servidor. Ele permite que você crie gatilhos do AWS Lambda e também implante os mesmos criando as funções necessárias. O framework sem servidor permite lidar com grandes projetos de uma forma mais fácil. Os eventos e recursos necessários são escritos em um só lugar e apenas alguns comandos ajudam a implantar a funcionalidade completa no console da AWS.

Neste capítulo, você aprenderá em detalhes como começar a usar a estrutura sem servidor da AWS.

Instale o Serverless Framework usando npm install

Para começar, você precisa primeiro instalar nodejs. Você pode verificar se há nodejs da seguinte maneira -

Você terá que usar o seguinte comando para instalar sem servidor usando o pacote npm -

npm install -g serverless

Depois que o npm estiver pronto, execute o comando sem servidor que mostra a lista de comandos a serem usados ​​para criar e implantar a função AWS Lambda. Observe as imagens fornecidas abaixo -

Você também pode usar sls em vez de sem servidor. sls é o comando abreviado para sem servidor.

Caso necessite de ajuda no comando sls, você pode usar o seguinte comando -

sls create --help

Para criar uma estrutura sem servidor, você deve seguir as etapas abaixo -

Passo 1

Para começar a usar a estrutura sem servidor, precisamos adicionar as credenciais. Com isso, você pode primeiro o usuário no console AWS da seguinte forma -

Passo 2

Clique em Next:Permissionsbotão para adicionar permissões. Você terá que anexar as políticas existentes ou acesso de administrador a este usuário.

etapa 3

Clique Create Userpara adicionar o usuário. Ele exibirá a chave de acesso e a chave secreta que precisamos para configurar a estrutura sem servidor -

Configurar AWS Serverless Framework

Vamos ver como configurar a estrutura sem servidor da AWS. Você pode usar o seguinte comando para esta finalidade -

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

Observe que os detalhes das credenciais inseridas, ou seja, o access key e secret key são armazenados no file /aws/credentials.

Primeiro, crie uma pasta onde deseja que seus arquivos de projeto sejam armazenados.

Em seguida, começaremos o trabalho em aws-serverless pasta.

Crie AWS Lambda usando Serverless Framework

Agora, vamos criar uma função Lambda com a estrutura sem servidor usando as etapas fornecidas abaixo -

Passo 1

A seguir estão os detalhes para sem servidor create comando -

Passo 2

Agora, precisamos atribuir o modelo, que são os seguintes -

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

etapa 3

Devemos fazer uso de aws-nodejstemplate para criar nosso primeiro projeto usando framework sem servidor. O comando para o mesmo propósito é mostrado aqui -

sls create --template aws-nodejs

Observe que este comando cria um padrão para o modelo aws-nodejs.

Passo 4

Agora, abra a pasta criada em um IDE. Aqui, estamos usando o código do Visual Studio e a estrutura da pasta é a seguinte -

Etapa 5

Existem 2 arquivos criados: handler.js e Serverless.yml

Os detalhes da função básica do AWS Lambda são mostrados em handler.js como 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 });
};

Este ficheiro Serverless.yml tem os detalhes de configuração da estrutura sem servidor, conforme mostrado abaixo -

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

Agora, precisamos adicionar alterações no arquivo serverless.yml de acordo com nossos requisitos. Você pode usar os comandos fornecidos abaixo -

Você pode usar o seguinte comando para Service -

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

Agora, mude o serviço aqui e adicione o nome dado à nossa pasta como mostrado -

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

Os detalhes do provedor são mostrados -

provider:
   name: aws
   runtime: nodejs6.10

O provedor é aws e o tempo de execução é nodejs6.10. Precisamos adicionar oregion no qual estaremos trabalhando e o stage, isso é dev or prodambiente para o projeto. Então, aqui estão os detalhes atualizados do provedor: provedor -

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

Papel IAM

o iam role, ou seja, o código para permissão para trabalhar com Lambda é mostrado aqui no .yml arquivo -

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

Observe que precisamos fornecer os detalhes da função, ou seja, a permissão necessária para outros serviços da AWS, na seção acima.

Detalhes do manipulador AWS Lambda

O nome da função de exportação em handler.jsé olá. Portanto, o manipulador é o nome do arquivo seguido pelo nome da exportação.

functions:
   hello:
      handler: handler.hello

Os detalhes do recurso sobre o serviço s3 adicionado conforme mostrado abaixo aqui -

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

Implantar AWS Lambda usando Serverless Framework

Vamos implantar a função lambda acima no console da AWS. Você pode usar as seguintes etapas para esta finalidade -

Passo 1

Primeiro, você terá que usar o seguinte comando -

sls deploy

Passo 2

Agora, você deve ver a função no console AWS agora, conforme mostrado. Os detalhes da AWS sem servidor são registrados na formação da nuvem AWS. Para isso, vá para o serviço AWS e selecioneCloudFormation. Os detalhes do AWS Lambda são exibidos da seguinte forma -

Observe que o nome dado é o nome do projeto seguido da etapa utilizada.

etapa 3

Ele cria a função IAM para AWS Lambda e grupo de log para AWS cloudwatch. O bucket S3 é criado com os detalhes do código armazenados e os detalhes da configuração.

Isso é criado pelo comando sls deploy. Você não precisa especificar a função iam; em vez disso, ela é criada por padrão durante odeploy palco.

Passo 4

O fluxo detalhado de eventos é exibido abaixo no serviço de formação de nuvem.

Código AWS Lambda

O código do AWS Lambda e suas configurações de execução são mostrados na captura de tela fornecida abaixo -

Ao testar a função Lambda, você pode encontrar a seguinte saída -

A saída de log para a função acima é mostrada aqui -

Também podemos testar a função AWS Lambda usando o comando sem servidor, conforme mostrado abaixo -

sls invoke --function hello

A sintaxe do comando invoke é mostrada aqui -

sls invoke --function hello

Este comando invoke aciona a função AWS Lambda e exibe a saída no prompt de comando conforme mostrado abaixo -

Você também pode testar a função Lambda antes de implantar e o comando para a mesma usando o seguinte comando -

sls invoke local --function hello

Observe que nem sempre é possível testar localmente, pois recursos como S3 e DinanoDB não podem ser simulados no ambiente local. Apenas as chamadas de função básicas podem ser testadas localmente.

Usando API Gateway e AWS Lambda com Serverless Framework

Vamos ver como criar um novo projeto para trabalhar com Lambda e gateway api. Você pode usar o seguinte comando para esta finalidade -

sls create --template aws-nodejs

Agora abra aws-apiprojeto em código visual. Você pode ver que ohandler.js e serverless.ymlarquivos criados. Vamos fazer as alterações para adicionar o gateway API.

Você terá que fazer as seguintes mudanças em serverless.yml -

Agora, os detalhes dos eventos adicionados para ativação do gateway api com AWS Lambda -

Há uma coisa nova adicionada aqui chamada events. Nós especificamos o evento comohttp, junto com seu caminho e método.

O caminho é o ponto final que usaremos quando o caminho do gateway da API for criado e o método usado for GET.

Observe que o manipulador é handler.helloe hello é o nome de exportação de handler.js.

Observe que você não precisa implantar o gateway api aqui, pois a estrutura sem servidor fará isso.

Agora, vamos executar o sls deploy comando para criar a função AWS Lambda com gatilho como api gateway.

sls deploy

Observe que os detalhes de implantação estão listados acima. Dá oGeturl com o ponto final como os detalhes do caminho. O palco éprodentão o mesmo é usado no url. O nome da função éaws-api-prod-hello.

Vamos acessar o url e ver o resultado. Você pode ver a seguir a resposta que obtemos do 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}}

Os detalhes do evento também estão disponíveis na saída quando você acessa o url. O httpMethod é GET e os queryStringParameters são nulos, pois nada foi passado na string de consulta. Os detalhes do evento são fornecidos ainput que especificamos no manipulador AWS Lambda -

A saída que obtemos do gateway api são apenas os body detalhes como message e input. A resposta é totalmente controlada pelo gateway api e como exibi-la como saída.

Agora, vamos passar as entradas para o url GET na string de consulta e ver o display -

Então você pode ver a saída da querystring conforme mostrado abaixo -

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

Vamos alterar a função do AWS Lambda para exibir apenas os detalhes da string de consulta, conforme mostrado abaixo -

'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 alteramos a mensagem com base na string de consulta display message. Isso implantará a função novamente e verificará a saída. Ele exibe os detalhes presentes na mensagem de exibição da variável da string de consulta, conforme mostrado abaixo.

Vamos agora adicionar post método para os eventos criados conforme mostrado abaixo -

Agora, implante as mudanças feitas e você pode ver a seguinte saída do comando de implantação -

Observe que testar o URL da postagem diretamente no navegador não fornecerá os detalhes. Você deve testar o URL da postagem empostman.

Para pegar o carteiro vá para https://www.getpostman.com/apps. Baixe o aplicativo de acordo com seu sistema operacional. Depois de instalado, você deve ser capaz de testar o url de sua postagem conforme mostrado abaixo -

Isso exibe a mensagem que adicionamos na função Lambda.