Учебники

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

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

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

Установите Serverless Framework, используя npm install

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

Установить сервер

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

npm install -g serverless

Severless

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

Рамочная команда

Framework Prompt

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

стенография

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

sls create --help

Помогите

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

Шаг 1

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

Добавить пользователя

Шаг 2

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

Установить разрешение

Краткий обзор

Шаг 3

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

Создать пользователя

Настройка AWS Serverless Framework

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

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

Настроить платформу

Обратите внимание, что данные введенных учетных данных, а именно ключ доступа и секретный ключ , хранятся в файле / aws / credentials .

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

Создать папку

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

Создание AWS Lambda с использованием Serverless Framework

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

Шаг 1

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

Создать команду

Шаг 2

Теперь нам нужно назначить шаблон следующим образом:

AWS-nodejs, aws-nodejs-typcript, aws-nodejs-ecma-script, aws-python, aws-python3, aws-groovy-gradle и т. Д.

Шаг 3

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

sls create --template aws-nodejs

Nodejs

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

Шаг 4

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

Visual Studio Framework

Шаг 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: 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 . Нам нужно добавить регион, в котором мы будем работать, и стадию , которая является средой разработки или разработки для проекта. Итак, вот обновленные данные о провайдере: провайдер —

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

Роль IAM

Роль iam , то есть код для разрешения работы с 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 Подробности

Имя функции экспорта в 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 отображаются следующим образом:

Cloud Framework

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

Этап используется

Шаг 3

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

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

Бессерверный продукт

Шаг 4

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

Подробный поток

Привет

Лямбда-код AWS

Лямбда-код AWS и настройки его выполнения показаны на приведенном ниже снимке экрана.

Лямбда-код

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

Лямбда каркас

Структура исполнения

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

Рамочный выход

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

sls invoke --function hello

Безсерверный фреймворк

Синтаксис команды invoke показан здесь —

sls invoke --function hello

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

Триггер команды

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

sls invoke local --function hello 

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

Invoke Local

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

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

sls create --template aws-nodejs 

Api Gateway Framework

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

Открытый обработчик

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

изменения

Теперь добавлена ​​информация о событиях для активации шлюза API с помощью AWS Lambda.

Детали мероприятия

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

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

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

Наблюдать за обработчиком

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

Теперь мы запустим команду sls deploy, чтобы создать функцию AWS Lambda с триггером в качестве шлюза API .

sls deploy

Sls Deploy

Обратите внимание, что подробности развертывания перечислены выше. Это дает Get URL с конечной точкой в ​​качестве деталей пути. Стадия 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 — нулевые, поскольку в строке запроса ничего не передается. Информация о событии дается на вход, который мы указали в обработчике лямбды AWS —

вход

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

Теперь давайте передадим входные данные в URL-адрес 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 
 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 });
};

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

Показать сообщение

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

Почтовый метод

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

Команда развертывания

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

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

Почтовый URL

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