Modul 11: Bermigrasi dari Google App Engine ke Cloud Functions

1. Ringkasan

Rangkaian codelab Stasiun Migrasi Serverless (tutorial interaktif dan mandiri) dan video terkait bertujuan untuk membantu developer tanpa server Google Cloud memodernisasi aplikasi mereka dengan memandu mereka melalui satu atau beberapa migrasi, terutama yang beralih dari layanan lama. Dengan melakukannya, aplikasi Anda akan menjadi lebih portabel serta memberi Anda lebih banyak opsi dan fleksibilitas, sehingga Anda dapat berintegrasi dengan dan mengakses lebih banyak produk Cloud serta melakukan upgrade ke rilis bahasa yang lebih baru dengan lebih mudah. Meskipun awalnya berfokus pada pengguna Cloud paling awal, terutama developer App Engine (lingkungan standar), seri ini cukup luas untuk mencakup platform serverless lainnya seperti Cloud Functions dan Cloud Run, atau platform lainnya jika berlaku.

Ada situasi ketika Anda tidak memiliki "seluruh aplikasi" memerlukan resource App Engine atau Cloud Run. Jika kode Anda hanya terdiri dari microservice atau fungsi sederhana, Cloud Functions kemungkinan lebih cocok. Codelab ini mengajarkan cara memigrasikan aplikasi App Engine sederhana (atau memecah aplikasi yang lebih besar menjadi beberapa microservice) dan men-deploy-nya ke Cloud Functions, yakni platform serverless lain yang dibuat khusus untuk kasus penggunaan seperti ini.

Anda akan mempelajari cara

  • Menggunakan Cloud Shell
  • Mengaktifkan Google Cloud Translation API
  • Melakukan Autentikasi permintaan API
  • Mengonversi aplikasi App Engine kecil untuk dijalankan di Cloud Functions
  • Men-deploy kode ke Cloud Functions

Yang Anda butuhkan

Survei

Bagaimana Anda akan menggunakan tutorial ini?

Hanya membacanya Membacanya dan menyelesaikan latihan

Bagaimana penilaian Anda terhadap pengalaman dengan Python?

Pemula Menengah Mahir

Bagaimana penilaian Anda terhadap pengalaman menggunakan layanan Google Cloud?

Pemula Menengah Mahir

2. Latar belakang

Sistem PaaS seperti Google App Engine dan Cloud Functions memberikan banyak kemudahan bagi pengguna. Platform serverless ini memungkinkan tim teknis Anda untuk berfokus pada pembuatan solusi bisnis, sehingga tidak perlu menghabiskan waktu untuk menyelidiki platform yang akan digunakan dan menentukan jumlah hardware yang dibutuhkan. Aplikasi dapat meningkatkan skala secara otomatis sesuai kebutuhan, memperkecil skala hingga nol dengan penagihan bayar per penggunaan untuk mengontrol biaya, dan aplikasi tersebut memungkinkan berbagai bahasa pengembangan umum saat ini.

Namun, meskipun pengembangan aplikasi web full-stack atau back-end yang kompleks untuk aplikasi seluler sangat cocok untuk App Engine, sering kali ada kasus bahwa developer terutama mencoba menempatkan beberapa fungsi secara online, seperti memperbarui feed berita atau menarik skor terbaru pertandingan playoff tim tuan rumah. Meskipun ada logika pengkodean untuk kedua skenario tersebut, kedua skenario tersebut tidak tampak sebagai "aplikasi" menyeluruh yang memerlukan kecanggihan App Engine. Di sinilah fungsi Cloud Functions.

Cloud Functions ditujukan untuk men-deploy kode bit kecil yang:

  • Bukan bagian dari keseluruhan aplikasi
  • Tidak diperlukan di seluruh stack pengembangan
  • Berada di aplikasi atau backend aplikasi seluler tunggal yang berfokus pada satu hal

Anda juga dapat menggunakan Cloud Functions untuk memecah aplikasi monolitik berukuran besar menjadi beberapa microservice, yang masing-masing menggunakan database umum bersama seperti Cloud Firestore atau Cloud SQL. Dan jika ingin fungsi atau microservice Anda berada dalam container dan dieksekusi secara serverless di Cloud Run, Anda juga dapat melakukannya.

Contoh aplikasi App Engine kami yang ditampilkan di hampir semua tutorial migrasi merupakan aplikasi singkat dengan fungsi dasar yang berfungsi dengan baik di Cloud Functions. Dalam tutorial ini, Anda akan mempelajari cara memodifikasi aplikasi tersebut untuk dijalankan di Cloud Functions. Dari perspektif App Engine, karena fungsi lebih sederhana daripada keseluruhan aplikasi, pengalaman memulai Anda harus lebih mudah (dan lebih cepat), dan dengan lebih sedikit "overhead" secara umum. Migrasi ini menampilkan langkah-langkah berikut:

  • Penyiapan/Prakerja
  • Menghapus file konfigurasi
  • Mengubah file aplikasi

3. Penyiapan/Prakerja

Codelab ini dimulai dengan versi Python 3 dari aplikasi contoh App Engine Modul 2 Cloud NDB karena Cloud Functions tidak mendukung Python 2. Pertama, mari siapkan project, dapatkan kode, lalu deploy aplikasi dasar pengukuran untuk mengonfirmasi bahwa kita mulai dengan kode yang berfungsi.

1. Siapkan project

Jika Anda sudah menyelesaikan codelab Modul 2 (dan mem-port-nya ke Python 3), sebaiknya gunakan kembali project (dan kode yang sama). Atau, Anda dapat membuat project baru atau menggunakan kembali project lain yang sudah ada. Pastikan project memiliki akun penagihan aktif dengan layanan App Engine diaktifkan.

2. Dapatkan aplikasi contoh dasar pengukuran

Salah satu prasyarat untuk codelab ini adalah memiliki aplikasi contoh Modul 2 yang berfungsi. Jika Anda tidak memilikinya, selesaikan salah satu tutorial di atas sebelum melanjutkan. Atau, jika Anda sudah terbiasa dengan kontennya, Anda dapat memulai dengan mengambil kode Modul 2 di bawah.

Baik Anda menggunakan kode Anda atau kode kita, kode Modul 2 Python 3 adalah tempat kita akan memulai. Codelab Modul 11 ini memandu Anda melalui setiap langkah, yang diakhiri dengan kode yang menyerupai yang ada di folder repo Modul 11 (FINISH).

Direktori file awal Python 3 Modul 2 (milik Anda atau milik kami) akan terlihat seperti ini:

$ ls
README.md               main.py                 templates
app.yaml                requirements.txt

3. Deploy (ulang) aplikasi dasar pengukuran

Langkah prakerja yang tersisa untuk dijalankan sekarang:

  1. Biasakan kembali diri Anda dengan alat command-line gcloud
  2. Deploy kembali aplikasi contoh dengan gcloud app deploy
  3. Konfirmasikan bahwa aplikasi berjalan di App Engine tanpa masalah

Setelah berhasil menjalankan langkah-langkah tersebut, Anda siap untuk mengonversinya menjadi Cloud Function.

4. Menghapus file konfigurasi

File app.yaml adalah artefak App Engine yang tidak digunakan dengan Cloud Functions, jadi hapus sekarang. Jika Anda tidak melakukannya atau lupa untuk melakukannya, tidak ada salahnya karena Cloud Functions tidak menggunakannya. Itu adalah satu-satunya perubahan konfigurasi karena requirements.txt tetap sama dengan yang berasal dari Modul 2.

Jika Anda juga mem-port aplikasi App Engine Python 2 ke Python 3, hapus appengine_config.py dan folder lib jika ada. Keduanya adalah artefak App Engine yang tidak digunakan dalam runtime Python 3.

5. Mengubah file aplikasi

Hanya ada satu file aplikasi, main.py, sehingga semua perubahan yang diperlukan agar dapat dipindahkan ke Cloud Functions terjadi di file ini.

Impor

Karena kita hanya bekerja dengan fungsi, tidak diperlukan framework aplikasi web. Namun, untuk memudahkan, saat Cloud Functions berbasis Python dipanggil, objek permintaan akan otomatis diteruskan ke kode Anda sesuai kebutuhan. (Tim Cloud Functions memilihnya sebagai objek Permintaan Flask yang diteruskan ke fungsi Anda.)

Karena framework web bukan bagian dari lanskap Cloud Functions, tidak ada impor dari Flask kecuali jika aplikasi Anda menggunakan fitur Flask lainnya. Hal ini memang terjadi karena rendering template masih terjadi setelah konversi ke suatu fungsi, yang berarti untuk memanggil flask.render_template() tetap diperlukan, sehingga impor dari Flask. Tidak ada framework web yang berarti membuat instance aplikasi Flask tidak perlu dibuat, jadi hapus app = Flask(__name__). Kode Anda akan terlihat seperti berikut, sebelum dan sesudah menerapkan perubahan:

SEBELUM:

from flask import Flask, render_template, request
from google.cloud import ndb

app = Flask(__name__)
ds_client = ndb.Client()

SETELAH:

from flask import render_template
from google.cloud import ndb

ds_client = ndb.Client()

Jika Anda bergantung pada objek aplikasi (app) atau infrastruktur framework web lainnya, Anda harus menyelesaikan semua dependensi tersebut, menemukan solusi yang sesuai, atau menghapus penggunaan sepenuhnya atau menemukan proxy. Dengan begitu, Anda dapat mengonversi kode menjadi Cloud Function. Jika tidak, sebaiknya Anda tetap menggunakan App Engine atau memasukkan aplikasi dalam container untuk Cloud Run

Memperbarui tanda tangan fungsi pengendali utama

Perubahan yang diperlukan dalam tanda tangan fungsi adalah sebagai berikut:

  1. Flask tidak lagi digunakan setelah mengonversi aplikasi ke Cloud Function, jadi hapus dekorator rute.
  2. Cloud Functions secara otomatis meneruskan objek Request Flask sebagai parameter, jadi buat variabel untuk parameter tersebut. Di aplikasi contoh, kita akan menyebutnya request.
  3. Cloud Functions yang di-deploy harus diberi nama. Pengendali utama kami diberi nama root() dengan tepat di App Engine untuk menjelaskan apa itu (pengendali aplikasi root). Sebagai Cloud Function, nama tersebut menjadi kurang masuk akal. Sebagai gantinya, kita akan men-deploy Cloud Function dengan nama visitme. Jadi, gunakan juga nama itu sebagai nama fungsi Python. Demikian pula, di Modul 4 dan 5, kami juga menamai layanan Cloud Run visitme.

Berikut informasi sebelum dan sesudah pembaruan ini:

SEBELUM:

@app.route('/')
def root():
    'main application (GET) handler'
    store_visit(request.remote_addr, request.user_agent)
    visits = fetch_visits(10)
    return render_template('index.html', visits=visits)

SETELAH:

def visitme(request):
    'main application (GET) handler'
    store_visit(request.remote_addr, request.user_agent)
    visits = fetch_visits(10)
    return render_template('index.html', visits=visits)

Itulah akhir dari semua pembaruan yang diperlukan. Perlu diketahui bahwa perubahan yang dibuat hanya memengaruhi "infrastruktur" aplikasi pada kode sumber. Tidak ada perubahan yang diperlukan dalam kode aplikasi inti, dan tidak ada fungsi aplikasi yang diubah. Berikut adalah representasi bergambar dari perubahan-perubahan yang dibuat untuk mengilustrasikan poin ini:

668f30e3865b27a9.pngS

Pengembangan dan pengujian lokal

App Engine memiliki server pengembangan lokal dev_appserver.py, sedangkan Cloud Functions memiliki Framework Functions. Dengan framework ini, Anda dapat mengembangkan dan menguji secara lokal. Kode Anda dapat di-deploy ke Cloud Functions, tetapi juga dapat di-deploy ke platform komputasi lain seperti Compute Engine, Cloud Run, atau bahkan sistem lokal atau hybrid cloud yang mendukung Knative. Lihat di bawah untuk link tambahan ke Functions Framework.

6. Mem-build dan men-deploy

Men-deploy ke Cloud Functions sedikit berbeda dari App Engine. Karena tidak ada file konfigurasi yang digunakan di luar requirements.txt, informasi selengkapnya tentang kode harus ditentukan di command line. Deploy Cloud Function baru yang dipicu HTTP dan berjalan di Python 3.10 dengan perintah ini:

$ gcloud functions deploy visitme --runtime python310 --trigger-http --allow-unauthenticated

Output Anda akan serupa dengan berikut ini:

Deploying function (may take a while - up to 2 minutes)...⠛
For Cloud Build Logs, visit: https://console.cloud.google.com/cloud-build/builds;region=REGION/f5f6fc81-1bb3-4cdb-8bfe?project=PROJECT_ID
Deploying function (may take a while - up to 2 minutes)...done.
availableMemoryMb: 256
buildId: f5f6fc81-1bb3-4cdb-8bfe
buildName: projects/PROJECT_ID/locations/REGION/builds/f5f6fc81-1bb3-4cdb-8bfe
dockerRegistry: CONTAINER_REGISTRY
entryPoint: visitme
httpsTrigger:
  securityLevel: SECURE_OPTIONAL
  url: https://REGION-PROJECT_ID.cloudfunctions.net/visitme
ingressSettings: ALLOW_ALL
labels:
  deployment-tool: cli-gcloud
name: projects/PROJECT_ID/locations/REGION/functions/visitme
runtime: python310
serviceAccountEmail: PROJECT_ID@appspot.gserviceaccount.com
sourceUploadUrl: https://storage.googleapis.com/uploads-853031211983.REGION.cloudfunctions.appspot.com/8c923758-cee8-47ce-8e97-5720a5301c34.zip
status: ACTIVE
timeout: 60s
updateTime: '2022-05-16T18:28:06.153Z'
versionId: '8'

Setelah fungsi di-deploy, gunakan URL dari output deployment dan buka aplikasi Anda. URL-nya berbentuk: REGION-PROJECT_ID.cloudfunctions.net/visitme. Output harus sama dengan saat Anda men-deploy-nya sebelumnya ke App Engine:

2732ae9218f011a2.pngS

Seperti kebanyakan codelab dan video lainnya dalam seri ini, fungsi aplikasi dasar pengukuran tidak berubah. Tujuannya adalah menerapkan satu teknik modernisasi dan membuat aplikasi berfungsi persis seperti sebelumnya, tetapi didukung oleh infrastruktur yang lebih baru, misalnya bermigrasi dari layanan lama App Engine lama ke produk mandiri Cloud penggantinya, atau, seperti dalam kasus tutorial ini, memindahkan aplikasi ke platform serverless Google Cloud lainnya.

7. Ringkasan/Pembersihan

Selamat, Anda telah mengonversi aplikasi App Engine kecil ini menjadi Cloud Function. Kasus penggunaan lain yang sesuai: memecah aplikasi App Engine monolitik besar menjadi serangkaian microservice, masing-masing sebagai Cloud Function. Ini adalah teknik pengembangan yang lebih modern yang menghasilkan model yang lebih "plug-and-play" (a la " JAM stack"). Ini memungkinkan pencampuran dan pencocokan, serta penggunaan kembali kode, yang merupakan dua sasaran. Namun, manfaat lainnya adalah microservice ini akan terus di-debug dari waktu ke waktu, yang berarti kode stabil dan biaya pemeliharaan lebih rendah secara keseluruhan.

Pembersihan

Setelah menyelesaikan codelab ini, Anda dapat menonaktifkan aplikasi App Engine Modul 2 (untuk sementara atau secara permanen) untuk menghindari timbulnya penagihan. Platform App Engine memiliki kuota gratis, jadi Anda tidak akan ditagih selama Anda tidak melebihi tingkat penggunaannya. Hal yang sama berlaku untuk Datastore; lihat halaman harga Cloud Datastore untuk mengetahui detail lebih lanjut.

Men-deploy ke platform seperti App Engine dan Cloud Functions menimbulkan biaya build dan penyimpanan yang kecil. Di beberapa region, Cloud Build memiliki kuota gratisnya sendiri seperti halnya Cloud Storage. Build menggunakan sebagian dari kuota tersebut. Perhatikan penggunaan penyimpanan untuk meminimalkan potensi biaya, terutama jika region Anda tidak memiliki paket gratis tersebut.

Sayangnya, Cloud Functions tidak memiliki tombol "nonaktifkan" aplikasi baru. Cadangkan kode Anda dan hapus fungsinya. Anda selalu dapat men-deploy-nya kembali dengan nama yang sama nanti. Namun, jika Anda tidak akan melanjutkan codelab migrasi lainnya dan ingin menghapus semuanya sepenuhnya, nonaktifkan project Cloud Anda.

Langkah berikutnya

Selain tutorial ini, modul migrasi lain yang dapat dilihat mencakup memasukkan aplikasi App Engine Anda ke dalam container untuk Cloud Run. Lihat link ke codelab Modul 4 dan Modul 5:

  • Modul 4: Bermigrasi ke Cloud Run dengan Docker
  • Build aplikasi dalam container untuk dijalankan di Cloud Run dengan Docker
  • Migrasi ini memungkinkan Anda untuk tetap menggunakan Python 2.
  • Modul 5: Bermigrasi ke Cloud Run dengan Cloud Buildpacks
  • Build aplikasi dalam container untuk dijalankan di Cloud Run dengan Cloud Buildpacks
  • Anda tidak perlu mengetahui apa pun tentang Docker, container, atau Dockerfile.
  • Mengharuskan aplikasi Anda untuk sudah bermigrasi ke Python 3 (Buildpacks tidak mendukung Python 2)

Banyak modul lainnya berfokus untuk menunjukkan kepada developer cara bermigrasi dari layanan paket App Engine ke pengganti mandiri Cloud:

  • Modul 2: bermigrasi dari App Engine ndb ke Cloud NDB
  • Modul 7-9: bermigrasi dari tugas push Task Queue App Engine ke Cloud Tasks
  • Modul 12-13: bermigrasi dari Memcache App Engine ke Cloud Memorystore
  • Modul 15-16: bermigrasi dari Blobstore App Engine ke Cloud Storage
  • Modul 18-19: bermigrasi dari Task Queue App Engine (tugas pull) ke Cloud Pub/Sub

Jika containerization telah menjadi bagian dari alur kerja pengembangan aplikasi Anda, terutama jika terdiri dari pipeline CI/CD (continuous integration/continuous delivery atau deployment), sebaiknya lakukan migrasi ke Cloud Run, bukan Cloud Functions. Lihat Modul 4 untuk memasukkan aplikasi Anda ke dalam container dengan Docker, atau Modul 5 untuk melakukannya tanpa container, pengetahuan Docker, atau Dockerfile. Baik mempertimbangkan Cloud Functions atau Cloud Run, peralihan ke platform serverless lainnya bersifat opsional, dan sebaiknya pertimbangkan opsi terbaik untuk aplikasi dan kasus penggunaan Anda sebelum melakukan perubahan apa pun.

Terlepas dari modul migrasi yang Anda pertimbangkan berikutnya, semua konten Stasiun Migrasi Serverless (codelab, video, kode sumber [jika tersedia]) dapat diakses di repositori open source-nya. README repo juga memberikan panduan tentang migrasi yang perlu dipertimbangkan dan "urutan" yang relevan Modul Migrasi.

8. Referensi lainnya

Masalah/masukan codelab modul migrasi App Engine

Jika Anda menemukan masalah dengan codelab ini, telusuri masalah Anda terlebih dahulu sebelum mengajukan masalah. Link untuk menelusuri dan membuat masalah baru:

Referensi migrasi

Link ke folder repo untuk Modul 8 (START) dan Modul 9 (FINISH) dapat ditemukan pada tabel di bawah. Link tersebut juga dapat diakses dari repo untuk semua migrasi codelab App Engine yang dapat Anda clone atau download file ZIP.

Codelab

Python 3

Modul 2

kode

Modul 11

kode

Sumber daya {i>online<i}

Di bawah ini adalah referensi online yang mungkin relevan untuk tutorial ini:

App Engine

Cloud Functions

Informasi Cloud lainnya

Video

Lisensi

Karya ini dilisensikan berdasarkan Lisensi Umum Creative Commons Attribution 2.0.