Configura respuestas de error personalizadas

En este documento, se proporcionan configuraciones de ejemplo de respuestas de error personalizadas. Antes de configurar una respuesta de error personalizada, lee la descripción general de la respuesta de error personalizada.

En las opciones de configuración de ejemplo que se describen en esta página, se configura una política de respuesta de error personalizada en tres niveles del recurso de mapa de URL: el nivel del balanceador de cargas, el nivel de dominio de URL y el nivel de ruta de URL. .

Los parámetros de configuración de ejemplo se basan en los conceptos y se basan en los parámetros de configuración descritos en los siguientes documentos:

Ejemplo 1: Configura una página de error para todos los errores 4xx comunes a todos los hosts

En este ejemplo, se supone que configuraste un balanceador de cargas como se describe en Configura un balanceador de cargas de aplicaciones externo global con backends de grupos de instancias de VM.

En este ejemplo, las solicitudes al balanceador de cargas se enrutan al servicio de backend llamado web-backend-service. Si la solicitud encuentra una respuesta 4xx, la política de respuesta de error personalizada se configura para enviar la solicitud al servicio de error y se muestra un objeto de error (not-found.html) al cliente.

Para crear una política de respuesta de error personalizada, sigue estos pasos:

  1. Sube la página de error de HTML (not-found.html) al bucket de Cloud Storage.

    gcloud storage cp Desktop/not-found.html gs://GCS_BUCKET_NAME/
    
  2. Exporta el mapa de URL (web-map-http) a un archivo llamado web-map-http.yaml.

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

    Antes de agregar la política de respuesta de error personalizada, el mapa de URL (web-map-http) tiene una configuración similar a la siguiente.

    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. Edita web-map-http.yaml para agregar una política de respuesta de error personalizada, como se destaca en la siguiente configuración de YAML, en la sección defaultCustomErrorResponsePolicy. En este ejemplo, se configura una política de respuesta de error a nivel del balanceador de cargas (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
    

    Te recomendamos que almacenes todos tus objetos de error en un bucket de Cloud Storage y que un bucket de backend conectado a tu equilibrador de carga haga referencia a ellos. Los buckets de Cloud Storage ofrecen una forma sencilla de almacenar tus objetos de error y hacer que se muestren a tus clientes mediante el balanceador de cargas. Sin embargo, también puedes entregar páginas de error y elementos relacionados sin usar un bucket de backend. Por ejemplo, puedes usar un servicio de backend, que hace referencia a un backend de grupo de instancias de VM que tiene un servidor Apache configurado para entregar una página de respuesta de error personalizada.

  4. Para actualizar el mapa de URL, importa la configuración más reciente desde web-map-http.yaml.

    gcloud compute url-maps import web-map-http --source web-map-http.yaml
    
  5. Después de actualizar el mapa de URL, debes esperar un tiempo antes de comenzar a enviar tráfico a la dirección IP del balanceador de cargas.

    Envía una solicitud para una página que no existe.

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

    Se entrega el contenido de error de not-found.html y se muestra un código de estado HTTP 404.

Ejemplo 2: Configura una página de error para un código de error específico para un host específico

Este ejemplo se basa en el anterior: Configura una página de error para todos los errores 4xx comunes a todos los hosts. Se supone que un balanceador de cargas ya está configurado de modo que las solicitudes al host video.example.com se enruten al servicio de backend llamado video-backend-service. Si una solicitud falla con la autorización del servicio de backend, el servicio muestra una respuesta 401 (Unauthorized). La política de respuesta de error personalizada está configurada para enviar la solicitud al servicio de error y se muestra un objeto de error (video-obtain-authorization.html) al cliente.

En la mayoría de los casos, es probable que el contenido de error contenga vínculos a elementos, por ejemplo, una imagen de logotipo. El cliente realiza solicitudes para los recursos a los que se hace referencia en la página de error, y se envían solicitudes adicionales al balanceador de cargas para recuperarlos. El balanceador de cargas responde a la solicitud y muestra los elementos vinculados. Para ello, se almacenan estos recursos en el mismo bucket de backend especificado en defaultCustomErrorResponsePolicy y se agrega una regla para enrutar las solicitudes de las URLs de los recursos (por ejemplo, /assets/logo.svg) al bucket de backend. . La respuesta del balanceador de cargas a la solicitud de recursos vinculados no es una respuesta de error, sino una respuesta normal, como se muestra en la siguiente configuración.

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

La política también te permite definir cuál debe ser el código de respuesta final para la solicitud. En este ejemplo, el código de respuesta cambió de 401 a 200 mediante la especificación del valor de overrideResponseCode a 200. Para todos los demás errores 4xx, el contenido de error en not-found.html se muestra al cliente y se conserva el código de respuesta HTTP original del servicio de backend.

Como se muestra en la siguiente tabla, se configuran dos políticas de respuesta de error personalizadas en este ejemplo. Estas políticas se crean a nivel del balanceador de cargas y de los dominios de URL.

Nivel de política Campo de API Código de respuesta HTTP de coincidencia Error de servicio Objeto de error mostrado
Dominio de URL pathMatchers[].defaultCustomErrorResponsePolicy 401 CUSTOM_ERRORS_BUCKET video-obtain-authorization.html
Balanceador de cargas urlMaps.defaultCustomErrorResponsePolicy Todos los 4xx CUSTOM_ERRORS_BUCKET not-found.html

Si deseas crear una política de respuesta de error personalizada para un código de error 401 en el host video.example.com, sigue estos pasos:

  1. Sube la página de error de HTML (video-obtain-authorization.html) y los elementos relacionados (logo.svg) al bucket de 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. Exporta el mapa de URL (web-map-http) a un archivo llamado web-map-http.yaml.

    gcloud compute url-maps export web-map-http --destination web-map-http.yaml
    
  3. Edita web-map-http.yaml para agregar una política de respuesta de error personalizada, como se destaca en la siguiente configuración de YAML, en la sección defaultCustomErrorResponsePolicy. En este ejemplo, se configura una política de respuesta de error personalizada a nivel del balanceador de cargas (urlMaps.defaultCustomErrorResponsePolicy) y del dominio de la URL (pathMatchers[].defaultCustomErrorResponsePolicy).

    Como el servicio de error no se define a nivel del dominio de la URL, el servicio de error a nivel del dominio de la URL se establece de forma predeterminada en el servicio de error definido en el nivel superior, es decir, el nivel del balanceador de cargas.

    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. Para actualizar el mapa de URL, importa la configuración más reciente desde web-map-http.yaml.

    gcloud compute url-maps import web-map-http --source web-map-http.yaml
    
  5. Después de actualizar el mapa de URL, debes esperar un tiempo antes de comenzar a enviar tráfico a la dirección IP del balanceador de cargas.

    Envía una solicitud al host de una URL que requiera autorización.

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

    Se entrega el contenido de error de video-obtain-authorization.html y se muestra un código de estado HTTP 200.

Ejemplo 3: Configura políticas de respuesta de error personalizadas y detalladas para diferentes dominios, rutas de acceso y códigos de respuesta de error

En este ejemplo, se muestra cómo personalizar respuestas de error específicas para diferentes dominios URL, rutas de URL y códigos de respuesta de error de HTTP.

La configuración de respuesta de error personalizada, que se explica en este ejemplo, supone lo siguiente:

Como se muestra en la siguiente tabla, se configuran cuatro políticas de respuesta de error personalizadas en este ejemplo. Estas políticas se crean en tres niveles en el siguiente orden de prioridad:

  1. Ruta de URL (pathMatchers[].pathRules[].customErrorResponsePolicy)
  2. Dominio de URL (pathMatchers[].defaultCustomErrorResponsePolicy)
  3. Balanceador de cargas (urlMaps.defaultCustomErrorResponsePolicy)
Nivel de política Solicitar URL Código de respuesta HTTP de coincidencia Error de servicio Objeto de error mostrado
Ruta de URL example.net/video/hd/* 404 BUCKET-2 not-found-hd-videos-404.html
Ruta de URL example.net/video/sd/* 404 BUCKET-2 not-found-sd-videos-404.html
Dominio de URL example.net/* Todos los 4xx BUCKET-1 example-net-4xx.html
Balanceador de cargas Any Todos los 4xx o 5xx BUCKET-1 error-page-generic.html

La política de respuesta de error personalizada en el nivel de balanceador de cargas se aplica solo si la política coincide con las condiciones de error y no se definió una política coincidente para el código de error en los niveles inferiores. es decir, el dominio de URL o la ruta de URL. Del mismo modo, la política de respuesta de error personalizada en el nivel de dominio URL se aplica solo si la política coincide con las condiciones de error y no se definió ninguna política coincidente para el código de error en el nivel inferior; es decir, la ruta de URL. En este ejemplo, si una solicitud a la URL www.example.net/video/hd encuentra una respuesta 404, se muestra el archivo not-found-hd-videos-404.html. Sin embargo, si se encuentra una respuesta 404 para una solicitud a la URL www.example.net/video/, se muestra el archivo example-net-4xx.html.

Para crear políticas de respuesta de error personalizadas en tres niveles del mapa de URL, sigue estos pasos:

  1. Sube los objetos con errores a los buckets de 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. Exporta el mapa de URL (video-org-url-map) a un archivo llamado video-org-url-map.yaml..

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

    Antes de agregar la política de respuesta de error personalizada, el mapa de URL (video-org-url-map) tiene una configuración similar a la siguiente.

    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. Edita video-org-url-map.yaml para agregar políticas de respuesta de error personalizadas, como se destaca en la siguiente configuración de YAML, en la sección defaultCustomErrorResponsePolicy.

    Como el servicio de error no se define a nivel del dominio de la URL, el servicio de error a nivel del dominio de la URL se establece de forma predeterminada en el servicio de error definido en el nivel superior, es decir, el nivel del balanceador de cargas.

    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. Para actualizar el mapa de URL, importa la configuración más reciente desde video-org-url-map.yaml.

    gcloud compute url-maps import video-org-url-map --source video-org-url-map.yaml
    
  5. Después de actualizar el mapa de URL, debes esperar un tiempo antes de comenzar a enviar tráfico a la dirección IP del balanceador de cargas.

    Envía una solicitud para una página que no existe.

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

    Se entrega el contenido de error de example-net-4xx.html.

    Del mismo modo, prueba otras URLs con diferentes dominios y rutas de URL.