안녕하세요.
오늘은 지난 글에 이어서 serverless Framework 연동과 관련한 부분을 작성해보겠습니다.
아마 이 글에 이어서는 실제 API 개발이 순차적으로 이어질 것 같습니다.
▶️ 왜 Serverless Framework를 사용할까?
AWS Lambda로 인증 기능을 개발하면서 가장 먼저 맞닥뜨린 벽은 배포의 불편함이었습니다.
실제로 처음에는 별도 Framework 등의 고민 없이 직접 AWS console에서 코드를 붙여서 진행을 했는데요.
함수 내 코드 하나를 바꾸는 것도 너무 번거로웠고, 무엇이 어떻게 바뀌었는데 추적하는 것도 매우 어려웠습니다. (완전 노가다...)
그리고 그 외에도 버전 관리나 인프라 설정 등도 수동으로 하다 보면 실수할 여지도 많을 것 같았습니다.
그래서 어떻게 좀 더 편리하고 쉽게 할 수 있을까해서 선택한 것이 바로 serverless Framework입니다.
serverless Framework는 AWS뿐 아니라 다양한 클라우드에서 Lambda 같은 서버리스 애플리케이션을 코드로 관리할 수 있게 도와줍니다.

이름 자체가 serverless라서, 뭔가 공식적인 느낌이 들기도 했는데요.
몇 가지 설정만 잘 하면 아주 쉽고 편리하게 코드 관리부터 각종 설정과 배포까지 할 수 있습니다.
가장 큰 장점은 다음과 같습니다.
- AWS console에서 해야 할 인프라 설정을 코드로 관리 가능
- serverless.yml로 Lambda, API Gateway, DynamoDB 등등 까지 정의
- serverless deploy 한 줄로 배포가 끝
이후로는 배포가 정말 빨라지고, 실수 자체가 없어졌습니다.
▶️ 프로젝트 생성 및 설정
그럼 serverless Framework와 함께 프로젝트를 세팅해보겠습니다.
가장 먼저 serverless Framework 부터 설치를 해야 합니다.
npm install -g serverless
그리고 프로젝트를 생성해주시면 됩니다.
아래와 같은 명령어로 진행해도 되고, IntelliJ 등 IDE 내에서 생성을 직접 해주셔도 됩니다.
sls create --template aws-java-maven --path my-auth-project
기본 프로젝트 구조는 다음과 같습니다.
📦 my-auth-project
├── serverless.yml
├── build.gradle
├── src.main.java
│ └── com.my-auth
│ ├── handler ← Lambda 핸들러 클래스 (ex. LoginHandler.java)
│ ├── model ← DTO, 요청/응답 객체 (ex. LoginRequest.java)
│ ├── repository ← DynamoDB 연동 로직 (ex. UserRepository.java)
│ └── util ← 공통 유틸 클래스 (ex. JwtUtil.java, PasswordEncoder.java)
나머지 구조는 기존 보통의 프로젝트와 똑같이 아주 익숙합니다.
여기서 살펴볼 것은 serverless.yml 파일 하나만 보면 되는데요.
serverless.yml가 serverless Framework의 핵심 설정 파일입니다.
Lambda 함수, API Gateway 이벤트, DynamoDB 같은 리소스를 코드로 정의할 수 있게 해주며, 인프라를 선언형으로 구성하고 한 번에 배포할 수 있게 도와줍니다.
그럼 serverless.yml 예시 파일을 같이 보면서 이해해보면 좋을 같습니다.
service: my-auth
provider:
name: aws
runtime: java17
region: ap-northeast-2
memorySize: 512
timeout: 10
package:
artifact: build/libs/my-auth.jar
functions:
signup:
handler: com.my-auth.handler.SignUpHandler::handleRequest
events:
- httpApi:
path: /signup
method: POST
login:
handler: com.my-auth.handler.LoginHandler::handleRequest
events:
- httpApi:
path: /login
method: POST
- provider
- AWS 내 Serverless (Lambda) 관련 설정입니다.
- Lambda의 runtime, memory, timeout 등을 설정합니다.
- package
- 빌드된 Java 패키지 경로를 명시 (*.jar)
- functions
- 실제 Lambda 함수 정의
- handler는 자바 클래스의 패키지경로::메서드명을 지정
- events는 API Gateway의 엔드포인트를 연결 (POST /login)
즉, serverless.yml 하나로 별도 콘솔 내에서 설정 할 필요 없이 Lambda와 API Gateway 등의 환경변수를 모두 정의할 수 있습니다.
▶️ 배포를 해보자
그럼 이제 구성이 끝났으니, 실제 배포를 한 번 해보겠습니다.
배포 명령어 또한 아주 간단합니다.
serverless deploy
또는 sls deploy
하지만, 아마 높은 확률로 실패할 것인데요. 대부분 권한 문제입니다.
보통 다음과 같은 에러가 많이 발생합니다.
User is not authorized to perform: cloudformation:CreateStack
또는
An error occurred: RuleDashcodeEventsRuleSchedule1 -
User is not authorized to perform: events:DescribeRule
필요한 일부 권한은 다음과 같습니다. 좀 더 세부적으로 조정이 가능하지만 우선 개발 중에는 아래와 같이 진행해도 무방할 것 같습니다.
추후에는 deploy 전용 IAM 계정을 만들고, 필요한 내용만 미세 조정하는 것도 좋은 방법일 것 같네요.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"cloudformation:*",
"lambda:*",
"apigateway:*",
"iam:PassRole",
"dynamodb:*",
"logs:*",
"s3:*"
],
"Resource": "*"
}
]
}
이렇게 되면 권한 문제가 해결되고, 배포가 진행됩니다.
동작 방식은 간단하게 설명하자면,
serverless Framework가 내부적으로 AWS CloudFormation을 이용해서 Lambda, API Gateway, DynamoDB 등 리소스를 자동으로 생성하고 관리해줍니다.
AWS CloudFormation은 인프라를 코드로 관리할 수 있게 해주는 AWS의 IaC(Infrastructure as Code) 서비스입니다.
https://docs.aws.amazon.com/ko_kr/AWSCloudFormation/latest/UserGuide/Welcome.html
오늘의 글에서는 serverless Framework를 통한 프로젝트 생성 및 배포 까지를 정리해보았습니다.
다음 글에서는 실제 Lambda API 를 개발해보겠습니다.
감사합니다.
'Backend Engineering' 카테고리의 다른 글
[Serverless 서비스 개발] #4. 로그인/로그아웃 기능 구현 (2) | 2025.06.22 |
---|---|
[Serverless 서비스 개발] #3. 회원가입 기능 구현 (2) | 2025.06.20 |
[Serverless 서비스 개발] #1. 시스템 설계 (1) | 2025.06.18 |
[Cache] Local Cache vs Redis, 언제 어떤 캐시를 써야 할까? (1) | 2025.06.16 |
Spring Security를 활용한 인증 흐름 정리 (0) | 2025.06.09 |