AWS Lambda와 API Gateway를 활용한 서버리스 아키텍처 구축
AWS Lambda는 서버리스(Serverless) 아키텍처를 지원하는 AWS의 컴퓨팅 서비스로, 서버를 프로비저닝하거나 관리할 필요 없이 코드를 실행할 수 있게 해줍니다. 이 글에서는 AWS Lambda의 개념부터 실제로 함수를 생성하고 API Gateway를 통해 RESTful API를 구축하는 방법까지 자세히 알아보겠습니다.
목차
- AWS Lambda란?
- AWS Lambda의 특징
- Lambda 함수 생성하기
- API Gateway로 RESTful API 구축하기
- Lambda 함수에 API Gateway 연결 및 배포
- API Gateway의 보안 설정
- 실습 예제
- Java AWS SDK로 Lambda 호출하기
- 마치며
AWS Lambda란?
AWS Lambda는 서버를 직접 관리하지 않고도 코드를 실행할 수 있는 서버리스 컴퓨팅 서비스입니다. 사용자는 코드를 작성하여 Lambda 함수로 업로드하면, AWS가 필요한 때에 해당 함수를 실행하고 자동으로 확장해줍니다.
- 서버 관리 불필요: 인프라 관리 없이 코드에만 집중할 수 있습니다.
- 자동 확장: 트래픽 증가 시 AWS가 자동으로 리소스를 할당하여 확장합니다.
- 이벤트 기반 실행: 다양한 AWS 서비스 또는 커스텀 이벤트에 의해 함수가 트리거됩니다.
- 다양한 언어 지원: Python, Node.js, Java, C#, Go 등 여러 프로그래밍 언어를 지원합니다.
AWS Lambda의 특징
- 이벤트 트리거 기반 실행: 예를 들어, S3 버킷에 파일이 업로드되면 해당 이벤트를 감지하여 Lambda 함수가 자동으로 실행됩니다.
- 자동 확장성: 함수 호출량에 따라 AWS가 자동으로 리소스를 확장하거나 축소합니다.
- 비용 효율성: 실제 함수 실행 시간과 사용한 메모리에 따라 비용이 청구되며, 유휴 상태에서는 비용이 발생하지 않습니다.
가격 책정
- 프리 티어:
- 매월 1백만 건의 무료 요청 제공
- 매월 최대 400,000GB-초의 컴퓨팅 시간 제공
Lambda 함수 생성하기
1. Lambda 함수 생성
- AWS Management Console에서 Lambda 서비스로 이동합니다.
- 함수 생성(Create function) 버튼을 클릭합니다.
- 새로 작성(Author from scratch) 옵션을 선택합니다.
- 함수 이름:
lambda-api-gateway-root
- 런타임: Python 3.7 (원하는 언어 선택 가능)
- 함수 이름:
- 함수 생성(Create function) 버튼을 클릭하여 함수를 생성합니다.
2. 코드 작성 및 배포
생성된 함수의 코드 편집기에서 아래 코드를 입력합니다.
import json
def lambda_handler(event, context):
print("Lambda 함수가 실행되었습니다.")
print("이벤트: ", event)
body = "Hello, World!"
return {
'statusCode': 200,
'headers': {
'Content-Type': 'application/json'
},
'body': json.dumps(body)
}
- 코드 설명:
event
: Lambda 함수를 호출할 때 전달되는 이벤트 데이터.context
: 함수 실행 환경 정보.- 함수는
"Hello, World!"
라는 메시지를 JSON 형식으로 반환합니다.
배포하기
- 코드를 작성한 후 상단의 Deploy(배포) 버튼을 클릭하여 변경 사항을 저장합니다.
3. 함수 테스트
- Test(테스트) 버튼을 클릭하여 테스트 이벤트를 생성합니다.
- 테스트 이벤트 이름을 입력하고, 필요한 경우 이벤트 데이터를 수정한 후 Create(생성) 버튼을 클릭합니다.
- Test(테스트) 버튼을 다시 클릭하여 함수를 실행하고 결과를 확인합니다.
- 실행 결과와 로그 출력을 확인할 수 있습니다.
4. 함수 설정 변경 (성능 최적화)
- 좌측 메뉴에서 Configuration(구성) 탭을 선택합니다.
- 메모리(Memory) 설정을 조정하여 함수에 할당되는 메모리를 변경할 수 있습니다.
- 메모리는 128MB부터 10,240MB(10GB)까지 설정 가능합니다.
- 메모리를 늘리면 함수의 CPU 성능도 향상되지만, 비용이 증가합니다.
- 시간 제한(Timeout) 설정을 조정하여 함수의 최대 실행 시간을 변경할 수 있습니다.
- 최소 1초에서 최대 15분까지 설정 가능합니다.
API Gateway로 RESTful API 구축하기
API Gateway란?
AWS API Gateway는 RESTful API 및 WebSocket API를 생성, 게시, 유지 관리, 모니터링 및 보호할 수 있는 완전 관리형 서비스입니다. Lambda 함수와 연계하여 서버리스 애플리케이션의 API 엔드포인트를 쉽게 구축할 수 있습니다.
- RESTful API 생성: HTTP 기반의 API를 생성하여 외부에서 Lambda 함수를 호출할 수 있습니다.
- 통합: Lambda, EC2, 다른 AWS 서비스 또는 외부 웹 서비스와 통합할 수 있습니다.
- 보안 관리: 인증 및 권한 부여를 위한 다양한 옵션을 제공합니다.
Lambda 함수에 API Gateway 연결 및 배포
1. API Gateway 생성
- AWS Management Console에서 API Gateway 서비스로 이동합니다.
- API 생성(Create API) 버튼을 클릭합니다.
- REST API 선택 후 새 API를 생성합니다.
- API 이름:
MyFirstAPI
- 엔드포인트 유형(Endpoint Type): 지역(Regional)
- API 이름:
- API 생성(Create API) 버튼을 클릭합니다.
2. 리소스 및 메서드 설정
루트 리소스에 GET 메서드 추가
- 좌측 리소스 트리에서 / (루트 리소스)를 선택합니다.
- 작업(Actions) 드롭다운 메뉴에서 메서드 생성(Create Method)를 선택합니다.
- GET 메서드를 선택하고 체크 표시를 클릭합니다.
- 통합 유형(Integration Type): Lambda 함수
- Lambda 프록시 통합 사용(Use Lambda Proxy Integration): 체크
- Lambda 함수 지역(Region):
ap-northeast-2
(서울) - Lambda 함수 이름:
lambda-api-gateway-root
- 저장(Save) 버튼을 클릭합니다.
- 권한 설정 팝업이 나타나면 확인(OK) 버튼을 클릭하여 API Gateway가 Lambda 함수를 호출할 수 있는 권한을 부여합니다.
테스트
- 메서드 실행(Method Execution) 화면에서 테스트(Test) 버튼을 클릭하여 API를 테스트할 수 있습니다.
- 요청을 보내면 Lambda 함수의 응답이 표시됩니다.
3. 새로운 리소스 및 메서드 추가
/hello
리소스에 GET 메서드 추가
- 작업(Actions) 드롭다운 메뉴에서 리소스 생성(Create Resource)를 선택합니다.
- 리소스 이름(Resource Name):
hello
- 리소스 경로(Resource Path): 자동으로
/hello
로 설정됩니다.
- 리소스 경로(Resource Path): 자동으로
- 리소스 생성(Create Resource) 버튼을 클릭합니다.
- 생성된
/hello
리소스를 선택하고, 메서드 생성(Create Method)를 통해 GET 메서드를 추가합니다. - Lambda 함수와 통합 설정은 앞서와 동일하게 진행하되, Lambda 함수 이름을 새로운 함수(
lambda-api-gateway-hello
)로 지정합니다.
4. API 배포
- 좌측 메뉴에서 작업(Actions) 드롭다운 메뉴에서 API 배포(Deploy API)를 선택합니다.
- 배포 단계(Deployment Stage):
- 새 스테이지(New Stage) 선택
- 스테이지 이름(Stage Name):
dev
- 배포(Deploy) 버튼을 클릭합니다.
- 배포가 완료되면 Invoke URL이 제공됩니다.
- 루트 경로:
https://{api_id}.execute-api.{region}.amazonaws.com/dev/
/hello
경로:https://{api_id}.execute-api.{region}.amazonaws.com/dev/hello
- 루트 경로:
5. API 호출
- 웹 브라우저나 HTTP 클라이언트(예: Postman)를 통해 API를 호출하여 Lambda 함수의 응답을 확인합니다.
- 예시:
- 루트 경로 호출:
GET https://{api_id}.execute-api.{region}.amazonaws.com/dev/
/hello
경로 호출:GET https://{api_id}.execute-api.{region}.amazonaws.com/dev/hello
- 루트 경로 호출:
API Gateway의 보안 설정
API Gateway는 다양한 방법으로 API의 접근을 제어할 수 있습니다.
1. IAM 권한을 통한 인증
- 특정 IAM 사용자 또는 역할만 API에 접근할 수 있도록 설정할 수 있습니다.
설정 방법
- API Gateway 콘솔에서 해당 메서드를 선택합니다.
- 메서드 요청(Method Request)을 클릭합니다.
- 권한 인증(Authorization) 설정에서 IAM 역할(IAM Role)을 선택합니다.
- 설정을 저장한 후, API를 다시 배포해야 변경 사항이 적용됩니다.
2. API 키를 통한 인증
- API 키를 발급하여 키를 가진 사용자만 API를 사용할 수 있도록 제한할 수 있습니다.
설정 방법
- API Gateway 콘솔에서 API 키(API Keys) 메뉴로 이동합니다.
- API 키 생성(Create API Key)를 클릭하여 새로운 키를 생성합니다.
- 사용 계획(Usage Plan)을 설정하여 API 키와 API를 연결합니다.
- API의 메서드 설정에서 API 키 필요(Require API Key) 옵션을 활성화합니다.
- 변경 사항을 저장하고 API를 다시 배포합니다.
실습 예제
Lambda 함수 생성: lambda-demo-api-bye
- AWS Lambda 콘솔에서 새로운 함수를 생성합니다.
- 함수 이름:
lambda-demo-api-bye
- 런타임: Python 3.7
- 함수 이름:
- 아래 코드를 함수에 입력합니다.
import json
def lambda_handler(event, context):
if 'body' in event:
body = event['body']
print("Received data:", body)
return {
'statusCode': 200,
'headers': {
'Content-Type': 'application/json'
},
'body': json.dumps("Bye method return")
}
API Gateway에 /bye
리소스 및 POST 메서드 추가
- API Gateway 콘솔에서 기존 API(
MyFirstAPI
)를 선택합니다. - 리소스 생성(Create Resource)를 통해
/bye
리소스를 생성합니다. /bye
리소스에 POST 메서드를 추가합니다.- 통합 설정에서 Lambda 함수로
lambda-demo-api-bye
를 선택합니다. - Lambda 프록시 통합 사용 옵션을 체크합니다.
- 설정을 저장하고 API를 다시 배포합니다.
API 테스트
- HTTP 클라이언트(예: Postman, 부메랑)를 사용하여 다음과 같이 요청을 보냅니다.
- URL:
https://{api_id}.execute-api.{region}.amazonaws.com/dev/bye
- 메서드: POST
- 쿼리 문자열 파라미터(Query Parameters):
name
: 원하는 값
- 본문(Body): 필요 시 JSON 또는 기타 형식으로 데이터 전송
- URL:
CloudWatch 로그 확인
- AWS CloudWatch 콘솔에서 Lambda 함수의 로그 그룹으로 이동합니다.
- 함수 실행 시 출력된 로그를 확인하여 이벤트 데이터(
event
객체)를 확인합니다.
Java AWS SDK로 Lambda 호출하기
AWS SDK를 사용하면 Java 애플리케이션에서 직접 Lambda 함수를 호출할 수 있습니다.
1. AWS 자격 증명 설정
- IAM에서 AWS 자격 증명(Access Key ID와 Secret Access Key)을 생성합니다.
- 해당 자격 증명은 Lambda 함수를 호출할 수 있는 권한을 가져야 합니다.
2. Maven 또는 Gradle 프로젝트 설정
- AWS SDK for Java를 사용하기 위해 프로젝트의 의존성에 AWS SDK 라이브러리를 추가합니다.
Maven 예시 (pom.xml
파일):
<dependencies>
<!-- AWS SDK for Lambda -->
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-lambda</artifactId>
<version>1.12.100</version>
</dependency>
</dependencies>
3. Java 코드로 Lambda 함수 호출
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.lambda.AWSLambda;
import com.amazonaws.services.lambda.AWSLambdaClientBuilder;
import com.amazonaws.services.lambda.model.InvokeRequest;
import com.amazonaws.services.lambda.model.InvokeResult;
public class LambdaInvoker {
public static void main(String[] args) {
// AWS 자격 증명 설정
BasicAWSCredentials awsCreds = new BasicAWSCredentials("ACCESS_KEY_ID", "SECRET_ACCESS_KEY");
// Lambda 클라이언트 생성
AWSLambda lambdaClient = AWSLambdaClientBuilder.standard()
.withCredentials(new AWSStaticCredentialsProvider(awsCreds))
.withRegion("ap-northeast-2")
.build();
// Lambda 함수 호출 요청 생성
InvokeRequest invokeRequest = new InvokeRequest()
.withFunctionName("lambda-demo-api-bye")
.withPayload("{ \"key\": \"value\" }");
// Lambda 함수 호출
InvokeResult invokeResult = lambdaClient.invoke(invokeRequest);
// 응답 처리
String response = new String(invokeResult.getPayload().array());
System.out.println("Lambda 응답: " + response);
}
}
- 주의사항:
- 실제 코드에서는 AWS 자격 증명을 코드에 하드코딩하지 말고, 환경 변수나 AWS 자격 증명 파일을 사용해야 합니다.
- Lambda 함수의 권한 설정에 따라 호출이 제한될 수 있으므로, IAM 역할 및 정책을 적절히 설정해야 합니다.
마치며
AWS Lambda와 API Gateway를 활용하면 서버를 직접 관리하지 않고도 확장성 있는 애플리케이션을 구축할 수 있습니다. 이 글에서는 Lambda 함수를 생성하고, API Gateway를 통해 RESTful API를 구축하며, 보안 설정과 실습 예제까지 다루었습니다.
추가적으로 Java AWS SDK를 사용하여 프로그램matically하게 Lambda 함수를 호출하는 방법도 알아보았습니다.
AWS의 다양한 서비스를 연계하여 서버리스 아키텍처를 구축하면, 개발자는 비즈니스 로직에 더 집중할 수 있고, 인프라 관리에 드는 비용과 시간을 절약할 수 있습니다.
참고 자료
관련 노션 페이지