AWS

AWS Aurora Serverless DB 생성, Lambda로 이벤트 전송 IaC

devfinger 2024. 10. 23. 10:45

Terraform을 사용하여 Aurora Serverless DB, 테이블, 그리고 Lambda 함수를 설정하고, Aurora의 데이터 입력 이벤트가 Lambda를 호출하도록 트리거를 설정

provider "aws" {
  region = "ap-northeast-2"
}

# Aurora Serverless Cluster 생성
resource "aws_rds_cluster" "aurora" {
  cluster_identifier      = "aurora-serverless-cluster"
  engine                  = "aurora-mysql"
  engine_version          = "5.7.mysql_aurora.2.07.1"
  database_name           = "mydb"
  master_username         = "admin"
  master_password         = "password123"
  backup_retention_period = 5
  storage_encrypted       = true

  scaling_configuration {
    auto_pause   = true
    max_capacity = 2
    min_capacity = 1
    seconds_until_auto_pause = 300
  }
}

# Aurora Cluster DB 인스턴스 생성
resource "aws_rds_cluster_instance" "aurora_instance" {
  count              = 1
  identifier         = "aurora-serverless-instance-${count.index + 1}"
  cluster_identifier = aws_rds_cluster.aurora.id
  instance_class     = "db.serverless"
  engine             = aws_rds_cluster.aurora.engine
}

# 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_policy_attachment" "lambda_policy" {
  policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
  roles      = [aws_iam_role.lambda_exec_role.name]
}

# Lambda 함수 생성 (Java 사용)
resource "aws_lambda_function" "lambda_function" {
  function_name = "aurora_trigger_lambda"
  role          = aws_iam_role.lambda_exec_role.arn
  handler       = "com.example.LambdaHandler::handleRequest"
  runtime       = "java11"
  memory_size   = 128
  timeout       = 15
  filename      = "lambda_function.zip"  # Java 코드 패키지 (S3에 업로드된 ZIP 파일)
  s3_bucket     = "my-lambda-bucket"
  s3_key        = "lambda_function.zip"
}

# RDS에서 Lambda 호출을 위한 Event Bridge 설정
resource "aws_rds_event_subscription" "rds_event_subscription" {
  name      = "aurora-lambda-trigger"
  source_type = "db-instance"
  event_categories = ["insert"]
  sns_topic_arn    = aws_sns_topic.aurora_sns.arn

  source_ids = [aws_rds_cluster_instance.aurora_instance.id]
}

# SNS Topic 생성 (RDS 이벤트를 Lambda로 전달)
resource "aws_sns_topic" "aurora_sns" {
  name = "aurora-sns-topic"
}

# SNS Topic과 Lambda 연결
resource "aws_lambda_permission" "sns_invoke_lambda" {
  statement_id  = "AllowSNSInvocation"
  action        = "lambda:InvokeFunction"
  function_name = aws_lambda_function.lambda_function.function_name
  principal     = "sns.amazonaws.com"
  source_arn    = aws_sns_topic.aurora_sns.arn
}

resource "aws_sns_topic_subscription" "aurora_sns_subscription" {
  topic_arn = aws_sns_topic.aurora_sns.arn
  protocol  = "lambda"
  endpoint  = aws_lambda_function.lambda_function.arn
}

 

주요 구성 요소

  1. Aurora Serverless Cluster 생성: MySQL 기반 Aurora Serverless DB 클러스터를 생성하고, 자동 스케일링 적용
  2. Lambda 함수 생성: Java로 작성된 Lambda 함수 설정. 패키지된 .zip 파일은 S3에 업로드된 것으로 가정
  3. RDS 이벤트 트리거: Aurora에서 발생하는 데이터 입력 이벤트가 SNS를 통해 Lambda 함수로 전달되도록 aws_rds_event_subscription을 설정
  4. SNS와 Lambda 연결: SNS 주제가 RDS에서 발생하는 이벤트를 수신하고, 이를 Lambda 함수로 전달할 수 있도록 SNS-Lambda 연결을 설정

추가 설명

  • Java Lambda 코드는 패키징 후 S3에 업로드되어 있어야 하며, Terraform에서는 해당 파일을 Lambda로 배포
  • Aurora 테이블에서 데이터를 INSERT할 때 Lambda 호출: Aurora에서 특정 테이블에 데이터가 입력될 때 이벤트를 통해 Lambda로 전달. RDS 이벤트는 SNS 주제를 통해 Lambda로 트리거

이 IaC 구성을 통해 Aurora에서 데이터가 입력되면 Lambda가 자동으로 호출