AWS

AWS Lambda 에 HTTPS 인증서 적용하기

devfinger 2024. 10. 24. 20:39

Lambda에 HTTPS를 적용하기 위해선 API Gateway를 사용해서 Lambda로의 요청을 처리하게 해야 합니다. API Gateway는 HTTPS 트래픽을 처리할 수 있으며, ACM(인증서 관리 서비스)을 통해 발급받은 SSL 인증서를 적용할 수 있다.

주요 단계:

  1. ACM 인증서 발급: ACM에서 HTTPS용 인증서를 발급받습니다.
  2. API Gateway 설정: API Gateway를 통해 HTTPS 트래픽을 Lambda로 전달합니다.
  3. API Gateway에 ACM 인증서 적용: 발급받은 SSL 인증서를 API Gateway에 연결합니다.

Terraform을 사용한 IaC 예시

# Step 1: ACM 인증서 발급
resource "aws_acm_certificate" "lambda_cert" {
  domain_name               = var.domain_name  # 예: "api.mydomain.com"
  subject_alternative_names = var.subject_alternative_names  # 대체 도메인 이름
  validation_method         = "DNS"  # DNS 검증 방식

  tags = {
    Name = "acm-${var.env}-lambda-ssl"
  }
}

# Step 2: ACM 인증서 검증을 위한 Route 53 레코드 생성
resource "aws_route53_record" "cert_validation" {
  for_each = {
    for dvo in aws_acm_certificate.lambda_cert.domain_validation_options :
    dvo.domain_name => {
      name   = dvo.resource_record_name
      type   = dvo.resource_record_type
      value  = dvo.resource_record_value
    }
  }

  zone_id = aws_route53_zone.main_zone.zone_id  # Route 53 Zone ID
  name    = each.value.name
  type    = each.value.type
  records = [each.value.value]
  ttl     = 60
}

# Step 3: API Gateway 설정
resource "aws_api_gateway_rest_api" "lambda_api" {
  name        = "Lambda API Gateway"
  description = "API Gateway for Lambda HTTPS"
}

# Step 4: Lambda를 위한 API Gateway 리소스 생성
resource "aws_api_gateway_resource" "lambda_resource" {
  rest_api_id = aws_api_gateway_rest_api.lambda_api.id
  parent_id   = aws_api_gateway_rest_api.lambda_api.root_resource_id
  path_part   = "{proxy+}"
}

# Step 5: API Gateway에서 Lambda로의 통합
resource "aws_api_gateway_method" "lambda_method" {
  rest_api_id   = aws_api_gateway_rest_api.lambda_api.id
  resource_id   = aws_api_gateway_resource.lambda_resource.id
  http_method   = "ANY"
  authorization = "NONE"
}

resource "aws_api_gateway_integration" "lambda_integration" {
  rest_api_id             = aws_api_gateway_rest_api.lambda_api.id
  resource_id             = aws_api_gateway_resource.lambda_resource.id
  http_method             = aws_api_gateway_method.lambda_method.http_method
  integration_http_method = "POST"
  type                    = "AWS_PROXY"
  uri                     = aws_lambda_function.my_lambda.invoke_arn
}

# Step 6: API Gateway에 ACM 인증서 적용 (HTTPS 지원)
resource "aws_api_gateway_domain_name" "lambda_domain" {
  domain_name = var.domain_name  # "api.mydomain.com"
  certificate_arn = aws_acm_certificate.lambda_cert.arn
}

# Step 7: Route 53에서 API Gateway 도메인 연결
resource "aws_route53_record" "lambda_api_dns" {
  zone_id = aws_route53_zone.main_zone.zone_id
  name    = var.domain_name
  type    = "A"

  alias {
    name                   = aws_api_gateway_domain_name.lambda_domain.cloudfront_domain_name
    zone_id                = aws_api_gateway_domain_name.lambda_domain.cloudfront_zone_id
    evaluate_target_health = false
  }
}

 

이 코드는 다음을 수행한다.

  • ACM을 통해 도메인 인증서를 발급받고, 이를 API Gateway에 적용
  • API Gateway가 Lambda와 통합되어 HTTPS 요청을 처리할 수 있도록 설정
  • Route 53을 통해 도메인과 API Gateway를 연결

이렇게 하면 Lambda가 HTTPS 트래픽을 처리할 수 있게 된다.