AWS CloudFormation에서 "하나 이상의 오리진 또는 오리진 그룹이 존재하지 않음" 오류를 해결하려면 어떻게 해야 하나요?

최종 업데이트 날짜: 2020년 6월 19일

Amazon CloudFront 배포를 포함한 AWS CloudFormation 스택을 생성하거나 업데이트하려고 하면 AWS CloudFormation에서 "하나 이상의 오리진 또는 오리진 그룹이 존재하지 않음"이라는 오류를 표시합니다. 이 오류를 해결하려면 어떻게 해야 하나요?

간략한 설명

CacheBehavior 또는 DefaultCacheBehaviorTargetOriginId 속성이 CloudFront 오리진이나 오리진 그룹 ID와 일치하지 않을 경우 AWS CloudFormation에서 이 오류가 발생합니다. 이 ID는 오리진 또는 오리진 그룹을 고유하게 식별하는 사용자 정의 문자열입니다.

AWS CloudFormation에서 오리진 그룹을 지원하기 전에는 오리진 그룹을 수동으로 생성하여 TargetOriginId에서 해당 오리진 그룹을 참조할 수 있었습니다. 이제는 오리진 그룹을 템플릿에서 정의한 다음 AWS CloudFormation을 통해 모든 리소스를 관리해야 합니다.

: AWS CloudFormation 외부의 스택 리소스를 변경하지 않는 것이 좋습니다. 이렇게 하면 스택의 템플릿과 스택 리소스의 현재 상태 사이에 불일치가 발생할 수 있습니다. 스택을 업데이트하거나 삭제하면 불일치 때문에 오류가 발생할 수 있습니다.

해결 방법

1.    TargetOriginId가 오리진이나 오리진 그룹 중 하나의 ID와 일치하는지 확인하려면 DefaultCacheBehavior 또는 CacheBehavior의 파라미터로 올바른 오리진 ID를 입력합니다.

다음의 예제 JSON 및 YAML 템플릿 스니펫에서는 DefaultCacheBehavior가 단일 오리진을 포함한 CloudFront 배포를 정의하고 사용합니다. 또한 이 오리진은 인증을 위해 Origin Access Identity(OAI)를 사용합니다. 이들 예제에서 오리진 ID는 my-s3-origin으로 설정되어 있습니다.

JSON:

{
    "AWSTemplateFormatVersion": "2010-09-09T00:00:00.000Z",
    "Resources": {
        "cloudfrontdistribution": {
            "Type": "AWS::CloudFront::Distribution",
            "Properties": {
                "DistributionConfig": {
                    "DefaultCacheBehavior": {
                        "ViewerProtocolPolicy": "https-only",
                        "DefaultTTL": 3600,
                        "ForwardedValues": {
                            "Cookies": {
                                "Forward": "none"
                            },
                            "QueryString": true
                        },
                        "TargetOriginId": "my-s3-origin"
                    },
                    "Enabled": true,
                    "Origins": [{
                        "DomainName": "my-s3-bucket.s3.amazonaws.com",
                        "Id": "my-s3-origin",
                        "S3OriginConfig": {
                            "OriginAccessIdentity": { "Fn::Sub" : "origin-access-identity/cloudfront/${CloudFrontOriginAccessIdentity}" }

                        },
                        "OriginPath": "/my-content"
                    }]
                }
            }
        },
        "CloudFrontOriginAccessIdentity": {
            "Type": "AWS::CloudFront::CloudFrontOriginAccessIdentity",
            "Properties": {
                "CloudFrontOriginAccessIdentityConfig": {
                    "Comment": { "Ref": "AWS::StackName" }
                }
            }
        }
    }
}

참고: my-s3-origin을 오리진 ID로 대체합니다. my-s3-bucket.s3.amazonaws.com을 도메인 이름으로 대체합니다. /my-content를 오리진 경로로 대체합니다.

YAML:

AWSTemplateFormatVersion: 2010-09-09
Resources:
  cloudfrontdistribution:
    Type: AWS::CloudFront::Distribution
    Properties:
      DistributionConfig:
        DefaultCacheBehavior:
          ViewerProtocolPolicy: https-only
          DefaultTTL: 3600
          ForwardedValues:
            Cookies:
              Forward: none
            QueryString: true
          TargetOriginId: my-s3-origin
        Enabled: true
        Origins:
          - DomainName: 'my-s3-bucket.s3.amazonaws.com'
            Id: my-s3-origin
            S3OriginConfig:
              OriginAccessIdentity: !Sub origin-access-identity/cloudfront/${CloudFrontOriginAccessIdentity}
            OriginPath: /my-content
          
  CloudFrontOriginAccessIdentity:
    Type: AWS::CloudFront::CloudFrontOriginAccessIdentity
    Properties:
      CloudFrontOriginAccessIdentityConfig:
        Comment: !Sub ${AWS::StackName}

2.    AWS CloudFormation 스택이 생성되었거나 업데이트되었는지 확인하려면 CloudFront 배포를 테스트합니다.