Cloud Run 함수 (1세대) 문제 해결
이 문서에서는 Cloud Run 함수 (1세대)를 사용할 때 오류 메시지를 해결하고 문제를 해결하는 방법을 설명합니다.
배포
이 섹션에는 배포에서 발생할 수 있는 문제를 나열하고 각 문제를 해결하는 방법에 대한 제안을 제공합니다. 배포 중 발생할 수 있는 많은 문제들이 역할 및 권한 또는 잘못된 구성과 관련이 있습니다.
이벤트 기반 함수를 배포할 때 배포 서비스 계정에 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에 액세스할 수 없고 배포가 실패합니다.
오류 메시지
콘솔
Failed to configure trigger PubSub projects/PROJECT_ID/topics/FUNCTION_NAME
gcloud
ERROR: (gcloud.functions.deploy) OperationError: code=13, message=Failed to configure trigger PubSub projects/PROJECT_ID/topics/FUNCTION_NAME
해결 방법
기본 cloudfunctions.serviceAgent
역할로 서비스 계정을 재설정할 수 있습니다.
기본 런타임 서비스 계정이 존재하지 않음
사용자 관리 서비스 계정을 지정하지 않으면 Cloud Run 함수 (1세대)는 기본적으로 App Engine 서비스 계정을 사용합니다. 사용자 관리 서비스 계정을 지정하지 않고 기본 계정을 삭제하면 배포에 실패합니다.
오류 메시지
gcloud
ERROR: (gcloud.functions.deploy) ResponseError: status=[400], code=[Ok], message=[Default service account 'test-project-356312@appspot.gserviceaccount.com' doesn't exist. Please recreate this account or specify a different account. Please visit https://cloud.google.com/functions/docs/troubleshooting for in-depth troubleshooting documentation.]
해결 방법
이 문제를 해결하려면 다음 해결 방법 중 하나를 따르세요.
함수를 배포할 때 사용자 관리형 런타임 서비스 계정을 지정합니다.
프로젝트에 대해 PROJECT_ID@appspot.gserviceaccount.com 기본 서비스 계정을 다시 만듭니다.
기본 서비스 계정의 삭제 취소를 실행합니다.
함수를 배포할 때 사용자에게 런타임 서비스 계정 권한 누락
모든 함수는 함수가 다른 리소스에 액세스할 때 ID로 제공되는 서비스 계정과 연결됩니다. 이 런타임 서비스 계정은 기본 서비스 계정 또는 사용자 관리형 서비스 계정일 수 있습니다. Cloud Functions에서 런타임 서비스 계정을 사용하려면 배포자에게 해당 서비스 계정에 대한 iam.serviceAccounts.actAs
권한이 있어야 합니다. 기본값이 아닌 런타임 서비스 계정을 만드는 사용자에게는 이 권한이 자동으로 부여되지만 다른 배포자의 경우 올바른 권한이 있는 사용자가 이 권한을 부여해야 합니다.
프로젝트 뷰어, Cloud Functions 개발자 또는 Cloud Functions 관리자 역할이 할당된 사용자에게는 런타임 서비스 계정에 대한 iam.serviceAccounts.actAs
권한도 추가로 할당해야 합니다.
오류 메시지
Console
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 USER is missing permission 'iam.serviceaccounts.actAs' on service account PROJECT_ID@appspot.gserviceaccount.com. Grant the role 'roles/iam.serviceAccountUser' to the caller on the service account PROJECT_ID@appspot.gserviceaccount.com. You can do that by running 'gcloud iam service-accounts add-iam-policy-binding
PROJECT_ID@appspot.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 USER is missing permission 'iam.serviceaccounts.actAs' on service account SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com. Grant the role 'roles/iam.serviceAccountUser' to the caller on the service account SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com. You can do that by running 'gcloud iam service-accounts add-iam-policy-binding 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
권한이 포함됩니다.
함수를 배포하는 동안 Cloud Run Functions 서비스 에이전트 서비스 계정에 프로젝트 버킷 권한 누락
Cloud Run 함수는 동일한 Google Cloud 프로젝트에 있는 Cloud Storage 버킷의 이벤트에 의해서만 트리거될 수 있습니다. 또한 Cloud Functions 서비스 에이전트 서비스 계정(service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com
)에는 프로젝트에 대한 cloudfunctions.serviceAgent
역할이 필요합니다.
오류 메시지
콘솔
Deployment failure: Insufficient permissions to (re)configure a trigger
(permission denied for bucket BUCKET_ID). Please, give owner permissions
to the editor role of the bucket and try again.
gcloud
ERROR: (gcloud.functions.deploy) OperationError: code=7, message=Insufficient
permissions to (re)configure a trigger (permission denied for bucket BUCKET_ID).
Please, give owner permissions to the editor role of the bucket and try again.
해결 방법
이 오류를 해결하려면 기본 역할로 서비스 에이전트 서비스 계정을 재설정합니다.
프로젝트 편집자 역할이 있는 사용자는 함수를 공개로 만들 수 없음
프로젝트 편집자 역할에는 프로젝트 내 리소스를 관리할 수 있는 광범위한 권한이 있지만 Cloud Run 함수를 공개할 수 있는 권한은 기본적으로 부여되지 않습니다. 함수를 배포하는 사용자 또는 서비스에 cloudfunctions.functions.setIamPolicy
권한을 부여해야 합니다.
오류 메시지
gcloud
ERROR: (gcloud.functions.add-iam-policy-binding) ResponseError: status=[403], code=[Forbidden], message=[Permission 'cloudfunctions.functions.setIamPolicy' denied on resource 'projects/PROJECT_ID/locations/LOCATION/functions/FUNCTION_NAME (or resource may not exist).]
해결 방법
이 오류를 해결하려면 다음 해결 방법 중 하나를 따르세요.
배포자에게 프로젝트 소유자 또는 Cloud Functions 관리자 역할을 할당합니다. 두 역할 모두
cloudfunctions.functions.setIamPolicy
권한을 포함합니다.커스텀 역할을 만들어 권한을 수동으로 부여합니다.
프로젝트에 도메인 제한 공유가 적용되어 있는지 확인합니다.
리소스 위치 제한 조직 정책을 사용할 때 함수 배포 실패
조직에서 리소스 위치 제한 정책을 사용하는 경우 정책에 의해 제한된 리전에서 함수 배포가 제한됩니다. Google Cloud 콘솔에서는 함수를 배포하는 동안 리전 드롭다운에서 제한된 리전을 사용할 수 없습니다.
오류 메시지
gcloud
ERROR: (gcloud.functions.deploy) ResponseError: status=[400], code=[Ok], message=[The request has violated one or more Org Policies. Please refer to the respective violations for more information. violations {
type: "constraints/gcp.resourceLocations"
subject: "orgpolicy:projects/PROJECT_ID"
description: "Constraint constraints/gcp.resourceLocations violated for projects/PROJECT_ID attempting GenerateUploadUrlActionV1 with location set to RESTRICTED_LOCATION. See https://cloud.google.com/resource-manager/docs/organization-policy/org-policy-constraints for more information."
}
해결 방법
리소스 위치 제약조건의 allowed_values
또는 denied_values
목록에서 위치를 추가하거나 삭제하여 배포를 성공적으로 진행합니다.
함수의 전역 범위를 실행하는 동안 함수 배포 실패
이 오류는 코드에 문제가 있음을 나타냅니다. 배포 파이프라인에서 함수 배포가 완료되었지만 마지막 단계인 함수에 상태 확인 보내기 단계에서 실패했습니다. 이 상태 확인은 예외, 비정상 종료 또는 제한 시간이 발생할 수 있는 함수의 전역 범위를 실행하려고 합니다. 전역 범위는 일반적으로 라이브러리에 로드하고 클라이언트를 초기화하는 위치입니다.
오류 메시지
콘솔
Deployment failure: Function failed on loading user code. This is likely due to a bug in the user code.
gcloud
ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Function
failed on loading user code. This is likely due to a bug in the user code.
Cloud Logging 로그에서 다음이 표시됩니다.
"Function failed on loading user code. This is likely due to a bug in the user code."
해결 방법
이 문제를 해결하려면 다음 해결 방법 중 하나를 따르세요.
함수가 전역 범위를 실행할 수 없는 이유가 명확하지 않은 경우 전역 변수의 지연 초기화를 사용하여 코드를 일시적으로 요청 호출로 이동하는 것이 좋습니다. 이를 통해 클라이언트 라이브러리 전반에 로그 구문을 더 추가할 수 있습니다. 이로 인해 특히 다른 서비스를 호출하는 경우 인스턴스화 시간이 초과되거나 비정상 종료되고 예외가 실행될 수 있습니다.
함수 제한 시간을 늘립니다.
뷰어 역할이 있는 사용자는 함수를 배포할 수 없음
프로젝트 뷰어 또는 Cloud Functions 뷰어 역할이 있는 사용자는 함수 및 함수 세부정보에 대해 읽기 전용 액세스 권한을 갖으며 새 함수를 배포할 수 없습니다. Google Cloud 콘솔에서 함수 만들기 기능이 비활성화되고 다음과 같은 오류가 표시됩니다.
오류 메시지
gcloud
ERROR: (gcloud.functions.deploy) PERMISSION_DENIED: Permission
'cloudfunctions.functions.sourceCodeSet' denied on resource
'projects/PROJECT_ID/locations/LOCATION` (or resource may not exist)
해결 방법
사용자에게 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-sources-PROJECT_NUMBER-LOCATION/FUNCTION_NAME/version-VERSION_NUMBER/function-source.zip: Access to bucket gcf-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 함수는 적절한 권한이 없는 최종 사용자 및 서비스 계정에 대한 액세스 권한을 제한합니다.
브라우저에서 Cloud Run Functions URL로 이동해도 인증 헤더가 자동으로 추가되지 않습니다.
오류 메시지
HTTP 오류 응답 코드: 403 금지됨
HTTP 오류 응답 본문:
Error: Forbidden Your client does not have permission
to get URL /FUNCTION_NAME from this server.
해결 방법
이 오류를 해결하려면 다음 해결 방법 중 하나를 따르세요.
사용자에게 Cloud Run 함수 호출자 역할을 할당합니다.
조직에서 지원하는 경우 인증되지 않은 호출을 허용하도록 함수를 재배포합니다. 이는 테스트 목적으로 유용할 수 있습니다.
allow internal traffic only
구성으로 인한 제공 권한 오류
인그레스 설정은 Google Cloud 프로젝트 또는 VPC 서비스 제어 서비스 경계 외부의 리소스에서 HTTP 함수를 호출할 수 있는지 여부를 제한합니다. 인그레스 네트워킹에 내부 트래픽만 허용 설정을 구성하면 이 오류 메시지는 동일한 프로젝트 또는 VPC 서비스 제어 경계에서 VPC 네트워크의 요청만 허용됨을 나타냅니다.
오류 메시지
HTTP 오류 응답 코드: 404 Not Found
HTTP 오류 응답 본문:
404 Page not found
해결 방법
이 오류를 해결하려면 다음 해결 방법 중 하나를 따르세요.
Google Cloud 프로젝트나 VPC 서비스 제어 서비스 경계에서 요청을 보내는지 확인합니다.
인그레스 설정을 함수의 모든 트래픽 허용으로 변경합니다.
Cloud Run 함수 소스 코드로 인해 잘못된 함수 URL, HTTP 메서드 또는 로직 오류로 인해 404 오류가 발생할 수 있습니다.
함수 호출에 유효한 사용자 인증 정보가 없음
제한된 액세스로 구성된 함수에는 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 함수에 올바르게 신호를 보내는지 확인해야 합니다. 특히 함수가 비동기 태스크를 완료하는 즉시 위 목록에 나열된 작업 중 하나를 실행해야 합니다.
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.
Cloud Run 함수에는 다음과 같은 심각도 수준이 있습니다.
* `severity=WARNING` ( Response code: 429 ) Cloud Run functions cannot scale due
to the [`max-instances`](/functions/docs/configuring/max-instances) limit you set
during configuration.
* `severity=ERROR` ( Response code: 500 ) Cloud Run functions intrinsically
cannot manage the rate of traffic.
해결 방법
- HTTP 트리거 기반 함수의 경우 삭제해서는 안 되는 요청에 대해 지수 백오프 및 재시도를 구현합니다. Workflows에서 Cloud Run Functions를 트리거하는 경우
try/retry
구문을 사용하여 이를 수행할 수 있습니다. - 백그라운드 또는 이벤트 기반 함수의 경우 Cloud Run Functions는 최소 1회 전송을 지원합니다. 재시도를 명시적으로 사용 설정하지 않아도 이벤트가 자동으로 다시 전송되고 함수 실행이 재시도됩니다. 자세한 내용은 이벤트 기반 함수 재시도 사용 설정을 참고하세요.
- 문제의 근본 원인이 Cloud Run Functions만으로 인해 증가된 일시적인 오류 기간이거나 해당 문제에 대한 도움이 필요한 경우 Cloud Customer Care에 문의하세요.
로깅
다음 섹션에서는 로깅 문제와 해결 방법을 설명합니다.
로그 항목에 로그 심각도 수준이 없거나 잘못된 경우
Cloud Run Functions에는 기본적으로 런타임 로깅이 포함되어 있습니다. stdout
또는 stderr
에 작성된 로그는 Google Cloud 콘솔에 자동으로 표시됩니다.
그러나 이러한 로그 항목에는 기본적으로 문자열 메시지만 포함됩니다.
해결 방법
로그 심각도를 포함하려면 구조화된 로그 항목을 전송해야 합니다.
장애 발생 시 예외를 다르게 처리 또는 로깅
장애 정보를 관리하고 로깅하는 방법을 맞춤설정할 수 있습니다.
해결 방법
함수를 try
블록에 래핑하여 예외 및 로깅 스택 트레이스 처리를 맞춤설정합니다.
try
블록을 추가하면 retry on failure
구성이 있는 이벤트 기반 함수에 의도하지 않은 부작용이 발생할 수 있습니다. 실패 이벤트를 재시도하면 자체적으로 실패할 수 있습니다.
예시
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 함수 로그가 제외 필터에 있으면 로그 탐색기에 로그가 표시되지 않습니다.
해결 방법
기본 로그를 사용 설정하고 제외 필터가 설정되어 있지 않은지 확인합니다.
Cloud Run Functions 로그가 로그 탐색기에 표시되지 않음
일부 Cloud Logging 클라이언트 라이브러리는 비동기 프로세스를 사용하여 로그 항목을 작성합니다. 함수에 오류가 발생하거나 종료되는 경우 일부 로그 항목이 아직 기록되지 않았을 수 있으며 나중에 표시될 수 있습니다. 일부 로그가 손실되어 로그 탐색기에 표시되지 않을 수도 있습니다.
해결 방법
클라이언트 라이브러리 인터페이스를 사용하여 함수를 종료하기 전에 버퍼링된 로그 항목을 삭제하거나, 라이브러리를 사용하여 로그 항목을 동기식으로 작성합니다. stdout
또는 stderr
에 로그를 직접 동기식으로 작성할 수도 있습니다.
로그 라우터 싱크를 사용하여 Cloud Run 함수 로그가 표시되지 않음
로그 라우터 싱크는 로그 항목을 다양한 대상으로 라우팅합니다.
설정에는 삭제할 수 있는 항목을 정의하는 제외 필터가 있습니다.
해결 방법
resource.type="cloud_functions"
에 설정된 제외 필터를 삭제합니다.
데이터베이스 연결
많은 데이터베이스 오류는 연결 제한 초과 또는 시간 초과와 관련이 있습니다. 로그에 Cloud SQL 경고(예: Context deadline exceeded
)가 표시되면 연결 구성을 조정해야 할 수 있습니다. 자세한 내용은 Cloud SQL 권장사항을 참고하세요.
네트워킹
이 섹션에서는 네트워킹 문제를 나열하고 각 문제를 해결하는 방법을 제안합니다.
네트워크 연결
이그레스 설정을 구성한 후에도 Cloud Run Functions의 모든 아웃바운드 요청이 실패하는 경우에는 연결 테스트를 실행하여 기본 네트워크 연결 문제를 식별하면 됩니다. 자세한 내용은 연결 테스트 만들기 및 실행을 참조하세요.
서버리스 VPC 액세스 커넥터가 준비되지 않았거나 존재하지 않음
서버리스 VPC 액세스 커넥터가 실패하면 커넥터 전용의 필수 /28
서브넷 마스크가 사용 중이 아니기 때문일 수 있습니다.
오류 메시지
VPC connector projects/xxxxx/locations/REGION/connectors/xxxx
is not ready yet or does not exist.
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
역할을 가져야 합니다. 그렇지 않으면roles/compute.networkAdmin
가 필요합니다.커넥터가 호스트 프로젝트에서 생성된 경우 호스트 프로젝트의
Cloud Run functions Service Agent
에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는 보안 강화를 위해 Cloud Run 함수에서 이메일을 보낼 때 TCP 목적지 포트 25
로의 연결을 차단합니다.
해결 방법
이러한 연결을 차단 해제하려면 다음 옵션 중 하나를 선택합니다.
TCP 포트
587
또는465
와 같이 다른 포트에서 SMTP 서버에 연결합니다.
기타
이 섹션에서는 다른 카테고리에 해당하지 않는 추가 문제를 간략히 설명하고 각 문제에 대한 해결 방법을 제공합니다.
Cloud 감사 로그의 google.storage.buckets.testIamPermissions
메서드에 VPC 서비스 제어 오류가 표시됨
Google Cloud 콘솔에서 함수 세부정보 페이지를 열면 Cloud Run 함수가 컨테이너 이미지의 저장소 저장소를 수정하고 공개적으로 액세스할 수 있는지 확인합니다. 이를 확인하기 위해 Cloud Run 함수는 다음 형식([REGION].artifacts.[PROJECT_ID].appspot.com
)의 google.storage.buckets.testIamPermissions
메서드를 사용하여 Container Registry 버킷에 요청을 보냅니다. 두 검사의 유일한 차이점은 하나는 인증을 통해 실행되어 버킷을 수정할 수 있는 사용자 권한을 확인하는 반면, 다른 하나는 인증 없이 실행되어 버킷에 공개적으로 액세스할 수 있는지 확인한다는 점입니다.
VPC 서비스 제어 경계가 storage.googleapis.com
API를 제한하는 경우 Google Cloud 콘솔의 Cloud Audit Logs에 google.storage.buckets.testIamPermissions
메서드에 오류가 표시됩니다.
오류 메시지
인증 정보가 없는 공개 액세스 확인의 경우 VPC SC 거부 정책 감사 로그에 다음과 유사한 항목이 표시됩니다.
"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": {}, "requestMetadata": { "callerIp": "END_USER_IP" }, "serviceName": "storage.googleapis.com", "methodName": "google.storage.buckets.testIamPermissions", "resourceName": "projects/PROJECT_NUMBER", "metadata": { "ingressViolations": [ { "servicePerimeter": "accessPolicies/ACCESS_POLICY_ID/servicePerimeters/VPC_SC_PERIMETER_NAME", "targetResource": "projects/PROJECT_NUMBER" } ], "resourceNames": [ "projects/_/buckets/REGION.artifacts.PROJECT_ID.appspot.com" ], "securityPolicyInfo": { "servicePerimeterName": "accessPolicies/ACCESS_POLICY_ID/servicePerimeters/VPC_SC_PERIMETER_NAME", "organizationId": "ORG_ID" }, "violationReason": "NO_MATCHING_ACCESS_LEVEL", ...
인증 정보가 포함된 공개 액세스 확인의 경우 VPC SC 거부 정책 감사 로그에는 사용자가 다음 예와 유사한 버킷 설정을 수정할 수 있는 항목이 표시됩니다.
"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": "END_USER_EMAIL" }, "requestMetadata": { "callerIp": "END_USER_IP", "requestAttributes": {}, "destinationAttributes": {} }, "serviceName": "storage.googleapis.com", "methodName": "google.storage.buckets.testIamPermissions", "resourceName": "projects/PROJECT_NUMBER", "metadata": { "ingressViolations": [ { "servicePerimeter": "accessPolicies/ACCESS_POLICY_ID/servicePerimeters/VPC_SC_PERIMETER_NAME", "targetResource": "projects/PROJECT_NUMBER" } ], "resourceNames": [ "projects/_/buckets/REGION.artifacts.PROJECT_ID.appspot.com" ], "securityPolicyInfo": { "servicePerimeterName": "accessPolicies/ACCESS_POLICY_ID/servicePerimeters/VPC_SC_PERIMETER_NAME", "organizationId": "ORG_ID" }, "violationReason": "NO_MATCHING_ACCESS_LEVEL", ...
해결 방법
Container Registry 버킷에 공개적으로 액세스할 수 없는 경우 VPC 서비스 제어 오류를 무시할 수 있습니다.
또는 다음 예와 같이 VPC 서비스 제어 인그레스 규칙을 추가하여 google.storage.buckets.testIamPermissions
메서드를 허용할 수 있습니다.
ingress_from { sources { access_level: "*" } identity_type: ANY_IDENTITY } ingress_to { operations { service_name: "storage.googleapis.com" method_selectors { method: "google.storage.buckets.testIamPermissions" } } resources: "projects/PROJECT_NUMBER" }
가능하면 사용자 IP 주소로 액세스 수준을 정의하여 인그레스 규칙을 더 세분화할 수 있습니다.