Tạo và triển khai bằng cách sử dụng Serverless Framework

AWS Lambda có thể được tạo và triển khai bằng cách sử dụng khuôn khổ không máy chủ. Nó cho phép bạn tạo các trình kích hoạt AWS Lambda và cũng triển khai tương tự bằng cách tạo các vai trò bắt buộc. Serverless framework cho phép xử lý các dự án lớn một cách dễ dàng hơn. Các sự kiện và tài nguyên cần thiết được viết ở một nơi và chỉ một vài lệnh giúp triển khai toàn bộ chức năng trên bảng điều khiển AWS.

Trong chương này, bạn sẽ tìm hiểu chi tiết cách bắt đầu với AWS serverless framework.

Cài đặt Serverless Framework bằng cách sử dụng npm install

Để bắt đầu, trước tiên bạn cần cài đặt nodejs. Bạn có thể kiểm tra nodejs như sau:

Bạn sẽ phải sử dụng lệnh sau để cài đặt serverless bằng gói npm -

npm install -g serverless

Sau khi hoàn tất npm, hãy thực thi lệnh serverless hiển thị danh sách lệnh sẽ được sử dụng để tạo và triển khai hàm AWS Lambda. Quan sát các ảnh chụp màn hình dưới đây -

Bạn cũng có thể sử dụng sls thay vì serverless. sls là lệnh viết tắt cho serverless.

Trong trường hợp bạn cần trợ giúp về lệnh sls, bạn có thể sử dụng lệnh sau:

sls create --help

Để tạo một khung công tác không máy chủ, bạn phải làm theo các bước dưới đây:

Bước 1

Để bắt đầu sử dụng serverless framework, chúng ta cần thêm thông tin đăng nhập. Bằng cách này, bạn có thể là người dùng đầu tiên trong bảng điều khiển AWS như sau:

Bước 2

Bấm vào Next:Permissionsđể thêm quyền. Bạn sẽ phải đính kèm các chính sách hiện có hoặc Quyền truy cập của Quản trị viên cho người dùng này.

Bước 3

Nhấp chuột Create Userđể thêm người dùng. Nó sẽ hiển thị khóa truy cập và khóa bí mật mà chúng ta cần để định cấu hình khung máy chủ -

Định cấu hình AWS Serverless Framework

Hãy để chúng tôi xem cách định cấu hình khung máy chủ AWS. Bạn có thể sử dụng lệnh sau cho mục đích này:

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

Lưu ý rằng các chi tiết của thông tin xác thực đã nhập, đó là access keysecret key được lưu trữ trong file /aws/credentials.

Đầu tiên, hãy tạo một thư mục nơi bạn muốn các tệp dự án của mình được lưu trữ.

Tiếp theo, chúng ta sẽ bắt đầu công việc trong aws-serverless thư mục.

Tạo AWS Lambda bằng cách sử dụng Serverless Framework

Bây giờ, chúng ta hãy tạo một hàm Lambda với khung công tác không máy chủ bằng cách sử dụng Các bước dưới đây:

Bước 1

Sau đây là chi tiết cho serverless create lệnh -

Bước 2

Bây giờ, chúng ta cần gán mẫu như sau:

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

Bước 3

Chúng tôi sẽ tận dụng aws-nodejsmẫu để tạo dự án đầu tiên của chúng tôi bằng cách sử dụng khuôn khổ không máy chủ. Lệnh cho mục đích tương tự như được hiển thị ở đây -

sls create --template aws-nodejs

Lưu ý rằng lệnh này tạo một bản soạn sẵn cho mẫu aws-nodejs.

Bước 4

Bây giờ, mở thư mục được tạo trong IDE. Ở đây chúng tôi đang sử dụng mã Visual Studio và cấu trúc thư mục như sau:

Bước 5

Có 2 tệp được tạo: handler.jsServerless.yml

Chi tiết chức năng cơ bản của AWS Lambda được hiển thị trong handler.js như sau -

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

Tập tin này Serverless.yml có chi tiết cấu hình của khung công tác không máy chủ như được hiển thị bên dưới -

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

Bây giờ, chúng tôi cần thêm các thay đổi trong tệp serverless.yml theo yêu cầu của chúng tôi. Bạn có thể sử dụng các lệnh như dưới đây:

Bạn có thể sử dụng lệnh sau cho Service -

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

Bây giờ, hãy thay đổi dịch vụ ở đây và thêm tên được đặt cho thư mục của chúng tôi như được hiển thị -

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

Thông tin chi tiết về nhà cung cấp như được hiển thị -

provider:
   name: aws
   runtime: nodejs6.10

Nhà cung cấp là aws và thời gian chạy là nodejs6.10. Chúng tôi cần thêmregion trong đó chúng tôi sẽ làm việc và stage, đó là dev or prodmôi trường cho dự án. Vì vậy, đây là chi tiết cập nhật của nhà cung cấp: nhà cung cấp -

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

Vai trò IAM

Các iam rolenghĩa là mã cho phép làm việc với Lambda được hiển thị ở đây trong .yml tập tin -

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

Lưu ý rằng chúng tôi cần cung cấp chi tiết về vai trò, đó là quyền cần thiết với các dịch vụ AWS khác, trong phần trên.

Chi tiết Trình xử lý AWS Lambda

Tên của hàm xuất trong handler.jsxin chào. Vì vậy, trình xử lý là tên của tệp theo sau là tên xuất.

functions:
   hello:
      handler: handler.hello

Chi tiết tài nguyên về dịch vụ s3 được thêm vào như hình dưới đây -

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

Triển khai AWS Lambda bằng cách sử dụng Serverless Framework

Hãy để chúng tôi triển khai hàm lambda ở trên cho bảng điều khiển AWS. Bạn có thể sử dụng các Bước sau cho mục đích này:

Bước 1

Đầu tiên, bạn sẽ phải sử dụng lệnh sau:

sls deploy

Bước 2

Bây giờ, bạn sẽ thấy chức năng trong bảng điều khiển AWS như được hiển thị. Các chi tiết của AWS không máy chủ được đăng nhập trong hệ thống đám mây AWS. Vì mục đích này, hãy chuyển đến dịch vụ AWS và chọnCloudFormation. Các chi tiết của AWS Lambda được hiển thị như sau:

Quan sát rằng tên được đưa ra là tên dự án, theo sau là giai đoạn được sử dụng.

Bước 3

Nó tạo ra vai trò iam cho AWS Lambda và nhóm nhật ký cho AWS cloudwatch. Nhóm S3 được tạo có lưu trữ chi tiết mã và chi tiết cấu hình.

Điều này được tạo ra bởi lệnh sls deploy. Bạn không cần chỉ định vai trò iam, thay vào đó nó được tạo theo mặc định trongdeploy sân khấu.

Bước 4

Dòng sự kiện chi tiết được hiển thị bên dưới trong dịch vụ hình thành đám mây.

Mã AWS Lambda

Mã AWS Lambda và cài đặt thực thi của nó được hiển thị trong ảnh chụp màn hình dưới đây -

Khi bạn kiểm tra hàm Lambda, bạn có thể tìm thấy kết quả sau:

Đầu ra Nhật ký cho chức năng trên được hiển thị ở đây:

Chúng tôi cũng có thể kiểm tra chức năng AWS Lambda bằng cách sử dụng lệnh serverless như hình dưới đây:

sls invoke --function hello

Cú pháp của lệnh gọi được hiển thị ở đây:

sls invoke --function hello

Lệnh gọi này kích hoạt hàm AWS Lambda và hiển thị kết quả đầu ra trong dấu nhắc lệnh như hình dưới đây:

Bạn cũng có thể kiểm tra hàm Lambda trước khi triển khai và lệnh tương tự bằng cách sử dụng lệnh sau:

sls invoke local --function hello

Xin lưu ý rằng không phải lúc nào cũng có thể kiểm tra cục bộ vì các tài nguyên như S3 vàDynanoDB không thể được mô phỏng trên môi trường cục bộ. Chỉ có thể kiểm tra cục bộ các lệnh gọi hàm cơ bản.

Sử dụng API Gateway và AWS Lambda với Serverless Framework

Hãy để chúng tôi xem cách tạo dự án mới để làm việc với Lambda và api gateway. Bạn có thể sử dụng lệnh sau cho mục đích này:

sls create --template aws-nodejs

Bây giờ mở aws-apidự án trong mã trực quan. Bạn có thể thấy rằnghandler.jsserverless.ymlcác tệp được tạo. Hãy để chúng tôi thực hiện các thay đổi trong đó để bổ sung api gateway.

Bạn sẽ phải thực hiện những thay đổi sau trong serverless.yml -

Giờ đây, các chi tiết sự kiện đã được thêm vào để kích hoạt cổng api với AWS Lambda -

Có một thứ mới được thêm vào đây được gọi là events. Chúng tôi đã chỉ định sự kiện làhttp, cùng với đường dẫn và phương pháp của nó.

Đường dẫn là điểm cuối mà chúng ta sẽ sử dụng khi đường dẫn cổng api được tạo và phương thức được sử dụng là GET.

Quan sát rằng trình xử lý là handler.hellovà xin chào là tên xuất từ ​​handler.js.

Lưu ý rằng bạn không phải triển khai api gateway ở đây, vì khung công tác không máy chủ sẽ thực hiện nó.

Bây giờ, chúng tôi sẽ chạy sls deploy lệnh tạo hàm AWS Lambda với trình kích hoạt là api gateway.

sls deploy

Quan sát rằng các chi tiết triển khai được liệt kê ở trên. Nó cung cấp choGeturl với điểm cuối là chi tiết đường dẫn. Sân khấu làprodvì vậy cũng được sử dụng trong url. Tên của hàm làaws-api-prod-hello.

Hãy để chúng tôi nhấn url và xem kết quả. Bạn có thể thấy như sau phản hồi mà chúng tôi nhận được từ url nhận 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}}

Chi tiết sự kiện cũng có sẵn trong đầu ra khi bạn nhấn vào url. HttpMethod là GET và queryStringParameters là rỗng vì không có gì được truyền vào chuỗi truy vấn. Chi tiết sự kiện được cung cấp choinput mà chúng tôi đã chỉ định trong trình xử lý AWS Lambda -

Đầu ra chúng tôi nhận được từ cổng api chỉ là body các chi tiết như messageinput. Phản hồi được kiểm soát hoàn toàn bởi cổng api và cách hiển thị nó dưới dạng đầu ra.

Bây giờ, chúng ta hãy chuyển đầu vào cho url GET trong chuỗi truy vấn và xem màn hình -

Sau đó, bạn có thể thấy đầu ra của chuỗi truy vấn như hình dưới đây:

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

Hãy để chúng tôi thay đổi hàm AWS Lambda để chỉ hiển thị chi tiết chuỗi truy vấn như hình dưới đây -

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

Quan sát rằng chúng tôi đã thay đổi thông báo dựa trên chuỗi truy vấn display message. Thao tác này sẽ triển khai lại chức năng và kiểm tra kết quả đầu ra. Nó hiển thị các chi tiết có trong thông báo hiển thị biến chuỗi truy vấn như hình dưới đây.

Bây giờ hãy để chúng tôi thêm post phương thức cho các sự kiện được tạo như hình dưới đây -

Bây giờ, hãy triển khai các thay đổi đã thực hiện và bạn có thể thấy kết quả sau từ lệnh triển khai:

Lưu ý rằng việc kiểm tra url bài đăng trực tiếp trong trình duyệt sẽ không cung cấp thông tin chi tiết. Bạn nên kiểm tra url của bài đăng trongpostman.

Để đưa người đưa thư đi đến https://www.getpostman.com/apps. Tải xuống ứng dụng theo hệ điều hành của bạn. Sau khi cài đặt, bạn sẽ có thể kiểm tra url bài đăng của mình như hình dưới đây -

Điều này hiển thị thông báo chúng tôi đã thêm trong hàm Lambda.