Modul 11: Bermigrasi dari Google App Engine ke Cloud Functions

1. Ringkasan

Serangkaian codelab Serverless Migration Station (tutorial praktik mandiri) dan video terkait bertujuan untuk membantu developer serverless Google Cloud memodernisasi aplikasi mereka dengan memandu mereka melalui satu atau beberapa migrasi, terutama beralih dari layanan lama. Dengan melakukannya, aplikasi Anda akan lebih portabel dan Anda akan memiliki lebih banyak opsi dan fleksibilitas, sehingga Anda dapat berintegrasi dengan dan mengakses berbagai produk Cloud serta mengupgrade 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 di tempat lain jika berlaku.

Ada situasi ketika Anda tidak memiliki "seluruh aplikasi" untuk memerlukan resource App Engine atau Cloud Run. Jika kode Anda hanya terdiri dari microservice atau fungsi sederhana, Cloud Functions mungkin 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, platform tanpa server lain yang dibuat khusus untuk kasus penggunaan seperti ini.

Anda akan mempelajari cara

  • Menggunakan Cloud Shell
  • Aktifkan Google Cloud Translation API
  • Melakukan Autentikasi permintaan API
  • Mengonversi aplikasi App Engine kecil agar berjalan di Cloud Functions
  • Men-deploy kode Anda 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 berfokus pada pembuatan solusi bisnis, bukan menghabiskan waktu untuk menyelidiki platform yang akan digunakan dan menentukan jumlah hardware yang diperlukan. Aplikasi dapat melakukan penskalaan otomatis sesuai kebutuhan, memperkecil skala hingga nol dengan biaya penagihan per penggunaan untuk mengontrol biaya, dan mendukung berbagai bahasa pengembangan umum saat ini.

Namun, meskipun pengembangan aplikasi web full-stack atau backend yang kompleks untuk aplikasi seluler sangat cocok untuk App Engine, sering kali developer hanya mencoba menempatkan beberapa fungsi secara online, seperti memperbarui feed berita atau menarik skor terbaru pertandingan playoff tim tuan rumah. Meskipun logika coding ada untuk kedua skenario, keduanya tampaknya bukan "aplikasi" lengkap yang memerlukan kecanggihan App Engine. Di sinilah Cloud Functions berperan.

Cloud Functions digunakan untuk men-deploy sedikit kode yang:

  • Bukan bagian dari seluruh aplikasi
  • Tidak diperlukan dalam 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 yang besar menjadi beberapa microservice, yang masing-masing menggunakan database umum bersama seperti Cloud Firestore atau Cloud SQL. Selain itu, jika Anda ingin fungsi atau microservice Anda dikemas dalam container dan dieksekusi secara serverless di Cloud Run, Anda juga dapat melakukannya.

Aplikasi App Engine contoh kami yang telah ditampilkan di hampir semua tutorial migrasi adalah aplikasi singkat dengan fungsi dasar yang berfungsi sama baiknya di Cloud Functions. Dalam tutorial ini, Anda akan mempelajari cara mengubah aplikasi tersebut agar berjalan di Cloud Functions. Dari perspektif App Engine, karena fungsi lebih sederhana daripada seluruh aplikasi, pengalaman memulai Anda akan lebih mudah (dan lebih cepat), serta secara umum memiliki lebih sedikit "overhead". Migrasi ini menampilkan langkah-langkah berikut:

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

3. Penyiapan/Prakerja

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

1. Siapkan project

Jika Anda telah menyelesaikan codelab Modul 2 (dan mem-porting-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 yang 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 yang ditautkan di atas sebelum melanjutkan ke sini. Jika sudah terbiasa dengan kontennya, Anda bisa memulai dengan mengambil kode Modul 2 di bawah.

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

File awal (START) di direktori Python 3 Modul 2 (kode Anda atau kode 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 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 melakukannya, tidak ada bahaya karena Cloud Functions tidak menggunakannya. Itulah satu-satunya perubahan konfigurasi karena requirements.txt tetap sama dengan yang ada di Modul 2.

Jika Anda juga mentransfer aplikasi App Engine Python 2 ke Python 3, hapus appengine_config.py dan folder lib jika ada. Ini adalah artefak App Engine yang tidak digunakan di runtime Python 3.

5. Mengubah file aplikasi

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

Impor

Karena kita hanya menggunakan fungsi, tidak diperlukan framework aplikasi web. Namun, untuk mempermudah, saat Cloud Functions berbasis Python dipanggil, objek permintaan akan otomatis diteruskan agar kode Anda dapat menggunakannya 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 aplikasi Anda menggunakan fitur Flask lainnya. Memang demikian kasusnya karena rendering template masih berlangsung setelah konversi ke fungsi, yang berarti panggilan flask.render_template() masih diperlukan, sehingga impornya dari Flask. Tidak ada framework web berarti tidak perlu membuat instance aplikasi Flask, 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 penggunaannya sepenuhnya atau menemukan proxy. Baru kemudian Anda dapat mengonversi kode menjadi Cloud Function. Jika tidak, sebaiknya Anda tetap menggunakan App Engine atau mem-build 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 menjadi Cloud Function, jadi hapus dekorator rute.
  2. Cloud Functions secara otomatis meneruskan objek Request Flask sebagai parameter, jadi buat variabel untuknya. Di aplikasi contoh, kita akan memanggilnya request.
  3. Cloud Functions yang di-deploy harus diberi nama. Handler utama kami diberi nama root() dengan tepat di App Engine untuk mendeskripsikan fungsinya (handler aplikasi root). Sebagai Cloud Function, penggunaan nama tersebut kurang tepat. Sebagai gantinya, kita akan men-deploy Cloud Function dengan nama visitme, jadi gunakan nama tersebut sebagai nama fungsi Python juga. Demikian pula, di Modul 4 dan 5, kita juga memberi nama layanan Cloud Run visitme.

Berikut adalah tampilan sebelum dan sesudah dengan 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)

Dengan demikian, semua pembaruan yang diperlukan telah selesai. Perhatikan bahwa perubahan yang dilakukan hanya memengaruhi kode "infrastruktur" aplikasi. Tidak ada perubahan yang diperlukan dalam kode aplikasi inti, dan tidak ada fungsi aplikasi yang diubah. Berikut adalah representasi gambar dari perubahan yang dilakukan untuk mengilustrasikan poin ini:

668f30e3865b27a9.png

Pengembangan dan pengujian lokal

Sementara App Engine memiliki server pengembangan lokal dev_appserver.py, Cloud Functions memiliki Functions Framework. 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 cloud lokal atau hybrid yang mendukung Knative. Lihat link tambahan ke Functions Framework di bawah.

6. Mem-build dan men-deploy

Deployment 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 yang dipicu HTTP baru yang berjalan di Python 3.10 dengan perintah ini:

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

Output yang diharapkan mirip 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 Anda di-deploy, gunakan URL dari output deployment dan buka aplikasi Anda. URL-nya berbentuk: REGION-PROJECT_ID.cloudfunctions.net/visitme. Outputnya harus sama seperti saat Anda men-deploy-nya sebelumnya ke App Engine:

2732ae9218f011a2.png

Seperti kebanyakan codelab dan video lainnya dalam seri ini, fungsi aplikasi dasar tidak berubah. Tujuannya adalah untuk 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 ke produk mandiri Cloud penggantinya, atau, seperti dalam tutorial ini, memindahkan aplikasi ke platform serverless Google Cloud lainnya.

7. Ringkasan/Pembersihan

Selamat karena telah mengonversi aplikasi App Engine kecil ini menjadi Cloud Function. Kasus penggunaan lain yang sesuai: memecah aplikasi App Engine monolitik yang besar menjadi serangkaian microservice, yang masing-masing sebagai Cloud Function. Teknik pengembangan yang lebih modern ini menghasilkan komponen yang lebih "plug-and-play" (seperti gaya "JAM stack"). Hal ini memungkinkan pencampuran dan pencocokan, serta penggunaan kembali kode, yang merupakan dua tujuan, tetapi manfaat lainnya adalah bahwa mikroservice ini akan terus di-debug dari waktu ke waktu, yang berarti kode stabil dan biaya pemeliharaan yang lebih rendah secara keseluruhan.

Pembersihan

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

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

Sayangnya, Cloud Functions tidak memiliki fitur "nonaktifkan". Buat cadangan kode Anda dan hapus saja fungsi tersebut. Anda selalu dapat men-deploy ulang dengan nama yang sama nanti. Namun, jika Anda tidak akan melanjutkan codelab migrasi lainnya dan ingin menghapus semuanya, matikan project Cloud Anda.

Langkah berikutnya

Selain tutorial ini, modul migrasi lain yang perlu diperhatikan mencakup mem-build aplikasi App Engine 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: Melakukan Migrasi 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: melakukan migrasi dari tugas push App Engine Task Queue ke Cloud Tasks
  • Modul 12-13: bermigrasi dari App Engine Memcache ke Cloud Memorystore
  • Modul 15-16: bermigrasi dari Blobstore App Engine ke Cloud Storage
  • Modul 18-19: bermigrasi dari App Engine Task Queue (pull task) ke Cloud Pub/Sub

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

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

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

Referensi online

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