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