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.*
danpubsub.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
Tentukan akun layanan runtime yang dikelola pengguna saat men-deploy fungsi generasi ke-1.
atau
Buat ulang akun layanan default
@appspot.gserviceaccount.com untuk project Anda.
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}
danresourcemanager.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:
Tetapkan peran Project Owner atau Cloud Functions Admin kepada deployer, yang keduanya berisi izin
cloudfunctions.functions.setIamPolicy
.atau
Berikan izin secara manual dengan membuat peran khusus.
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:
- Izinkan seluruh multi-region
- Deploy fungsi pengujian
- 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
- Nonaktifkan Lifecycle Management di bucket yang diperlukan oleh Container Registry.
- 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.
- 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:
Klik nama tertaut dari fungsi yang ingin Anda berikan akses.
Klik link Powered By Cloud Run pada link di pojok kanan atas halaman ringkasan Detail fungsi.
Klik Pemicu lalu pilih Izinkan pemanggilan yang tidak diautentikasi.
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.
Error Cloud Logging terkait pembatalan permintaan antrean yang tertunda
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 batasmax-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.
Setelan ini mencakup Filter pengecualian, yang menentukan entri yang dapat dihapus dengan mudah.
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:
Hubungkan ke server SMTP pada port yang berbeda, seperti port TCP 587 atau 465.