서버리스 프레임 워크를 사용하여 생성 및 배포

AWS Lambda는 서버리스 프레임 워크를 사용하여 생성 및 배포 할 수 있습니다. 이를 통해 AWS Lambda 트리거를 생성하고 필요한 역할을 생성하여이를 배포 할 수도 있습니다. 서버리스 프레임 워크를 사용하면 대규모 프로젝트를 더 쉽게 처리 할 수 ​​있습니다. 필요한 이벤트와 리소스는 한곳에 작성되며 몇 가지 명령만으로 AWS 콘솔에 전체 기능을 배포하는 데 도움이됩니다.

이 장에서는 AWS 서버리스 프레임 워크를 시작하는 방법을 자세히 알아 봅니다.

npm install을 사용하여 서버리스 프레임 워크 설치

시작하려면 먼저 설치해야합니다. nodejs. 다음과 같이 nodejs를 확인할 수 있습니다.

npm 패키지를 사용하여 서버리스를 설치하려면 다음 명령을 사용해야합니다.

npm install -g serverless

npm이 완료되면 AWS Lambda 함수를 생성하고 배포하는 데 사용할 명령 목록을 보여주는 서버리스 명령을 실행합니다. 아래 주어진 스크린 샷을 관찰하십시오-

서버리스 대신 sls를 사용할 수도 있습니다. sls 서버리스를위한 축약 형 명령입니다.

명령에 대한 도움이 필요한 경우 sls, 다음 명령을 사용할 수 있습니다-

sls create --help

서버리스 프레임 워크를 생성하려면 아래 단계를 따라야합니다.

1 단계

서버리스 프레임 워크 사용을 시작하려면 자격 증명을 추가해야합니다. 이를 통해 다음과 같이 AWS 콘솔에서 먼저 사용자를 수행 할 수 있습니다.

2 단계

클릭 Next:Permissions버튼을 눌러 권한을 추가하십시오. 이 사용자에게 기존 정책 또는 관리자 액세스 권한을 연결해야합니다.

3 단계

딸깍 하는 소리 Create User사용자를 추가합니다. 서버리스 프레임 워크를 구성하는 데 필요한 액세스 키와 비밀 키를 표시합니다.

AWS 서버리스 프레임 워크 구성

AWS 서버리스 프레임 워크를 구성하는 방법을 살펴 보겠습니다. 이 목적으로 다음 명령을 사용할 수 있습니다.

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

입력 한 자격 증명의 세부 정보, 즉 access keysecret key 에 저장됩니다 file /aws/credentials.

먼저 프로젝트 파일을 저장할 폴더를 만듭니다.

다음으로 작업을 시작합니다. aws-serverless 폴더.

서버리스 프레임 워크를 사용하여 AWS Lambda 생성

이제 아래 단계를 사용하여 서버리스 프레임 워크로 Lambda 함수를 생성 해 보겠습니다.

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.jsServerless.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프로젝트 환경. 여기에 provider : provider의 업데이트 된 세부 정보가 있습니다.

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 배포

위의 lambda 함수를 AWS 콘솔에 배포 해 보겠습니다. 이 목적을 위해 다음 단계를 사용할 수 있습니다-

1 단계

먼저 다음 명령을 사용해야합니다.

sls deploy

2 단계

이제 그림과 같이 AWS 콘솔에 함수가 표시됩니다. 서버리스 AWS의 세부 정보는 AWS 클라우드 형성에 기록됩니다. 이를 위해 AWS 서비스로 이동하여CloudFormation. AWS Lambda의 세부 정보는 다음과 같이 표시됩니다.

주어진 이름이 프로젝트 이름 뒤에 사용 된 단계인지 확인합니다.

3 단계

AWS Lambda에 대한 iam 역할과 AWS cloudwatch에 대한 로그 그룹을 생성합니다. 코드 세부 정보와 구성 세부 정보가 저장된 S3 버킷이 생성됩니다.

이것은 명령에 의해 생성됩니다 sls deploy. iam 역할을 지정할 필요는 없습니다. 대신 기본적으로deploy 단계.

4 단계

자세한 이벤트 흐름은 클라우드 형성 서비스에서 아래에 표시됩니다.

AWS Lambda 코드

AWS Lambda 코드와 실행 설정은 아래 스크린 샷에 나와 있습니다.

Lambda 함수를 테스트하면 다음 출력을 찾을 수 있습니다.

위 기능에 대한 로그 출력은 다음과 같습니다.

또한 아래와 같이 서버리스 명령을 사용하여 AWS Lambda 함수를 테스트 할 수 있습니다.

sls invoke --function hello

invoke 명령의 구문은 다음과 같습니다.

sls invoke --function hello

이 호출 명령은 AWS Lambda 함수를 트리거하고 아래와 같이 명령 프롬프트에 출력을 표시합니다.

배포하기 전에 Lambda 함수를 테스트하고 다음 명령을 사용하여 동일한 명령을 테스트 할 수도 있습니다.

sls invoke local --function hello

S3 및 DynanoDB와 같은 리소스는 로컬 환경에서 시뮬레이션 할 수 없으므로 항상 로컬에서 테스트 할 수있는 것은 아닙니다. 기본 함수 호출 만 로컬에서 테스트 할 수 있습니다.

서버리스 프레임 워크와 함께 API Gateway 및 AWS Lambda 사용

Lambda 및 api 게이트웨이를 사용할 새 프로젝트를 생성하는 방법을 살펴 보겠습니다. 이 목적을 위해 다음 명령을 사용할 수 있습니다-

sls create --template aws-nodejs

자, 열다 aws-api시각적 코드로 프로젝트. 당신은 볼 수 있습니다handler.jsserverless.yml생성 된 파일. API 게이트웨이 추가를 위해 변경해 보겠습니다.

다음과 같이 변경해야합니다. serverless.yml

이제 AWS Lambda를 사용한 API 게이트웨이 활성화를 위해 추가 된 이벤트 세부 정보-

여기에 추가 된 새로운 것이 있습니다. events. 이벤트를 다음과 같이 지정했습니다.http, 경로 및 방법과 함께.

경로는 api 게이트웨이 경로가 생성 될 때 사용할 끝점이며 사용 방법은 GET입니다.

핸들러가 handler.hello, hello는 handler.js의 내보내기 이름입니다.

서버리스 프레임 워크가 수행하므로 여기에서 api 게이트웨이를 배포 할 필요가 없습니다.

이제 우리는 sls deploy 트리거를 사용하여 AWS Lambda 함수를 생성하는 명령 api gateway.

sls deploy

배포 세부 정보가 위에 나열되어 있는지 확인하십시오. 그것은 준다Get경로 세부 사항으로 끝 점이있는 url. 무대는prodURL에서도 동일하게 사용됩니다. 함수의 이름은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 다음과 같은 세부 사항 messageinput. 응답은 api 게이트웨이와 출력으로 표시하는 방법에 의해 전적으로 제어됩니다.

이제 쿼리 문자열의 GET URL에 입력을 전달하고 디스플레이를 살펴 보겠습니다.

그러면 아래와 같이 querystring의 출력을 볼 수 있습니다.

{"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. OS에 따라 앱을 다운로드하십시오. 설치가 완료되면 아래와 같이 게시물 URL을 테스트 할 수 있습니다.

Lambda 함수에 추가 한 메시지가 표시됩니다.