Configurar respuestas de error personalizadas

En este documento se proporcionan ejemplos de configuraciones de respuestas de error personalizadas. Antes de configurar una respuesta de error personalizada, consulta el resumen de las respuestas de error personalizadas.

Las configuraciones de ejemplo descritas en esta página configuran una política de respuesta de error personalizada en tres niveles del recurso de mapa de URLs: el nivel del balanceador de carga, el nivel del dominio de la URL y el nivel de la ruta de la URL.

Las configuraciones de ejemplo se basan en conceptos y configuraciones descritos en los siguientes documentos:

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

En este ejemplo se da por hecho que has configurado un balanceador de carga tal como se describe en el artículo Configurar un balanceador de carga de aplicación externo global con backends de grupos de instancias de máquina virtual.

En este ejemplo, las solicitudes al balanceador de carga se enrutan al servicio de backend llamado web-backend-service. Si la solicitud recibe una respuesta 4xx, la política de respuesta de error personalizada se configura para enviar la solicitud al servicio de errores y se devuelve 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 HTML (not-found.html) al depósito de Cloud Storage.

    gcloud storage cp Desktop/not-found.html gs://GCS_BUCKET_NAME/
    
  2. Exporta el mapa de URLs (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 añadir la política de respuesta de error personalizada, el mapa de URLs (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 añadir una política de respuesta de error personalizada, tal como se destaca en la siguiente configuración YAML, en la sección defaultCustomErrorResponsePolicy. En este ejemplo, se configura una política de respuesta de error a nivel del balanceador de carga (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 segmento de Cloud Storage y que hagas referencia a ellos desde un segmento de backend adjunto a tu balanceador de carga. Los segmentos de Cloud Storage te ofrecen una forma sencilla de almacenar tus objetos de error y de que el balanceador de carga los devuelva a tus clientes. Sin embargo, también puedes servir páginas de error y recursos relacionados sin usar un backend bucket. Por ejemplo, puedes usar un servicio de backend que haga referencia a un backend de grupo de instancias de VM que tenga un servidor Apache configurado para servir una página de respuesta de error personalizada.

  4. Actualiza el mapa de URLs importando la configuración más reciente de 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 URLs, debes esperar un tiempo antes de poder empezar a enviar tráfico a la dirección IP de tu balanceador de carga.

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

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

    Se sirve el contenido del error de not-found.html y se devuelve un código de estado HTTP 404.

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

Este ejemplo se basa en el anterior: Configurar una página de error para todos los errores 4xx comunes a todos los hosts. Se presupone que ya se ha configurado un balanceador de carga de forma que las solicitudes al host video.example.com se enruten al servicio de backend llamado video-backend-service. Si un servicio backend no autoriza una solicitud, el servicio devuelve una respuesta 401 (Unauthorized). La política de respuesta de error personalizada se configura para enviar la solicitud al servicio de errores y se devuelve un objeto de error (video-obtain-authorization.html) al cliente.

En la mayoría de los casos, es probable que el contenido del error contenga enlaces a recursos, como una imagen de logotipo. El cliente envía solicitudes de recursos a los que se hace referencia en la página de error y se envían solicitudes adicionales al balanceador de carga para obtenerlos. A continuación, el balanceador de carga responde a la solicitud y devuelve los recursos vinculados. Para ello, se almacenan estos recursos en el mismo contenedor de backend especificado en defaultCustomErrorResponsePolicy y se añade una regla para enrutar las solicitudes de las URLs de los recursos (por ejemplo, /assets/logo.svg) al contenedor de backend. La respuesta del balanceador de carga 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 de la solicitud. En este ejemplo, el código de respuesta ha cambiado de 401 a 200 al especificar el valor de overrideResponseCode como 200. En el caso de los demás errores 4xx, el contenido del error en not-found.html se devuelve al cliente y se conserva el código de respuesta HTTP original del servicio de backend.

Como se muestra en la siguiente tabla, en este ejemplo se han configurado dos políticas de respuesta de error personalizadas. Estas políticas se crean a nivel del balanceador de carga y del dominio de la URL.

Nivel de la política Campo de la API Coincidir con el código de respuesta HTTP Servicio de errores Objeto de error devuelto
Dominio de URL pathMatchers[].defaultCustomErrorResponsePolicy 401 CUSTOM_ERRORS_BUCKET video-obtain-authorization.html
Balanceador de carga urlMaps.defaultCustomErrorResponsePolicy Todos los 4xx CUSTOM_ERRORS_BUCKET not-found.html

Para crear una política de respuesta de error personalizada para un código de error 401 del host video.example.com, siga estos pasos:

  1. Sube la página de error HTML (video-obtain-authorization.html) y los recursos relacionados (logo.svg) al segmento 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 URLs (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 añadir una política de respuesta de error personalizada, tal como se destaca en la siguiente configuración YAML, en la sección defaultCustomErrorResponsePolicy. En este ejemplo, se configura una política de respuesta de error personalizada en el nivel del balanceador de carga (urlMaps.defaultCustomErrorResponsePolicy) y en el nivel del dominio de la URL (pathMatchers[].defaultCustomErrorResponsePolicy).

    Como el servicio de errores no está definido en el nivel de dominio de la URL, el servicio de errores en el nivel de dominio de la URL se define de forma predeterminada como el servicio de errores definido en el nivel superior, es decir, el nivel del balanceador de carga.

    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. Actualiza el mapa de URLs importando la configuración más reciente de 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 URLs, debes esperar un tiempo antes de poder empezar a enviar tráfico a la dirección IP de tu balanceador de carga.

    Envía una solicitud a tu host para obtener una URL que necesite autorización.

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

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

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

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

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

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

  1. Ruta de URL (pathMatchers[].pathRules[].customErrorResponsePolicy)
  2. Dominio de URL (pathMatchers[].defaultCustomErrorResponsePolicy)
  3. Balanceador de carga (urlMaps.defaultCustomErrorResponsePolicy)
Nivel de la política Solicitar URL Coincidir con el código de respuesta HTTP Servicio de errores Objeto de error devuelto
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 carga Any Todos los errores 4xx o 5xx BUCKET-1 error-page-generic.html

La política de respuesta de error personalizada a nivel del balanceador de carga solo se aplica si la política coincide con las condiciones de error y no se ha definido ninguna política coincidente para el código de error en los niveles inferiores, es decir, el dominio o la ruta de la URL. Del mismo modo, la política de respuesta de error personalizada a nivel de dominio de URL solo se aplica si la política coincide con las condiciones de error y no se ha definido ninguna política coincidente para el código de error en el nivel inferior, es decir, la ruta de la URL. En este ejemplo, si una solicitud a la URL www.example.net/video/hd recibe una respuesta 404, se devuelve 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 devuelve el archivo example-net-4xx.html.

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

  1. Sube los objetos de error a los segmentos 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 URLs (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 añadir la política de respuesta de error personalizada, el mapa de URLs (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 añadir políticas de respuesta de error personalizadas, tal como se destaca en la siguiente configuración YAML, en la sección defaultCustomErrorResponsePolicy.

    Como el servicio de errores no está definido en el nivel de dominio de la URL, el servicio de errores en el nivel de dominio de la URL se define de forma predeterminada como el servicio de errores definido en el nivel superior, es decir, el nivel del balanceador de carga.

    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. Actualiza el mapa de URLs importando la configuración más reciente de 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 URLs, debes esperar un tiempo antes de poder empezar a enviar tráfico a la dirección IP de tu balanceador de carga.

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

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

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

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