Pay-as-You-Go 기반(프리 플랜 제외) AWS CloudFront 생성

AWS CLI를 통해 CloudFront pay-as-you-go를 생성하십시오.

Page content

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:GetDistributionConfigcloudfront: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-configETagDistributionConfig를 포함하는 래퍼 객체를 반환합니다. 새로운 분배를 생성할 때는 내부 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.jsonAliasesOrigins를 업데이트하여 일치시킵니다(예: 새 버킷 웹사이트 엔드포인트 및 별칭 목록). 현재는 커스텀 도메인 없이 분배를 원하는 경우, 별칭을 지우세요:

jq '.Aliases = {"Quantity": 0, "Items": []}' updated-distribution-config.json > final-distribution-config.json

다른 S3 웹사이트 엔드포인트로 연결해야 하는 경우, 동일한 파일의 Origins 섹션을 편집하세요(예: IdDomainName을 새 버킷의 웹사이트 호스트 이름으로 변경하고, 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를 유지할 수 있습니다.

유용한 링크