티스토리 뷰

AWS CDK로 lambda와 API Gateway 생성하기 (Typescript)

https://cdkworkshop.com/ 를 따라한 튜토리얼이다.

내용 일부에 변경이 있어서 변경 내용을 포함하였다.

초기 셋팅

너무 뻔해서 설명할게 없다.

https://cdkworkshop.com/15-prerequisites.html

이 사이트에 있는 것 + 추가로 아래의 셋팅을 진행한다.

  • GIT 설치
  • AWS CLI 설치
  • cdk-workshop용 Programmatic access User 생성 및 aws configure
  • node js 설치 (나의 경우 v12.6.0으로 진행)
  • aws cdk toolkit 설치 (npm install -g aws-cdk)
  • python 설치 (나는 typescript로 할거라서 굳이..)
  • visual studio code 설치

참고로 visual studio code 설치 후 Shift + Cmd + P 누른 다음에 shell 이라고 입력하면 오지는 명령 하나가 나온다. (Mac 기준임)

바로 터미널에 code . 라고 입력하면 현재 디렉토리를 기반으로 프로젝트를 실행해주는 기능이다. 리얼 유용하니 꼭 설정해 놓도록 하자.

Hello, CDK!

이제 CDK 프로젝트를 생성해보자. 적당히 디렉토리 명을 cdk-lambda-workshop로 만든 후 해당 폴더 안으로 들어가서 아래 명령어를 친다.

$ cdk init app --laungage=typescript

그러면 CDK 프로젝트가 하나 생성된다.

이제 위에서 말한 오지는 명령을 쳐보자

$ code .

그러면 이제 visual studio code 가 해당 cdk project를 기반으로 실행될 것이다.

여러가지 디렉토리들(bin, lib)이 있는데, bin은 부트스트랩 코드가 있는 곳이라 건들 필요는 없고, 여러분이 만져야 할 곳은 lib 디렉토리다.

해당 디렉토리 하단에 cdk-lambda-workshop-stack.ts 파일이 생기는데 해당 파일이 실제 비지니스 로직이 들어가는 핵심 파일이다.

CDK에 Lambda Stack 생성

bin, lib 디렉토리와 같은 하이라키에 lambda 디렉토리를 만들고 hello.js 파일을 추가하자

내용은 아래와 같다

exports.handler = async function(event) {
    console.log('request:', JSON.stringify(event, undefined, 2));
    return {
        statusCode: 200,
        headers: { 'Content-Type': 'text/plain' },
        body: `Hello, CDK! You've hit ${event.path}\n`
    };
}

위 코드를 CDK에서 불러와서 쓰려면 cdk용 lambda 모듈을 설치해줘야 한다.

$ npm install @aws-cdk/aws-lambda

위 명령어를 통해 lambda 모듈을 설치하도록 하자

이제 위에서 만든 lambda function을 내 Stack에 생성하는 코드를 짜보자

cdk-lambda-workshop-stack.ts 내용은 아래와 같다.

import cdk = require('@aws-cdk/core');

export class CdkLambdaWorkshopStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // The code that defines your stack goes here

  }
}

아직은 아무 내용 없이 스켈레톤 코드만 존재한다.

이제 여기서 lambda 스택을 생성해보자.

import cdk = require('@aws-cdk/core');
import lambda = require('@aws-cdk/aws-lambda');
import path = require('path');

export class CdkLambdaWorkshopStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // The code that defines your stack goes here
    const hello = new lambda.Function(this, 'HelloHandler', {
      runtime: lambda.Runtime.NODEJS_10_X,
      code: lambda.Code.fromAsset(path.join(__dirname, './../lambda')),
      handler: 'hello.handler'
    });

  }
}

이게 cdkworkshop.com 부분과 다른 부분인데, cdkworkshop.com은 node.js 버전도 낮은 버전을 쓰고 있고, 지금은 deprecated된 lambda.Code.asset 함수를 쓰고 있어서 위 처럼 바꿨다.

위처럼 입력하면 lambda 함수가 배포된다.

정상적으로 잘 빌드되나 확인해보기 위해 터미널에 아래와 같이 친다

$ cdk synth

해당 명령어는 cdk 코드를 CloudFormation으로 만들어 준다.

그리고 이제 배포를 해보자

$ cdk deploy

정상적으로 배포되는 것을 확인 할 수 있다.

이제 AWS Lambda Console로 가서 위에서 생성한 Lambda Function이 잘 생겼는지 확인 후, Test → Create new test event → Event Template에서 Amazon API Gateway AWS Proxy 선택 → Event name에 test 입력 → Create

이후 다시 Test 버튼 클릭 하면 정상적으로 실행되고 결과가 출력된다.

CDK API Gateway 스택 생성

Lambda 스택까지 만들었으니 이를 연결해주는 API Gateway 스택을 생성해보자

$ npm install @aws-cdk/aws-apigateway

입력 후 위에서 만든 hello 를 연결해주는 코드를 작성하자

import cdk = require('@aws-cdk/core');
import lambda = require('@aws-cdk/aws-lambda');
import apigw = require('@aws-cdk/aws-apigateway');
import path = require('path');

export class CdkLambdaWorkshopStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // The code that defines your stack goes here
    const hello = new lambda.Function(this, 'HelloHandler', {
      runtime: lambda.Runtime.NODEJS_10_X,
      code: lambda.Code.fromAsset(path.join(__dirname, './../lambda')),
      handler: 'hello.handler'
    });

    new apigw.LambdaRestApi(this, 'Endpoint', {
      handler: hello
    });

  }
}

이후 cdk deploy 명령어를 통해 배포 후 몇초 기다리면 api gateway url이 터미널에 표시된다. 웹브라우져에서 해당 url을 입력해보자

위와 같은 멋진 결과를 확인 할 수 있다.

'Cloud > Developing & IaC' 카테고리의 다른 글

AWS CDK로 lambda와 API Gateway 생성하기 (Typescript)  (0) 2019.11.07
댓글
댓글쓰기 폼