Memecahkan masalah penayangan di App Engine

Halaman ini menjelaskan error inisialisasi dan penayangan aplikasi umum di App Engine serta metode untuk memecahkan masalahnya.

Error izin saat membuat aplikasi dengan akun layanan default

Saat Anda membuat aplikasi setelah mengaktifkan App Engine API untuk pertama kalinya, aplikasi tersebut mungkin gagal dengan error berikut:

gcloud CLI

An internal error occurred while calling service consumer manager for service account.
Creating  App Engine application in projectPROJECT and REGION....failed. DEBUG: (gcloud.app.create) Error Response: [13] an internal error has occurred

Log permintaan

Service account creation is not allowed on this project.

Konsol

Error while initialising App Engine.

Error ini mungkin terjadi karena penerapan batasan kebijakan organisasi constraints/iam.disableServiceAccountCreation saat membuat aplikasi. Kebijakan ini mencegah penyediaan akun layanan default App Engine PROJECT_ID@appspot.gserviceaccount.com.

Untuk mengatasi masalah ini, Anda harus menghapus batasan kebijakan organisasi constraints/iam.disableServiceAccountCreation untuk sementara agar pembuatan dan deployment akun layanan default App Engine dapat dilakukan. Akun layanan default diperlukan untuk pembuatan aplikasi dan tidak dapat dilewati. Hal ini juga berlaku saat Anda menggunakan akun layanan per versi. Akun layanan default App Engine dapat dihapus atau diganti dengan akun layanan yang Anda buat setelah deployment berhasil.

Jika Anda menggunakan akun layanan yang Anda buat, tinjau Ringkasan rekomendasi peran untuk memahami cara menerapkan izin yang membatasi, seperti memberikan peran pembuat token di akun layanan yang Anda buat untuk agen layanan.

Aplikasi tidak menayangkan perubahan kode terbaru

Jika aplikasi tidak menayangkan perubahan kode terbaru setelah deployment, Anda dapat menggunakan sistem file root penampung untuk memeriksa kontennya. Langkah-langkah pemecahan masalah berikut menunjukkan cara mengambil image container, dan mengekspor sistem file root untuk analisis lebih lanjut:

  1. Gunakan Cloud Logging untuk mendapatkan URL image container, dengan filter GAE_FULL_APP_CONTAINER. Setelah Anda menerapkan filter, Cloud Logging akan menampilkan URL image penampung, dengan nama domain yang sepenuhnya memenuhi syarat (FQDN). Contohnya, GAE_FULL_APP_CONTAINER: FQDN/PROJECT_ID/appengine/SERVICE_NAME.VERSION_ID@sha256:SHA256_DIGEST.

  2. Jalankan perintah berikut untuk mengekspor URL image container:

    export IMAGE_URL='FQDN/PROJECT_ID/appengine/SERVICE_NAME.VERSION_ID@sha256:SHA256_DIGEST'
    

    Ganti:

    • FQDN dengan nama domain yang sepenuhnya memenuhi syarat dari URL image container.
    • PROJECT_ID dengan project ID Google Cloud project Anda.
    • SERVICE_NAME dengan nama layanan Anda.
    • VERSION_ID dengan ID versi layanan.
    • SHA256_DIGEST dengan nilai SHA256.
  3. Buat penampung baru dengan URL image container:

    docker pull ${IMAGE_URL}
    export CONTAINER_ID=$(docker create ${IMAGE_URL})
    docker ps -a # the list should contain the newly created container with status `Created`
    
  4. Mengekspor sistem file root (rootfs) dari image container:

     docker export ${CONTAINER_ID} -o gae_app.tar
     mkdir gae_app
     mv -v gae_app.tar gae_app/
     cd gae_app/
     tar -xf gae_app.tar
     ls -la # inspect the container FS
    

    Atau, jika Anda tidak memerlukan file TAR, jalankan perintah berikut:

      mkdir gae_app
      cd gae_app/
      docker export ${CONTAINER_ID} | tar -xC <dest>
      ls -la # inspect the container FS
    

    Analisis konten sistem file root untuk memverifikasi apakah perubahan kode terbaru ada.

  5. Jalankan perintah berikut untuk membersihkan image:

    docker container rm ${CONTAINER_ID}
    docker image rm ${IMAGE_URL}
    unset IMAGE_URL CONTAINER_ID
    

Nginx gagal terhubung atau menghubungi container aplikasi

Error berikut hanya terjadi di lingkungan fleksibel App Engine dan biasanya ditampilkan dengan error 502 segera setelah error:

recv() failed (104: Connection reset by peer) while reading response header from upstream

Error ini menunjukkan bahwa reverse proxy nginx (file bantuan nginx) tidak dapat menjangkau container aplikasi. Di log, Anda dapat membandingkan waktu tutup error 502 di log nginx dengan waktu log nginx.error. Nginx.error yang diikuti langsung dengan error nginx 502 kemungkinan menjadi penyebab error nginx 502.

Error ini sering terjadi saat waktu tunggu koneksi keepalive aplikasi lebih kecil daripada waktu tunggu keepalive nginx. Karena nginx di lingkungan fleksibel App Engine memiliki keepalive_timeout 650 detik, aplikasi harus menjaga koneksi tetap aktif setidaknya selama ini. Secara default, aplikasi Node.js memiliki keepAliveTimeout berdurasi 5.000 milidetik. Dalam hal ini, Anda dapat menetapkan server.keepAliveTimeout ke 700.000 milidetik.

Untuk memecahkan masalah, periksa log yang ditulis oleh kode yang berjalan di penampung aplikasi Anda dengan menghubungkan ke instance VM, dan tambahkan logging lainnya, jika perlu, untuk menemukan akar masalahnya.

Memori tidak cukup

Error kehabisan memori berikut terjadi di lingkungan fleksibel App Engine, dan biasanya ditampilkan dengan error 502:

kernel: [  133.706951] Out of memory: Kill process 4490 (java) score 878 or sacrifice child
kernel: [  133.714468] Killed process 4306 (java) total-vm:5332376kB, anon-rss:2712108kB, file-rss:0kB

Error ini menunjukkan bahwa App Engine telah menghentikan aplikasi.

Error ini terjadi saat instance tidak memiliki memori yang cukup. Secara default, lingkungan fleksibel App Engine memiliki memori 1 GB, dengan hanya 600 MB yang tersedia untuk container aplikasi.

Untuk memecahkan masalah, periksa log untuk menemukan entri kehabisan memori, dan perbarui konfigurasi memory_gb di file app.yaml, lalu deploy ulang.

Koneksi terbuka tidak memadai untuk menangani permintaan masuk

Aplikasi mungkin mengalami error 502 jika jumlah maksimum koneksi yang menunggu sama dengan atau lebih besar dari 75% jumlah koneksi aktif.

Untuk mengatasi masalah ini, periksa metrik Cloud Monitoring untuk mengetahui jumlah maksimum koneksi aktif dan menunggu, dan kurangi jumlah koneksi yang menunggu untuk memastikan bahwa jumlah maksimum koneksi yang menunggu kurang dari atau sama dengan 75% dari jumlah koneksi aktif.