본문 바로가기
AWS

AWS Lambda에 TypeScript 코드로 배포하기

by whoyoung90 2024. 3. 1.
반응형

이전 글에서 AWS Lambda와 API Gateway를 활용하여 Serverless API 환경을 구성하는 법을 알아보았다면

이번엔 실전편이다!

 

이전 글에서 구현한 Lambda 함수의 핸들러(이벤트를 처리하는 함수 코드의 메서드)

기본적으로 .js 접미사가 있는 파일을 CommonJS 모듈로 취급한다. 즉, node.js 코드로 구현해야 한다는 뜻이다.

물론 선택적으로 파일명을 .mjs 확장자로 사용하여 ES 모듈로 지정할 수는 있다. [공식문서 참고]

 

그러나 이번 글에서는 Typescript를 이용해 Lambda 함수를 생성하고 배포하는 과정을 기록해보려 한다.

 

> Lambda에 Typescript 코드 배포하는 방법들

-  npx tsc 명령어로 트랜스파일하여 직접 zip 업로드

- AWS SAM

- AWS SDK

- AWS CLI 및 esbuild ✅

 

내가 알아본 네가지 방법들 중 AWS CLI가 가장 직관적이고 구현하기 쉬워 채택하였다.

 

> AWS CLI및 esbuild를 사용하여 Lambda에 TypeScript 코드 배포하기

esbuild를 사용하여 코드를 트랜스파일하여 Lambda에 배포하는 방법이다.

 

1. aws cli 설치하기

$ brew install awscli

$ which aws
/usr/local/bin/aws 또는 /opt/homebrew/bin/aws

$ aws --version
aws-cli/2.15.21 Python/3.11.7 Darwin/23.2.0 source/arm64 prompt/off

Mac OS는 Homebrew를 사용하면 명령어로 간단히 설치 할 수 있다.

 

2. CLI 인증 준비 (IAM 엑세스 키 + 시크릿 엑세스 키)

AWS CLI를 사용하기 위해서는 AWS 계정에서 발급한 IAM 사용자의 AWS Access Key IDAWS Secret Access Key가 필요하다.

 

AWS 홈페이지에서 계정을 로그인 한 것과 같이,

CLI에서도 내 서비스를 이용하기 위해선 IAM에서 등록한 사용자 계정의 아이디와 비밀번호가 필요하다. 그 아이디와 비밀번호가 Access Key ID와 Secret Access Key 라고 보면 된다.

 

aws 웹페이지 > 루트 사용자로 로그인 > IAM 접속

기존 IAM 사용자는 해당 키값을 확인하면 되고, 신규 IAM 사용자느 사용자 생성부터 해주면 된다.

 

2-1. 기존 IAM 사용자 (엑세스 키 + 시크릿 키 아는경우)

2번 관련 내용 PASS하고 3번으로 넘어가면 된다 👍.

특히 시크릿 키는 웹페이지에서 재확인이 불가한데, 이번 기회에 따로 안전하게 저장해두자!

 

2-2. 기존 IAM 사용자 (시크릿 키 분실한경우)

만일 자신의 엑세스 키 혹은 시크릿 키를 분실하였다면 IAM 콘솔 메뉴에 들어가서 간단하게 재발급 받을 수 있다. (최대 2개)

 

엑세스 키는 언제든 바로 확인 가능하지만, 특히 시크릿 키!!!!

시크릿 키의 경우 생성시 csv파일로 다운로드 해두거나 따로 복사해두지 않으면 확인할 방법이 없더라..

엑세스 키 2 > 엑세스 키 만들기 클릭

 

 

사용사례 CLI > 체크박스 > 다음 클릭

 

 

사용하려는 엑세스 키가 어느 용도로 사용되는 키인지 설명을 적어주면 된다. 나중에봐도 단번에 알 수 있도록 적으면 좋을듯 👍

설명 태그 값 > 엑세스 키 만들기 클릭

 

 

엑세스 키와 시크릿 키가 생성되었다. 엑세스 키는 추후에도 계속 확인이 가능한 키라 굳이 따로 저장하고 있을 필요는 없지만,

시크릿 엑세스 키는 해당 화면을 패스한 이후에는 도저히 확인할 방법이 없다.

"csv 파일 다운로드"하여 따로 프라이빗한 공간에 꼭꼭 저장해두자!

 

 

맨 처음 이미지와 비교해보면 엑세스 키2에 방금 생성한 엑세스 키가 적혀있는 것을 확인할 수 있다.

생성한 엑세스 키와 시크릿 키를 갖고 3번으로 넘어가자.

 

2-3. 신규 IAM 사용자

루트 사용자 말고 따로 IAM 사용자를 사용하고 있지 않았다면,

IAM > 사용자 > 사용자 생성을 클릭하여 사용자부터 만들어야 한다.

 

사용자를 새로 만들고 나면, 2-2의 진행과정과 동일하게 엑세스 키와 시크릿 키를 발급받으면 된다.

 

 

IAM 사용자 이름을 작성하고 다음 클릭

 

 

권한설정은 어떻게 사용하느냐에 따라 달라질거 같다.

그룹에 사용자 추가 - 기존 사내에서 생성한 그룹권한에 등록

직접 정책 연결 - 직접 권한을 하나씩 등록할 때 사용 > 여기서는 lambdaFullAccess를 검색 추가하여 다음을 클릭

 

이렇게해서 사용자를 생성한 후 2-2과 동일한 과정으로 엑세스 키와 시크릿 키를 준비해두면 된다!!

 

3. CLI 인증 설정

유저 엑세스 키를 알아냈다면, aws configure를 입력하여 이용하고자 하는 User의 Access, Secret Access Key를 입력해주자. 

이렇게 하면 default 프로필로 등록이 된다.

$ aws configure
AWS Access Key ID [None] : [발급받은 IAM의 Access Key ID]
AWS Secret Access Key [None] : [발급받은 IAM의 Secret Access Key]
Default region name [None] : ap-northeast-2[서울 리전]
Default output format [None] : json

 

4. 샘플 함수 작성

4-1. 새 프로젝트 생성

npm install -D @types/aws-lambda esbuild

로컬 컴퓨터에서 람다 함수에 배포할 새 프로젝트 생성

@types/aws-lambda  esbuild 패키지를 devDependency에 추가

 

4-2. index.ts 작성

// index.ts
import { Context, APIGatewayProxyResult, APIGatewayEvent } from 'aws-lambda';

export const handler = async (event: APIGatewayEvent, context: Context): Promise<APIGatewayProxyResult> => {
  console.log(`Event: ${JSON.stringify(event, null, 2)}`);
  console.log(`Context: ${JSON.stringify(context, null, 2)}`);
  return {
      statusCode: 200,
      body: JSON.stringify({
          message: 'hello world',
      }),
   };
};

index.ts라는 이름의 새 파일을 생성하여 배포하고자 하는 함수 로직을 Typescript로 만들어주면 된다.

 

aws lambda 공식문서

요것도 참고!!

결국 import 문을 사용하기 위해 @types/aws-lambda를 종속 설치한 것이며, 타사 라이브러리와 혼동하지 말라는 뜻 같다.

 

4-3. package.json 작성

"scripts": {
  "prebuild": "rm -rf dist",
  "build": "esbuild index.ts --bundle --minify --sourcemap --platform=node --target=es2020 --outfile=dist/index.js",
  "postbuild": "cd dist && zip -r index.zip index.js*"
}

해당 빌드 스크립트를 추가해주자.

 

5. 람다 함수 빌드 및 배포

// 패키지 빌드
$ yarn build

해당 명령어 빌드시 prebuild -> build -> postbuild 순으로 빌드 된다.

 

// 해당 패키지로 람다 함수 생성
aws lambda create-function --function-name hello-world --runtime "nodejs20.x" --role arn:aws:iam::123456789012:role/lambda-ex --zip-file "fileb://dist/index.zip" --handler index.handler

--function-name, --runtime, --role에 각각 설정하고자 하는 값들을 입력.

해당 명령어 배포시 AWS Lambda에 --function-name에서 설정한 이름으로 새로운 함수가 생성된다.

 

// 코드 수정후 업데이트 배포
aws lambda update-function-code --function-name hello-world --zip-file 'fileb://dist/index.zip'

생성한 함수의 로직을 수정하여 재배포 하고 싶다면 해당 명령어를 사용하면 된다! [공식문서 참고]

나같은 경우는 create-function과 update-function-code 명령어를 스크립트에 추가하여 사용하고 있다 👍

 

 

[참조 URL]

https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/typescript-package.html#aws-cli-ts

 

.zip 파일 아카이브를 사용하여 Lambda에 트랜스파일된 TypeScript 코드를 배포합니다. - AWS Lambda

AWS SAMesbuild를 사용하여 TypeScript 코드에서 Node.js Lambda 함수를 생성합니다. esbuild 지원은 현재 공개 프리뷰 중에 있습니다. 공개 평가판으로 제공되는 동안에는 esbuild 지원에 이전 버전과 호환되지

docs.aws.amazon.com

https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/lambda-intro-execution-role.html#permissions-executionrole-console

 

Lambda 실행 역할 - AWS Lambda

lambda:SourceFunctionARN 조건 키는 Lambda 함수 버전 또는 함수 별칭을 지원하지 않습니다. 특정 함수 버전 또는 별칭에 ARN을 사용하는 경우 함수는 지정한 작업을 수행할 권한이 없습니다. 버전 또는

docs.aws.amazon.com

https://inpa.tistory.com/entry/AWS-%F0%9F%93%9A-AWS-CLI-%EC%84%A4%EC%B9%98-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%89%BD%EA%B3%A0-%EB%B9%A0%EB%A5%B4%EA%B2%8C

 

[AWS] 📚 AWS CLI 설치 & 등록 방법 - 쉽고 빠르게 설명

AWS CLI (Command Line) AWS Command Line Interface는 쉘 커맨드를 사용하여 AWS 서비스와 상호 작용할 수 있는 도구이다. 우리가 브라우저로 아마존 웹 서비스 홈페이지(콘솔 홈)에 가서 서비스를 이용한 것

inpa.tistory.com

 

반응형

댓글