AWS

AWS S3와 CloudFront 연동 IaC

devfinger 2024. 10. 22. 21:10

 

  • S3 버킷: 파일을 저장할 곳
  • CloudFront 배포: S3 파일을 전 세계적으로 배포할 Content Delivery Network(CDN)
  • S3 버킷 정책: CloudFront가 S3 버킷에 접근할 수 있도록 허용
# AWS Provider 설정
provider "aws" {
  region = "ap-northeast-2"  # 사용할 리전 (CloudFront는 글로벌이므로 S3 리전만 지정)
}

# 1. S3 버킷 생성
resource "aws_s3_bucket" "my_bucket" {
  bucket = "my-unique-bucket-name"  # S3 버킷 이름. 고유해야 함.
  
  # 버킷에 대해 기본적인 설정 (예: 웹 호스팅, 버전 관리 등)
  acl    = "private"  # CloudFront만 접근하도록 비공개로 설정
  
  tags = {  # 태그 설정
    Name        = "My S3 Bucket"
    Environment = "Production"
  }
}

# 2. S3 버킷 정책 (CloudFront가 버킷에 접근할 수 있도록 허용)
resource "aws_s3_bucket_policy" "my_bucket_policy" {
  bucket = aws_s3_bucket.my_bucket.id

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Effect = "Allow"
        Principal = {
          Service = "cloudfront.amazonaws.com"
        }
        Action = "s3:GetObject"
        Resource = "${aws_s3_bucket.my_bucket.arn}/*"
        Condition = {
          StringEquals = {
            "AWS:SourceArn" = aws_cloudfront_distribution.my_distribution.arn
          }
        }
      }
    ]
  })
}

# 3. CloudFront Origin Access Control 설정 (S3에 직접 접근하지 못하게 함)
resource "aws_cloudfront_origin_access_control" "s3_oac" {
  name          = "S3OriginAccessControl"
  origin_type   = "s3"
  signing_behavior = "always"
  signing_protocol = "sigv4"
}

# 4. CloudFront 배포 생성
resource "aws_cloudfront_distribution" "my_distribution" {
  origin {
    domain_name = aws_s3_bucket.my_bucket.bucket_domain_name
    origin_id   = "S3-${aws_s3_bucket.my_bucket.id}"

    # S3에 대한 OAC 설정
    origin_access_control_id = aws_cloudfront_origin_access_control.s3_oac.id
  }

  enabled = true

  # 기본 동작 설정 (GET, HEAD 요청 허용)
  default_cache_behavior {
    allowed_methods  = ["GET", "HEAD"]
    cached_methods   = ["GET", "HEAD"]
    target_origin_id = "S3-${aws_s3_bucket.my_bucket.id}"

    viewer_protocol_policy = "redirect-to-https"  # HTTP 요청을 HTTPS로 리디렉션

    # 캐시 동작 설정
    forwarded_values {
      query_string = false
      cookies {
        forward = "none"
      }
    }
  }

  # SSL 인증서 설정 (기본 CloudFront 인증서 사용)
  viewer_certificate {
    cloudfront_default_certificate = true
  }

  # CloudFront 배포의 태그 설정
  tags = {
    Name = "My CloudFront Distribution"
    Environment = "Production"
  }
}

# 출력: CloudFront 도메인
output "cloudfront_domain_name" {
  value = aws_cloudfront_distribution.my_distribution.domain_name
  description = "CloudFront distribution domain name to access the S3 files"
}

 

 

설명:

  1. S3 버킷 (aws_s3_bucket):
    • bucket: S3 버킷의 고유 이름
    • acl = "private": 버킷을 비공개로 설정하여 직접적으로 외부에서 접근할 수 없도록 한다. CloudFront만 이 버킷에 접근할 수 있도록 함
  2. S3 버킷 정책 (aws_s3_bucket_policy):
    • S3 버킷이 CloudFront 배포에서만 접근할 수 있도록 허용하는 정책. CloudFront의 Origin Access Control을 통해 서명된 요청만 허용
  3. CloudFront Origin Access Control (aws_cloudfront_origin_access_control):
    • S3 버킷에 대한 직접적인 접근을 차단하고, CloudFront에서 서명된 요청만 수락하도록 하는 설정
  4. CloudFront 배포 (aws_cloudfront_distribution):
    • origin: CloudFront가 배포할 원본 데이터(S3 버킷)를 설정
    • default_cache_behavior: 기본 캐싱 및 프로토콜 설정을 정의합니다. 여기서 모든 HTTP 요청을 HTTPS로 리디렉션하는 설정도 포함
    • viewer_certificate: 기본적으로 CloudFront의 인증서를 사용하여 HTTPS 트래픽을 처리
  5. 출력 (output):
    • CloudFront 도메인을 출력합니다. 이를 통해 S3 버킷의 파일을 CloudFront를 통해 액세스할 수 있는 URL을 제공합니다.

실행 결과:

CloudFront 배포가 생성되고, 이를 통해 S3 버킷의 파일에 접근할 수 있는 CloudFront 도메인이 출력. 사용자는 인터넷을 통해 해당 CloudFront 도메인을 통해 S3 버킷에 있는 파일에 접근


추가 설명:

  • OAC (Origin Access Control)는 CloudFront에서 S3로의 직접 접근을 방지하고, CloudFront를 통해서만 S3 객체에 접근할 수 있도록 보안 조치를 제공
  • S3 버킷의 acl을 private으로 설정하여 외부에서의 직접적인 접근을 방지
  • CloudFront를 사용하면 전 세계적으로 빠르게 파일을 배포할 수 있으며, HTTPS 트래픽을 기본으로 설정하여 보안 강화

'AWS' 카테고리의 다른 글

AWS EC2, Lambda, EFS 생성 및 EFS 접근 IaC  (0) 2024.10.23
AWS DirectConnect와 Transit G/W 연결해서 내부 통신 IaC  (0) 2024.10.22
AWS EFS 리소스  (1) 2024.10.22
AWS IaC 배포 방법들  (0) 2024.10.22
S3에서 IaC로 폴더 만들기  (0) 2024.10.22