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
}
주요 구성 요소
- Aurora Serverless Cluster 생성: MySQL 기반 Aurora Serverless DB 클러스터를 생성하고, 자동 스케일링 적용
- Lambda 함수 생성: Java로 작성된 Lambda 함수 설정. 패키지된 .zip 파일은 S3에 업로드된 것으로 가정
- RDS 이벤트 트리거: Aurora에서 발생하는 데이터 입력 이벤트가 SNS를 통해 Lambda 함수로 전달되도록 aws_rds_event_subscription을 설정
- SNS와 Lambda 연결: SNS 주제가 RDS에서 발생하는 이벤트를 수신하고, 이를 Lambda 함수로 전달할 수 있도록 SNS-Lambda 연결을 설정
추가 설명
- Java Lambda 코드는 패키징 후 S3에 업로드되어 있어야 하며, Terraform에서는 해당 파일을 Lambda로 배포
- Aurora 테이블에서 데이터를 INSERT할 때 Lambda 호출: Aurora에서 특정 테이블에 데이터가 입력될 때 이벤트를 통해 Lambda로 전달. RDS 이벤트는 SNS 주제를 통해 Lambda로 트리거
이 IaC 구성을 통해 Aurora에서 데이터가 입력되면 Lambda가 자동으로 호출
'AWS' 카테고리의 다른 글
AWS Lambda IaC 적용 방법 (1) | 2024.10.23 |
---|---|
AWS security_groups 멀티 지정 (0) | 2024.10.23 |
AWS EC2, Lambda, EFS 생성 및 EFS 접근 IaC (0) | 2024.10.23 |
AWS DirectConnect와 Transit G/W 연결해서 내부 통신 IaC (0) | 2024.10.22 |
AWS S3와 CloudFront 연동 IaC (0) | 2024.10.22 |