AWS

AWS Lambda IaC 적용 방법

devfinger 2024. 10. 23. 13:49

Lambda 리소스 구성 요소 및 사용 여부

Lambda 함수 구성에서 다양한 리소스가 있다.

  1. 애플리케이션 (Application): Lambda 함수는 기본적으로 AWS Lambda에 대한 함수 단위로 관리되지만, 여러 함수나 관련 리소스를 한데 모으는 개념으로 애플리케이션을 구성할 수 있다.
    • 필수 여부: 선택 사항 (기본적으로 Lambda 함수 단위로도 충분히 운영 가능)
    • 리소스명: AWS SAM(Application)을 사용하면 aws_serverless_application으로 정의
  2. 함수 (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: 환경 변수
  3. 코드 서명 구성 (Code Signing Config): Lambda 함수가 신뢰할 수 있는 서명된 코드만 실행하도록 보장
    • 필수 여부: 선택 사항
    • 리소스명: aws_lambda_code_signing_config
    • 필수 파라미터:
      • allowed_signing_profiles: 허용된 서명 프로필 리스트
    • 옵션 파라미터:
      • description: 코드 서명 구성 설명
  4. 이벤트 소스 매핑 (Event Source Mapping): Lambda가 특정 이벤트 소스로부터 데이터를 자동으로 가져와 실행되도록 설정하는 리소스입니다. (예: SQS, DynamoDB, Kinesis 등)
    • 필수 여부: 선택 사항 (Lambda가 트리거 없이 수동 실행된다면 필요 없음)
    • 리소스명: aws_lambda_event_source_mapping
    • 필수 파라미터:
      • event_source_arn: 트리거 이벤트 소스의 ARN (예: SQS ARN)
      • function_name: Lambda 함수 이름
    • 옵션 파라미터:
      • batch_size: 한 번에 처리할 이벤트의 개수
  5. 계층 (Layers): Lambda 함수에서 공통 라이브러리나 패키지를 여러 함수 간에 공유할 수 있도록 하는 기능
    • 필수 여부: 선택 사항 (공통 라이브러리를 사용해야 할 때만 필요)
    • 리소스명: aws_lambda_layer_version
    • 필수 파라미터:
      • layer_name: 계층의 이름
      • s3_bucket, s3_key 또는 filename: 계층에 포함될 코드의 경로
      • compatible_runtimes: 이 계층이 사용될 수 있는 런타임
  6. 복제본 (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 경로를 참조하도록 설정하면 된다.