AWS CloudFormation을 사용하여 AWS::CloudFront::Distribution 리소스를 업데이트하려고 하면 다음과 같은 오류가 발생합니다. "하나 이상의 오리진 또는 오리진 그룹이 존재하지 않습니다."
해결 방법
CacheBehavior 또는 DefaultCacheBehavior의 TargetOriginId는 AWS::CloudFront::Distribution 리소스의 Origin 또는 OriginGroups 속성의 Id와 일치해야 합니다. ID가 일치하지 않으면 오리진 또는 오리진 그룹이 존재하지 않음 오류 메시지가 표시됩니다.
존재하지 않거나 CloudFormation 외부에서 생성한 오리진의 TargetOriginId를 설정하면 이 오류가 발생합니다. 업데이트 작업 시 CloudFormation은 CloudFormation 외부에서 생성한 배포의 모든 오리진과 오리진 그룹을 삭제합니다. CloudFormation에서 오리진 또는 오리진 그룹을 사용 중일 때 삭제하려고 하면 오류가 발생합니다.
참고: CloudFormation 외부에서 스택 리소스를 수정하지 않는 것이 가장 좋습니다. CloudFormation 외부에서 수정하면 스택의 템플릿과 스택 리소스의 현재 상태가 일치하지 않을 수 있습니다.
이 문제를 해결하려면 다음 단계를 완료하십시오.
- CloudFormation 템플릿에서 AWS::CloudFront::Distribution 리소스를 엽니다.
- 각 TargetOriginId가 Origins 또는 OriginGroups 속성에 정의된 오리진 또는 오리진 그룹 중 하나의 ID와 일치하는지 확인합니다. ID가 일치하지 않는 경우 올바른 오리진 ID를 DefaultCacheBehavior 또는 CacheBehavior의 파라미터로 입력합니다.
다음 예제 템플릿 조각에서 DefaultCacheBehavior는 단일 오리진으로 CloudFront 배포를 정의하고 사용합니다. 또한 오리진은 인증을 위해 오리진 액세스 ID(OAI)를 사용하며, 오리진은 Amazon Simple Storage Service(Amazon S3)입니다.
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"
}
}
}
}
}
}
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}
참고: 위의 예시에서 my-s3-origin을 오리진 ID로, my-s3-bucket.s3.amazonaws.com을 도메인 이름으로, /my-content를 오리진 경로로 바꾸십시오.
- CloudFront 배포를 테스트하여 CloudFormation 스택이 생성 또는 업데이트되었는지 확인합니다.
관련 정보
CloudFront 배포에서 다양한 오리진 사용
CloudFormation 콘솔에서 스택 생성
AWS CloudFormation 모범 사례