aws

AWS Serverless

C/H 2020. 10. 28. 15:05

serverless

설치

awscli

brew install awscli
aws --version

awslogs

pip install awslogs
pip3 install awslogs

# awslogs 확인
awslogs get /aws/lambda/helloworld -S -G --watch

nodejs

# brew install node@12
brew install node
node -v

npm install -g n
n lts
node -v
v12.19.0

serverless

npm install -g serverless

AWS 인증서 설치

aws configure

cat ~/.aws/config
[profile brighant]
region = ap-northeast-2
output = json

cat ~/.aws/credentials
[brighant]
aws_access_key_id=xxx
aws_secret_access_key=xxx

[default]로 설정하면 --profile default 명령인자를 입력하지 않아도 기본값이 default로 설정된다.

serverless

create

serverless create --template aws-nodejs --path hwlloworld --name helloworld
sls create -t aws-nodejs -p helloworld -n helloworld

Directory

└── helloworld
    ├── handler.js
    └── serverless.yml

serverless.yml

service: helloworld

provider:
  name: aws
  runtime: nodejs12.x

functions:
  hello:
    handler: handler.hello

Run

sls invoke local --function hello --logs
sls invoke local -f hello -l

Package

sls package

Deploy

sls deploy --profile brighant
sls deploy --profile brighant --stage dev --region ap-northeast-2
sls deploy --profile brighant -s dev -r ap-northeast-2

Trigger

serverless.ymla

functions:
    hello:
        handler: handler.hello
        events:
            - http:
                path: hello/get
                method: get

Invoke result endpoints

sls deploy -s production -r ap-northeast-2

...
api keys:
  None
endpoints:
  GET - https://udgrtfgbnjn6.execute-api.ap-northeast-2.amazonaws.com/production/hello/get
functions:
  hello: helloworld-production-hello
...

기존 Gateway Endpoint 설정

provider:
    name: aws
    runtime: nodejs12.x
    region: ap-northeast-2
    apiGateway:
        restApiId: xxxxxxxxxx
        restApiRootResourceId: xxxxxxxxxx

node install package

npm i http

modules/http_module.js

const http = require('http');

module.exports = {

  getUserByHttp: () => new Promise((resolve, reject) => {
    const options = {
      host: 'jsonplaceholder.typicode.com',
      port: 80,
      path: '/users',
      method: 'GET',
      headers: {
        'Content-Type': 'applications/json'
      }
    }

    const request = http.request(options, (response)=>{
      let body = '';
      response.on('data', (data)=>{
        body += data;
      });
      response.on('end', ()=>{
        resolve(JSON.parse(body));
      });
      response.on('error', (err)=>{
        console.error('http-error:', err);
      });
    });
    request.end();
  })
}

handler.js

'use strict';

require('dotenv').config();
const httpModule = require("./modules/http_module");

module.exports.hello = async event => {
  const httpResult = await httpModule.getUserByHttp();
  console.log('##### HTTP RESULT #####');

  if(httpResult){
    httpResult.forEach(user => {
      console.log("id = %d, nmae = %s, email = %s", user.id, user.name, user.email);
    });
  }
};

환경변수

serverless.yaml

provider:
    name: aws
    runtime: nodejs12.x
    region: ap-northeast-2
    environment:
        key1:
            value1
        key2:
            value2

그외 기본 설정

serverless.yaml

provider:
    name: aws
    runtime: nodejs12.x
    memorySize: 128
    timeout: 5

function:
    hello:
        handler: handler.hello
        description: hellolambda.
        memorySize: 512
        timeout: 10

serverless plugins

list

sls plugin list
sls plugin search -q sns

prune

sls plugin install -n serverless-prune-plugin

serverless.yaml 자동 추가

plugins:
  - serverless-prune-plugin

serverless.yaml 설정

custom:
  prune:
    automatic: true
    number: 5

Multi Endpoint api

install lambda-api

npm 

handler.js

'use strict';

module.exports.router = async event => {
  return {
    statusCode: 200,
    body: JSON.stringify(
      {
        message: 'Go Serverless v1.0! Your function executed successfully!',
        input: event,
      },
      null,
      2
    ),
  };

  // Use this code if you don't use the http event with the LAMBDA-PROXY integration
  // return { message: 'Go Serverless v1.0! Your function executed successfully!', event };
};

serverless.yaml

service: restapi

provider:
  name: aws
  runtime: nodejs12.x

functions:
  router:
    handler: handler.router
반응형