AWS Lambda может быть создан и развернут с использованием бессерверной инфраструктуры. Это позволяет создавать триггеры AWS Lambda, а также развертывать их, создавая необходимые роли. Безсерверный фреймворк позволяет проще обрабатывать большие проекты. Необходимые события и ресурсы записаны в одном месте, и всего несколько команд помогают развернуть все функции на консоли AWS.
В этой главе вы подробно узнаете, как начать работу с AWS-сервером.
Установите Serverless Framework, используя npm install
Для начала вам нужно сначала установить nodejs . Вы можете проверить наличие узлов следующим образом:
Вы должны будете использовать следующую команду для установки без сервера, используя пакет npm —
npm install -g serverless
После завершения npm выполните безсерверную команду, которая показывает список команд, которые будут использоваться для создания и развертывания лямбда-функции AWS. Обратите внимание на скриншоты, приведенные ниже —
Вы также можете использовать 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
Обратите внимание, что эта команда создает шаблон для шаблона 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: 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 отображаются следующим образом:
Обратите внимание, что данное имя — это имя проекта, за которым следует используемый этап.
Шаг 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, не могут быть смоделированы в локальной среде. Только основные вызовы функций могут быть проверены локально.
Использование 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.
Здесь добавлена новая вещь, называемая событиями . Мы указали событие как http вместе с его путем и методом.
Путь — это конечная точка, которую мы будем использовать при создании пути шлюза API и метода GET.
Обратите внимание, что обработчиком является handler.hello , а hello — это имя экспорта из handler.js.
Обратите внимание, что вам не нужно развертывать здесь шлюз API, так как безсерверный фреймворк будет выполнять это.
Теперь мы запустим команду sls deploy, чтобы создать функцию AWS Lambda с триггером в качестве шлюза API .
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 в строке запроса и увидим отображение:
Затем вы можете увидеть вывод строки запроса, как показано ниже —
{"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 . Загрузите приложение в соответствии с вашей ОС. После установки вы сможете протестировать ваш пост, как показано ниже —
Это отображает сообщение, которое мы добавили в функцию Lambda.