백앤드(Back-End)/AWS

[AWS] Lambda 개발 & 배포 환경 설정(serverless.yml )

RyanSin 2021. 9. 29. 13:08
반응형

- 개요

안녕하세요. 이번 시간에는 Serverless Framework에서 환경설정을 하는 방법에 대해 알아보겠습니다.

 

지난 시간에는 API 환경을 구축하는 시간을 가졌습니다. 보통 우리가 개발을 할 때 "개발 환경"과 "배포 환경"을 나눠서 개발을 진행합니다.

 

안 그렇게 되면... 정말 불편한 상황들이 발생하기 때문에 우리 여러 가지 전략을 새우고 진행합니다.

 

이번 시간에는 간단한 환경 설정을 하는 방법에 대해 알아보겠습니다.

 

- 설정

Node.js 에서 환경변수에 접근하는 방법은 "process.env.PORT"과 같이 사용합니다.

 

Serverless Framework를 사용하면 serverless.yml 파일에 환경변수를 등록해 사용하면 됩니다.

 

1.  env 폴더 생성(dev.json & production.json 파일 생성)

원하는 위치에 env폴더를 생성하고 아래 dev.json & production.json 파일을 생성합니다. (이름은 원하는 이름으로 설정해도 됩니다.)

 

dev.json
{
    "MariaDB_HOST": "localhost",
    "MariaDB_PORT":3306,
    "MariaDB_USER":"root",
    "MariaDB_PASSWORD":"",
    "MariaDB_NAME":"Ryan",
    "Redis_HOST": "localhost",
    "Redis_PORT": 6379
 }

MariaDB와 Redis 정보를 등록했습니다. production.json 파일도 동일한 구조를 생성하지만 내용은 필요에 맞게 설정해서 하면 됩니다.

 

serverless.yml 파일 설정

지난 시간에 serverless.yml 파일을 몇 가지 등록해서 사용했습니다. 방금 작성한 dev.json 파일을 등록해주면 됩니다.

 

custom:
  env: ${file(./env/${opt:stage,'dev'}.json)} # 환경변수 정보 JSON 파일을 불러온다.
  serverless-offline:
    httpPort: 4000 # 로컬 포트
    lambdaPort: 4001 # 람다 포트
    
provider:
  name: aws
  runtime: nodejs12.x #서버 버전
  lambdaHashingVersion: 20201221 #생성 날짜
  stage: production # 배포 상태를 지정 default : dev
  region: ap-northeast-2 # AWS Region을 지정합니다.

  #환경 변수에 맞게 값을 설정한다.
  environment:
    MariaDB_HOST: ${self:custom.env.MariaDB_HOST}
    MariaDB_PORT: ${self:custom.env.MariaDB_PORT}
    MariaDB_USER: ${self:custom.env.MariaDB_USER}
    MariaDB_PASSWORD: ${self:custom.env.MariaDB_PASSWORD}
    MariaDB_NAME: ${self:custom.env.MariaDB_NAME}
    Redis_HOST: ${self:custom.env.Redis_HOST}
    Redis_PORT: ${self:custom.env.Redis_PORT}

env 환경을 설정합니다. 배포 시에는 배포 파일명을 작성해야 합니다. 그래야 적용이 가능합니다.

 

Ex): env: ${file(./env/${opt:stage,'dev'}.json)}  -> env: ${file(./env/${opt:stage, 'production'}. json)}

 

 

 

serverless.yml 파일에 등록하면 이제 우리는 사용할 수 있습니다.

 

MariaDBConnection.js
const mysql = require('mysql2/promise');
 
const db = mysql.createPool({
  host: process.env.MariaDB_HOST,
  port: process.env.MariaDB_PORT,
  user: process.env.MariaDB_USER,
  password: process.env.MariaDB_PASSWORD,
  database: process.env.MariaDB_NAME,
  waitForConnections: true, // 풀에 여유 커넥션이 없는 경우 대기 여부
  connectionLimit: 1, // 최대 거넥션 개수, 기본 10
});

module.exports = db

 

제가 사용하는 모듈을 사용하지 않으셔도 됩니다. 제일 중요한 건 process.env.MariaDB_HOST 부분입니다.

 

dev.json 파일에 등록한 값이 프로젝트 어디에서든 사용이 가능하다는 겁니다. :)

 

 

- 추가 사항(VPC 환경 설정)

custom:
  env: ${file(./env/${opt:stage,'dev'}.json)} # 환경변수 정보 JSON 파일을 불러온다.
  serverless-offline:
    httpPort: 4000 # 로컬 포트
    lambdaPort: 4001 # 람다 포트
    
provider:
  name: aws
  runtime: nodejs12.x #서버 버전
  lambdaHashingVersion: 20201221 #생성 날짜
  stage: production # 배포 상태를 지정 default : dev
  region: ap-northeast-2 # AWS Region을 지정합니다.

  #환경 변수에 맞게 값을 설정한다.
  environment:
    MariaDB_HOST: ${self:custom.env.MariaDB_HOST}
    MariaDB_PORT: ${self:custom.env.MariaDB_PORT}
    MariaDB_USER: ${self:custom.env.MariaDB_USER}
    MariaDB_PASSWORD: ${self:custom.env.MariaDB_PASSWORD}
    MariaDB_NAME: ${self:custom.env.MariaDB_NAME}
    Redis_HOST: ${self:custom.env.Redis_HOST}
    Redis_PORT: ${self:custom.env.Redis_PORT}
    
  #VPC 영역 설정
  vpc:
    securityGroupIds:
      - sg-0796d98969be08b68
    subnetIds:
      - subnet-08bb6bd0009ce964d
      - subnet-04ffcf71a770411e2

배포하는 VPC 영역이 나눠서 있다면 우리는 직접 설정을 해야 합니다.

 

 

전체 소스(serverless.yml)
service: serverless-api
frameworkVersion: "2"

custom:
  env: ${file(./env/${opt:stage,'dev'}.json)} # 환경변수 정보 JSON 파일을 불러온다.
  serverless-offline:
    httpPort: 4000 # 로컬 포트
    lambdaPort: 4001 # 람다 포트
    
provider:
  name: aws
  runtime: nodejs12.x #서버 버전
  lambdaHashingVersion: 20201221 #생성 날짜
  stage: production # 배포 상태를 지정 default : dev
  region: ap-northeast-2 # AWS Region을 지정합니다.

  #환경 변수에 맞게 값을 설정한다.
  environment:
    MariaDB_HOST: ${self:custom.env.MariaDB_HOST}
    MariaDB_PORT: ${self:custom.env.MariaDB_PORT}
    MariaDB_USER: ${self:custom.env.MariaDB_USER}
    MariaDB_PASSWORD: ${self:custom.env.MariaDB_PASSWORD}
    MariaDB_NAME: ${self:custom.env.MariaDB_NAME}
    Redis_HOST: ${self:custom.env.Redis_HOST}
    Redis_PORT: ${self:custom.env.Redis_PORT}
    
  #VPC 영역 설정
  vpc:
    securityGroupIds:
      - sg-0796d98969be08b68
    subnetIds:
      - subnet-08bb6bd0009ce964d
      - subnet-04ffcf71a770411e2

functions:
  api:
    handler: handler.index

    #API 경로를 등록해줘야 한다.(해당 API를 통해 API Gateway에 등록며 개발환경에서도 등록해야 된다.)
    events:
      - http:
          path: /api
          method: get

plugins:
  - serverless-offline