Memecahkan masalah Cloud Functions

Dokumen ini menunjukkan beberapa masalah umum yang mungkin Anda alami dan cara mengatasinya.

Deployment

Fase deployment sering menjadi sumber masalah. Banyak masalah yang mungkin Anda temui selama deployment berkaitan dengan peran dan izin. Yang lain berkaitan dengan konfigurasi yang salah.

Pengguna dengan peran Viewer tidak dapat men-deploy fungsi

Pengguna yang telah diberi peran Project Viewer atau Cloud Functions Viewer memiliki akses hanya baca ke fungsi dan detail fungsi. Peran ini tidak diizinkan untuk men-deploy fungsi baru.

Pesan error

Cloud Console

You need permissions for this action. Required permission(s): cloudfunctions.functions.create

Cloud SDK

ERROR: (gcloud.functions.deploy) PERMISSION_DENIED: Permission
'cloudfunctions.functions.sourceCodeSet' denied on resource
'projects/<PROJECT_ID>/locations/<LOCATION>` (or resource may not exist)

Solusi

Beri pengguna peran yang memiliki akses yang sesuai.

Pengguna dengan peran Project Viewer atau Cloud Function tidak dapat men-deploy fungsi

Untuk men-deploy fungsi, pengguna yang telah diberi peran Project Viewer, Cloud Function Developer, atau Cloud Function Admin harus diberi peran tambahan.

Pesan error

Cloud Console

User does not have the iam.serviceAccounts.actAs permission on
<PROJECT_ID>@appspot.gserviceaccount.com required to create function.
You can fix this by running
'gcloud iam service-accounts add-iam-policy-binding <PROJECT_ID>@appspot.gserviceaccount.com --member=user: --role=roles/iam.serviceAccountUser'

Cloud SDK

ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Forbidden],
message=[Missing necessary permission iam.serviceAccounts.actAs for <USER>
on the service account <PROJECT_ID>@appspot.gserviceaccount.com. Ensure that
service account <PROJECT_ID>@appspot.gserviceaccount.com is a member of the
project <PROJECT_ID>, and then grant <USER> the role 'roles/iam.serviceAccountUser'.
You can do that by running
'gcloud iam service-accounts add-iam-policy-binding <PROJECT_ID>@appspot.gserviceaccount.com --member=<USER> --role=roles/iam.serviceAccountUser'
In case the member is a service account please use the prefix 'serviceAccount:' instead of 'user:'.]

Solusi

Tetapkan peran tambahan kepada pengguna, peran Service Account User IAM (roles/iam.serviceAccountUser ), yang dicakupkan ke akun layanan runtime Cloud Functions.

Akun layanan deployment tidak memiliki peran Service Agent saat men-deploy fungsi

Layanan Cloud Functions menggunakan akun layanan Agen Layanan Cloud Functions (service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com) saat melakukan tindakan administratif pada project Anda. Secara default, akun ini diberi peran cloudfunctions.serviceAgent Cloud Functions. Peran ini diperlukan untuk integrasi Cloud Pub/Sub, IAM, Cloud Storage, dan Firebase. Deployment akan gagal jika Anda telah mengubah peran untuk akun layanan ini.

Pesan error

Cloud Console

Missing necessary permission resourcemanager.projects.getIamPolicy for
serviceAccount:service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com on project <PROJECT_ID>.
Please grant serviceAccount:service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com
the roles/cloudfunctions.serviceAgent role. You can do that by running
'gcloud projects add-iam-policy-binding <PROJECT_ID> --member=serviceAccount:service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com --role=roles/cloudfunctions.serviceAgent'

Cloud SDK

ERROR: (gcloud.functions.deploy) OperationError: code=7,
message=Missing necessary permission resourcemanager.projects.getIamPolicy
for serviceAccount:service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com
on project <PROJECT_ID>. Please grant
serviceAccount:service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com
the roles/cloudfunctions.serviceAgent role. You can do that by running
'gcloud projects add-iam-policy-binding <PROJECT_ID> --member=serviceAccount:service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com --role=roles/cloudfunctions.serviceAgent'

Solusi

Reset akun layanan ini ke peran default.

Akun layanan deployment tidak memiliki izin Pub/Sub saat men-deploy fungsi berbasis peristiwa

Layanan Cloud Functions menggunakan akun layanan Agen Layanan Cloud Functions (service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com) saat melakukan tindakan administratif. Secara default, akun ini diberi peran cloudfunctions.serviceAgent Cloud Functions. Untuk men-deploy fungsi berbasis peristiwa, layanan Cloud Functions harus mengakses Cloud Pub/Sub untuk mengonfigurasi topik dan langganan. Jika peran yang ditetapkan ke akun layanan diubah dan izin yang sesuai tidak diberikan, layanan Cloud Functions tidak dapat mengakses Cloud Pub/Sub dan deployment akan gagal.

Pesan error

Cloud Console

Failed to configure trigger PubSub projects/<PROJECT_ID>/topics/<FUNCTION_NAME>

Cloud SDK

ERROR: (gcloud.functions.deploy) OperationError: code=13,
message=Failed to configure trigger PubSub projects/<PROJECT_ID>/topics/<FUNCTION_NAME>

Solusi

Anda dapat:

  • Reset akun layanan ini ke peran default.

    atau

  • Beri izin pubsub.subscriptions.* dan pubsub.topics.* ke akun layanan Anda secara manual.

Akun layanan runtime default tidak ada

Jika akun layanan runtime yang dikelola pengguna tidak ditentukan, fungsi generasi ke-1 akan ditetapkan secara default ke menggunakan akun layanan app engine sebagai akun layanan runtime. Jika akun default ini telah dihapus dan tidak ada akun yang dikelola pengguna yang ditentukan, deployment akan gagal.

Pesan error

Cloud Console

Default service account '<PROJECT_ID>@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.

Cloud SDK

ERROR: (gcloud.functions.deploy) ResponseError: status=[400], code=[Ok], message=[Default service account '<PROJECT_ID>@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.]

Solusi

Pengguna tidak memiliki izin untuk akun layanan runtime saat men-deploy fungsi

Di lingkungan dengan beberapa fungsi yang mengakses resource yang berbeda, praktik yang umum adalah menggunakan identitas per fungsi , dengan akun layanan runtime bernama, bukan akun layanan runtime default (PROJECT_ID@appspot.gserviceaccount.com ).

Namun, untuk menggunakan akun layanan runtime non-default, deployer harus memiliki izin iam.serviceAccounts.actAs di akun non-default tersebut. Pengguna yang membuat akun layanan runtime non-default secara otomatis diberi izin ini, tetapi deployer lain harus memiliki izin ini yang diberikan oleh pengguna dengan izin yang benar.

Pesan error

Cloud SDK

ERROR: (gcloud.functions.deploy) ResponseError: status=[400], code=[Bad Request],
message=[Invalid function service account requested: <SERVICE_ACCOUNT_NAME@<PROJECT_ID>.iam.gserviceaccount.com]

Solusi

Beri pengguna peran roles/iam.serviceAccountUser di akun layanan runtime <SERVICE_ACCOUNT_NAME> non-default. Peran ini mencakup izin iam.serviceAccounts.actAs.

Akun layanan Agen Layanan Cloud Functions tidak memiliki izin bucket project saat men-deploy fungsi

Cloud Functions hanya dapat dipicu oleh peristiwa dari bucket Cloud Storage dalam project Google Cloud Platform yang sama. Selain itu, akun layanan Agen Layanan Cloud Functions (service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com) memerlukan peran cloudfunctions.serviceAgent di project Anda.

Pesan error

Cloud Console

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.

Cloud SDK

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.

Solusi

Anda dapat:

  • Reset akun layanan ini ke peran default.

    atau

  • Berikan peran cloudfunctions.serviceAgent kepada akun layanan runtime.

    atau

  • Beri akun layanan runtime izin storage.buckets.{get, update} dan resourcemanager.projects.get.

Pengguna dengan peran Project Editor tidak dapat membuat fungsi menjadi publik

Untuk memastikan bahwa developer yang tidak diberi otorisasi tidak dapat mengubah setelan autentikasi untuk pemanggilan fungsi, pengguna atau layanan yang men-deploy fungsi tersebut harus memiliki izin cloudfunctions.functions.setIamPolicy.

Pesan error

Cloud SDK

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).]

Solusi

Anda dapat:

Deployment fungsi gagal karena Cloud Build tidak mendukung VPC-SC

Cloud Functions menggunakan Cloud Build untuk membangun kode sumber Anda ke dalam container yang dapat dijalankan. Untuk menggunakan Cloud Functions dengan Kontrol Layanan VPC, Anda harus mengonfigurasi tingkat akses untuk akun layanan Cloud Build di perimeter layanan Anda.

Pesan error

Cloud Console

Salah satu dari hal berikut:

Error in the build environment

OR

Unable to build your function due to VPC Service Controls. The Cloud Build
service account associated with this function needs an appropriate access
level on the service perimeter. Please grant access to the Cloud Build
service account: '{PROJECT_NUMBER}@cloudbuild.gserviceaccount.com' by
following the instructions at
https://cloud.google.com/functions/docs/securing/using-vpc-service-controls#grant-build-access"

Cloud SDK

Salah satu dari hal berikut:

ERROR: (gcloud.functions.deploy) OperationError: code=13, message=Error in
the build environment

OR

Unable to build your function due to VPC Service Controls. The Cloud Build
service account associated with this function needs an appropriate access
level on the service perimeter. Please grant access to the Cloud Build
service account: '{PROJECT_NUMBER}@cloudbuild.gserviceaccount.com' by
following the instructions at
https://cloud.google.com/functions/docs/securing/using-vpc-service-controls#grant-build-access"

Solusi

Jika log Resource yang Diaudit project Anda menyebutkan "Permintaan dilarang oleh kebijakan organisasi" di bagian Kontrol Layanan VPC dan memiliki label Cloud Storage, Anda harus memberi Akun Layanan Cloud Build akses ke perimeter Kontrol Layanan VPC.

Deployment fungsi gagal karena titik entri yang ditentukan dengan tidak benar

Deployment Cloud Functions dapat gagal jika titik entri ke kode Anda, yaitu nama fungsi yang diekspor, tidak ditentukan dengan benar.

Pesan error

Cloud Console

Deployment failure: Function failed on loading user code. Error message:
Error: please examine your function logs to see the error cause:
https://cloud.google.com/functions/docs/monitoring/logging#viewing_logs

Cloud SDK

ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Function
failed on loading user code. Error message: Please examine your function
logs to see the error cause:
https://cloud.google.com/functions/docs/monitoring/logging#viewing_logs

Solusi

Kode sumber Anda harus berisi fungsi titik entri yang telah ditentukan dengan benar dalam deployment, baik melalui konsol Cloud atau Cloud SDK.

Deployment fungsi gagal saat menggunakan kebijakan organisasi Batasan Lokasi Resource

Jika organisasi Anda menggunakan kebijakan Batasan Lokasi Resource, Anda mungkin melihat error ini di log. Hal ini menunjukkan bahwa pipeline deployment gagal membuat bucket penyimpanan multi-regional.

Pesan error

Di log Cloud Build:

Token exchange failed for project '<PROJECT_ID>'.
Org Policy Violated: '<REGION>' violates constraint 'constraints/gcp.resourceLocations'

Di log Cloud Storage:

<REGION>.artifacts.<PROJECT_ID>.appspot.com` storage bucket could not be created.

Solusi

Jika menggunakan constraints/gcp.resourceLocations dalam batasan kebijakan organisasi, Anda harus menentukan lokasi multi-region yang sesuai. Misalnya, jika men-deploy di salah satu region us, Anda harus menggunakan us-locations.

Namun, jika Anda memerlukan kontrol yang lebih terperinci dan ingin membatasi deployment fungsi ke satu region (bukan beberapa region), buat bucket multi-region terlebih dahulu:

  1. Izinkan seluruh multi-region
  2. Deploy fungsi pengujian
  3. Setelah deployment berhasil, ubah kembali kebijakan organisasi untuk hanya mengizinkan region tertentu.

Bucket penyimpanan multi-region tetap tersedia untuk region tersebut, sehingga deployment berikutnya dapat berhasil. Jika nantinya Anda memutuskan untuk melakukan allowlist pada region di luar tempat bucket penyimpanan multi-region dibuat, Anda harus mengulangi prosesnya.

Deployment fungsi gagal saat mengeksekusi cakupan global fungsi

Error ini menunjukkan bahwa ada masalah dengan kode Anda. Pipeline deployment selesai men-deploy fungsi, tetapi gagal di langkah terakhir - mengirimkan health check ke fungsi tersebut. Health check ini dimaksudkan untuk mengeksekusi cakupan global fungsi, yang dapat menampilkan pengecualian, error, atau waktu habis. Cakupan global adalah tempat Anda biasanya memuat dalam library dan menginisialisasi klien.

Pesan error

Di log Cloud Logging:

"Function failed on loading user code. This is likely
due to a bug in the user code."

Solusi

Untuk pesan error yang lebih mendetail, periksa log build fungsi Anda, serta log runtime fungsi Anda. Jika tidak jelas mengapa fungsi Anda gagal mengeksekusi cakupan globalnya, pertimbangkan untuk memindahkan kode untuk sementara ke pemanggilan permintaan, menggunakan inisialisasi lambat variabel global. Hal ini memungkinkan Anda menambahkan laporan log tambahan di sekitar library klien, yang dapat menyebabkan waktu habis saat pembuatan instance (terutama jika mereka memanggil layanan lain), atau menyebabkan error/menampilkan pengecualian. Selain itu, Anda dapat mencoba meningkatkan waktu tunggu fungsi.

Build

Saat Anda men-deploy kode sumber fungsi ke Cloud Functions, sumber tersebut disimpan di bucket Cloud Storage. Cloud Build kemudian secara otomatis membangun kode Anda ke dalam image container dan mengirimkan image tersebut ke Container Registry. Cloud Functions mengakses image ini ketika perlu menjalankan container untuk mengeksekusi fungsi Anda.

Build gagal karena Image Container Registry tidak ada

Cloud Functions (generasi ke-1) menggunakan Container Registry untuk mengelola image fungsi. Container Registry menggunakan Cloud Storage untuk menyimpan lapisan image dalam bucket yang bernama STORAGE-REGION.artifacts.PROJECT-ID.appspot.com. Penggunaan Object Lifecycle Management pada bucket ini akan membatalkan deployment fungsi karena deployment bergantung pada keberadaan image ini.

Pesan error

Cloud Console

Build failed: Build error details not available. Please check the logs at
<CLOUD_CONSOLE_LINK>

CLOUD_CONSOLE_LINK contains an error like below :
failed to get OS from config file for image 'us.gcr.io/<PROJECT_ID>/gcf/us-central1/<UUID>/worker:latest'"

Cloud SDK

ERROR: (gcloud.functions.deploy) OperationError: code=13, message=Build
failed: Build error details not available. Please check the logs at
<CLOUD_CONSOLE_LINK>

CLOUD_CONSOLE_LINK contains an error like below :
failed to get OS from config file for image 'us.gcr.io/<PROJECT_ID>/gcf/us-central1/<UUID>/worker:latest'"

Solusi

  1. Nonaktifkan Lifecycle Management di bucket yang diperlukan oleh Container Registry.
  2. Hapus semua image fungsi yang terpengaruh. Anda dapat mengakses log build untuk menemukan lokasi image. Referensikan skrip untuk menghapus image secara massal. Perhatikan bahwa hal ini tidak memengaruhi fungsi yang saat ini di-deploy.
  3. Deploy ulang fungsi.

Serving

Fase penyajian juga dapat menjadi sumber error.

Error izin penyajian karena fungsi memerlukan autentikasi

Fungsi HTTP tanpa mengaktifkan Izinkan pemanggilan yang tidak diautentikasi akan membatasi akses ke pengguna akhir dan akun layanan yang tidak memiliki izin yang sesuai. Pesan error ini menunjukkan bahwa pemanggil tidak memiliki izin untuk memanggil fungsi.

Pesan error

Kode Respons Error HTTP: 403 Terlarang

Isi Respons Error HTTP: Error: Dilarang Klien Anda tidak memiliki izin untuk mendapatkan URL /<FUNCTION_NAME> dari server ini.

Solusi

Anda dapat:

  • Deploy ulang fungsi Anda untuk mengizinkan pemanggilan yang tidak diautentikasi jika didukung oleh organisasi Anda. Hal ini dapat berguna untuk tujuan pengujian.

  • Panggil fungsi HTTP menggunakan kredensial autentikasi di header permintaan Anda. Misalnya, Anda bisa mendapatkan token identitas melalui gcloud sebagai berikut:

    curl  -H "Authorization: Bearer $(gcloud auth print-identity-token)" \
      https://REGION-PROJECT_ID.cloudfunctions.net/FUNCTION_NAME
    

    Baca bagian Mengautentikasi pemanggilan

  • Untuk Cloud Functions (generasi ke-1), izinkan akses publik (tanpa autentikasi) bagi semua pengguna untuk fungsi tertentu.

  • Untuk Cloud Functions (generasi ke-2), Anda dapat melakukan salah satu hal berikut:

    • Tetapkan peran Cloud Run Invoker Cloud IAM kepada pengguna untuk fungsi tertentu.

    • Dari konsol Google Cloud:

      Buka Konsol Google Cloud

      1. Klik nama tertaut dari fungsi yang ingin Anda berikan akses.

      2. Klik link Powered By Cloud Run pada link di pojok kanan atas halaman ringkasan Detail fungsi.

      3. Klik Pemicu lalu pilih Izinkan pemanggilan yang tidak diautentikasi.

      4. Klik Save.

Error izin penyajian karena konfigurasi "izinkan traffic internal saja"

Setelan traffic masuk membatasi apakah fungsi HTTP dapat dipanggil oleh resource di luar project Google Cloud atau perimeter layanan Kontrol Layanan VPC. Jika setelan "izinkan traffic internal saja" untuk jaringan traffic masuk dikonfigurasi, pesan error ini menunjukkan bahwa hanya permintaan dari jaringan VPC dalam project atau perimeter Kontrol Layanan VPC yang sama yang diizinkan.

Pesan error

Kode Respons Error HTTP: 403 Terlarang

Isi Respons Error HTTP: Error 403 (Dilarang) 403. Itu adalah error. Akses tidak diizinkan. Hanya itu yang kami ketahui.

Solusi

Anda dapat:

  • Pastikan permintaan berasal dari project Google Cloud Anda atau perimeter layanan Kontrol Layanan VPC.

    atau

  • Ubah setelan traffic masuk untuk mengizinkan semua traffic untuk fungsi tersebut.

Pemanggilan fungsi tidak memiliki kredensial autentikasi yang valid

Pemanggilan fungsi Cloud Functions yang telah disiapkan dengan akses terbatas memerlukan token ID. Token akses atau token refresh tidak berfungsi.

Pesan error

Kode Respons Error HTTP: 401 Tidak Diberi Otorisasi

Isi Respons Error HTTP: Klien Anda tidak memiliki izin ke URL yang diminta

Solusi

Pastikan permintaan Anda menyertakan header Authorization: Bearer ID_TOKEN, dan token tersebut adalah token ID, bukan token akses atau token refresh. Jika membuat token ini secara manual dengan kunci pribadi akun layanan, Anda harus menukar token JWT yang ditandatangani sendiri dengan token Identitas yang ditandatangani Google, dengan mengikuti panduan ini.

Mencoba mengaktifkan fungsi menggunakan curl akan mengalihkan ke halaman login Google

Jika Anda mencoba memanggil fungsi yang tidak ada, Cloud Functions merespons dengan pengalihan HTTP/2 302 yang mengarahkan Anda ke halaman login akun Google. Ini salah. Aplikasi harus merespons dengan kode respons error HTTP/2 404. Masalah sedang ditangani.

Solusi

Pastikan Anda menentukan nama fungsi dengan benar. Anda dapat memeriksa menggunakan gcloud functions call yang menampilkan error 404 yang benar untuk fungsi yang tidak ada.

Aplikasi mengalami error dan eksekusi fungsi gagal

Error ini menunjukkan bahwa proses yang menjalankan fungsi Anda telah berhenti. Hal ini biasanya disebabkan oleh error pada runtime yang disebabkan oleh masalah dalam kode fungsi. Hal ini juga dapat terjadi jika deadlock atau beberapa kondisi lain dalam kode fungsi Anda menyebabkan runtime menjadi tidak responsif terhadap permintaan masuk.

Pesan error

Di log Cloud Logging: "Infrastruktur tidak dapat berkomunikasi dengan fungsi. Kemungkinan terjadi error atau deadlock dalam kode yang diberikan pengguna."

Solusi

Runtime yang berbeda dapat mengalami error pada skenario yang berbeda. Untuk menemukan akar masalahnya, buat log tingkat debug mendetail, periksa logika aplikasi Anda, dan uji kasus ekstrem.

Runtime Python37 Cloud Functions saat ini memiliki batasan yang diketahui terkait kecepatannya dalam menangani logging. Jika pernyataan log dari instance runtime Python37 ditulis dengan kecepatan yang cukup tinggi, error ini dapat terjadi. Versi runtime Python >= 3.8 tidak memiliki batasan ini. Sebaiknya pengguna bermigrasi ke versi runtime Python yang lebih tinggi untuk menghindari masalah ini.

Jika Anda masih tidak yakin tentang penyebab error tersebut, lihat halaman dukungan kami.

Fungsi berhenti di tengah eksekusi, atau terus berjalan setelah kode Anda selesai

Beberapa runtime Cloud Functions memungkinkan pengguna menjalankan tugas asinkron. Jika fungsi Anda membuat tugas tersebut, fungsi tersebut juga harus secara eksplisit menunggu hingga tugas selesai. Jika hal ini tidak dilakukan, fungsi Anda dapat berhenti dieksekusi pada waktu yang salah.

Perilaku error

Fungsi Anda menunjukkan salah satu perilaku berikut:

  • Fungsi Anda berhenti saat tugas asinkron masih berjalan, tetapi sebelum periode waktu tunggu yang ditentukan berlalu.
  • Fungsi Anda tidak berhenti berjalan saat tugas ini selesai, dan terus berjalan hingga periode waktu tunggu berlalu.

Solusi

Jika fungsi berhenti lebih awal, Anda harus memastikan semua tugas asinkron fungsi telah selesai sebelum melakukan hal berikut:

  • menampilkan nilai
  • me-resolve atau menolak objek Promise yang ditampilkan (khusus fungsi Node.js)
  • menampilkan pengecualian dan/atau error yang tidak diketahui
  • mengirim respons HTTP
  • memanggil fungsi callback

Jika fungsi Anda gagal berhenti begitu semua tugas asinkron selesai, Anda harus memastikan bahwa fungsi tersebut memberikan sinyal ke Cloud Functions dengan benar setelah selesai. Secara khusus, pastikan Anda melakukan salah satu operasi yang tercantum di atas segera setelah fungsi menyelesaikan tugas asinkronnya.

Heap JavaScript kehabisan memori

Untuk fungsi Node.js 12+ dengan batas memori lebih dari 2 GiB, pengguna harus mengonfigurasi NODE_OPTIONS agar memiliki max_old_space_size sehingga batas heap JavaScript setara dengan batas memori fungsi.

Pesan error

Cloud Console

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory

Solusi

Deploy fungsi Node.js 12+ Anda, dengan NODE_OPTIONS dikonfigurasi agar max_old_space_size ditetapkan ke batas memori fungsi Anda. Misalnya:

gcloud functions deploy envVarMemory \
--runtime nodejs20 \
--set-env-vars NODE_OPTIONS="--max_old_space_size=8192" \
--memory 8Gi \
--trigger-http

Fungsi dihentikan

Anda mungkin melihat salah satu pesan error berikut saat proses yang menjalankan kode Anda berhenti, baik karena error runtime atau sengaja dihentikan. Ada juga kemungkinan kecil terjadinya error infrastruktur yang jarang terjadi.

Pesan error

Pemanggilan fungsi terganggu. Error: fungsi dihentikan. Tindakan yang disarankan: periksa log untuk mengetahui alasan penghentian. Informasi pemecahan masalah tambahan dapat ditemukan di Logging.

Permintaan ditolak. Error: fungsi dihentikan. Tindakan yang disarankan: periksa log untuk mengetahui alasan penghentian. Informasi pemecahan masalah tambahan dapat ditemukan di Logging.

Fungsi tidak dapat diinisialisasi. Error: fungsi dihentikan. Tindakan yang disarankan: periksa log untuk mengetahui alasan penghentian. Informasi pemecahan masalah tambahan dapat ditemukan di Logging.

Solusi

  • Untuk fungsi latar belakang (Pub/Sub yang dipicu) saat executionID dikaitkan dengan permintaan yang berakhir dengan error, coba aktifkan coba lagi jika gagal. Hal ini memungkinkan percobaan ulang eksekusi fungsi saat pengecualian yang dapat dicoba lagi dimunculkan. Untuk mengetahui informasi selengkapnya tentang cara menggunakan opsi ini secara aman, termasuk mitigasi untuk menghindari pengulangan percobaan ulang tanpa batas dan mengelola error yang dapat diulang/fatal secara berbeda, lihat Praktik Terbaik.

  • Aktivitas latar belakang (apa pun yang terjadi setelah fungsi dihentikan) dapat menyebabkan masalah, jadi periksa kode Anda. Cloud Functions tidak menjamin tindakan apa pun selain yang dijalankan selama periode eksekusi fungsi. Jadi, meskipun aktivitas berjalan di latar belakang, aktivitas tersebut dapat dihentikan oleh proses pembersihan.

  • Jika terjadi lonjakan traffic tiba-tiba, coba sebarkan workload sedikit lebih lama. Uji juga fungsi Anda secara lokal menggunakan Functions Framework sebelum men-deploy ke Cloud Functions untuk memastikan bahwa error bukan karena dependensi yang hilang atau konflik.

Error runtime saat mengakses resource yang dilindungi oleh VPC-SC

Secara default, Cloud Functions menggunakan alamat IP publik untuk membuat permintaan keluar ke layanan lain. Jika fungsi Anda tidak berada di dalam perimeter Kontrol Layanan VPC, fungsi tersebut dapat menerima respons 403 HTTP saat mencoba mengakses layanan Google Cloud yang dilindungi oleh VPC-SC, karena penolakan perimeter layanan.

Pesan error

Di log Resource yang Diaudit, entri seperti berikut:

"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"
  ...

Solusi

Tambahkan Cloud Functions di project Google Cloud Anda sebagai resource terlindungi di perimeter layanan dan deploy fungsi yang sesuai dengan VPC-SC. Lihat Menggunakan Kontrol Layanan VPC untuk mengetahui informasi selengkapnya.

Atau, jika project Cloud Functions Anda tidak dapat ditambahkan ke perimeter layanan, lihat Menggunakan Kontrol Layanan VPC dengan fungsi di luar perimeter.

Skalabilitas

Masalah penskalaan yang terkait dengan infrastruktur Cloud Functions dapat muncul dalam beberapa keadaan.

Kondisi berikut dapat dikaitkan dengan kegagalan penskalaan.

  • Peningkatan traffic mendadak.
  • Waktu cold start yang lama.
  • Waktu pemrosesan permintaan yang lama.
  • Tingkat error fungsi tinggi.
  • Batas instance maksimum tercapai, sehingga sistem tidak dapat melakukan penskalaan lebih lanjut.
  • Faktor sementara yang dikaitkan dengan layanan Cloud Functions.

Dalam setiap kasus, Cloud Functions mungkin tidak melakukan peningkatan skala cukup cepat untuk mengelola traffic.

Pesan error

  • The request was aborted because there was no available instance
    • severity=WARNING ( Kode respons: 429 ) Cloud Functions tidak dapat diskalakan karena batas max-instances yang Anda tetapkan selama konfigurasi.
    • severity=ERROR ( Kode respons: 500 ) Cloud Functions secara intrinsik tidak dapat mengelola laju traffic.

Solusi

  • Untuk fungsi berbasis pemicu HTTP, minta klien untuk mengimplementasikan backoff eksponensial dan mencoba lagi untuk permintaan yang tidak boleh dihapus. Jika memicu Cloud Functions dari Workflows, Anda dapat menggunakan sintaksis try/retry untuk mencapainya.
  • Untuk fungsi berbasis peristiwa / latar belakang, Cloud Functions mendukung penayangan minimal satu kali. Bahkan tanpa mengaktifkan percobaan ulang secara eksplisit, peristiwa tersebut akan otomatis ditayangkan ulang dan eksekusi fungsi akan dicoba lagi. Lihat Mencoba Ulang Fungsi Berbasis Peristiwa untuk mengetahui informasi selengkapnya.
  • Jika akar masalah ini adalah periode error sementara yang tinggi yang hanya dikaitkan dengan Cloud Functions atau jika Anda memerlukan bantuan terkait masalah Anda, hubungi dukungan.

Logging

Menyiapkan logging untuk membantu Anda melacak masalah dapat menyebabkan masalah itu sendiri.

Entri log tidak memiliki tingkat keparahan log atau tingkat keparahan lognya salah

Cloud Functions menyertakan logging runtime sederhana secara default. Log yang ditulis ke stdout atau stderr muncul secara otomatis di konsol Google Cloud. Namun, entri log ini, secara default, hanya berisi pesan string sederhana.

Pesan error

Tingkat keparahan tidak ada atau salah dalam log.

Solusi

Untuk menyertakan tingkat keparahan log, Anda harus mengirim entri log terstruktur.

Menangani atau membuat log pengecualian secara berbeda jika terjadi error

Anda mungkin ingin menyesuaikan cara mengelola dan mencatat log informasi error.

Solusi

Gabungkan fungsi Anda dalam blok try untuk menyesuaikan penanganan pengecualian dan logging stack trace.

Contoh


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!'

Log terlalu besar di Node.js 10+, Python 3.8, Go 1.13, dan Java 11

Ukuran maksimum entri log reguler dalam runtime ini adalah 105 KiB.

Solusi

Pastikan Anda mengirim entri log yang lebih kecil dari batas ini.

Cloud Function menampilkan error, tetapi log tidak ada

Log Cloud Function di-streaming ke bucket default yang dibuat dan diaktifkan saat project dibuat. Jika bucket default dinonaktifkan atau jika log Cloud Function berada di filter pengecualian, log tidak akan muncul di Log Explorer.

Solusi

Pastikan log default diaktifkan.

Log Cloud Functions tidak muncul di Log Explorer

Beberapa library klien Cloud Logging menggunakan proses asinkron untuk menulis entri log. Jika fungsi mengalami error, atau terhenti, ada kemungkinan beberapa entri log belum ditulis dan dapat muncul kemudian. Kemungkinan juga beberapa log akan hilang dan tidak dapat dilihat di Log Explorer.

Solusi

Gunakan antarmuka library klien untuk menghapus entri log yang di-buffer sebelum menghentikan fungsi atau gunakan library untuk menulis entri log secara sinkron. Anda juga dapat menulis log secara langsung ke stdout atau stderr secara sinkron.

Log Cloud Functions tidak muncul melalui Sink Router Log

Entri log dirutekan ke berbagai tujuannya menggunakan Sink Router Log.

Screenshot Router Log Konsol dengan Lihat detail sink yang disorot

Setelan ini mencakup Filter pengecualian, yang menentukan entri yang dapat dihapus dengan mudah.

Screenshot pop-up Detail Sink Router Log Konsol yang menampilkan filter pengecualian

Solusi

Pastikan tidak ada filter pengecualian yang ditetapkan untuk resource.type="cloud_functions"

Koneksi database

Ada sejumlah masalah yang dapat muncul saat terhubung ke database, dan banyak yang terkait dengan melampaui batas koneksi atau waktu habis. Jika melihat peringatan Cloud SQL di log, misalnya, "batas waktu konteks terlampaui", Anda mungkin perlu menyesuaikan konfigurasi koneksi. Lihat dokumen Cloud SQL untuk detail tambahan.

Networking

Konektivitas jaringan

Jika semua permintaan keluar dari Cloud Function gagal bahkan setelah Anda mengonfigurasi setelan traffic keluar, Anda dapat menjalankan Uji Konektivitas untuk mengidentifikasi masalah konektivitas jaringan yang mendasarinya. Untuk mengetahui informasi selengkapnya, lihat Membuat dan menjalankan Uji Konektivitas.

Konektor Akses VPC Serverless belum siap atau tidak ada

Jika konektor Akses VPC Serverless gagal, konektor itu mungkin tidak menggunakan subnet mask /28 yang dikhususkan untuk konektor tersebut sesuai persyaratan.

Pesan error

VPC connector projects/xxxxx/locations/REGION/connectors/xxxx
is not ready yet or does not exist.

Solusi

Cantumkan subnet Anda untuk memeriksa apakah konektor Anda menggunakan subnet mask /28.

Jika tidak, buat ulang atau buat konektor baru untuk menggunakan subnet /28. Perhatikan pertimbangan berikut:

  • Jika membuat ulang konektor, Anda tidak perlu men-deploy ulang fungsi lainnya. Anda mungkin mengalami gangguan jaringan saat konektor dibuat ulang.

  • Jika Anda membuat konektor alternatif baru, deploy ulang fungsi Anda untuk menggunakan konektor baru tersebut, lalu hapus konektor asli. Metode ini menghindari gangguan jaringan.

Traffic SMTP ke alamat IP tujuan eksternal yang menggunakan TCP port 25 diblokir

Untuk keamanan tambahan, Google Cloud memblokir koneksi ke port tujuan TCP 25 saat mengirim email dari fungsi.

Solusi

Untuk berhenti memblokir koneksi ini, pilih salah satu opsi berikut: