Lambda 리소스 구성 요소 및 사용 여부
Lambda 함수 구성에서 다양한 리소스가 있다.
- 애플리케이션 (Application): Lambda 함수는 기본적으로 AWS Lambda에 대한 함수 단위로 관리되지만, 여러 함수나 관련 리소스를 한데 모으는 개념으로 애플리케이션을 구성할 수 있다.
- 필수 여부: 선택 사항 (기본적으로 Lambda 함수 단위로도 충분히 운영 가능)
- 리소스명: AWS SAM(Application)을 사용하면 aws_serverless_application으로 정의
- 함수 (Function): Lambda의 핵심 리소스로, 코드가 실행되는 역할
- 필수 여부: 필수
- 리소스명: aws_lambda_function
- 필수 파라미터:
- function_name: 함수의 이름
- role: Lambda가 실행될 때 사용할 IAM 역할
- handler: Lambda 함수에서 실행될 메소드 (com.example.Handler::handleRequest처럼 Java의 경우)
- runtime: Java의 경우 "java11" 또는 "java17"
- s3_bucket, s3_key 또는 filename: 코드가 담긴 S3 버킷 또는 ZIP 파일의 경로
- 옵션 파라미터:
- memory_size: 함수가 사용할 메모리 크기
- timeout: 최대 실행 시간
- environment: 환경 변수
- 코드 서명 구성 (Code Signing Config): Lambda 함수가 신뢰할 수 있는 서명된 코드만 실행하도록 보장
- 필수 여부: 선택 사항
- 리소스명: aws_lambda_code_signing_config
- 필수 파라미터:
- allowed_signing_profiles: 허용된 서명 프로필 리스트
- 옵션 파라미터:
- description: 코드 서명 구성 설명
- 이벤트 소스 매핑 (Event Source Mapping): Lambda가 특정 이벤트 소스로부터 데이터를 자동으로 가져와 실행되도록 설정하는 리소스입니다. (예: SQS, DynamoDB, Kinesis 등)
- 필수 여부: 선택 사항 (Lambda가 트리거 없이 수동 실행된다면 필요 없음)
- 리소스명: aws_lambda_event_source_mapping
- 필수 파라미터:
- event_source_arn: 트리거 이벤트 소스의 ARN (예: SQS ARN)
- function_name: Lambda 함수 이름
- 옵션 파라미터:
- batch_size: 한 번에 처리할 이벤트의 개수
- 계층 (Layers): Lambda 함수에서 공통 라이브러리나 패키지를 여러 함수 간에 공유할 수 있도록 하는 기능
- 필수 여부: 선택 사항 (공통 라이브러리를 사용해야 할 때만 필요)
- 리소스명: aws_lambda_layer_version
- 필수 파라미터:
- layer_name: 계층의 이름
- s3_bucket, s3_key 또는 filename: 계층에 포함될 코드의 경로
- compatible_runtimes: 이 계층이 사용될 수 있는 런타임
- 복제본 (Aliases): Lambda 함수의 특정 버전에 대한 참조를 제공하여 버전 관리 및 트래픽을 분할할 수 있도록 한다.
- 필수 여부: 선택 사항
- 리소스명: aws_lambda_alias
- 필수 파라미터:
- function_name: Lambda 함수 이름
- function_version: 참조할 함수 버전
- name: 별칭 이름
- 옵션 파라미터:
- routing_config: 트래픽 분할 비율 설정
Lambda 생성부터 Java 코드 배포까지
1. Java Lambda 함수 소스 코드
간단한 Java Lambda 핸들러 코드를 예시
package com.example;
public class LambdaHandler {
public String handleRequest(String input) {
return "Hello, " + input;
}
}
2. 빌드 및 패키징 (Java 소스 ZIP 파일로 만들기)
Maven이나 Gradle을 사용해 Java 코드를 빌드한 후, 아래와 같이 ZIP 파일로 패키징합니다.
- Maven으로 빌드 후 .zip 파일로 생성:
mvn clean package
zip -j lambda_function.zip target/my-lambda-function.jar
3. S3로 배포하는 방법
빌드한 ZIP 파일을 S3 버킷에 업로드하고 Terraform에서 이 파일을 참조하도록 설정
S3에 파일 업로드:
aws s3 cp lambda_function.zip s3://my-lambda-bucket/
4. Lambda 함수 IaC로 생성하기
provider "aws" {
region = "ap-northeast-2"
}
# Lambda IAM Role 생성
resource "aws_iam_role" "lambda_exec_role" {
name = "lambda_exec_role"
assume_role_policy = jsonencode({
Version = "2012-10-17",
Statement = [{
Action = "sts:AssumeRole",
Effect = "Allow",
Principal = {
Service = "lambda.amazonaws.com"
}
}]
})
}
# Lambda IAM Policy 추가
resource "aws_iam_role_policy_attachment" "lambda_policy" {
role = aws_iam_role.lambda_exec_role.name
policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
}
# Lambda 함수 생성 (S3에서 코드 참조)
resource "aws_lambda_function" "my_lambda_function" {
function_name = "MyJavaLambda"
role = aws_iam_role.lambda_exec_role.arn
handler = "com.example.LambdaHandler::handleRequest"
runtime = "java11"
s3_bucket = "my-lambda-bucket"
s3_key = "lambda_function.zip"
memory_size = 128
timeout = 10
}
# S3에 직접 업로드 대신 로컬 파일을 사용할 경우
# filename = "lambda_function.zip" 옵션 사용
S3 vs 직접 업로드
- S3를 사용하는 경우: Lambda 코드가 큰 경우 S3를 사용하면 더 효율적입니다. 대규모 애플리케이션을 배포하거나 여러 번의 배포를 수행할 때 S3에 코드를 저장해 관리하는 것이 유리
- 직접 업로드: 소규모 코드나 테스트 코드일 경우 간단하게 filename을 사용해 로컬에서 직접 Lambda에 업로드할 수 있습니다. 하지만 이 방법은 규모가 커지면 불편해질 수 있다.
요약
- Lambda를 IaC로 생성할 때, 필수 리소스는 aws_lambda_function과 IAM Role
- Java 코드를 작성해 ZIP 파일로 패키징한 후, S3에 업로드하거나 직접 ZIP 파일을 참조하여 Lambda 함수를 배포할 수 있습니다.
- S3로 배포하는 것이 더 큰 프로젝트나 지속적인 배포를 고려할 때 유리하며, IaC에서 S3 경로를 참조하도록 설정하면 된다.
'AWS' 카테고리의 다른 글
AWS IAM 관리형 정책 (Managed Policies) (0) | 2024.10.23 |
---|---|
AWS IAM(Identity and Access Management) 사용법 (1) | 2024.10.23 |
AWS security_groups 멀티 지정 (0) | 2024.10.23 |
AWS Aurora Serverless DB 생성, Lambda로 이벤트 전송 IaC (0) | 2024.10.23 |
AWS EC2, Lambda, EFS 생성 및 EFS 접근 IaC (0) | 2024.10.23 |