Создание и развертывание с использованием Serverless Framework

AWS Lambda можно создать и развернуть с использованием бессерверной инфраструктуры. Он позволяет создавать триггеры AWS Lambda, а также развертывать их, создавая необходимые роли. Бессерверный фреймворк упрощает работу с большими проектами. Необходимые события и ресурсы записываются в одном месте, и всего несколько команд помогают развернуть полную функциональность на консоли AWS.

В этой главе вы подробно узнаете, как начать работу с бессерверной средой AWS.

Установите Serverless Framework с помощью npm install

Для начала нужно сначала установить nodejs. Вы можете проверить nodejs следующим образом:

Вам нужно будет использовать следующую команду для установки без сервера с использованием пакета npm -

npm install -g serverless

После завершения npm выполните бессерверную команду, которая показывает список команд, которые будут использоваться для создания и развертывания функции AWS Lambda. Обратите внимание на приведенные ниже скриншоты -

Вы также можете использовать sls вместо serverless. sls это сокращенная команда для бессерверного.

Если вам нужна помощь по команде sls, вы можете использовать следующую команду -

sls create --help

Для создания бессерверной структуры вы должны выполнить следующие шаги:

Шаг 1

Чтобы начать использовать бессерверную структуру, нам нужно добавить учетные данные. Таким образом, вы можете сначала ввести пользователя в консоль AWS следующим образом:

Шаг 2

Нажмите на Next:Permissionsкнопку, чтобы добавить разрешения. Вам нужно будет прикрепить существующие политики или доступ администратора к этому пользователю.

Шаг 3

Нажмите Create Userдобавить пользователя. Он отобразит ключ доступа и секретный ключ, который нам нужен для настройки бессерверной структуры -

Настроить AWS Serverless Framework

Давайте посмотрим, как настроить бессерверную структуру AWS. Для этой цели вы можете использовать следующую команду -

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

Обратите внимание, что сведения о введенных учетных данных, то есть access key а также secret key хранятся в file /aws/credentials.

Сначала создайте папку, в которой вы хотите хранить файлы вашего проекта.

Далее мы начнем работу в aws-serverless папка.

Создайте AWS Lambda с помощью Serverless Framework

Теперь давайте создадим лямбда-функцию с бессерверной структурой, используя шаги, указанные ниже:

Шаг 1

Ниже приведены сведения о бессерверном create команда -

Шаг 2

Теперь нам нужно назначить шаблон, который выглядит следующим образом:

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

Шаг 3

Мы будем использовать aws-nodejsшаблон для создания нашего первого проекта с использованием бессерверной среды. Команда для той же цели показана здесь -

sls create --template aws-nodejs

Обратите внимание, что эта команда создает шаблон для шаблона aws-nodejs.

Шаг 4

Теперь откройте папку, созданную в IDE. Здесь мы используем код Visual Studio, а структура папок выглядит следующим образом:

Шаг 5

Создано 2 файла: handler.js а также Serverless.yml

Подробные сведения об основных функциях AWS Lambda показаны на handler.js следующим образом -

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

Этот файл Serverless.yml имеет детали конфигурации бессерверной структуры, как показано ниже -

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

Теперь нам нужно внести изменения в файл serverless.yml в соответствии с нашими требованиями. Вы можете использовать команды, указанные ниже -

Вы можете использовать следующую команду для Service -

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

Теперь измените службу здесь и добавьте имя, данное нашей папке, как показано -

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

Детали провайдера, как показано -

provider:
   name: aws
   runtime: nodejs6.10

Провайдер aws и время выполнения nodejs6.10. Нам нужно добавитьregion в котором мы будем работать и stage, то есть dev or prodсреда для проекта. Итак, вот обновленные данные поставщика: поставщик -

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

Роль IAM

В iam role, то есть код для разрешения работы с Lambda показан здесь, в .yml файл -

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

Обратите внимание, что нам нужно предоставить подробную информацию о роли, то есть разрешение, необходимое для других сервисов AWS, в разделе выше.

Сведения об обработчике AWS Lambda

Название функции экспорта в handler.jsпривет. Таким образом, обработчик - это имя файла, за которым следует имя экспорта.

functions:
   hello:
      handler: handler.hello

Сведения о ресурсе о службе s3 добавлены, как показано ниже здесь -

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

Развертывание AWS Lambda с помощью Serverless Framework

Давайте развернем указанную выше лямбда-функцию на консоли AWS. Для этой цели вы можете использовать следующие шаги -

Шаг 1

Во-первых, вам нужно будет использовать следующую команду -

sls deploy

Шаг 2

Теперь вы должны увидеть функцию в консоли AWS, как показано. Детали бессерверного AWS регистрируются в формировании облака AWS. Для этого зайдите в сервис AWS и выберитеCloudFormation. Подробности AWS Lambda отображаются следующим образом:

Обратите внимание, что данное имя - это имя проекта, за которым следует используемый этап.

Шаг 3

Он создает роль iam для AWS Lambda и группу журналов для AWS cloudwatch. Создается корзина S3, в которой хранятся детали кода и детали конфигурации.

Это создается командой sls deploy. Вам не нужно указывать роль iam, вместо этого она создается по умолчанию во времяdeploy этап.

Шаг 4

Подробный поток событий отображается ниже в сервисе формирования облака.

Код AWS Lambda

Код AWS Lambda и параметры его выполнения показаны на скриншоте ниже -

Когда вы тестируете лямбда-функцию, вы можете найти следующий результат:

Вывод журнала для вышеуказанной функции показан здесь -

Мы также можем протестировать функцию AWS Lambda с помощью бессерверной команды, как показано ниже -

sls invoke --function hello

Синтаксис команды вызова показан здесь -

sls invoke --function hello

Эта команда вызова запускает функцию AWS Lambda и отображает вывод в командной строке, как показано ниже:

Вы также можете протестировать функцию Lambda перед развертыванием и команду для того же, используя следующую команду -

sls invoke local --function hello

Обратите внимание, что не всегда можно протестировать локально, поскольку такие ресурсы, как S3 и DynanoDB, не могут быть смоделированы в локальной среде. Локально можно протестировать только вызовы основных функций.

Использование API Gateway и AWS Lambda с Serverless Framework

Давайте посмотрим, как создать новый проект для работы с Lambda и API-шлюзом. Для этой цели вы можете использовать следующую команду -

sls create --template aws-nodejs

Теперь откройте aws-apiпроект в визуальном коде. Вы можете видеть, чтоhandler.js а также serverless.ymlфайлы созданы. Давайте внесем изменения в это для добавления шлюза api.

Вам нужно будет внести следующие изменения в serverless.yml -

Теперь подробности событий добавлены для активации шлюза api с помощью AWS Lambda -

Здесь добавлена ​​новая вещь, которая называется events. Мы указали событие какhttp, а также его путь и метод.

Путь - это конечная точка, которую мы будем использовать при создании пути шлюза api и используемом методе GET.

Обратите внимание, что обработчик handler.hello, а hello - это имя экспорта из handler.js.

Обратите внимание, что вам не нужно развертывать здесь шлюз api, так как это будет выполнять бессерверная структура.

Теперь мы запустим sls deploy команда для создания функции AWS Lambda с триггером как api gateway.

sls deploy

Обратите внимание, что подробности развертывания перечислены выше. Это даетGeturl с конечной точкой в ​​качестве подробностей пути. Сценаprodтак же используется в URL-адресе. Имя функцииaws-api-prod-hello.

Давайте перейдем к URL-адресу и посмотрим на результат. Вы можете увидеть следующий ответ, который мы получаем от 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}}

Детали события также доступны в выводе, когда вы нажимаете URL-адрес. HttpMethod - это GET, а параметры queryStringParameters имеют значение NULL, поскольку в строке запроса ничего не передается. Подробная информация о мероприятии предоставляетсяinput который мы указали в обработчике AWS Lambda -

Вывод, который мы получаем от шлюза api, - это только body такие детали, как message а также input. Ответ полностью контролируется шлюзом api и способом его отображения в качестве вывода.

Теперь давайте передадим входные данные URL-адресу GET в строке запроса и посмотрим на дисплей -

Затем вы можете увидеть вывод строки запроса, как показано ниже -

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

Давайте изменим функцию AWS Lambda, чтобы просто отображать детали строки запроса, как показано ниже -

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

Обратите внимание, что мы изменили сообщение на основе строки запроса display message. Это снова развернет функцию и проверит вывод. Он отображает сведения, представленные в сообщении отображения переменной строки запроса, как показано ниже.

Давайте теперь добавим post метод к событиям, созданным, как показано ниже -

Теперь разверните внесенные изменения, и вы увидите следующий вывод команды развертывания:

Обратите внимание, что тестирование URL-адреса публикации в браузере напрямую не дает подробностей. Вы должны проверить URL-адрес сообщения вpostman.

Чтобы получить почтальона, перейдите в https://www.getpostman.com/apps. Загрузите приложение для вашей ОС. После установки вы сможете проверить URL-адрес своего сообщения, как показано ниже -

Это отображает сообщение, которое мы добавили в функцию Lambda.