커스텀 오류 응답 구성

이 문서에서는 커스텀 오류 응답 구성의 예시를 제공합니다. 커스텀 오류 응답을 구성하기 전에 커스텀 오류 응답 개요를 읽어보세요.

이 페이지에 설명된 예시 구성에서는 부하 분산기 수준, URL 도메인 수준, URL 경로 수준 등 URL 맵 리소스의 세 가지 수준에서 커스텀 오류 응답 정책을 구성합니다.

구성 예시는 개념을 바탕으로 하고 다음 문서에 설명된 설정을 기반으로 합니다.

예시 1: 모든 호스트에 공통된 모든 4xx 오류에 대한 오류 페이지 구성

이 예시에서는 VM 인스턴스 그룹 백엔드가 있는 전역 외부 애플리케이션 부하 분산기 설정에 설명된 대로 부하 분산기를 설정했다고 가정합니다.

이 예시에서 부하 분산기에 대한 요청은 web-backend-service라는 백엔드 서비스로 라우팅됩니다. 요청에 4xx 응답이 발견되면 커스텀 오류 응답 정책이 오류 서비스로 요청을 전송하도록 구성되고 오류 객체(not-found.html)가 클라이언트에 반환됩니다.

커스텀 오류 응답 정책을 만들려면 다음 단계를 수행합니다.

  1. HTML 오류 페이지(not-found.html)를 Cloud Storage 버킷에 업로드합니다.

    gcloud storage cp Desktop/not-found.html gs://GCS_BUCKET_NAME/
    
  2. URL 맵(web-map-http)을 web-map-http.yaml이라는 파일로 내보냅니다.

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

    커스텀 오류 응답 정책을 추가하기 전에 URL 맵(web-map-http)에는 다음과 비슷한 구성이 있습니다.

    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. defaultCustomErrorResponsePolicy 섹션에서 web-map-http.yaml을 수정하여 다음 YAML 구성에 강조표시된 대로 커스텀 오류 응답 정책을 추가합니다. 이 예시에서는 오류 응답 정책이 부하 분산기 수준(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
    

    모든 오류 객체를 Cloud Storage 버킷에 저장하여 부하 분산기에 연결된 백엔드 버킷에서 참조하도록 하는 것이 좋습니다. Cloud Storage 버킷은 부하 분산기를 사용하여 오류 객체를 저장하고 클라이언트에 반환할 수 있는 간단한 방법을 제공합니다. 하지만 백엔드 버킷을 사용하지 않고 오류 페이지와 관련 애셋을 제공할 수도 있습니다. 예를 들어 커스텀 오류 응답 페이지를 제공하도록 구성된 Apache 서버가 있는 VM 인스턴스 그룹 백엔드를 참조하는 백엔드 서비스를 사용할 수 있습니다.

  4. web-map-http.yaml에서 최신 구성을 가져와서 URL 맵을 업데이트합니다.

    gcloud compute url-maps import web-map-http --source web-map-http.yaml
    
  5. URL 맵을 업데이트한 후 부하 분산기의 IP 주소로 트래픽 전송을 시작하기 전에 잠시 기다려야 합니다.

    존재하지 않는 페이지에 대한 요청을 보냅니다.

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

    not-found.html의 오류 콘텐츠가 제공되고 HTTP 404 상태 코드가 반환됩니다.

예시 2: 특정 호스트의 특정 오류 코드에 대한 오류 페이지 구성

이 예시는 모든 호스트에 공통된 모든 4xx 오류에 대한 오류 페이지 구성이라는 이전 예시를 바탕으로 합니다. 여기서는 호스트 video.example.com에 대한 요청이 video-backend-service라는 백엔드 서비스로 라우팅되도록 부하 분산기가 이미 구성되어 있다고 가정합니다. 요청이 백엔드 서비스의 승인에 실패하면 서비스는 401 (Unauthorized) 응답을 반환합니다. 그런 다음 커스텀 오류 응답 정책은 오류 서비스로 요청을 전송하도록 구성되고 오류 객체(video-obtain-authorization.html)가 클라이언트에 반환됩니다.

대부분의 경우 오류 콘텐츠에 로고 이미지와 같은 애셋 링크가 포함될 가능성이 높습니다. 클라이언트는 오류 페이지에서 참조된 애셋에 대한 요청을 수행하고, 이를 가져오기 위해 부하 분산기로 추가 요청이 전송됩니다. 그러면 부하 분산기가 요청에 응답하고 연결된 애셋을 반환합니다. 이렇게 하려면 이러한 애셋을 defaultCustomErrorResponsePolicy에 지정된 동일한 백엔드 버킷에 저장하고 애셋 URL(예: /assets/logo.svg)에서 백엔드 버킷으로 요청을 라우팅하는 규칙을 추가하면 됩니다. 연결된 애셋 요청에 대한 부하 분산기의 응답은 오류 응답이 아니라 다음 구성과 같이 일반적인 응답입니다.

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

또한 정책을 사용하면 요청의 최종 응답 코드를 정의할 수 있습니다. 이 예시에서는 응답 코드가 overrideResponseCode 값을 200으로 지정하여 401에서 200으로 변경되었습니다. 다른 모든 4xx 오류의 경우 not-found.html의 오류 콘텐츠가 클라이언트에 반환되고 백엔드 서비스의 원래 HTTP 응답 코드가 보존됩니다.

다음 표와 같이 이 예시에서는 두 개의 커스텀 오류 응답 정책이 구성되어 있습니다. 이러한 정책은 부하 분산기 수준 및 URL 도메인 수준에서 생성됩니다.

정책 수준 API 필드 HTTP 응답 코드 일치 오류 서비스 오류 객체 반환
URL 도메인 pathMatchers[].defaultCustomErrorResponsePolicy 401 CUSTOM_ERRORS_BUCKET video-obtain-authorization.html
부하 분산기 urlMaps.defaultCustomErrorResponsePolicy 모든 4xx CUSTOM_ERRORS_BUCKET not-found.html

호스트 video.example.com401 오류 코드에 대한 커스텀 오류 응답 정책을 만들려면 다음 단계를 수행합니다.

  1. HTML 오류 페이지(video-obtain-authorization.html) 및 관련 애셋(logo.svg)을 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. URL 맵(web-map-http)을 web-map-http.yaml이라는 파일로 내보냅니다.

    gcloud compute url-maps export web-map-http --destination web-map-http.yaml
    
  3. defaultCustomErrorResponsePolicy 섹션에서 web-map-http.yaml을 수정하여 다음 YAML 구성에 강조표시된 대로 커스텀 오류 응답 정책을 추가합니다. 이 예시에서는 커스텀 오류 응답 정책이 부하 분산기 수준(urlMaps.defaultCustomErrorResponsePolicy) 및 URL 도메인 수준(pathMatchers[].defaultCustomErrorResponsePolicy)에서 구성됩니다.

    오류 서비스가 URL 도메인 수준에서 정의되지 않았으므로 URL 도메인 수준의 오류 서비스는 기본적으로 상위 수준인 부하 분산기 수준에서 정의된 오류 서비스로 지정됩니다.

    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. web-map-http.yaml에서 최신 구성을 가져와서 URL 맵을 업데이트합니다.

    gcloud compute url-maps import web-map-http --source web-map-http.yaml
    
  5. URL 맵을 업데이트한 후 부하 분산기의 IP 주소로 트래픽 전송을 시작하기 전에 잠시 기다려야 합니다.

    호스트에 승인이 필요한 URL에 대한 요청을 보냅니다.

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

    video-obtain-authorization.html의 오류 콘텐츠가 제공되고 HTTP 200 상태 코드가 반환됩니다.

예시 3: 여러 도메인, 경로, 오류 응답 코드에 대해 세분화된 커스텀 오류 응답 정책 구성

이 예시에서는 여러 URL 도메인, URL 경로, HTTP 오류 응답 코드에 대해 특정 오류 응답을 맞춤설정하는 방법을 보여줍니다.

이 예시에서 설명하는 커스텀 오류 응답 구성은 다음을 가정합니다.

  • 다음 이미지에 표신된 대로 호스트 및 경로 기반 라우팅을 사용하여 외부 애플리케이션 부하 분산기의 URL 맵을 구성했습니다.

    백엔드 서비스 설정 예시
    백엔드 서비스 설정 예시(확대하려면 클릭)
  • 커스텀 오류 페이지를 반환하도록 BUCKET_1BUCKET_2라는 백엔드 버킷 두 개를 구성했습니다.

다음 표와 같이 이 예시에는 4개의 커스텀 오류 응답 정책이 구성되어 있습니다. 이러한 정책은 다음 우선순위에 따라 세 가지 수준에서 생성됩니다.

  1. URL 경로(pathMatchers[].pathRules[].customErrorResponsePolicy)
  2. URL 도메인(pathMatchers[].defaultCustomErrorResponsePolicy)
  3. 부하 분산기(urlMaps.defaultCustomErrorResponsePolicy)
정책 수준 요청 URL 일치하는 HTTP 응답 코드 오류 서비스 오류 객체 반환
URL 경로 example.net/video/hd/* 404 BUCKET-2 not-found-hd-videos-404.html
URL 경로 example.net/video/sd/* 404 BUCKET-2 not-found-sd-videos-404.html
URL 도메인 example.net/* 모든 4xx BUCKET-1 example-net-4xx.html
부하 분산기 Any 모든 4xx 또는 5xx BUCKET-1 error-page-generic.html

부하 분산기 수준의 커스텀 오류 응답 정책은 정책이 오류 조건과 일치하고 하위 수준에서 즉, URL 도메인 또는 URL 경로에서 오류 코드에 일치하는 정책이 정의되지 않은 경우에만 적용됩니다. 마찬가지로 URL 도메인 수준의 커스텀 오류 응답 정책은 정책이 오류 조건과 일치하고 하위 수준인 URL 경로에서 오류 코드에 일치하는 정책이 정의되지 않은 경우에만 적용됩니다. 이 예시에서 URL www.example.net/video/hd에 대한 요청에 404 응답이 발생하면 not-found-hd-videos-404.html 파일이 반환됩니다. 하지만 URL www.example.net/video/에 대한 요청에 대해 404 응답이 발생하면 example-net-4xx.html 파일이 반환됩니다.

URL 맵의 세 가지 수준에서 커스텀 오류 응답 정책을 만들려면 다음 단계를 수행합니다.

  1. 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. URL 맵(video-org-url-map)을 video-org-url-map.yaml.이라는 파일로 내보냅니다.

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

    커스텀 오류 응답 정책을 추가하기 전에 URL 맵(video-org-url-map)에는 다음과 비슷한 구성이 있습니다.

    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. defaultCustomErrorResponsePolicy 섹션에서 video-org-url-map.yaml을 수정하여 다음 YAML 구성에 강조표시된 대로 커스텀 오류 응답 정책을 추가합니다.

    오류 서비스가 URL 도메인 수준에서 정의되지 않았으므로 URL 도메인 수준의 오류 서비스는 기본적으로 상위 수준인 부하 분산기 수준에서 정의된 오류 서비스로 지정됩니다.

    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. video-org-url-map.yaml에서 최신 구성을 가져와서 URL 맵을 업데이트합니다.

    gcloud compute url-maps import video-org-url-map --source video-org-url-map.yaml
    
  5. URL 맵을 업데이트한 후 부하 분산기의 IP 주소로 트래픽 전송을 시작하기 전에 잠시 기다려야 합니다.

    존재하지 않는 페이지에 대한 요청을 보냅니다.

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

    example-net-4xx.html의 오류 콘텐츠가 제공됩니다.

    마찬가지로 다른 URL 도메인 및 URL 경로를 가진 다른 URL도 테스트합니다.