본문 바로가기

# DevNote/AWS

[Lambda] serverless와 typescript로 시작하는 Lambda

AWS까지 배우기엔 너무 힘들어요

Lambda는 매력적인 서비스입니다.


실제 사용된 만큼만 과금되기 때문에 사용자가 없는 시간에는 요금이 절감되고.
아마존이 가진 pool에 배포된 code 넣어 실행하는 형태이기 때문에,
사용자가 급증해도 유연한 대처가 가능하기 때문이죠.


다만 Lambda 혼자서는 제 역할을 할 수 없는데,
실제 서비스를 제공하려면, Lambda만 설정해야 될 것이 아니라,
Lambda Apllication, API Gateway와 같은 부가적인 설정도 이루어져야 합니다.


이걸 프로그래머가 혼자 다 설정해야 한다니...
코딩하는걸 더 좋아하는 사람에겐 생지옥이 따로 없습니다.


효과적인 대안이 어디 없을까요?


serverless

이런 경우에는 serverless 프레임워크가 좋은 선택일 확률이 매우 높습니다.


람다 배포시에 같이 해줘야하는 부가적인 설정들을 알아서 처리해주기 때문에,
프로그래머는 순수하게 람다에 배포할 코드에만 집중할 수 있습니다.


이 포스팅에서는 타입스크립트로 작성한 코드를 serverless를 통해 Lambda에 배포하는 것을 목표로 하겠습니다.


설치하기

serverless

먼저 기본적인 타입스크립트 세팅을 마친 뒤에,
다음 명령어를 통해 serverless 프레임워크를 설치합니다.

$ npm install -d serverless 

aws-lambda

이름 그대로 AWS Lmabda와 관련된 라이브러리입니다.

$ npm install aws-lambda
$ npm install -d @types/aws-lambda

serverless-plugin-typescript

별도의 컴파일없이 TypeScript를 사용할 수 있도록 도와주는 플러그인입니다.

$ npm install -d serverless-plugin-typescript

serverless-offline

로컬에서 람다환경을 테스트할 수 있도록 도와주는 플러그인입니다.

$ npm install -d serverless-offline

인증서 등록

Via AWS-CLI

로컬에 AWS-CLI가 설치되어 있고 configure이 완료되어 있는 상태라면,
해당 컴퓨터에는 이미 shared-credntials가 등록된 상태이므로 이 단계를 건너뛰어도 됩니다.


Via serverless

AWS-CLI없이 serverless에 공개키와 비밀키를 넣어 credentials를 등록할 수 있습니다.
아래 명령어처럼 공개키와 비밀키를 넣어주세요.

serverless config credentials \
    --provider aws \
    --key xxxxxxxxxxxxxx \
    --secret xxxxxxxxxxxxxx

함수 작성하기

아래와 같은 형태로 핸들러를 작성해주세요.
여기서는 간단하게 Hello, World!를 반환하는 코드를 작성하겠습니다.

import { APIGatewayEvent } from "aws-lambda";

/**
 * 서버리스 람다 핸들러 타입
 */
type ServerlessHandler = (
    event: APIGatewayProxyEvent,
    context: Context
) => Promise<APIGatewayProxyResult>;

export const hello_handler : ServerlessHandler = async (event) => {
    return {
        statusCode: 200,
        body: `Hello, World!`
    };
};

설정파일 만들기

만들어진 람다함수를 라우팅하기 위해서는,
프로젝트 최상위에 serverless.yml 파일을 작성해야 합니다.


handler에는 타입스크립트 파일경로.핸들러이름 형태로 적어야 합니다.
그 다음 path에는 라우팅할 경로를 적어주세요.

service: hello-world

provider:
    runtime: nodejs12.x
    name: aws
    stage: dev
    region: ap-northeast-2

functions:
    main:
        handler: /your/path/filename.hello_handler
        events:
            - http:
                  path: /
                  method: get
                  cors: true

plugins:
    - serverless-plugin-typescript
    - serverless-offline

주의해야 할 점은 plugins에서 serverless-plugin-typescriptserverless-offline보다 위에 있어야 합니다.


배포하기

아래 두 명령어로 람다에 배포하거나 로컬에서 테스트할 수 있습니다.

# 람다에 배포
$ npm run deploy

# 로컬에서 테스트
$ npm run offline

삭제하기

아래 명령어로 람다를 삭제할 수 있습니다.

serverless remove