Pay-as-You-Go 기반(프리 플랜 제외) AWS CloudFront 생성
AWS CLI를 통해 CloudFront pay-as-you-go를 생성하십시오.
AWS Free 플랜이 제대로 작동하지 않으며, AWS 콘솔에서 새로운 CloudFront 분배에 Pay-as-you-go 옵션이 숨겨짐입니다.
Hugo 기반 사이트를 AWS에 호스팅할 때, 일반적으로 버킷을 CloudFront 뒤에 두고 Lambda@Edge 함수를 연결하여 디렉터리 경로(예: /blog/)에 대한 요청을 /blog/index.html로 재작성합니다. 이는 S3 웹사이트 스타일 원본에 사용됩니다. 그런 다음 hugo deploy 또는 AWS CLI로 배포를 사용하여 빌드된 사이트를 동기화할 수 있습니다. 단, 이 경우 CloudFront 분배를 사용해야 하며, 플랫 레이트 계획을 피하고 싶다면 Pay-as-you-go 가격을 사용해야 합니다. 콘솔에서는 이제 더 이상 해당 옵션을 선택할 수 없으며, Free 또는 Pro 플랜만 제공됩니다.

이 글에서는 AWS CLI와 이 글의 scripts 폴더에 있는 스크립트를 사용하여 기존 분배 구성 정보를 재사용하여 Pay-as-you-go 분배를 생성하는 방법을 보여줍니다.
콘솔에서 제공되는 옵션이 Free 또는 Pro만인 경우
Amazon은 CloudFront의 플랫 레이트 가격 플랜을 도입하여, WAF, DDoS 보호, Route 53 및 기타 서비스를 포함한 CDN을 고정 월간 가격으로 제공하며, 과다 사용이 없습니다. CloudFront 콘솔에서 새 분배를 생성할 때, 이제 Free 또는 Pro(및 그 이상) 플랜 옵션만 제공됩니다. Pro 플랜은 $15/월부터 시작하며, “Pay-as-you-go” 옵션은 여기서는 보이지 않습니다.
Pay-as-you-go는 CloudFront API 또는 AWS CLI(create-distribution)를 통해 분배를 생성할 때 여전히 기본값입니다. 따라서 이전에 분배를 생성했거나 CLI를 통해 생성한 분배가 있고, 동일한 동작(예: S3 웹사이트 원본 + Lambda@Edge로 index.html)을 가진 다른 분배를 원한다면, 기존 분배의 구성 정보를 내보내고 수정한 후 새 분배를 생성할 수 있습니다. 이 새 분배는 나중에 플랫 레이트 플랜에 연결하지 않는 한 Pay-as-you-go 가격을 사용합니다.
필요한 사항
- 기존 CloudFront 분배의 구성 정보를 복사할 수 있는 분배(예: 다른 Hugo 사이트에 사용되는 분배 또는 콘솔 변경 전에 생성된 분배).
- AWS CLI가 설치되고,
cloudfront:GetDistributionConfig및cloudfront:CreateDistribution을 실행할 수 있는 자격 증명으로 구성되어 있어야 합니다. - jq(또는 유사한 도구)로 JSON 구성 파일을 편집할 수 있어야 합니다.
다음 예제 스크립트는 이 글의 scripts 폴더에 있습니다: current-distribution-config.json, new-distribution-config.json, updated-distribution-config.json, final-distribution-config.json.
단계 1: 기존 분배 구성 정보 가져오기
전체 분배 구성 정보(포함 ETag)를 가져오고 저장합니다:
# ABCDEFG를 기존 분배 ID로 교체
aws cloudfront get-distribution-config --id ABCDEFG > current-distribution-config.json
get-distribution-config는 ETag와 DistributionConfig를 포함하는 래퍼 객체를 반환합니다. 새로운 분배를 생성할 때는 내부 DistributionConfig만 전달하므로, 이를 추출합니다:
jq '.DistributionConfig' < current-distribution-config.json > new-distribution-config.json
이 시점에서 new-distribution-config.json은 다음과 같이 보입니다(축약됨). CallerReference, Aliases, Origins, DefaultRootObject, DefaultCacheBehavior와 Lambda@Edge가 포함됩니다. 예제 사이트 도메인은 micro.com으로 설정되었습니다:
{
"CallerReference": "8b2b19eb-6d41-4fc0-8d04-a1313e23e2d7",
"Aliases": {
"Quantity": 1,
"Items": ["micro.com"]
},
"DefaultRootObject": "index.html",
"Origins": {
"Quantity": 1,
"Items": [
{
"Id": "micro.com.s3.us-west-2.amazonaws.com",
"DomainName": "micro.com.s3-website-us-west-2.amazonaws.com",
"OriginPath": "",
"CustomOriginConfig": {
"HTTPPort": 80,
"HTTPSPort": 443,
"OriginProtocolPolicy": "http-only"
}
}
]
},
"DefaultCacheBehavior": {
"TargetOriginId": "micro.com.s3.us-west-2.amazonaws.com",
"ViewerProtocolPolicy": "redirect-to-https",
"LambdaFunctionAssociations": {
"Quantity": 1,
"Items": [
{
"LambdaFunctionARN": "arn:aws:lambda:us-east-1:...your-lambda-arn",
"EventType": "origin-request",
"IncludeBody": false
}
]
}
}
}
단계 2: 고유한 CallerReference 설정
모든 분배에는 고유한 CallerReference가 있어야 합니다. 다른 분배와 동일한 값을 사용하면 API가 요청을 거부합니다. 새로운 문자열이나 타임스탬프를 사용하세요:
NEW_CALLER_REF="new-distr-$(date +%s)"
jq --arg ref "$NEW_CALLER_REF" '.CallerReference = $ref' new-distribution-config.json > updated-distribution-config.json
단계 3: 별칭 및 원본 조정(선택 사항)
새로운 사이트가 다른 도메인 또는 S3 버킷을 사용하는 경우, updated-distribution-config.json의 Aliases 및 Origins를 업데이트하여 일치시킵니다(예: 새 버킷 웹사이트 엔드포인트 및 별칭 목록). 현재는 커스텀 도메인 없이 분배를 원하는 경우, 별칭을 지우세요:
jq '.Aliases = {"Quantity": 0, "Items": []}' updated-distribution-config.json > final-distribution-config.json
다른 S3 웹사이트 엔드포인트로 연결해야 하는 경우, 동일한 파일의 Origins 섹션을 편집하세요(예: Id와 DomainName을 새 버킷의 웹사이트 호스트 이름으로 변경하고, DefaultCacheBehavior.TargetOriginId를 동일한 Id로 설정하세요).
단계 4: 새 분배 생성
최종 구성에서 분배를 생성합니다:
aws cloudfront create-distribution --distribution-config file://final-distribution-config.json
응답에는 새 분배의 Id, ARN, DomainName, Status가 포함됩니다. 새 분배는 기본적으로 Pay-as-you-go 가격을 사용합니다. 그런 다음 DNS(또는 Route 53)를 새 CloudFront 도메인으로 지정하고, Hugo를 사용하는 경우 일반적으로 Hugo deploy 또는 AWS CLI를 사용하여 배포할 수 있습니다.
빠른 참고: 전체 스크립트
기존 분배 ID를 사용하고 별칭을 지우면 흐름은 다음과 같습니다:
# 1) 분배 구성 내보내기 및 추출
aws cloudfront get-distribution-config --id EABCDEFGZ > current-distribution-config.json
jq '.DistributionConfig' < current-distribution-config.json > new-distribution-config.json
# 2) 고유한 CallerReference 설정
NEW_CALLER_REF="new-distr-$(date +%s)"
jq --arg ref "$NEW_CALLER_REF" '.CallerReference = $ref' new-distribution-config.json > updated-distribution-config.json
# 3) 선택 사항: 커스텀 도메인 없음
jq '.Aliases = {"Quantity": 0, "Items": []}' updated-distribution-config.json > final-distribution-config.json
# 4) 분배 생성 (Pay-as-you-go)
aws cloudfront create-distribution --distribution-config file://final-distribution-config.json
Pay-as-you-go vs 플랫 레이트 (요약)
- Pay-as-you-go: 데이터 전송 및 요청에 대해 지불합니다. CloudFront의 영구 무료 계층은 월별로 1 TB 데이터 전송 및 10M HTTP/HTTPS 요청을 포함합니다. 월간 계획 요금 없음.
- 플랫 레이트 플랜: 여기서 문서화됨. 무료 플랜은 더 낮은 허용량(예: 1M 요청, 100 GB)을 제공합니다. Pro는 $15/월부터 시작하며 더 많은 용량과 WAF, Route 53 등이 포함되어 있습니다. 과다 사용 없음.
데이터 트래픽이 Pay-as-you-go 무료 계층에 맞고, 플랫 레이트 플랜의 묶음 기능이 필요하지 않다면, 위와 같이 CLI를 통해 분배를 생성하면 콘솔에서 제공되는 Free/Pro만 보이는 상태에서도 Pay-as-you-go를 유지할 수 있습니다.