Memecahkan masalah Cloud Functions (generasi ke-1)

Dokumen ini menunjukkan cara memecahkan pesan error dan menyelesaikan masalah saat menggunakan Cloud Functions (generasi ke-1).

Deployment

Bagian ini mencantumkan masalah yang mungkin Anda temui dengan deployment dan memberikan saran untuk memperbaiki setiap masalah. Banyak masalah yang Anda mungkin ditemui selama deployment terkait dengan peran dan izin atau konfigurasi yang salah.

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

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

Pesan error

Konsol

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

Solusi

Anda dapat mereset akun layanan ke peran cloudfunctions.serviceAgent default.

Akun layanan runtime default tidak ada

Saat layanan yang dikelola pengguna account tidak tertentu, Cloud Functions (generasi ke-1) menggunakan layanan App Engine akun oleh secara default. Deployment akan gagal jika Anda menghapus akun default tanpa menentukan akun layanan yang dikelola pengguna.

Pesan error

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

Solusi

Untuk mengatasi masalah ini, ikuti salah satu solusi berikut:

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

Setiap fungsi dikaitkan dengan akun layanan yang berfungsi sebagai identitasnya ketika fungsi tersebut mengakses resource lain. Layanan runtime ini akun Google dapat menjadi akun layanan default, atau akun layanan yang dikelola pengguna. Untuk Cloud Functions Untuk menggunakan akun layanan runtime, deployer harus memiliki iam.serviceAccounts.actAs di akun layanan tersebut. Pengguna yang membuat akun layanan runtime non-default akan otomatis diberikan , tetapi pen-deploy lain harus memiliki izin ini yang diberikan oleh pengguna dengan izin akses yang benar.

Pengguna yang telah diberi peran Project Viewer, Cloud Functions Developer, atau Peran Admin Cloud Functions juga harus ditetapkan Izin iam.serviceAccounts.actAs pada akun layanan runtime.

Pesan error

Konsol

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 berikut terjadi untuk akun layanan default:

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 berikut terjadi untuk akun layanan non-default:

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:'.

Solusi

Menetapkan pengguna Peran roles/iam.serviceAccountUser pada layanan default atau layanan yang dikelola pengguna menggunakan akun layanan. 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 di Project Google Cloud 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

Konsol

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.

Solusi

Untuk mengatasi error ini, reset akun layanan Agen Layanan ke peran default.

Pengguna dengan peran Project Editor tidak dapat menyetel fungsi ke publik

Peran Project Editor memiliki izin luas untuk mengelola resource di dalam sebuah proyek, tetapi tidak secara inheren memberikan kemampuan untuk membuat Cloud Functions bersifat publik. Anda harus memberikan izin ke cloudfunctions.functions.setIamPolicy` izin akses ke pengguna atau layanan yang men-deploy fungsi.

Pesan error

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

Solusi

Untuk mengatasi error ini, ikuti salah satu solusi berikut:

Deployment fungsi gagal saat menggunakan kebijakan organisasi Pembatasan Lokasi Resource

Jika organisasi Anda menggunakan Lokasi Resource Batasan , maka akan membatasi deployment fungsi di region yang dibatasi oleh lebih lanjut. Di konsol Google Cloud, region yang dibatasi tidak akan tersedia dari drop-down region saat men-deploy fungsi.

Pesan error

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

Solusi

Tambahkan atau hapus lokasi dari daftar allowed_values atau denied_values lokasi resource agar deployment berhasil.

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

Konsol

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.

Di log Cloud Logging:

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

Solusi

Untuk mengatasi masalah ini, ikuti salah satu solusi berikut:

  • Untuk pesan error yang lebih mendetail, tinjau build fungsi Anda log, dan runtime fungsi log.

  • Jika tidak jelas alasan fungsi Anda gagal menjalankan cakupan globalnya, pertimbangkan untuk sementara memindahkan kode ke pemanggilan permintaan, menggunakan inisialisasi lambat pada global variabel. Ini memungkinkan Anda menambahkan pernyataan log tambahan di sekitar library klien, yang dapat waktu habis saat membuat instance (terutama jika mereka memanggil layanan), atau berhenti berfungsi atau menampilkan pengecualian sepenuhnya.

  • Tingkatkan waktu tunggu fungsi.

  • Kode sumber harus berisi fungsi titik entri yang telah yang ditentukan dalam deployment, baik melalui konsol atau gcloud.

Pengguna dengan peran Viewer tidak dapat men-deploy fungsi

Pengguna dengan peran Project Viewer atau Cloud Functions Viewer memiliki akses hanya baca ke fungsi dan detail fungsi, serta tidak dapat men-deploy fungsi-fungsi baru. Fitur Buat fungsi berwarna abu-abu di bagian Konsol Google Cloud dengan error berikut:

Pesan error

gcloud

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

Solusi

Tetapkan peran Developer Cloud Functions pengguna.

Akun layanan build tidak memiliki izin

Pesan error

Dalam error deploy fungsi atau dalam log build, Anda mungkin melihat salah satu error berikut:

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.

Solusi

Akun layanan build memerlukan izin untuk membaca dari bucket sumber dan izin baca dan tulis untuk repositori {i>Artifact Deployment<i}. Anda mungkin mengalami {i>error<i} ini karena perubahan perilaku {i>default<i} untuk cara Cloud Build menggunakan akun layanan, yang dijelaskan dalam Perubahan Akun Layanan Cloud Build.

Untuk mengatasi masalah ini, gunakan salah satu solusi berikut:

Akun layanan build dinonaktifkan

Pesan error

Could not build the function due to disabled service account used by Cloud Build. Please make sure that the service account is active.

Solusi

Akun layanan build harus diaktifkan agar dapat men-deploy fungsi. Anda mungkin mengalami {i>error<i} ini karena perubahan perilaku {i>default<i} terkait cara Cloud Build menggunakan akun layanan, yang dijelaskan dalam Perubahan Akun Layanan Cloud Build.

Untuk mengatasi masalah ini, gunakan salah satu solusi berikut:

Aktif

Bagian ini mencantumkan masalah penayangan yang mungkin Anda alami, dan memberikan saran-saran untuk memperbaiki masing-masing masalah tersebut.

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.

Mengunjungi URL Cloud Functions di browser tidak menambahkan header otentikasi secara otomatis.

Pesan error

Kode Respons Error HTTP: 403 Forbidden

Isi Respons Error HTTP:

Error: Forbidden Your client does not have permission
to get URL /FUNCTION_NAME from this server.

Solusi

Untuk mengatasi error ini, ikuti salah satu solusi berikut:

Error izin penayangan karena konfigurasi allow internal traffic only

Setelan traffic masuk membatasi apakah fungsi HTTP dapat dipanggil oleh resource di luar project Google Cloud atau perimeter layanan Kontrol Layanan VPC. Saat Anda mengonfigurasi setelan allow internal traffic only untuk traffic masuk jaringan, pesan kesalahan ini menunjukkan bahwa hanya permintaan dari Jaringan VPC dalam project yang sama atau perimeter Kontrol Layanan VPC yang diizinkan.

Pesan error

Kode Respons Error HTTP: 404 TIDAK DITEMUKAN

Isi Respons Error HTTP:

404 Page not found

Solusi

Untuk mengatasi error ini, ikuti salah satu solusi berikut:

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

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

  • Kode sumber Cloud Functions dapat menghasilkan error 404 karena URL fungsi, metode HTTP, atau error logika yang salah.

Pemanggilan fungsi tidak memiliki kredensial autentikasi yang valid

{i>Function<i} yang dikonfigurasi dengan akses terbatas memerlukan token ID. Pemanggilan fungsi gagal jika Anda menggunakan token akses atau token refresh.

Pesan error

Kode Respons Error HTTP: 401 Tidak Diberi Otorisasi

Isi Respons Error HTTP:

Your client does not have permission to the requested URL </FUNCTION_NAME>

Solusi

Untuk mengatasi error ini, ikuti salah satu solusi berikut:

  • Pastikan permintaan Anda menyertakan header Authorization: Bearer ID_TOKEN, dan token tersebut adalah token ID, bukan token akses atau token refresh. Jika Anda membuat token ini secara manual dengan kunci pribadi akun layanan, Anda harus menukar token JWT yang ditandatangani sendiri dengan token identitas yang ditandatangani Google. Sebagai mengetahui informasi selengkapnya, lihat Mengautentikasi untuk pemanggilan.

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

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

    Untuk mengetahui informasi selengkapnya, lihat Mengautentikasi untuk pemanggilan .

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. Kegagalan dalam melakukannya dapat menyebabkan fungsi Anda 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 berlanjut untuk dijalankan hingga periode waktu tunggu berlalu.

Solusi

Jika fungsi dihentikan lebih awal, Anda harus memastikan bahwa tugas asinkron selesai sebelum fungsi Anda melakukan tindakan berikut:

  • Menampilkan nilai
  • Menyelesaikan atau menolak objek Promise yang ditampilkan (khusus fungsi Node.js)
  • Menampilkan pengecualian dan error yang tidak tertangkap
  • Mengirim respons HTTP
  • Memanggil fungsi callback

Jika fungsi Anda gagal berhenti setelah menyelesaikan tugas asinkron, Anda harus memverifikasi bahwa fungsi Anda memberi sinyal ke Cloud Functions dengan benar setelah selesai. Secara khusus, pastikan bahwa Anda melakukan salah satu operasi yang tercantum dalam daftar sebelumnya segera setelah fungsi Anda selesai tugas asinkronnya.

Terjadi error runtime saat mengakses resource yang dilindungi oleh Kontrol Layanan VPC

Secara default, Cloud Functions menggunakan alamat IP publik untuk membuat permintaan keluar ke layanan lain. Fungsi yang tidak berada dalam Kontrol Layanan VPC perimeter mungkin menerima respons HTTP 403 saat mencoba untuk mengakses layanan Google Cloud yang dilindungi oleh Kontrol Layanan VPC, karena perimeter layanan penolakan.

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

Untuk mengatasi error ini, ikuti salah satu solusi berikut:

Skalabilitas

Bagian ini mencantumkan masalah skalabilitas dan memberikan saran untuk memperbaiki setiap masalah tersebut.

Error Cloud Logging terkait pembatalan permintaan antrean yang tertunda

Kondisi berikut dapat dikaitkan dengan kegagalan penskalaan.

  • Peningkatan traffic mendadak.
  • Cold start time yang lama.
  • Waktu pemrosesan permintaan yang lama.
  • Tingkat error fungsi tinggi.
  • Mencapai batas instance maksimum.
  • 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.

Cloud Functions memiliki tingkat keparahan berikut:

* `severity=WARNING` ( Response code: 429 ) Cloud Functions cannot scale due
  to the [`max-instances`](/functions/docs/configuring/max-instances) limit you set
  during configuration.
* `severity=ERROR` ( Response code: 500 ) Cloud Functions intrinsically
  cannot manage the rate of traffic.

Solusi

  • Untuk fungsi berbasis pemicu HTTP, implementasikan eksponensial backoff dan percobaan ulang untuk permintaan yang tidak boleh dibatalkan. Jika memicu Cloud Functions dari Workflows, Anda dapat menggunakan sintaksis try/retry untuk mencapainya.
  • Untuk fungsi yang dipicu peristiwa atau latar belakang, Cloud Functions mendukung pengiriman minimal satu kali. Bahkan tanpa mengaktifkan percobaan ulang secara eksplisit, peristiwa tersebut akan otomatis ditayangkan ulang dan eksekusi fungsi akan dicoba lagi. Untuk informasi selengkapnya, lihat Mengaktifkan percobaan ulang fungsi berbasis peristiwa.
  • Jika akar masalahnya adalah periode error sementara yang meningkat yang dikaitkan hanya dengan Cloud Functions atau jika Anda membutuhkan bantuan masalah Anda, hubungi Cloud Customer Care.

Logging

Bagian berikut membahas masalah terkait logging dan cara memperbaikinya.

Entri log tidak memiliki tingkat keparahan log atau tidak memiliki tingkat keparahan log

Cloud Functions menyertakan logging runtime secara default. Log yang ditulis ke stdout atau stderr muncul secara otomatis di konsol Google Cloud. Tetapi entri log ini secara {i>default<i}, hanya berisi pesan string.

Solusi

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

Menangani atau membuat log pengecualian secara berbeda jika terjadi error

Sebaiknya sesuaikan cara Anda mengelola dan mencatat informasi error.

Solusi

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

Menambahkan blok try dapat mengakibatkan efek samping yang tidak diinginkan dalam berbasis peristiwa fungsi dengan konfigurasi retry on failure. Mencoba lagi peristiwa yang gagal itu sendiri bisa gagal.

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 untuk entri log reguler dalam runtime ini adalah 105 KiB.

Solusi

Kirim entri log yang lebih kecil dari batas ini.

Log tidak ada meskipun Cloud Functions menampilkan error

Cloud Functions melakukan streaming log Cloud Function ke bucket default. Kapan Anda membuat project, Cloud Functions membuat dan mengaktifkan bucket default. Jika bucket default dinonaktifkan atau jika log Cloud Function ada di filter pengecualian, log tidak akan muncul di {i>Log Explorer<i}.

Solusi

Aktifkan log default dan pastikan tidak ada filter pengecualian yang ditetapkan.

Log Cloud Functions tidak muncul di Logs Explorer

Beberapa library klien Cloud Logging menggunakan proses asinkron untuk menulis entri log. Jika sebuah fungsi {i>crash<i}, atau terhenti, ada kemungkinan bahwa beberapa entri log belum ditulis dan mungkin muncul nanti. Ini juga beberapa log mungkin akan hilang dan tidak dapat dilihat di {i>Log Explorer<i}.

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 menggunakan sink Log Router

Router Log mencatat entri log route ke berbagai tujuan.

Screenshot Router Log Konsol dengan Lihat detail sink yang disorot

Setelan disertakan dalam Filter pengecualian, yang menentukan entri yang dapat dibuang.

Screenshot dialog Detail Sink Router Log Konsol yang menampilkan filter pengecualian

Solusi

Hapus kumpulan filter pengecualian untuk resource.type="cloud_functions".

Koneksi database

Banyak error database yang terkait dengan melebihi batas koneksi atau waktu habis. Jika Anda melihat tampilan Cloud SQL peringatan di log Anda, misalnya, Context deadline exceeded, Anda mungkin perlu untuk menyesuaikan konfigurasi koneksi. Untuk informasi selengkapnya, lihat Praktik terbaik Cloud SQL.

Jaringan

Bagian ini mencantumkan masalah jaringan dan memberikan saran untuk memperbaiki setiap masalah tersebut.

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 tersebut mungkin menggunakan subnet mask /28 yang dikhususkan untuk konektor sesuai wajib.

Pesan error

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

Saat Cloud Functions di-deploy dengan konektor dalam kondisi buruk karena tidak adanya izin di akun layanan Agen Layanan Google API PROJECT_NUMBER@cloudservices.gserviceaccount.com, error berikut akan terjadi:

Pesan error

Failed to prepare VPC connector. Please try again later.

Solusi

Mencantumkan subnet Anda untuk memeriksa apakah konektor Anda menggunakan subnet mask /28. Jika konektor Anda tidak menggunakan subnet mask /28, buat ulang atau buat konektor baru.

Untuk mengatasi masalah ini, ikuti salah satu solusi berikut:

  • Jika membuat ulang konektor, Anda tidak perlu men-deploy ulang konektor lainnya fungsi-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, lalu hapus konektor asli. Metode ini menghindari gangguan jaringan.

  • Pastikan Cloud Functions dan konektor terkaitnya di-deploy di region yang sama.

  • Untuk konfigurasi VPC Bersama :

    • Pastikan akun layanan SERVICE_PROJECT_NUMBER@cloudservices.gserviceaccount.com dan service-SERVICE_PROJECT_NUMBER@gcp-sa-vpcaccess.iam.gserviceaccount.com yang digunakan oleh Konektor VPC untuk menyediakan resource dalam project tidak izin tidak ada. Akun layanan ini harus memiliki peran roles/compute.networkUser dalam project host konfigurasi VPC Bersama saat konektor berada dalam project layanan. Jika tidak, roles/compute.networkAdmin diperlukan.

    • Jika konektor dibuat di project host, pastikan peran Serverless VPC Access User diberikan pada Cloud Functions Service Agent dalam project host Anda.

    • Jika status konektor menunjukkan error Connector is in a bad state, manual deletion recommended, dan Agen Layanan Google API tidak memiliki izin yang diperlukan untuk menyediakan resource komputasi di project konektor, berikan roles/compute.admin ke akun layanan PROJECT_NUMBER@cloudservices.gserviceaccount.com. Dalam beberapa kasus Anda mungkin perlu membuat ulang konektor setelah memperbarui izin.

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 Cloud Functions.

Solusi

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

Lainnya

Bagian ini menguraikan masalah tambahan apa pun yang tidak sesuai dengan kategori lainnya dan menawarkan solusi untuk masing-masingnya.

Error Kontrol Layanan VPC pada metode google.storage.buckets.testIamPermissions di Log Audit Cloud

Saat Anda membuka halaman Detail fungsi di Konsol Google Cloud, Cloud Functions memeriksa apakah Anda dapat memodifikasi ke repositori container image container, mengaksesnya secara publik. Untuk memverifikasi, Cloud Functions mengirimkan permintaan ke bucket Container Registry menggunakan Metode google.storage.buckets.testIamPermissions dengan format berikut: [REGION].artifacts.[PROJECT_ID].appspot.com. Satu-satunya perbedaan antara pemeriksaan adalah yang dijalankan dengan otentikasi untuk memverifikasi izin akses pengguna untuk memodifikasi bucket, sedangkan pemeriksaan lainnya berjalan tanpa otentikasi untuk memverifikasi apakah bucket dapat diakses oleh publik.

Jika perimeter Kontrol Layanan VPC membatasi storage.googleapis.com API, Konsol Google Cloud menampilkan error pada google.storage.buckets.testIamPermissions di Cloud Audit Logs.

Pesan error

Untuk pemeriksaan akses publik tanpa info otentikasi, Log audit VPC SC Denial Policy menampilkan entri yang mirip dengan yang berikut ini:

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

Untuk pemeriksaan akses publik dengan info autentikasi, baca Kebijakan Penolakan SC VPC log audit menunjukkan entri yang memungkinkan pengguna mengubah setelan bucket yang serupa pada contoh 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": "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",
  ...

Solusi

Jika bucket Container Registry tidak dapat diakses secara publik, Anda dapat mengabaikan error Kontrol Layanan VPC.

Atau, Anda dapat menambahkan aturan masuknya Kontrol Layanan VPC untuk mengizinkan metode google.storage.buckets.testIamPermissions, seperti yang ditunjukkan dalam contoh berikut:

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

Jika memungkinkan, Anda dapat lebih menyempurnakan aturan masuk dengan menentukan akses sesuai dengan alamat IP pengguna.