Cloud Run 문제 해결

이 페이지에서는 Cloud Run을 사용할 때 발생하는 오류 메시지 및 문제 해결 방법을 보여줍니다.

공개 Issue Tracker에서도 기존 문제를 확인하거나 새로운 문제를 개설할 수 있습니다.

이 페이지에 나열되지 않은 다른 오류 메시지는 알려진 문제 페이지를 확인하세요.

배포 오류

이 섹션에는 배포에서 발생할 수 있는 문제를 나열하고 각 문제를 해결하는 방법에 대한 제안을 제공합니다.

컨테이너를 시작할 수 없음

배포를 시도할 때 다음 오류가 발생합니다.

Container failed to start. Failed to start and then listen on the port defined by the PORT environment variable.

이 문제를 해결하려면 다음과 같은 가능한 원인을 배제하세요.

  1. 컨테이너 이미지를 로컬에서 실행할 수 있는지 확인합니다. 컨테이너 이미지를 로컬에서 실행할 수 없는 경우 먼저 문제를 진단하고 로컬에서 수정해야 합니다.

  2. 컨테이너 런타임 계약에 설명된 대로 컨테이너가 예상 포트에서 요청을 리슨하는지 확인합니다. 컨테이너는 Cloud Run에서 정의하고 PORT 환경 변수에 제공된 포트에서 수신되는 요청을 리슨해야 합니다. 포트를 지정하는 방법은 컨테이너 구성을 참조하세요.

  3. 컨테이너가 일반적으로 0.0.0.0으로 표시된 모든 네트워크 인터페이스에서 리슨하는지 확인합니다.

  4. 컨테이너 이미지가 컨테이너 런타임 계약에 따라 64비트 Linux용으로 컴파일되었는지 확인합니다.

  5. Cloud Logging을 사용하여 stdout 또는 stderr 로그에서 애플리케이션 오류를 찾습니다. Error Reporting에서 캡처된 장애를 찾을 수도 있습니다.

    오류나 장애를 수정하려면 코드 또는 버전 설정을 업데이트해야 합니다. 로컬에서 서비스 문제를 해결할 수도 있습니다.

내부 오류, 리소스 준비 기한 초과

다른 Google Cloud API를 배포하거나 호출하려고 하면 다음 오류가 발생합니다.

The server has encountered an internal error. Please try again later. Resource readiness deadline exceeded.

이 문제는 Cloud Run 서비스 에이전트가 없거나 Cloud Run 서비스 에이전트(roles/run.serviceAgent) 역할이 없을 때 발생할 수 있습니다.

Cloud Run 서비스 에이전트가 Google Cloud 프로젝트에 있고 필요한 역할을 갖도록 하려면 다음 단계를 수행합니다.

  1. Google Cloud 콘솔을 엽니다.

    권한 페이지로 이동

  2. 권한 페이지의 오른쪽 위 모서리에서 Google 제공 역할 부여 체크박스를 선택합니다.

  3. 주 구성원 목록에서 ID
    service-PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com을 사용하는 Cloud Run 서비스 에이전트의 ID를 찾습니다.

  4. 서비스 에이전트에 Cloud Run 서비스 에이전트 역할이 있는지 확인합니다. 서비스 에이전트에 역할이 없는 경우 역할을 부여합니다.

/etc/passwd에서 오류 사용자 '루트'를 찾을 수 없습니다.

배포를 시도할 때 다음 오류가 발생합니다.

ERROR: "User \"root\""not found in /etc/passwd

이 문제는 고객 관리 암호화 키가 --key 매개변수를 사용하여 지정된 경우에 발생합니다.

이 문제를 해결하려면 Dockerfile에서 USER root 대신 USER 0을 지정합니다.

기본 Compute Engine 서비스 계정이 삭제됨

배포를 시도할 때 다음 오류가 발생합니다.

ERROR: (gcloud.run.deploy) User EMAIL_ADDRESS does not have permission to access namespace NAMESPACE_NAME (or it may not exist): Permission 'iam.serviceaccounts.actAs' denied on service account PROJECT_NUMBER-compute@developer.gserviceaccount.com (or it may not exist).

이 문제는 다음 상황 중 하나에서 발생합니다.

이 문제를 해결하려면 다음 안내를 따르세요.

  1. --service-account gcloud 플래그를 사용하여 서비스 계정을 지정합니다.
  2. 지정한 서비스 계정에 배포에 필요한 권한이 있는지 확인합니다.

Google Cloud 프로젝트에 기본 Compute Engine 서비스 에이전트가 있는지 확인하려면 다음 단계를 수행합니다.

  1. Google Cloud 콘솔을 엽니다.

    권한 페이지로 이동

  2. 권한 페이지의 오른쪽 위 모서리에서 Google 제공 역할 부여 체크박스를 선택합니다.

  3. 주 구성원 목록에서 ID
    PROJECT_NUMBER-compute@developer.gserviceaccount.com을 사용하는 Compute Engine 서비스 에이전트의 ID를 찾습니다.

Cloud Run 서비스 에이전트에 이미지를 읽을 권한이 없음

PROJECT-ID-2의 Container Registry에 저장된 이미지를 사용하여 PROJECT-ID에서 배포하려고 하면 다음 오류가 발생합니다.

Google Cloud Run Service Agent must have permission to read the image, gcr.io/PROJECT-ID/IMAGE-NAME. Ensure that the provided container image URL is correct and that above account has permission to access the image. If you just enabled the Cloud Run API, the permissions might take a few minutes to propagate. Note that PROJECT-ID/IMAGE-NAME is not in project PROJECT-ID-2. Permission must be granted to the Google Cloud Run Service Agent from this project.

이 문제를 해결하려면 다음 문제 해결 권장사항을 따르세요.

  • 다른 Google Cloud 프로젝트에서 컨테이너 이미지를 배포하는 안내에 따라 주 구성원에게 필요한 권한이 있는지 확인합니다.

  • 이 문제는 프로젝트가 Cloud Run 서비스 에이전트의 요청을 금지하는 Cloud Storage API의 제한이 있는 VPC 서비스 제어 경계 내에 있는 경우에도 발생할 수 있습니다. 이 문제를 해결하려면 다음 안내를 따르세요.

    1. Google Cloud Console에서 로그 탐색기를 엽니다. Cloud Run 페이지 내에서 로그 페이지를 사용하지 마세요.

      로그 탐색기로 이동

    2. 쿼리 필드에 다음 텍스트를 입력합니다.

      protoPayload.@type="type.googleapis.com/google.cloud.audit.AuditLog"
      severity=ERROR
      protoPayload.status.details.violations.type="VPC_SERVICE_CONTROLS"
      protoPayload.authenticationInfo.principalEmail="service-PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com"
      
    3. 이 쿼리를 사용한 후 로그 항목이 표시되면 로그 항목을 검사하여 VPC 서비스 제어 정책을 업데이트해야 하는지 확인합니다. 기존 액세스 정책에 service-PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com을 추가해야 할 수도 있습니다.

컨테이너 가져오기 오류

배포를 시도할 때 다음 오류가 발생합니다.

The service has encountered an error during container import. Please try again later. Resource readiness deadline exceeded.

이 문제를 해결하려면 다음과 같은 가능한 원인을 배제하세요.

  1. 컨테이너의 파일 시스템에 utf8 이외의 문자가 포함되어 있지 않은지 확인합니다.

  2. 일부 Windows 기반 Docker 이미지는 외부 레이어를 사용합니다. 외부 레이어가 있는 경우 Container Registry가 오류를 생성하지 않지만 Cloud Run의 컨트롤 플레인은 이를 지원하지 않습니다. 이 문제를 해결하려면 Docker 데몬에서 --allow-nondistributable-artifacts 플래그를 설정해 볼 수 있습니다.

제공 오류

이 섹션에는 제공에서 발생할 수 있는 문제를 나열하고 각 문제를 해결하는 방법에 대한 제안을 제공합니다.

HTTP 401: 클라이언트가 제대로 인증되지 않음

제공 중에 다음 오류가 발생합니다.

The request was not authorized to invoke this service

이 문제를 해결하려면 다음 안내를 따르세요.

  • 서비스 계정으로 호출된 경우 Google이 서명한 ID 토큰의 대상 클레임(aud)을 반드시 다음과 같이 설정해야 합니다.

    • 수신 서비스의 Cloud Run URL(https://service-xyz.run.app 형식 사용)
      • Cloud Run 서비스는 반드시 인증이 필요합니다.
      • Cloud Run 서비스는 Cloud Run URL 또는 부하 분산기 URL을 통해 호출할 수 있습니다.
    • 웹 애플리케이션 유형의 OAuth 2.0 클라이언트 ID의 클라이언트 ID(nnn-xyz.apps.googleusercontent.com 형식 사용)
    • 제공된 정확한 값을 사용하여 구성된 커스텀 대상. 예를 들어 커스텀 대상이 service.example.com이면 대상 클레임(aud) 값도 service.example.com이어야 합니다. 커스텀 대상이 https://service.example.com이면 대상 클레임 값도 https://service.example.com이어야 합니다.
  • jwt.io 도구는 JWT에서 클레임을 확인하는 데 효과적입니다.

  • 인증 토큰의 형식이 잘못되었으면 401 오류가 발생합니다. 토큰의 형식이 잘못되었고 토큰 생성에 사용되는 IAM 멤버에 run.routes.invoke 권한이 누락되었으면 403 오류가 발생합니다.

  • 이그레스 트래픽이 라우팅되도록 Cloud Run 서비스로 요청을, HTTP 프록시로 작업 ID를 인증하기 위해 메타데이터 서버를 사용하여 ID와 액세스 토큰을 가져오는 경우 다음 호스트를 HTTP 프록시 예외에 추가해야 합니다.

    • 169.254.* 또는 169.254.0.0/16
    • *.google.internal

    이 오류는 일반적으로 Cloud 클라이언트 라이브러리에서 REST 또는 gRPC 호출을 인증하기 위해 메타데이터 서버를 사용하여 애플리케이션 기본 사용자 인증 정보를 가져올 때 발생합니다. HTTP 프록시 예외를 정의하지 않으면 다음 동작이 발생합니다.

    • Cloud Run 서비스나 작업 및 HTTP 프록시가 다른 Google Cloud 워크로드에서 호스팅되는 경우 Google Cloud 클라이언트 라이브러리에서 사용자 인증 정보를 가져올 수 있더라도 토큰은 HTTP 프록시 워크로드에 할당된 서비스 계정에 생성되므로 계획한 Google Cloud API 작업을 수행하는 데 필요한 권한이 없을 수 있습니다. 이 경우 Cloud Run이 아닌 HTTP 프록시 워크로드의 메타데이터 서버 뷰에서 토큰을 가져옵니다.

    • HTTP 프록시가 Google Cloud에서 호스팅되지 않고 메타데이터 서버 요청이 프록시를 통해 라우팅되면 토큰 요청이 실패하고 Google Cloud APIs 작업이 인증되지 않습니다.

HTTP 403: 클라이언트에 서비스 호출 권한이 없음

resource.type = "cloud_run_revision"일 경우 다음 오류가 Cloud Logging에 있을 수도 있고 없을 수도 있습니다.

The request was not authenticated. Either allow unauthenticated invocations or set the proper Authorization header

클라이언트에 반환된 HTTP 응답에 다음 오류가 있습니다.

403 Forbidden
Your client does not have permission to get URL from this server.

resource.type = "cloud_run_revision" Cloud Logging 오류가 있는 경우 이 문제를 해결하려면 다음 안내를 따르세요.

  • 누구나 서비스를 호출할 수 있도록 하려면 서비스의 IAM 설정을 업데이트하여 서비스를 공개합니다.
  • 특정 ID로만 서비스를 호출할 수 있도록 하려면 적절한 승인 토큰으로 서비스를 호출해야 합니다.
    • 개발자가 호출한 경우 또는 최종 사용자가 호출한 경우: 개발자 또는 사용자에게 run.routes.invoke 권한이 있는지 확인합니다. 이 권한은 Cloud Run 관리자(roles/run.admin) 및 Cloud Run 호출자(roles/run.invoker) 역할을 통해 제공할 수 있습니다.
    • 서비스 계정으로 호출된 경우: 서비스 계정이 Cloud Run 서비스 구성원이고 Cloud Run 호출자(roles/run.invoker) 역할이 있는지 확인합니다.
    • 인증 토큰이 누락되었거나 올바른 형식의 인증 토큰을 사용하여 호출하지만 토큰을 생성하는 데 사용되는 IAM 멤버에게 run.routes.invoke 권한이 없으면 이 403 오류가 발생합니다.

resource.type = "cloud_run_revision" Cloud Logging 오류가 없는 경우 이 문제를 해결하려면 다음 안내를 따르세요.

  • 403 상태 코드는 서비스에 All로 구성된 인그레스가 있지만 VPC 서비스 제어로 인해 차단되었을 때 반환될 수 있습니다. VPC 서비스 제어 거부 문제 해결에 대한 자세한 내용은 404 오류에 대한 다음 섹션을 참조하세요.

HTTP 404: 찾을 수 없음

제공 중에 다음 문제가 발생합니다.

HTTP 404 오류가 발생합니다.

이 문제를 해결하려면 다음 안내를 따르세요.

  1. Cloud 콘솔의 서비스 세부정보 페이지를 확인하거나 다음 명령어를 실행하여 요청하는 URL이 올바른지 확인합니다.

    gcloud run services describe SERVICE_NAME | grep URL
    
  2. 앱 로직에서 404 오류 코드가 반환될 수 있는 부분을 검사합니다. 앱이 404를 반환하면 Cloud Logging에 표시됩니다.

  3. 요청을 수신하기 전에 앱이 구성된 포트에서 리슨하지 않는지 확인합니다.

  4. 로컬에서 실행할 때 앱이 404 오류 코드를 반환하지 않는지 확인합니다.

Cloud Run 서비스의 인그레스 설정이 '내부' 또는 '내부 및 Cloud Load Balancing'으로 설정되어 있고 요청이 지정된 네트워크 제한을 충족하지 않으면 404가 반환됩니다. 이 시나리오에서 요청은 컨테이너에 도달하지 않으며 다음 필터를 사용할 경우 Cloud Logging에 404없습니다.

resource.type="cloud_run_revision"
log_name="projects/PROJECT_ID/logs/run.googleapis.com%2Frequests"
httpRequest.status=404

동일한 인그레스 설정을 사용할 경우 프로젝트 및 IP 주소를 포함한 호출자의 컨텍스트에 따라 VPC 서비스 제어가 요청을 차단할 수 있습니다. VPC 서비스 제어 정책 위반을 확인하려면 다음 안내를 따르세요.

  1. Google Cloud 콘솔에서 로그 탐색기를 엽니다(Cloud Run의 로그 페이지 아님).

    로그 탐색기로 이동

  2. 쿼리 필드에 다음 텍스트를 입력합니다.

    resource.type="audited_resource"
    log_name="projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Fpolicy"
    resource.labels.method="run.googleapis.com/HttpIngress"
    
  3. 이 쿼리를 사용한 후 로그 항목이 표시되면 로그 항목을 검사하여 VPC 서비스 제어 정책을 업데이트해야 하는지 확인합니다.

HTTP 429: 사용 가능한 컨테이너 인스턴스 없음

제공 중에 다음 오류가 발생합니다.

HTTP 429
The request was aborted because there was no available instance.
The Cloud Run service might have reached its maximum container instance
limit or the service was otherwise not able to scale to incoming requests.
This might be caused by a sudden increase in traffic, a long container startup time or a long request processing time.

이 문제를 해결하려면 서비스의 '컨테이너 인스턴스 수' 측정항목을 확인하고 사용량이 최대값에 근접하면 이 제한을 늘릴 수 있습니다. '최대 인스턴스' 설정을 참조하고 추가 인스턴스가 필요하면 할당량 증가를 요청합니다.

HTTP 500: Cloud Run이 트래픽 속도를 관리할 수 없음

다음 오류는 제공 중에 발생하며 서비스가 최대 컨테이너 인스턴스 한도에 도달하지 않은 경우에도 발생할 수 있습니다.

HTTP 500
The request was aborted because there was no available instance

이 오류의 원인은 다음 중 하나일 수 있습니다.

  • 트래픽 급증
  • 콜드 스타트 시간
  • 긴 요청 처리 시간 또는 요청 처리 시간의 갑작스러운 증가
  • 서비스가 최대 컨테이너 인스턴스 한도(HTTP 429)에 도달한 경우
  • Cloud Run 서비스로 인한 일시적 요소

이 문제를 해결하려면 이전에 나열된 문제를 해결하세요.

이러한 문제를 해결하는 것 외에도 클라이언트가 중단해서는 안 되는 요청에 대해 지수 백오프 및 재시도를 구현할 수 있습니다.

트래픽 또는 요청 처리 시간이 짧고 갑작스럽게 증가하면 10초 해상도로 확대한 경우에만 Cloud Monitoring에 표시될 수 있습니다.

문제의 근본 원인이 Cloud Run만으로 인해 증가된 일시적인 오류 기간인 경우 지원팀에 문의할 수 있습니다.

HTTP 500 / HTTP 503: 컨테이너 인스턴스가 메모리 한도를 초과함

제공 중에 다음 오류가 발생합니다.

Cloud Logging에서는 다음 오류가 표시됩니다.

While handling this request, the container instance was found to be using too much memory and was terminated. This is likely to cause a new container instance to be used for the next request to this revision. If you see this message frequently, you may have a memory leak in your code or may need more memory. Consider creating a new revision with more memory.

이 문제를 해결하려면 다음 안내를 따르세요.

  1. 컨테이너 인스턴스가 사용 가능한 메모리를 초과하는지 확인합니다. varlog/system 로그에서 관련 오류를 찾습니다.
  2. 인스턴스가 사용 가능한 메모리를 초과하는 경우에는 메모리 한도 증가를 고려해 보세요.

Cloud Run에서 로컬 파일 시스템에 기록된 파일은 사용 가능한 메모리 계산에 반영됩니다. 여기에는 /var/log/*/dev/log제외한 위치에 기록된 모든 로그 파일도 포함됩니다.

HTTP 503: 잘못된 응답 또는 컨테이너 인스턴스 연결 문제

제공 중에 다음 오류 중 하나가 발생합니다.

HTTP 503
The request failed because either the HTTP response was malformed or connection to the instance had an error.

이 문제를 해결하려면 다음 문제 해결 권장사항을 따르세요.

  • Cloud Logging 확인 Cloud Logging을 사용하여 로그에서 메모리 부족 오류를 찾습니다. 메모리 한도를 초과하는 컨테이너 인스턴스 관련 오류 메시지가 표시되면 이 문제를 해결하기 위한 권장사항을 따르세요.

  • 앱 수준 제한 시간 Cloud Run에 설정된 요청 제한 시간에 도달하기 전 503 오류 코드와 함께 요청이 종료되면 언어 프레임워크에 대해 요청 제한 시간 설정을 업데이트해야 할 수 있습니다.

  • 다운스트림 네트워크 병목 현상 경우에 따라 부하 테스트 중과 같은 다운스트림 네트워크 병목 현상에서 503 오류 코드가 간접적으로 발생할 수 있습니다. 예를 들어 서비스가 서버리스 VPC 액세스 커넥터를 통해 트래픽을 라우팅하는 경우 다음 단계에 따라 커넥터가 처리량 기준점을 초과하지 않았는지 확인합니다.

    1. Google Cloud 콘솔에서 서버리스 VPC 액세스를 엽니다.

      서버리스 VPC 액세스로 이동

    2. 처리량 차트 히스토그램에 빨간색 막대가 있는지 확인합니다. 빨간색 막대가 있으면 커넥터가 사용하는 최대 인스턴스 또는 인스턴스 유형을 늘리는 것이 좋습니다. 또는 서버리스 VPC 액세스 커넥터를 통해 전송된 트래픽을 압축합니다.

  • 단일 컨테이너에 대한 인바운드 요청 한도 컨테이너당 요청 비율이 높을 때503 오류가 발생하는 알려진 문제가 있습니다. 컨테이너 인스턴스가 초당 800개를 초과하는 요청을 수신하면 사용 가능한 TCP 소켓이 소진될 수 있습니다. 이 문제를 해결하려면 다음 중 하나를 시도해 보세요.

    1. 서비스에 HTTP/2를 사용 설정하고 HTTP/2를 지원하도록 서비스를 변경합니다.

    2. 구성된 동시 실행을 낮춰 단일 컨테이너 인스턴스에 초당 800개를 초과하는 요청을 보내지 않도록 합니다. 다음 수식을 사용하여 컨테이너 인스턴스당 요청 비율에 대한 추정치를 가져옵니다. requests/sec/container_instance ~= concurrency * (1sec / median_request_latency)

HTTP 503: 높은 동시 실행 설정으로 인해 일부 요청을 처리할 수 없음

제공 중에 다음 오류가 발생합니다.

HTTP 503
The Cloud Run service probably has reached its maximum container instance limit. Consider increasing this limit.

이 문제는 컨테이너 인스턴스가 많은 CPU를 사용하여 요청을 처리하는 경우에 발생하며 이로 인해 컨테이너 인스턴스가 모든 요청을 처리할 수 없으므로 일부 요청이 503 오류 코드를 반환합니다.

이 문제를 해결하려면 다음 중 하나 이상을 사용해 보세요.

HTTP 504: 게이트웨이 제한 시간 오류

HTTP 504
The request has been terminated because it has reached the maximum request timeout.

서비스에서 긴 요청을 처리하는 경우 요청 제한 시간을 늘릴 수 있습니다. 서비스가 지정된 시간 내에 응답을 반환하지 않으면 요청이 종료되고 컨테이너 런타임 계약 에 문서화된 대로 서비스가 HTTP 504 에러를 반환합니다.

이 문제를 해결하려면 다음 중 한 가지 이상의 방법을 시도해 보세요.

  • 구성된 요청 제한 시간을 초과하기 전에 앱이 시간을 소비하고 있는 위치를 파악하기 위해 로깅 및 추적을 계측합니다.

  • 인프라 업데이트로 인해 가끔 아웃바운드 연결이 재설정됩니다. 애플리케이션이 장기적으로 지속되는 연결을 재사용하는 경우 끊어진 연결을 재사용하지 않도록 연결을 다시 설정하도록 애플리케이션을 구성하는 것이 좋습니다.

    • 앱의 로직 또는 오류 처리에 따라 504 오류는 애플리케이션이 끊어진 연결을 재사용하려고 하는 신호일 수 있으며 구성된 요청 제한 시간까지 요청이 차단됩니다.
    • 지속적인 오류를 반환하는 인스턴스를 종료하기 위해 활성 프로브를 사용할 수 있습니다.
  • 앱 코드 내에서 발생하는 메모리 부족 오류(예: java.lang.OutOfMemoryError)로 인해 컨테이너 인스턴스가 반드시 종료되는 것은 아닙니다. 메모리 사용량이 컨테이너 메모리 한도를 초과하지 않으면 인스턴스가 종료되지 않습니다. 앱 수준 메모리 부족 오류를 처리하는 방법에 따라 구성된 요청 제한 시간을 초과할 때까지 요청이 중단될 수 있습니다.

    • 위의 시나리오에서 컨테이너 인스턴스를 종료하려면 앱 수준 메모리 한도를 컨테이너 메모리 한도보다 크게 구성하세요.
    • 지속적인 오류를 반환하는 인스턴스를 종료하기 위해 활성 프로브를 사용할 수 있습니다.

피어에서 연결 재설정

제공 중에 다음 오류 중 하나가 발생합니다.

Connection reset by peer
asyncpg.exceptions.ConnectionDoesNotExistError: connection was closed in the middle of operation
grpc.StatusRuntimeException: UNAVAILABLE: io exception
psycopg.OperationalError: the connection is closed
ECONNRESET

이 오류는 애플리케이션이 네트워크 간에 피어와 설정된 TCP 연결이 있고 해당 피어가 예기치 않게 연결을 닫을 때 발생합니다.

이 문제를 해결하려면 다음 안내를 따르세요.

  • CPU 제한을 통해 백그라운드 작업을 수행하려는 경우 'CPU가 항상 할당됨' CPU 할당 설정을 사용해 보세요.

  • 아웃바운드 요청 제한 시간 내에 있는지 확인합니다. 애플리케이션이 이 기준을 넘어 유휴 상태로 연결을 유지하는 경우 게이트웨이가 연결을 수거해야 합니다.

  • 기본적으로 Cloud Run에는 TCP 소켓 옵션 keepalive가 사용 중지되어 있습니다. 서비스 수준에서 Cloud Run의 keepalive 옵션을 직접 구성할 수 있는 방법은 없지만 새 TCP 소켓 연결을 열 때 애플리케이션의 해당 연결에 사용하는 클라이언트 라이브러리에 따라 올바른 소켓 옵션을 제공하여 각 소켓 연결에 keepalive 옵션을 사용 설정할 수 있습니다.

  • 인프라 업데이트로 인해 가끔 아웃바운드 연결이 재설정됩니다. 애플리케이션이 장기적으로 지속되는 연결을 재사용하는 경우 끊어진 연결을 재사용하지 않도록 연결을 다시 설정하도록 애플리케이션을 구성하는 것이 좋습니다.

  • HTTP 프록시를 사용하여 Cloud Run 서비스 또는 작업 이그레스 트래픽을 라우팅하고 프록시에서 최대 연결 기간을 적용하는 경우 프록시에서 연결 풀링을 통해 설정된 TCP 연결과 같은 장기 실행 TCP 연결을 자동으로 삭제할 수 있습니다. 이로 인해 이미 종료된 연결을 재사용하면 HTTP 클라이언트가 실패합니다. HTTP 프록시를 통해 이그레스 트래픽을 라우팅하려면 연결 유효성 검사, 재시도, 지수 백오프를 구현하여 이 시나리오를 고려해야 합니다. 연결 풀에 연결 수명, 유휴 상태 연결, 연결 유휴 상태 제한 시간의 최댓값을 구성합니다.

연결 제한 시간

요청을 원격 호스트에 보낼 때 연결 제한 시간이 있으면 지연 시간 오류나 다음 오류 중 하나가 발생합니다.

java.io.IOException: Connection timed out
ConnectionError: HTTPSConnectionPool
dial tcp REMOTE_HOST:REMOTE_PORT: i/o timeout / context error
Error: 4 DEADLINE_EXCEEDED: Deadline exceeded

이러한 유형의 오류는 애플리케이션에서 원격 호스트로 새로운 TCP 연결을 만들려고 하는데 연결 설정 시간이 너무 오래 걸리면 발생합니다.

  • VPC 커넥터 또는 직접 VPC 이그레스를 사용하여 VPC 네트워크를 통해 모든 이그레스 트래픽을 라우팅하는 경우에는 다음을 확인합니다.

    • VPC 커넥터의 인그레스 트래픽을 허용하는 데 필요한 모든 방화벽 규칙을 정의했습니다.

    • VPC 방화벽 규칙은 VPC 커넥터나 직접 VPC 이그레스 서브넷의 인그레스 트래픽이 대상 호스트나 서브넷에 도달하도록 허용합니다.

    • 대상 호스트와 그 반대로 올바른 트래픽 라우팅을 허용하기 위한 모든 필수 경로가 준비되었습니다. 이는 패킷이 원격 호스트에 도달하기 전에 여러 네트워크를 통과하므로 VPC 네트워크 피어링 또는 하이브리드 클라우드 연결을 통해 이그레스 트래픽을 라우팅할 때 중요합니다.

  • HTTP 프록시를 사용하여 Cloud Run 서비스나 작업의 모든 이그레스 트래픽을 라우팅하는 경우 프록시를 사용하여 원격 호스트에 연결할 수 있는지 확인합니다.

    HTTP 프록시를 통해 라우팅되는 트래픽은 프록시의 리소스 사용률에 따라 지연될 수 있습니다. 프록시를 사용하여 HTTP 이그레스 트래픽을 라우팅하려는 경우 재시도, 지수 백오프 또는 회로 차단기를 구현하여 이 시나리오를 고려해야 합니다.

HTTP 프록시 예외 구성

HTTP 프록시를 사용하여 Cloud Run 서비스 또는 작업 이그레스 트래픽을 라우팅하는 경우 지연 시간, 연결 제한 시간, 연결 재설정, 인증 오류를 방지하기 위해 Cloud API와 기타 프록시되지 않은 호스트 및 서브넷의 예외를 추가해야 합니다.

프록시되지 않은 호스트와 서브넷에는 최소한 다음이 포함되어야 합니다.

  • 127.0.0.1
  • 169.254.* 또는 169.254.0.0/16
  • localhost
  • *.google.internal
  • *.googleapis.com

필요한 경우 프록시되지 않은 호스트에 다음이 포함될 수 있습니다.

  • *.appspot.com
  • *.run.app
  • *.cloudfunctions.net
  • *.gateway.dev
  • *.googleusercontent.com
  • *.pkg.dev
  • *.gcr.io

이그레스 네트워킹의 HTTP 프록시 예외를 구성하는 일반적인 방법은 다음과 같습니다.

  • 환경 변수: NO_PROXY 또는 no_proxy
  • Java 가상 머신 플래그 http.nonProxyHosts

    • 시스템 속성 https.nonProxyHosts는 정의되어 있지 않으므로 http.nonProxyHosts는 HTTP 및 HTTPS 모두에 적용됩니다.
    • 시스템 속성 http.nonProxyHosts는 CIDR 표기법을 지원하지 않으므로 패턴 일치 표현식을 사용해야 합니다.

Google에서 수정한 ID 토큰 서명

제공 중에 다음 오류가 발생합니다.

SIGNATURE_REMOVED_BY_GOOGLE

이 오류는 개발 및 테스트 중에 다음과 같은 상황에서 발생할 수 있습니다.

  1. 사용자가 Google Cloud CLI 또는 Cloud Shell을 사용하여 로그인합니다.
  2. 사용자가 gcloud 명령어를 사용하여 ID 토큰을 생성합니다.
  3. 사용자가 ID 토큰을 사용하여 비공개 Cloud Run 서비스를 호출합니다.

처음부터 그렇게 설계되어 있습니다. Google에서는 보안 문제로 인해 토큰 서명을 삭제하여 비공개 Cloud Run 서비스가 이러한 방식으로 생성된 ID 토큰을 재생하지 못하도록 합니다.

이 문제를 해결하려면 새 ID 토큰으로 비공개 서비스를 호출하세요. 자세한 내용은 서비스에서 인증 테스트를 참조하세요.

로그의 OpenBLAS 경고

1세대 실행 환경에서 NumPy와 같은 OpenBLAS 기반 라이브러리를 사용하는 경우 로그에 다음과 같은 경고가 표시될 수 있습니다.

OpenBLAS WARNING - could not determine the L2 cache size on this system, assuming 256k

이는 경고일 뿐이므로 서비스는 영향을 받지 않습니다. 이 경고가 표시되는 이유는 1세대 실행 환경에서 사용하는 컨테이너 샌드박스가 낮은 수준의 하드웨어 기능을 노출하지 않기 때문입니다. 로그에 이러한 경고가 표시되게 하려면 선택적으로 2세대 실행 환경으로 전환할 수 있습니다.

결합할 머신의 IP 주소를 가져올 때 Spark가 실패함

제공 중에 다음 오류 중 하나가 발생합니다.

assertion failed: Expected hostname (not IP) but got <IPv6 ADDRESS>
assertion failed: Expected hostname or IPv6 IP enclosed in [] but got <IPv6 ADDRESS>

이 문제를 해결하려면 다음 안내를 따르세요.

환경 변수 값을 변경하고 문제를 해결하려면 Dockerfile에서 ENV SPARK_LOCAL_IP="127.0.0.1"을 설정합니다. Cloud Run에서 변수 SPARK_LOCAL_IP가 설정되지 않으면 localhost 대신 상응하는 IPv6 값이 기본값으로 설정됩니다. RUN export SPARK_LOCAL_IP="127.0.0.1" 설정은 런타임 시 사용할 수 없으며 Spark는 설정되지 않은 것처럼 작동합니다.

커스텀 도메인 매핑

커스텀 도메인이 인증서 프로비저닝 상태에서 멈춤

커스텀 도메인을 매핑하려고 할 때 다음 오류 중 하나가 발생합니다.

The domain is available over HTTP.  Waiting for certificate provisioning. You must configure your DNS records for certificate issuance to begin and to accept HTTP traffic.
Waiting for certificate provisioning. You must configure your DNS records for certificate issuance to begin.

이 문제를 해결하려면 다음 안내를 따르세요.

  • 최소 24시간 동안 기다립니다. 일반적으로 SSL 인증서를 프로비저닝하는 데 약 15분 정도 걸리지만 최대 24시간까지 걸릴 수도 있습니다.
  • Google 관리 콘솔 도구 상자 Dig 도구를 사용하여 도메인 등록기관에서 DNS 레코드를 올바르게 업데이트했는지 확인합니다.

    도메인 등록기관의 DNS 레코드가 Google Cloud 콘솔에서 추가하라고 메시지에 표시하는 것과 일치해야 합니다.

  • 다음 방법 중 하나를 사용하여 계정에서 도메인의 루트가 확인되었는지 확인합니다.

  • 도메인 인증서가 만료되지 않았는지 확인합니다. 만료 경계를 찾으려면 다음 명령어를 사용하세요.

    echo | openssl s_client -servername 'ROOT_DOMAIN' -connect 'ROOT_DOMAIN:443' 2>/dev/null | openssl x509 -startdate -enddate -noout
    

앱의 서비스(모듈)가 1,000개를 초과할 수 없음

작업 실행 중에 다음 오류가 발생합니다.

Your app may not have more than 1000 services (modules). Please delete one of the existing services (modules) before trying to create a new service (module)
.

각 Cloud Run 서비스 배포는 수신되는 요청 수에 관계없이 사용 가능한 할당량에 대해 하나의 서비스 또는 모듈로 계산되지만, Cloud Run 작업의 경우에는 활성 실행되는 각각의 작업 실행이 할당량 대비 서비스로 계산됩니다. 따라서 동시 작업 실행을 많이 실행하면 할당량을 초과하여 이 오류가 발생할 수 있습니다. 이 문제를 해결하려면 여러 작업을 실행하는 대신 단일 작업 실행에서 동시 태스크를 사용하면 됩니다.

Admin API

기능이 선언된 출시 단계에서 지원되지 않음

Cloud Run Admin API를 호출할 때 다음 오류가 발생합니다.

The feature is not supported in the declared launch stage

이 오류는 Cloud Run Admin API를 직접 호출할 때 출시 단계 주석 또는 필드를 지정하지 않고 베타 기능을 사용하면 발생합니다.

이 문제를 해결하려면 요청에 출시 단계 필드를 추가합니다. 다음은 v1 REST API 및 v2 REST API의 예시입니다.

다음 예시에서는 JSON 및 v1 REST API를 사용하여 클라이언트 요청에 출시 단계 주석을 추가합니다.

    "annotations": {
      "run.googleapis.com/launch-stage": "BETA"
    }

다음 예시에서는 JSON 및 v2 REST API를 사용하여 클라이언트 요청에 LaunchStage 참조를 추가합니다.

  "launchStage": "BETA"

다음 예시에서는 YAML 및 v1 REST API를 사용하여 서비스 요청에 출시 단계 주석을 추가합니다.

kind: Service
metadata:
  annotations:
    run.googleapis.com/launch-stage: BETA

클라이언트 연결 해제가 Cloud Run에 전파되지 않음

Cloud Run에서 HTTP/1.1을 사용하면 클라이언트 연결 해제 이벤트가 Cloud Run 컨테이너에 전파되지 않습니다.

해결책은 클라이언트 연결 해제를 전파하는 Websockets 또는 HTTP/2.0을 사용하는 것입니다.

네트워크 파일 시스템 문제 해결

네트워크 파일 시스템 사용을 자세히 알아보세요.

NFS를 사용하여 파일에 액세스할 수 없음

오류 권장 해결 방법
mount.nfs: Protocol not supported 일부 기본 이미지(예: debianadoptopenjdk/openjdk11)에 종속 항목 nfs-kernel-server가 없습니다.
mount.nfs: Connection timed out 연결 시간이 초과되면 Filestore 인스턴스의 올바른 IP 주소를 제공하고 있는지 확인합니다.
mount.nfs: access denied by server while mounting IP_ADDRESS:/FILESHARE 서버에서 액세스가 거부된 경우 파일 공유 이름이 올바른지 확인하세요.

Cloud Storage FUSE를 사용하여 파일에 액세스할 수 없음

Cloud Storage FUSE 문제 해결 가이드를 참조하세요.