Cloud Run Functions 문제 해결
이 문서에서는 Cloud Run Functions를 사용할 때 오류 메시지를 해결하고 문제를 해결하는 방법을 설명합니다.
배포
이 섹션에는 배포에서 발생할 수 있는 문제를 나열하고 각 문제를 해결하는 방법에 대한 제안을 제공합니다. 배포 중 발생할 수 있는 많은 문제들이 역할 및 권한 또는 잘못된 구성과 관련이 있습니다.
Identity and Access Management를 사용하여 Cloud Functions v2 API(예: gcloud functions
, REST API, Terraform 사용)로 만든 함수에 대한 관리 작업을 실행하도록 ID를 승인합니다. 관리 작업에는 함수 만들기, 업데이트, 삭제가 포함됩니다. 자세한 내용은 IAM으로 액세스 승인을 참고하세요.
함수를 배포할 때 사용자에게 런타임 서비스 계정 권한 누락
모든 함수는 함수가 다른 리소스에 액세스할 때 ID로 제공되는 서비스 계정과 연결됩니다. 이 런타임 서비스 계정은 기본 서비스 계정 또는 사용자 관리형 서비스 계정일 수 있습니다. 여러 함수가 여러 리소스에 액세스하는 환경에서는 일반적으로 기본 런타임 서비스 계정(PROJECT_NUMBER-compute@developer.gserviceaccount.com
) 대신 이름이 지정된 런타임 서비스 계정에 함수별 ID를 사용합니다.
런타임 서비스 계정을 사용하려면 배포자에게 해당 서비스 계정에 대한 iam.serviceAccounts.actAs
권한이 있어야 합니다. 기본값이 아닌 런타임 서비스 계정을 만드는 사용자에게는 이 권한이 자동으로 부여되지만 다른 배포자의 경우 사용자로부터 이 권한을 부여 받아야 합니다.
프로젝트 뷰어, Cloud Functions 개발자 또는 Cloud Functions 관리자 역할이 있는 사용자의 런타임 서비스 계정에 iam.serviceAccounts.actAs
권한을 할당합니다.
오류 메시지
콘솔
You must have the iam.serviceAccounts.actAs permission on the selected service account. To obtain this permission, you can grant a role that includes it like the Service Account User role, on the project.
gcloud
기본 서비스 계정:
ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Ok], message=[Caller is missing permission 'iam.serviceaccounts.actAs' on service account projects/-/serviceAccounts/PROJECT_NUMBER-compute@developer.gserviceaccount.com.Grant the role 'roles/iam.serviceAccountUser' to the caller on the service account projects/-/serviceAccounts/PROJECT_NUMBER-compute@developer.gserviceaccount.com.You can do that by running 'gcloud iam service-accounts add-iam-policy-binding projects/-/serviceAccounts/PROJECT_NUMBER-compute@developer.gserviceaccount.com --member MEMBER --role roles/iam.serviceAccountUser'where MEMBER has a prefix like 'user:' or 'serviceAccount:'
기본 이외의 서비스 계정:
ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Ok], message=[Caller is missing permission 'iam.serviceaccounts.actAs' on service account projects/-/serviceAccounts/
SERVICE_ACCOUNT_NAME@PROJECT_ID
.iam.gserviceaccount.com.Grant the role 'roles/iam.serviceAccountUser' to the caller on the service account projects/-/serviceAccounts/
SERVICE_ACCOUNT_NAME@PROJECT_ID
.iam.gserviceaccount.com.You can do that by running 'gcloud iam service-accounts add-iam-policy-binding projects/-/serviceAccounts/
SERVICE_ACCOUNT_NAME@PROJECT_ID
.iam.gserviceaccount.com --member MEMBER --role roles/iam.serviceAccountUser'where MEMBER has a prefix like 'user:' or 'serviceAccount:'
해결 방법
기본 런타임 서비스 계정 또는 기본 이외의 런타임 서비스 계정에 대해 서비스 계정 사용자 역할(roles/iam.serviceAccountUser
)을 사용자에게 할당합니다. 이 역할에는 iam.serviceAccounts.actAs
권한이 포함됩니다.
이벤트 기반 함수를 배포할 때 배포 서비스 계정에 Pub/Sub 권한이 없음
Cloud Functions 서비스는 관리 작업을 수행할 때 Cloud Functions 서비스 에이전트 서비스 계정(service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com
)을 사용합니다. 기본적으로 이 계정에는 Cloud Functions cloudfunctions.serviceAgent
역할이 할당됩니다. 이벤트 기반 함수를 배포하려면 Cloud Functions 서비스에서 Pub/Sub에 액세스하여 주제와 구독을 구성해야 합니다. 적절한 권한을 부여하지 않고 서비스 계정에 할당된 역할을 변경하면 Cloud Functions 서비스가 Pub/Sub에 액세스할 수 없고 배포에 실패합니다.
오류 메시지
콘솔
Validation failed for trigger projects/PROJECT_ID/locations/LOCATION/triggers/FUNCTION_NAME-EVENTARC_ID: Permission "iam.serviceAccounts.ActAs" denied on "EndUserCredentials to PROJECT_NUMBER-compute@developer.gserviceaccount.com"
gcloud
ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Ok], message=[Validation failed for trigger projects/test-project-356312/locations/LOCATION/triggers/FUNCTION_NAME-EVENTARC_ID: Permission "iam.serviceAccounts.ActAs" denied on "EndUserCredentials to PROJECT_NUMBER-compute@developer.gserviceaccount.com"]
해결 방법
기본 cloudfunctions.serviceAgent 역할로 서비스 계정을 재설정할 수 있습니다.
기본 런타임 서비스 계정이 존재하지 않음
사용자 관리형 런타임 서비스 계정을 지정하지 않으면 Cloud Functions는 기본 컴퓨팅 서비스 계정을 런타임 서비스 계정으로 사용합니다. 사용자 관리 계정을 지정하지 않고 기본 계정을 삭제하면 배포에 실패합니다.
오류 메시지
gcloud
ERROR: (gcloud.functions.deploy) ResponseError: status=[404], code=[Ok], message=[Service account projects/-/serviceAccounts/PROJECT_NUMBER-compute@developer.gserviceaccount.com was not found.]
해결 방법
이 문제를 해결하려면 다음 해결 방법 중 하나를 따르세요.
함수를 배포하기 전에 사용자 관리형 런타임 서비스 계정을 지정합니다.
기본 서비스 계정의 숫자 ID로 서비스 계정을 삭제 취소합니다.
함수를 배포하는 동안 Cloud Functions 서비스 에이전트 서비스 계정에 프로젝트 버킷 권한 누락
Cloud Run Functions는 동일한 Google Cloud Platform 프로젝트에 있는 Cloud Storage 버킷의 이벤트에 의해서만 트리거될 수 있습니다. 또한 Cloud Functions 서비스 에이전트 서비스 계정(service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com
)에는 프로젝트에 대한 cloudfunctions.serviceAgent
역할이 필요합니다.
오류 메시지
콘솔
ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Ok], message=[Validation failed for trigger projects/PROJECT_ID/locations/LOCATION/triggers/FUNCTION_NAME-EVENTARC_ID: Permission "iam.serviceAccounts.ActAs" denied on "EndUserCredentials to PROJECT_NUMBER-compute@developer.gserviceaccount.com"]
gcloud
ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Ok], message=[Validation failed for trigger projects/<project-id>/locations/LOCATION/triggers/FUNCTION_NAME-EVENTARC_ID: Permission "iam.serviceAccounts.ActAs" denied on "EndUserCredentials to PROJECT_NUMBER-compute@developer.gserviceaccount.com"]
해결 방법
이 문제를 해결하려면 기본 역할로 이 서비스 계정을 재설정합니다.
프로젝트 편집자 역할이 있는 사용자는 함수를 공개로 만들 수 없음
프로젝트 편집자 역할에는 프로젝트 내 리소스를 관리할 수 있는 광범위한 권한이 있지만 Cloud Functions를 공개할 수 있는 권한은 기본적으로 부여되지 않습니다. 함수를 배포하는 사용자 또는 서비스에는 run.services.setIamPolicy
권한이 필요합니다.
오류 메시지
gcloud
ERROR: (gcloud.run.services.add-iam-policy-binding) PERMISSION_DENIED: Permission 'run.services.setIamPolicy' denied on resource 'projects/PROJECT_ID/locations/LOCATION/functions/FUNCTION_NAME' (or resource may not exist).
해결 방법
다음과 같은 작업을 할 수 있습니다.
배포자에게 프로젝트 소유자 또는 Cloud Functions 관리자 역할을 할당합니다.
커스텀 역할을 만들어 권한을 수동으로 부여합니다.
프로젝트에 도메인 제한 공유가 적용되어 있는지 확인합니다.
리소스 위치 제한 조직 정책을 사용할 때 함수 배포 실패
조직에서 리소스 위치 제약조건 정책을 사용하는 경우 정책에 의해 제한된 리전에서 함수 배포가 제한됩니다. Google Cloud 콘솔에서는 함수를 배포하는 동안 리전 드롭다운에서 제한된 리전을 사용할 수 없습니다.
오류 메시지
gcloud
ResponseError: status=[400], code=[Ok], message=["LOCATION" violates constraint "constraints/gcp.resourceLocations" on the resource "projects/PROJECT_ID/locations/LOCATION/functions/FUNCTION_NAME".]
해결 방법
리소스 위치 제약조건의 allowed_values
또는 denied_values
목록에서 위치를 추가하거나 삭제하여 배포를 성공적으로 진행할 수 있습니다.
함수의 전역 범위를 실행하는 동안 함수 배포 실패
이 오류는 코드에 문제가 있음을 나타냅니다. 배포 파이프라인에서 함수 배포가 완료되었지만 마지막 단계인 함수에 상태 확인 보내기 단계에서 실패했습니다. 이 상태 확인은 예외, 비정상 종료 또는 제한 시간이 발생할 수 있는 함수의 전역 범위를 실행하려고 합니다. 전역 범위는 일반적으로 라이브러리에 로드하고 클라이언트를 초기화하는 위치입니다.
오류 메시지
Cloud Logging 로그에서 다음이 표시됩니다.
Could not create or update Cloud Run service FUNCTION_NAME, Container Healthcheck failed. Revision REVISION_NAMEE is not ready and cannot serve traffic. The user-provided container failed to start and listen on the port defined provided by the PORT=8080 environment variable. Logs for this revision might contain more information.
해결 방법
이 문제를 해결하려면 다음 해결 방법 중 하나를 따르세요.
함수가 전역 범위를 실행할 수 없는 이유가 명확하지 않으면 전역 변수의 지연 초기화를 사용하여 코드를 일시적으로 요청 호출로 이동하는 것이 좋습니다. 이를 통해 클라이언트 라이브러리 전반에 로그 구문을 더 추가할 수 있습니다. 이로 인해 특히 다른 서비스를 호출하는 경우 인스턴스화 시간이 초과되거나 비정상 종료되고 예외가 실행될 수 있습니다.
또한 함수 제한 시간을 늘려 보세요. Cloud Run Functions의 제한 시간 한도를 늘리면 초기화에 여유가 생기고 Cloud Run 환경에서 더 확장 가능한 리소스 할당이 가능해져 리소스 부족으로 인한 이 문제를 완화할 수 있습니다.
뷰어 역할이 있는 사용자는 함수를 배포할 수 없음
프로젝트 뷰어 또는 Cloud Functions 뷰어 역할이 있는 사용자는 함수 및 함수 세부정보에 대해 읽기 전용 액세스 권한을 갖으며 새 함수를 배포할 수 없습니다. Google Cloud 콘솔에서 함수 만들기 기능이 비활성화되고 다음과 같은 오류가 표시됩니다.
오류 메시지
gcloud
ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Ok], message=[Permission 'cloudfunctions.functions.generateUploadUrl' denied on 'projects/PROJECT_ID/locations/LOCATION/functions']
해결 방법
사용자에게 Cloud Functions 개발자 역할을 할당합니다.
빌드 서비스 계정에 권한이 없음
오류 메시지
함수 배포 오류 또는 빌드 로그에 다음 오류 중 하나가 표시될 수 있습니다.
The service account running this build does not have permission to write logs. To fix this, grant the Logs Writer (roles/logging.logWriter) role to the service account.
Step #0 - "fetch": failed to Fetch: failed to download archive gs://gcf-v2-sources-PROJECT_NUMBER-LOCATION/FUNCTION_NAME/version-VERSION_NUMBER/function-source.zip: Access to bucket gcf-v2-sources-PROJECT_NUMBER-LOCATION denied. You must grant Storage Object Viewer permission to PROJECT_NUMBER-compute@developer.gserviceaccount.com.
Step #2 - "build": ERROR: failed to create image cache: accessing cache image "LOCATION-docker.pkg.dev/PROJECT/gcf-artifacts/FUNCTION_NAME/cache:latest": connect to repo store "LOCATION-docker.pkg.dev/PROJECT/gcf-artifacts/FUNCTION_NAME/cache:latest": GET https://LOCATION-docker.pkg.dev/v2/token?scope=repository%3APROJECT%2Fgcf-artifacts%2FFUNCTION_NAME%2Fcache%3Apull&service=: DENIED: Permission "artifactregistry.repositories.downloadArtifacts" denied on resource "projects/PROJECT/locations/LOCATION/repositories/gcf-artifacts" (or it may not exist)
Could not build the function due to a missing permission on the build service account. If you didn't revoke that permission explicitly, this could be caused by a change in the organization policies.
해결 방법
빌드 서비스 계정에 소스 버킷에서 읽을 수 있는 권한과 아티팩트 배포 저장소에 대한 읽기 및 쓰기 권한이 필요합니다. Cloud Build에서 서비스 계정을 사용하는 방식에 대한 기본 동작이 변경되어 이 오류가 발생할 수 있습니다(Cloud Build 서비스 계정 변경 참고).
이 문제를 해결하려면 다음 해결 방법 중 하나를 사용하세요.
- 함수 배포를 위한 커스텀 Cloud Build 서비스 계정을 만듭니다.
- 기본 Compute 서비스 계정에 Cloud Build 서비스 계정 역할(
roles/cloudbuild.builds.builder
)을 추가합니다. - 기본 서비스 계정 변경에 대한 Cloud Build 안내를 검토하고 변경사항을 선택 해제합니다.
빌드 서비스 계정이 사용 중지됨
오류 메시지
Could not build the function due to disabled service account used by Cloud Build. Please make sure that the service account is active.
해결 방법
함수를 배포하려면 빌드 서비스 계정이 사용 설정되어 있어야 합니다. Cloud Build에서 서비스 계정을 사용하는 방식에 대한 기본 동작이 변경되어 이 오류가 발생할 수 있습니다(Cloud Build 서비스 계정 변경 참고).
이 문제를 해결하려면 다음 해결 방법 중 하나를 사용하세요.
- 함수 배포를 위한 커스텀 Cloud Build 서비스 계정을 만듭니다.
- 기본 Compute 서비스 계정을 사용 설정합니다.
- 기본 서비스 계정 변경에 대한 Cloud Build 안내를 검토하고 변경사항을 선택 해제합니다.
제공
이 섹션에서는 발생할 수 있는 제공 문제를 나열하고 각 문제를 해결하는 방법을 제안합니다.
인증이 필요한 함수로 인한 제공 권한 오류
인증되지 않은 호출 허용이 사용 설정되지 않은 HTTP 함수는 적절한 권한이 없는 최종 사용자 및 서비스 계정에 대한 액세스 권한을 제한합니다. 이 오류 메시지는 호출자에게 함수를 호출할 수 있는 권한이 없음을 나타냅니다.
오류 메시지
HTTP 오류 응답 코드: 403 금지됨
HTTP 오류 응답 본문:
Error: Forbidden Your client does not have permission
to get URL /FUNCTION_NAME from this server.
해결 방법
이 문제를 해결하려면 다음 해결 방법 중 하나를 따르세요.
사용자에게 특정 함수에 대한 Cloud Run 호출자 Cloud IAM 역할을 할당합니다.
조직에서 지원하는 경우 인증되지 않은 호출을 허용하도록 함수를 재배포합니다. 이는 테스트에 유용합니다.
allow internal traffic only
구성으로 인한 제공 오류
인그레스 설정은 Google Cloud 프로젝트 또는 VPC 서비스 제어 서비스 경계 외부의 리소스에서 HTTP 함수를 호출할 수 있는지 여부를 제한합니다.
인그레스 네트워킹에 내부 트래픽만 허용 설정을 구성하면 이 오류 메시지는 동일한 프로젝트 또는 VPC 서비스 제어 경계에서 VPC 네트워크의 요청만 허용됨을 나타냅니다. 기본 functions.net
URL의 404 오류일 수도 있습니다.
오류 메시지
HTTP 오류 응답 코드: 404 Not Found
해결 방법
이 오류를 해결하려면 다음 해결 방법 중 하나를 따르세요.
Google Cloud 프로젝트나 VPC 서비스 제어 서비스 경계에서 요청을 보내는지 확인합니다.
인그레스 설정을 함수의 모든 트래픽 허용으로 변경합니다.
Cloud Run Functions 소스 코드로 인해 잘못된 함수 URL, HTTP 메서드, 로직 오류 등으로 인해 404가 발생할 수도 있습니다.
함수 호출에 유효한 사용자 인증 정보가 없음
제한된 액세스로 설정된 Cloud Run Functions 함수를 호출하려면 ID 토큰이 필요합니다. 액세스 토큰 또는 갱신 토큰은 작동하지 않습니다.
오류 메시지
HTTP 오류 응답 코드: 401 Unauthorized
HTTP 오류 응답 본문:
Your client does not have permission to the requested URL 'FUNCTION_NAME'
해결 방법
이 오류를 해결하려면 다음 해결 방법 중 하나를 따르세요.
요청에
Authorization: Bearer ID_TOKEN
헤더가 포함되어 있고 토큰이 액세스 또는 갱신 토큰이 아닌 ID 토큰인지 확인합니다. 서비스 계정의 비공개 키를 사용하여 이 토큰을 수동으로 생성하는 경우 자체 서명된 JWT 토큰을 Google에서 서명한 ID 토큰으로 교환해야 합니다. 자세한 내용은 호출 인증을 참고하세요.요청 헤더에서 인증 사용자 인증 정보를 사용하여 HTTP 함수를 호출합니다. 예를 들어 다음과 같이
gcloud
를 사용하여 ID 토큰을 가져올 수 있습니다. 자세한 내용은 호출 인증을 참고하세요.curl -H "Authorization: Bearer $(gcloud auth print-identity-token)"
https://REGION-PROJECT_ID.cloudfunctions.net/FUNCTION_NAME조직에서 지원하는 경우 인증되지 않은 호출을 허용하도록 함수를 재배포합니다. 이는 테스트에 유용합니다.
함수가 실행 중간에 중지되거나 코드가 완료된 후에도 계속 실행됨
일부 Cloud Run Functions 런타임에서는 사용자가 비동기 작업을 실행할 수 있습니다. 함수가 이러한 작업을 생성하는 경우 작업이 완료될 때까지 명시적으로 대기해야 합니다. 그렇지 않으면 잘못된 시간에 함수 실행이 중지될 수 있습니다.
오류 동작
함수는 다음 동작 중 하나를 나타냅니다.
- 지정된 제한 시간 기간이 경과하기 전에 비동기 작업이 실행되는 동안 함수가 종료됩니다.
- 이러한 작업이 완료될 때 함수의 실행은 중지되지 않으며 제한 시간 기간이 경과할 때까지 계속 실행됩니다.
해결 방법
함수가 조기 종료되는 경우 함수가 다음 작업을 실행하기 전에 함수의 비동기 태스크가 모두 완료되었는지 확인해야 합니다.
- 값 반환
- 반환된
Promise
객체 확인 또는 거부(Node.js 함수만 해당) - 포착되지 않은 예외 또는 오류 발생
- HTTP 응답 보내기
- 콜백 함수 호출
비동기 태스크를 완료한 후 함수가 종료되지 않으면 함수가 완료된 후 Cloud Run Functions에 올바르게 신호를 보내는지 확인해야 합니다. 특히 함수가 비동기 태스크를 완료하는 즉시 위에 나열된 작업 중 하나를 수행해야 합니다.
VPC 서비스 제어로 보호되는 리소스에 액세스할 때 런타임 오류
기본적으로 Cloud Run Functions는 공개 IP 주소를 사용하여 다른 서비스에 대해 아웃바운드 요청을 수행합니다. 함수가 VPC 서비스 제어 경계 내부에 없으면 서비스 경계 거부로 인해 VPC 서비스 제어로 보호되는 Google Cloud 서비스에 액세스하려고 시도할 때 HTTP 403 응답이 수신될 수 있습니다.
오류 메시지
감사된 리소스 로그에서 다음과 같은 항목:
"protoPayload": { "@type": "type.googleapis.com/google.cloud.audit.AuditLog", "status": { "code": 7, "details": [ { "@type": "type.googleapis.com/google.rpc.PreconditionFailure", "violations": [ { "type": "VPC_SERVICE_CONTROLS", ... "authenticationInfo": { "principalEmail": "CLOUD_FUNCTION_RUNTIME_SERVICE_ACCOUNT", ... "metadata": { "violationReason": "NO_MATCHING_ACCESS_LEVEL", "securityPolicyInfo": { "organizationId": "ORGANIZATION_ID", "servicePerimeterName": "accessPolicies/NUMBER/servicePerimeters/SERVICE_PERIMETER_NAME" ...
해결 방법
이 오류를 해결하려면 다음 해결 방법 중 하나를 따르세요.
함수는 VPC 네트워크를 통해 모든 발신 트래픽을 라우팅해야 합니다. 자세한 내용은 VPC 서비스 제어를 준수하는 함수 배포 섹션을 참고하세요.
또는 함수의 런타임 서비스 계정에 경계에 대한 액세스 권한을 부여합니다. 이렇게 하려면 액세스 수준 만들기 및 서비스 계정에 액세스 수준 추가를 수행하거나 경계에서 인그레스 정책 만들기를 수행하면 됩니다. 자세한 내용은 경계 외부 함수에 VPC 서비스 제어 사용을 참고하세요.
확장성
이 섹션에서는 확장성 문제를 나열하고 각 문제를 해결하는 방법을 제안합니다.
대기 중인 큐 요청 취소와 관련된 Cloud Logging 오류
확장 실패는 다음과 같은 시나리오에서 발생할 수 있습니다.
- 트래픽 급증
- 긴 콜드 스타트 시간
- 긴 요청 처리 시간
- 높은 함수 오류율
- 최대 인스턴스 한도에 도달하여 시스템이 확장되지 않음
- Cloud Run Functions 서비스로 인한 일시적 요소
위의 경우 모두 Cloud Run Functions가 트래픽을 관리할 만큼 충분히 확장되지 않을 수 있습니다.
오류 메시지
The request was aborted because there was no available instance
severity=WARNING
(응답 코드: 429) 구성 중에 설정한max-instances
한도로 인해 Cloud Run Functions가 확장될 수 없습니다.severity=ERROR
(응답 코드: 500) Cloud Run Functions는 기본적으로 트래픽 속도를 관리할 수 없습니다.
해결 방법
이 문제를 해결하려면 이전에 나열된 원인을 해결하세요.
HTTP 트리거 기반 함수의 경우 클라이언트가 삭제해서는 안 되는 요청에 대해 지수 백오프 및 재시도를 구현하도록 합니다. Workflows에서 Cloud Run Functions를 트리거하는 경우
try/retry
구문을 사용하여 이를 수행할 수 있습니다.백그라운드 또는 이벤트 기반 함수의 경우 Cloud Run Functions는 최소 1회 전송을 지원합니다. 재시도를 명시적으로 사용 설정하지 않아도 이벤트가 자동으로 다시 전송되고 함수 실행이 재시도됩니다. 자세한 내용은 이벤트 기반 함수 재시도를 참조하세요.
문제의 근본 원인이 Cloud Run Functions만으로 인해 증가된 일시적인 오류 기간이거나 해당 문제에 대한 도움이 필요한 경우 지원팀에 문의하세요.
콜드 스타트와 관련된 문제의 경우 최소 인스턴스를 구성하여 청구에 더 큰 영향을 미치는 콜드 스타트 수를 줄입니다.
로깅
다음 섹션에서는 로깅 문제와 해결 방법을 설명합니다.
로그 항목에 로그 심각도 수준이 없거나 잘못된 경우
Cloud Run Functions에는 기본적으로 런타임 로깅이 포함되어 있습니다. stdout
또는 stderr
에 작성된 로그는 Cloud Logging에 자동으로 표시됩니다.
그러나 이러한 로그 항목에는 기본적으로 문자열 메시지만 포함됩니다.
오류 메시지
로그에 로그 심각도 수준이 없거나 잘못된 경우
해결 방법
로그 심각도를 포함하려면 구조화된 로그 항목을 전송해야 합니다.
장애 발생 시 예외를 다르게 처리 또는 로깅
장애 정보를 관리하고 로깅하는 방법을 맞춤설정할 수 있습니다.
해결 방법
함수를 try
블록에 래핑하여 예외 및 로깅 스택 트레이스 처리를 맞춤설정합니다.
예시
import logging
import traceback
def try_catch_log(wrapped_func):
def wrapper(*args, **kwargs):
try:
response = wrapped_func(*args, **kwargs)
except Exception:
# Replace new lines with spaces so as to prevent several entries which
# would trigger several errors.
error_message = traceback.format_exc().replace('\n', ' ')
logging.error(error_message)
return 'Error';
return response;
return wrapper;
#Example hello world function
@try_catch_log
def python_hello_world(request):
request_args = request.args
if request_args and 'name' in request_args:
1 + 's'
return 'Hello World!'
Node.js 10 이상, Python 3.8, Go 1.13, 자바 11에서 로그가 너무 큼
이러한 런타임에서 일반 로그 항목의 최대 크기는 105KiB입니다.
해결 방법
이 한도보다 작은 로그 항목을 전송합니다.
Cloud Run Functions가 오류를 반환해도 로그가 누락됨
Cloud Run Functions는 Cloud Run Functions 로그를 기본 버킷으로 스트리밍합니다. 프로젝트를 만들면 Cloud Run Functions가 기본 버킷을 만들고 사용 설정합니다. 기본 버킷이 중지되었거나 Cloud Run Functions 로그가 제외 필터에 있으면 로그 탐색기에 로그가 표시되지 않습니다.
해결 방법
기본 로그를 사용 설정합니다.
Cloud Run Functions 로그가 로그 탐색기에 표시되지 않음
일부 Cloud Logging 클라이언트 라이브러리는 비동기 프로세스를 사용하여 로그 항목을 작성합니다. 함수에 오류가 발생하거나 종료되는 경우 일부 로그 항목이 아직 기록되지 않았을 수 있으며 나중에 표시될 수 있습니다. 일부 로그가 손실되어 로그 탐색기에 표시되지 않을 수도 있습니다.
해결 방법
클라이언트 라이브러리 인터페이스를 사용하여 함수를 종료하기 전에 버퍼링된 로그 항목을 삭제하거나, 라이브러리를 사용하여 로그 항목을 동기식으로 작성합니다. stdout
또는 stderr
에 로그를 직접 동기식으로 작성할 수도 있습니다.
로그 라우터 싱크를 사용할 때 Cloud Run Functions 로그가 누락됨
로그 라우터 싱크는 로그 항목을 다양한 대상으로 라우팅합니다.
제외 필터는 삭제할 수 있는 항목을 정의합니다.
해결 방법
resource.type = "cloud_run_revision"
에 설정된 제외 필터를 삭제합니다.
데이터베이스 연결
데이터베이스에 연결할 때 여러 문제가 발생할 수 있으며 연결 제한 초과 또는 시간 초과와 관련된 경우가 많습니다. 로그에 Cloud SQL 경고(예: Context deadline exceeded
)가 표시되면 연결 구성을 조정해야 할 수 있습니다. 자세한 내용은 Cloud SQL 권장사항을 참고하세요.
네트워킹
이 섹션에서는 네트워킹 문제를 나열하고 각 문제를 해결하는 방법을 제안합니다.
네트워크 연결
이그레스 설정을 구성한 후에도 Cloud Run Functions의 모든 아웃바운드 요청이 실패하는 경우에는 연결 테스트를 실행하여 기본 네트워크 연결 문제를 식별하면 됩니다. 자세한 내용은 연결 테스트 만들기 및 실행을 참조하세요.
서버리스 VPC 액세스 커넥터가 준비되지 않았거나 존재하지 않음
서버리스 VPC 액세스 커넥터가 실패하면 커넥터 전용의 필수 /28
서브넷 마스크가 사용 중이 아니기 때문일 수 있습니다.
오류 메시지
Problem connecting to VPC Connector projects/xxxxx/locations/REGION/connectors/xxxx: Serverless VPC Access is not found.
Google API 서비스 에이전트 서비스 계정 PROJECT_NUMBER@cloudservices.gserviceaccount.com
에 권한이 없기 때문에 상태가 좋지 않은 커넥터로 Cloud Run Functions가 배포되면 다음과 같은 오류가 발생합니다.
오류 메시지
Failed to prepare VPC connector. Please try again later.
해결 방법
서브넷을 나열하여 커넥터가 /28
서브넷 마스크를 사용하는지 확인하세요. 커넥터가 /28
서브넷 마스크를 사용하지 않으면 커넥터를 다시 만들거나 새로 만듭니다.
이 문제를 해결하려면 다음 해결 방법 중 하나를 따르세요.
커넥터를 다시 만들 때 다른 함수를 다시 배포할 필요가 없습니다. 커넥터를 다시 만들 때 네트워크 중단이 발생할 수 있습니다.
새로운 대체 커넥터를 만들 때는 새 커넥터를 사용하도록 함수를 다시 배포한 후 원래 커넥터를 삭제합니다. 이 방법을 사용하면 네트워크가 중단되지 않습니다.
Cloud Run Functions와 연결된 커넥터가 동일한 리전에 배포되어 있는지 확인하세요.
공유 VPC 구성의 경우:
VPC 커넥터가 프로젝트의 리소스를 프로비저닝하는 데 사용하는 서비스 계정
SERVICE_PROJECT_NUMBER@cloudservices.gserviceaccount.com
및service-SERVICE_PROJECT_NUMBER@gcp-sa-vpcaccess.iam.gserviceaccount.com
에 권한이 누락되지 않았는지 확인합니다. 커넥터가 서비스 프로젝트에 있는 경우 이러한 서비스 계정은 공유 VPC 구성의 호스트 프로젝트에roles/compute.networkUser
역할을 가져야 합니다.커넥터가 호스트 프로젝트에서 생성된 경우 호스트 프로젝트의 Cloud Run 서비스 에이전트에
Serverless VPC Access User
역할이 부여되었는지 확인합니다.
커넥터 상태에
Connector is in a bad state, manual deletion recommended
오류가 표시되고 Google API 서비스 에이전트에 커넥터 프로젝트에서 컴퓨팅 리소스를 프로비저닝하는 데 필요한 권한이 없는 경우PROJECT_NUMBER@cloudservices.gserviceaccount.com
서비스 계정에roles/compute.admin
을 부여합니다. 경우에 따라 이러한 권한을 추가한 후 커넥터를 다시 만들어야 할 수 있습니다.
TCP 포트 25를 사용하는 외부 대상 IP 주소에 대한 SMTP 트래픽이 차단됨
Google Cloud는 보안 강화를 위해 함수에서 이메일을 보낼 때 TCP 목적지 포트 25
로의 연결을 차단합니다.
해결 방법
이러한 연결을 차단 해제하려면 다음 해결 방법 중 하나를 따르세요.
TCP 포트
587
또는465
와 같이 다른 포트에서 SMTP 서버에 연결합니다.
기본 functions.net
URL의 404 오류
Cloud Run에서 run.app
URL을 사용 중지하면 Cloud Run Functions(2세대)의 기본 cloudfunctions.net
URL에도 액세스할 수 없습니다. 이 오류는 내부 트래픽만 허용 구성으로 인한 제공 오류로 인해 발생할 수도 있습니다.
오류 메시지
HTTP 오류 응답 코드: 404 Not Found
해결 방법
Cloud Run Functions(2세대)의 기본 cloudfunctions.net
URL을 다시 사용 설정하려면 service.yaml
파일을 새 구성(annotations:run.googleapis.com/default-url-disabled: false
)으로 대체하여 Cloud Run에서 run.app
URL을 다시 사용 설정해야 합니다.