Comment résoudre l'erreur « One or more of your origins or origin groups do not exist » (Un ou plusieurs de vos groupes d'origine ou origines n'existent pas) dans AWS CloudFormation ?

Dernière mise à jour : 18/08/2022

Lorsque j'essaie de créer ou de mettre à jour une pile AWS CloudFormation qui contient une distribution Amazon CloudFront, l'erreur suivante s'affiche :

« One or more of your origins or origin groups do not exist. » (Un ou plusieurs de vos groupes d'origine ou origines n'existent pas)

Brève description

Cette erreur se produit lorsque la propriété TargetOriginId de CacheBehavior ou DefaultCacheBehavior ne correspond pas à un ID d'origine ou de groupe d'origine CloudFront. Cet ID est une chaîne définie par l'utilisateur qui identifie de façon unique une origine ou un groupe d'origine. Vous devez définir le groupe d'origine dans le modèle et gérer vos ressources via CloudFormation.

Conseil : une bonne pratique consiste à éviter d'apporter des modifications aux ressources de la pile en dehors de CloudFormation. Cela peut créer une incompatibilité entre le modèle de votre pile et l'état actuel des ressources de votre pile. Si vous mettez à jour ou supprimez la pile, l'incompatibilité peut engendrer des erreurs.

Solution

1.    Vérifiez que le TargetOriginId correspond à l'ID de l'une des origines ou groupes d'origine définis. Saisissez l'ID d'origine correct en tant que paramètre pour DefaultCacheBehavior ou CacheBehavior.

Dans les exemples suivants d'extraits de modèle JSON et YAML, une distribution CloudFront avec une seule origine est définie et consommée par DefaultCacheBehavior. De plus, cette origine utilise une identité d'accès d'origine (OAI) pour l'authentification. Dans les exemples, l'ID d'origine est défini sur 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"
          }
        }
      }
    }
  }
}

Remarque : remplacez my-s3-origin par votre ID d'origine, my-s3-bucket.s3.amazonaws.com par votre nom de domaine et /my-content par votre chemin d'origine.

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.    Pour vérifier que votre pile CloudFormation a bien été créée ou mise à jour, testez votre distribution CloudFront.