AWS CloudFormation を使用して AWS::CloudFront::Distribution リソースを更新しようとすると、次のエラーが表示されます。 「1 つ以上のオリジンまたはオリジングループが存在しません。」
解決策
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 が一致しない場合は、DefaultCacheBehavior または CacheBehavior のパラメータに、正しいオリジン ID を入力します。
以下のテンプレートスニペット例では、DefaultCacheBehavior が単一オリジンの CloudFront ディストリビューションを定義して使用しています。また、オリジンは認証にオリジンアクセスアイデンティティ (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 のベストプラクティス