Configurer des réponses d'erreur personnalisées

Ce document fournit des exemples de configurations de réponses d'erreur personnalisées. Avant de configurer une réponse d'erreur personnalisée, consultez la page Présentation des réponses d'erreur personnalisées.

Les exemples de configuration décrits sur cette page permettent de configurer une stratégie de réponse d'erreur personnalisée à trois niveaux de la ressource de mappage d'URL : au niveau de l'équilibreur de charge, au niveau du domaine de l'URL et au niveau du chemin d'URL.

Les exemples de configurations s'appuient sur des concepts et des configurations décrits dans les documents suivants :

Exemple 1 : Configurer une page d'erreur pour toutes les erreurs 4xx communes à tous les hôtes

Cet exemple suppose que vous avez configuré un équilibreur de charge comme décrit dans la section Configurer un équilibreur de charge d'application externe global avec des backends de groupe d'instances de VM.

Dans cet exemple, les requêtes adressées à l'équilibreur de charge sont acheminées vers le service de backend nommé web-backend-service. Si la requête rencontre une réponse 4xx, la stratégie de réponse d'erreur personnalisée est configurée pour envoyer la requête au service d'erreur, et un objet d'erreur (not-found.html) est renvoyé au client.

Pour créer une stratégie de réponse d'erreur personnalisée, procédez comme suit :

  1. Importez la page d'erreur HTML (not-found.html) dans le bucket Cloud Storage.

    gcloud storage cp Desktop/not-found.html gs://GCS_BUCKET_NAME/
    
  2. Exportez le mappage d'URL (web-map-http) dans un fichier nommé web-map-http.yaml.

    gcloud compute url-maps export web-map-http --destination web-map-http.yaml
    

    Avant d'ajouter la règle de réponse aux erreurs personnalisée, le mappage d'URL (web-map-http) présente une configuration semblable à la suivante.

    creationTimestamp: '2020-01-14T19:12:44.680-08:00'
    defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/web-backend-service
    fingerprint: d0eJJpCBpHg=
    kind: compute#urlMap
    name: web-map-http
    selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/urlMaps/web-map-http
    
  3. Modifiez web-map-http.yaml pour ajouter une règle de réponse aux erreurs personnalisée, comme indiqué dans la configuration YAML suivante, dans la section defaultCustomErrorResponsePolicy. Dans cet exemple, une stratégie de réponse d'erreur est configurée au niveau de l'équilibreur de charge (urlMaps.defaultCustomErrorResponsePolicy).

    creationTimestamp: '2020-01-14T19:12:44.680-08:00'
    defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/web-backend-service
    defaultCustomErrorResponsePolicy:
      errorResponseRules:
        - matchResponseCodes:
          - 4xx
          path: '/not-found.html'
      errorService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets/CUSTOM_ERRORS_BUCKET
    fingerprint: d0eJJpCBpHg=
    kind: compute#urlMap
    name: web-map-http
    selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/urlMaps/web-map-http
    

    Nous vous recommandons de stocker tous vos objets d'erreur dans un bucket Cloud Storage et de les référencer par un bucket backend associé à votre équilibreur de charge. Les buckets Cloud Storage vous permettent de stocker facilement vos objets d'erreur et de les renvoyer à vos clients à l'aide de l'équilibreur de charge. Toutefois, vous pouvez également diffuser des pages d'erreur et des éléments associés sans utiliser de bucket backend. Par exemple, vous pouvez utiliser un service de backend faisant référence à un backend de groupe d'instances de VM doté d'un serveur Apache configuré pour diffuser une page de réponse d'erreur personnalisée.

  4. Mettez à jour le mappage d'URL en important la dernière configuration depuis web-map-http.yaml.

    gcloud compute url-maps import web-map-http --source web-map-http.yaml
    
  5. Après avoir mis à jour le mappage d'URL, vous devez attendre un certain temps avant de pouvoir commencer à envoyer du trafic vers l'adresse IP de votre équilibreur de charge.

    Envoyez une requête pour une page qui n'existe pas.

    curl -I http://IP_ADDRESS/a-page-that-does-not-exist
    

    Le contenu d'erreur de not-found.html est diffusé et un code d'état HTTP 404 est renvoyé.

Exemple 2 : Configurer une page d'erreur pour un code d'erreur spécifique pour un hôte spécifique

Cet exemple s'appuie sur l'exemple précédent : Configurer une page d'erreur pour toutes les erreurs 4xx communes à tous les hôtes. Nous partons ici du principe qu'un équilibreur de charge est déjà configuré de sorte que les requêtes adressées à l'hôte video.example.com soient acheminées vers le service de backend nommé video-backend-service. Si une requête échoue l'autorisation du service de backend, le service renvoie une réponse 401 (Unauthorized). La stratégie de réponse d'erreur personnalisée est configurée pour envoyer la requête au service d'erreur, et un objet d'erreur (video-obtain-authorization.html) est renvoyé au client.

Dans la plupart des cas, votre contenu d'erreur est susceptible de contenir des liens vers des éléments, par exemple une image de logo. Le client envoie des requêtes pour les éléments référencés sur la page d'erreur, et des requêtes supplémentaires sont envoyées à l'équilibreur de charge pour les récupérer. L'équilibreur de charge répond ensuite à la requête et renvoie les éléments associés. Pour ce faire, stockez ces éléments dans le même bucket backend spécifié dans defaultCustomErrorResponsePolicy et ajoutez une règle pour acheminer les requêtes des URL d'éléments (par exemple, /assets/logo.svg) vers le bucket backend. La réponse de l'équilibreur de charge à la requête pour les éléments associés n'est pas une réponse d'erreur, mais une réponse normale, comme illustré dans la configuration suivante.

pathMatchers:
...
  pathRules:
  - service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets/CUSTOM_ERRORS_BUCKET
    paths:
    - /assets

La règle vous permet également de définir le code de réponse final de la requête. Dans cet exemple, le code de réponse est passé de 401 à 200 en spécifiant la valeur de overrideResponseCode à 200. Pour toutes les autres erreurs 4xx, le contenu de l'erreur dans not-found.html est renvoyé au client, et le code de réponse HTTP d'origine du service de backend est conservé.

Comme indiqué dans le tableau suivant, deux stratégies de réponse d'erreur personnalisées sont configurées dans cet exemple. Ces règles sont créées au niveau de l'équilibreur de charge et au niveau du domaine d'URL.

Niveau de la stratégie Champ de l'API Correspond au code de réponse HTTP Service d'erreur Objet d'erreur renvoyé
Domaine d'URL pathMatchers[].defaultCustomErrorResponsePolicy 401 CUSTOM_ERRORS_BUCKET video-obtain-authorization.html
Équilibreur de charge urlMaps.defaultCustomErrorResponsePolicy Tous les 4xx CUSTOM_ERRORS_BUCKET not-found.html

Pour créer une stratégie de réponse d'erreur personnalisée pour un code d'erreur 401 pour l'hôte video.example.com, procédez comme suit :

  1. Importez la page d'erreur HTML (video-obtain-authorization.html) et les éléments associés (logo.svg) dans le bucket Cloud Storage.

    gcloud storage cp Desktop/video-obtain-authorization.html gs://GCS_BUCKET_NAME/
    gcloud storage cp Desktop/logo.svg gs://GCS_BUCKET_NAME/assets/
    
  2. Exportez le mappage d'URL (web-map-http) dans un fichier nommé web-map-http.yaml.

    gcloud compute url-maps export web-map-http --destination web-map-http.yaml
    
  3. Modifiez web-map-http.yaml pour ajouter une règle de réponse aux erreurs personnalisée, comme indiqué dans la configuration YAML suivante, dans la section defaultCustomErrorResponsePolicy. Dans cet exemple, une stratégie de réponse d'erreur personnalisée est configurée au niveau de l'équilibreur de charge (urlMaps.defaultCustomErrorResponsePolicy) et au niveau du domaine d'URL (pathMatchers[].defaultCustomErrorResponsePolicy).

    Comme le service d'erreur n'est pas défini au niveau du domaine d'URL, le service d'erreur au niveau du domaine d'URL est défini par défaut sur le service d'erreur défini au niveau supérieur, c'est-à-dire au niveau de l'équilibreur de charge.

    creationTimestamp: '2020-01-14T19:12:44.680-08:00'
    defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/web-backend-service
    defaultCustomErrorResponsePolicy:
      errorResponseRules:
        - matchResponseCodes:
          - 4xx
          path: '/not-found.html'
      errorService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets/CUSTOM_ERRORS_BUCKET
    fingerprint: d0eJJpCBpHg=
    hostRules:
    - hosts:
      - video.example.com
      pathMatcher: path-matcher-1
    kind: compute#urlMap
    name: web-map-http
    selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/urlMaps/web-map-http
    pathMatchers:
    - defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/video-backend-service
      name: path-matcher-1
      defaultCustomErrorResponsePolicy:
        errorResponseRules:
          - matchResponseCodes:
            - 401
            path: "/video-obtain-authorization.html
            overrideResponseCode: 200
        // The `errorService` in `pathMatchers[].defaultCustomErrorResponsePolicy` references the
        // error service configured in `urlMaps.defaultCustomErrorResponsePolicy`.
    
      // A URL map path rule to route requests from asset URLs (for example, "/assets/logo.svg") to the backend bucket.
      pathRules:
      - service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets/CUSTOM_ERRORS_BUCKET
        paths:
        - /assets
    
  4. Mettez à jour le mappage d'URL en important la dernière configuration à partir de web-map-http.yaml.

    gcloud compute url-maps import web-map-http --source web-map-http.yaml
    
  5. Après avoir mis à jour le mappage d'URL, vous devez attendre un certain temps avant de pouvoir commencer à envoyer du trafic vers l'adresse IP de votre équilibreur de charge.

    Envoyez une requête à votre hôte pour obtenir une URL nécessitant une autorisation.

    curl -I http://video.example.com/a-page-that-needs-authorization
    

    Le contenu d'erreur de video-obtain-authorization.html est diffusé et un code d'état HTTP 200 est renvoyé.

Exemple 3 : Configurer des stratégies de réponse d'erreur personnalisées précises pour différents domaines, chemins et codes de réponse d'erreur

Cet exemple montre comment personnaliser des réponses d'erreur spécifiques pour différents domaines d'URL, chemins d'URL et codes de réponse d'erreur HTTP.

La configuration de réponse d'erreur personnalisée, expliquée dans cet exemple, suppose ce qui suit :

Comme indiqué dans le tableau suivant, quatre stratégies de réponse d'erreur personnalisées sont configurées dans cet exemple. Ces règles sont créées sur trois niveaux dans l'ordre de priorité suivant :

  1. Chemin de l'URL (pathMatchers[].pathRules[].customErrorResponsePolicy)
  2. Domaine d'URL (pathMatchers[].defaultCustomErrorResponsePolicy)
  3. Équilibreur de charge (urlMaps.defaultCustomErrorResponsePolicy)
Niveau de la stratégie URL de la requête Correspond au code de réponse HTTP Service d'erreur Objet d'erreur renvoyé
Chemin de l'URL example.net/video/hd/* 404 BUCKET-2 not-found-hd-videos-404.html
Chemin de l'URL example.net/video/sd/* 404 BUCKET-2 not-found-sd-videos-404.html
Domaine d'URL example.net/* Tous les 4xx BUCKET-1 example-net-4xx.html
Équilibreur de charge Any Tout les 4xx ou 5xx BUCKET-1 error-page-generic.html

La stratégie de réponse d'erreur personnalisée au niveau de l'équilibreur de charge n'est appliquée que si elle correspond aux conditions d'erreur et qu'aucune règle de correspondance n'a été définie pour le code d'erreur aux niveaux inférieurs, c'est-à-dire le domaine de l'URL ou le chemin d'URL. De même, la stratégie de réponse d'erreur personnalisée au niveau du domaine de l'URL n'est appliquée que si la règle correspond aux conditions d'erreur et qu'aucune règle de correspondance n'a été définie pour le code d'erreur au niveau inférieur, c'est-à-dire le chemin de l'URL. Dans cet exemple, si une requête adressée à l'URL www.example.net/video/hd rencontre une réponse 404, le fichier not-found-hd-videos-404.html est renvoyé. Toutefois, si une réponse 404 est rencontrée pour une requête adressée à l'URL www.example.net/video/, le fichier example-net-4xx.html est renvoyé.

Pour créer des stratégies de réponse d'erreur personnalisées sur trois niveaux du mappage d'URL, procédez comme suit :

  1. Importez les objets d'erreur dans les buckets Cloud Storage.

    gcloud storage cp Desktop/error-page-generic.html gs://GCS_BUCKET_1_NAME/
    gcloud storage cp Desktop/example-net-4xx.html gs://GCS_BUCKET_1_NAME/
    gcloud storage cp Desktop/not-found-sd-videos-404.html gs://GCS_BUCKET_2_NAME/
    gcloud storage cp Desktop/not-found-hd-videos-404.html gs://GCS_BUCKET_2_NAME/
    
  2. Exportez le mappage d'URL (video-org-url-map) dans un fichier nommé video-org-url-map.yaml..

    gcloud compute url-maps export video-org-url-map --destination video-org-url-map.yaml
    

    Avant d'ajouter la règle de réponse aux erreurs personnalisée, le mappage d'URL (video-org-url-map) présente une configuration semblable à la suivante.

    creationTimestamp: '2021-03-05T13:34:15.833-08:00'
    defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/org-site
    fingerprint: mfyJIT7Zurs=
    hostRules:
    - hosts:
      - '*'
      pathMatcher: video-matcher
    - hosts:
      - example.net
      pathMatcher: video-matcher
    id: '8886405179645041976'
    kind: compute#urlMap
    name: video-org-url-map
    pathMatchers:
    - defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/video-site
      name: video-matcher
      pathRules:
      - paths:
        - /video/hd
        - /video/hd/*
        service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/video-hd
      - paths:
        - /video/sd
        - /video/sd/*
        service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/video-sd
    selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/urlMaps/video-org-url-map
    
  3. Modifiez video-org-url-map.yaml pour ajouter des règles de réponse aux erreurs personnalisées, comme indiqué dans la configuration YAML suivante, dans la section defaultCustomErrorResponsePolicy.

    Comme le service d'erreur n'est pas défini au niveau du domaine d'URL, le service d'erreur au niveau du domaine d'URL est défini par défaut sur le service d'erreur défini au niveau supérieur, c'est-à-dire au niveau de l'équilibreur de charge.

    creationTimestamp: '2021-03-05T13:34:15.833-08:00'
    defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/org-site
    fingerprint: mfyJIT7Zurs=
    hostRules:
    - hosts:
      - '*'
      pathMatcher: video-matcher
    - hosts:
      - example.net
      pathMatcher: video-matcher
    id: '8886405179645041976'
    kind: compute#urlMap
    name: video-org-url-map
    defaultCustomErrorResponsePolicy:
      errorResponseRules:
        - matchResponseCodes:
          - 4xx
          - 5xx
          path: '/error-page-generic.html'
      errorService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets/BUCKET-1
    pathMatchers:
    - defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/video-site
      name: video-matcher
      defaultCustomErrorResponsePolicy:
          errorResponseRules:
            - matchResponseCodes:
              - 4xx
              path: '/example-net-4xx.html'
          // The `errorService` in `pathMatchers[].defaultCustomErrorResponsePolicy` references the
          // error service configured in `urlMaps.defaultCustomErrorResponsePolicy`.
      pathRules:
      - paths:
        - /video/hd
        - /video/hd/*
        service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/video-hd
        customErrorResponsePolicy:
              errorResponseRules:
                - matchResponseCodes:
                  - 404
                  path: '/not-found-hd-videos-404.html'
              errorService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets/BUCKET-2
      - paths:
        - /video/sd
        - /video/sd/*
        service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/video-sd
        customErrorResponsePolicy:
              errorResponseRules:
                - matchResponseCodes:
                  - 404
                  path: '/not-found-sd-videos-404.html'
              errorService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets/BUCKET-2
    selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/urlMaps/video-org-url-map
    
  4. Mettez à jour le mappage d'URL en important la dernière configuration à partir de video-org-url-map.yaml.

    gcloud compute url-maps import video-org-url-map --source video-org-url-map.yaml
    
  5. Après avoir mis à jour le mappage d'URL, vous devez attendre un certain temps avant de pouvoir commencer à envoyer du trafic vers l'adresse IP de votre équilibreur de charge.

    Envoyez une requête pour une page qui n'existe pas.

    curl -I http://example.net/a-page-that-does-not-exist
    

    Le contenu d'erreur de example-net-4xx.html est diffusé.

    De même, testez d'autres URL avec des domaines d'URL et des chemins d'URL différents.