Modul 4: Melakukan migrasi dari Google App Engine ke Cloud Run dengan Docker

Rangkaian codelab ini (tutorial praktik mandiri) bertujuan untuk membantu developer Google App Engine (Standar) memodernisasi aplikasi mereka dengan memandu mereka melalui serangkaian migrasi. Setelah selesai, pengguna dapat membuat aplikasi mereka lebih portabel dengan mem-build aplikasi dalam container secara eksplisit untuk Cloud Run, layanan serupa container-hosting di Google Cloud untuk App Engine, dan layanan container-hosting lainnya.

Tutorial ini mengajarkan cara mem-build aplikasi App Engine dalam container untuk di-deploy ke layanan Cloud Run yang terkelola sepenuhnya menggunakan Docker, platform yang terkenal di industri untuk mengembangkan, mengirim, dan menjalankan aplikasi dalam container. Untuk developer Python 2, tutorial ini dimulai (START) dengan aplikasi contoh Modul 2 Cloud NDB App Engine sementara developer Python 3 START dengan contoh Cloud Datastore Modul 3.

Anda akan mempelajari cara

  • Mem-build aplikasi Anda dalam container menggunakan Docker
  • Men-deploy image container ke Cloud Run

Yang akan Anda perlukan

Survei

Bagaimana Anda akan menggunakan codelab ini?

Hanya membacanya Membacanya dan menyelesaikan latihan

Sistem PaaS seperti App Engine dan Cloud Functions memberikan banyak kemudahan bagi tim dan aplikasi Anda. Misalnya, platform tanpa server ini memungkinkan SysAdmin/Devops untuk fokus pada solusi proses build. Aplikasi Anda dapat melakukan penskalaan otomatis sesuai kebutuhan, memperkecil skala hingga nol dengan biaya penagihan per penggunaan yang dapat mengontrol biaya, dan menggunakan berbagai bahasa pengembangan yang umum.

Namun, fleksibilitas container juga menarik, dengan kemampuan untuk memilih bahasa, library, dan biner. Memberi pengguna manfaat terbaik dari kedua keunggulan, kemudahan tanpa server beserta fleksibilitas container, menjadi tujuan utama Google Cloud Run.

Mempelajari cara menggunakan Cloud Run tidak berada dalam cakupan codelab ini. Anda dapat menemukannya di dokumentasi Cloud Run. Tujuannya di sini adalah agar Anda mengetahui cara mem-build aplikasi App Engine dalam container untuk Cloud Run (atau layanan lainnya). Ada beberapa hal yang harus Anda ketahui sebelum melanjutkan, terutama bahwa pengalaman pengguna akan sedikit berbeda, setingkat lebih rendah karena Anda tidak akan lagi mengambil kode aplikasi dan men-deploy-nya.

Sebagai gantinya, Anda harus mempelajari beberapa hal tentang container seperti cara mem-build dan men-deploy-nya. Anda juga harus memutuskan apa yang ingin dimasukkan ke dalam image container, termasuk server web karena Anda tidak akan menggunakan server web App Engine lagi. Jika Anda memilih untuk tidak mengikuti jalur ini, mempertahankan aplikasi di App Engine bukanlah opsi yang buruk.

Dalam tutorial ini, Anda akan mempelajari cara mem-build aplikasi dalam container, mengganti file konfigurasi App Engine dengan konfigurasi container, menentukan apa yang masuk ke dalam container, kemudian menentukan cara memulai aplikasi — banyak dari hal-hal ini dikendalikan secara otomatis oleh App Engine.

Migrasi ini menampilkan langkah-langkah berikut:

  1. Penyiapan/Prakerja
  2. Mem-build aplikasi dalam container
    • Mengganti file konfigurasi
    • Mengubah file aplikasi

Sebelum memulai bagian utama tutorial, mari kita siapkan project, dapatkan kodenya, lalu deploy aplikasi dasar pengukuran sehingga kita tahu bahwa kita memulai dengan kode yang berfungsi.

1. Siapkan project

Jika Anda menyelesaikan codelab Modul 2 atau Modul 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 dan App Engine (aplikasi) diaktifkan.

2. Dapatkan aplikasi contoh dasar pengukuran

Salah satu prasyarat untuk codelab ini adalah memiliki aplikasi contoh Modul 2 atau Modul 3 yang berfungsi. Jika Anda tidak memilikinya, selesaikan salah satu tutorial tersebut (link di atas) sebelum melanjutkan ke sini. Sebaliknya, jika Anda sudah tidak asing dengan kontennya, Anda dapat memulai dengan mengambil kode Modul 2 atau 3 di bawah.

Baik Anda menggunakan kode Anda atau kode kami, kode Modul 2 adalah tempat kita akan memulai (START) versi Python 2 pada tutorial ini, dan begitu juga, kode Modul 3 untuk Python 3. Codelab Modul 4 ini akan memandu Anda melalui setiap langkah dan, tergantung pada opsi Anda, Anda akan memiliki kode yang menyerupai salah satu folder repo Modul 4 (FINISH) saat selesai.

File awal (START) di direktori Python 2 Modul 2 (kode Anda atau kode kami) akan terlihat seperti ini:

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

Jika menggunakan kode Modul 2 (2.x) milik Anda sendiri, Anda juga akan memiliki folder lib. lib maupun appengine_config.py tidak digunakan untuk Python 3, tempat kode awal (START) Modul 3 (3.x) 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 mem-build-nya dalam container.

Docker merupakan platform containerization standar dalam industri saat ini. Satu tantangan dalam penggunaannya, seperti yang disebutkan sebelumnya, adalah Docker memerlukan upaya untuk menyeleksi Dockerfile yang efisien, yaitu file konfigurasi yang menentukan cara image container Anda di-build. Buildpacks, di sisi lain, memerlukan hanya sedikit usaha karena menggunakan intropeksi untuk menentukan dependensi aplikasi Anda, membuat container Buildpacks menjadi efisien untuk aplikasi Anda.

Anda berada di tempat yang tepat jika sudah mengetahui tentang container, Docker, dan ingin mempelajari lebih lanjut tentang membuild aplikasi App Engine dalam container untuk Cloud Run. Jangan ragu untuk juga melakukan codelab Modul 5 (sama dengan modul ini tetapi dengan Cloud Buildpacks) setelahnya. Aplikasi contoh barebone kami cukup ringan untuk menghindari beberapa masalah Dockerfile yang disebutkan di atas.

Langkah-langkah migrasi meliputi mengganti file konfigurasi App Engine dan menentukan cara aplikasi Anda harus dimulai. Di bawah ini adalah tabel yang merangkum file konfigurasi yang diharapkan untuk setiap jenis platform. Membandingkan kolom App Engine dengan kolom Docker (dan secara opsional Buildpack):

Deskripsi

App Engine

Docker

Buildpacks

Konfigurasi umum

app.yaml

Dockerfile

(service.yaml)

Library pihak ke-3

requirements.txt

requirements.txt

requirements.txt

Konfigurasi pihak ke-3

app.yaml (plus appengine_config.py dan lib [khusus 2.x])

(T/A)

(T/A)

Startup

(T/A) atau app.yaml (jika entrypoint digunakan)

Dockerfile

Procfile

Abaikan file

.gcloudignore dan .gitignore

.gcloudignore, .gitignore, dan .dockerignore

.gcloudignore dan .gitignore

Setelah dibuild dalam container, aplikasi dapat di-deploy ke Cloud Run. Opsi platform container Google Cloud lainnya mencakup Compute Engine, GKE, dan Anthos.

Konfigurasi umum

Melakukan migrasi dari App Engine berarti mengganti app.yaml dengan Dockerfile yang menguraikan cara membuild dan menjalankan container. App Engine secara otomatis memulai aplikasi Anda, tetapi Cloud Run tidak. Inilah kegunaan perintah Dockerfile ENTRYPOINT dan CMD. Pelajari lebih lanjut Dockerfile dari halaman dokumen Cloud Run ini serta lihat contoh Dockerfile yang menghasilkan gunicorn.

Alternatif untuk menggunakan ENTRYPOINT atau CMD di Dockerfile adalah dengan menggunakan Procfile. Terakhir, .dockerignore membantu memfilter file non-aplikasi untuk menjaga ukuran container tetap rendah. Informasi lainnya terkait hal ini akan segera tersedia.

Hapus app.yaml dan buat Dockerfile

app.yaml tidak digunakan dalam container, jadi hapus sekarang. File konfigurasi container adalah Dockerfile, dan aplikasi contoh kami hanya memerlukan file minimal. Buat Dockerfile Anda dengan konten ini, ganti NNN dengan 2 atau 3, bergantung pada versi Python yang Anda gunakan:

FROM python:NNN-slim
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
ENTRYPOINT ["python", "main.py"]

Sebagian besar Dockerfile menentukan cara membuat container kecuali ENTRYPOINT yang menentukan cara memulai container, dalam hal ini memanggil python main.py untuk mengeksekusi server pengembangan Flask. Jika Anda baru menggunakan Docker, perintah FROM menunjukkan image dasar untuk memulai, dan "ramping" mengacu pada distribusi Python minimal. Pelajari lebih lanjut dari halaman image Python Docker.

Set tengah perintah membuat direktori kerja (/app), menyalin dalam file aplikasi, kemudian menjalankan pip install untuk menghadirkan library pihak ke-3 ke dalam container. WORKDIR menggabungkan perintah mkdir dan cd Linux; baca selengkapnya tentang hal ini di dokumentasi WORKDIR . Perintah COPY dan RUN sudah jelas.

Library pihak ke-3

File requirements.txt dapat tetap sama; Flask harus ada di file tersebut bersama library klien Datastore Anda (Cloud Datastore atau Cloud NDB). Jika Anda ingin menggunakan server HTTP lain yang sesuai dengan standar WSGI seperti Gunicorn — versi saat ini pada saat penulisan tutorial ini adalah 20.0.4 — lalu tambahkan gunicorn==20.0.4 ke requirements.txt.

Konfigurasi pihak ke-3

Developer Python 2 App Engine mengetahui bahwa library pihak ketiga disalin ke dalam folder lib, direferensikan di requirements.txt, dijadikan item dalam app.yaml, dan didukung oleh appengine_config.py. Container, seperti aplikasi App Engine Python 3, hanya menggunakan requirements.txt, sehingga semua item lainnya dapat dihapus, artinya jika Anda memiliki aplikasi App Engine 2.x, hapus appengine_config.py dan folder lib apa pun sekarang.

Startup

Pengguna Python 2 tidak memulai server web App Engine, namun saat berpindah ke container, Anda harus melakukannya. Hal ini dilakukan dengan menambahkan perintah CMD atau ENTRYPOINT di Dockerfile Anda yang menentukan cara memulai aplikasi, dan hal ini dijelaskan di bawah dengan cara yang sama seperti untuk pengguna Python 3.

Pengguna Python 3 memiliki opsi untuk mengonversi file app.yaml mereka agar memiliki perintah entrypoint, bukan script: auto di bagian handlers. Jika Anda menggunakan entrypoint di Python 3 app.yaml, akan terlihat seperti ini:

runtime: python38
entrypoint: python main.py

Perintah entrypoint memberi tahu App Engine cara memulai server Anda. Anda dapat memindahkannya hampir langsung ke Dockerfile (atau Procfile jika menggunakan Buildpacks [lihat Modul 5] untuk mem-build aplikasi Anda dalam container). Merangkum ketika perintah entrypoint akan berada di antara kedua platform:

  • Docker: baris dalam Dockerfile: ENTRYPOINT ["python", "main.py"]
  • Buildpacks: baris dalam Procfile: web: python main.py

Menggunakan server pengembangan Flask tidak masalah untuk pengujian, tetapi jika menggunakan server produksi seperti gunicorn untuk aplikasi Anda, pastikan untuk mengarahkan perintah ENTRYPOINT atau CMD ke aplikasi seperti di contoh Panduan Memulai Cloud Run.

Abaikan file

Sebaiknya Anda membuat file .dockerignore untuk memangkas ukuran container dan tidak mengacaukan image container dengan file berlebihan seperti berikut:

*.md
*.pyc
*.pyo
.git/
.gitignore
__pycache__

File aplikasi

Semua aplikasi Modul 2 atau Modul 3 sepenuhnya kompatibel dengan Python 2-3, yang berarti tidak ada perubahan pada komponen inti main.py; kami hanya akan menambahkan beberapa baris kode startup. Tambahkan sepasang baris di bagian bawah main.py untuk memulai server pengembangan karena Cloud Run memerlukan port 8080 agar dapat terbuka sehingga dapat memanggil aplikasi Anda:

if __name__ == '__main__':
    import os
    app.run(debug=True, threaded=True, host='0.0.0.0',
            port=int(os.environ.get('PORT', 8080)))

Setelah konfigurasi Docker dan pembaruan file sumber selesai, Anda siap untuk menjalankannya di Cloud Run. Sebelum itu, mari kita bahas sebentar tentang layanan.

Layanan vs. Aplikasi

Meskipun App Engine terutama dibuat untuk menghosting aplikasi, App Engine juga merupakan platform untuk menghosting layanan web atau aplikasi yang terdiri dari kumpulan microservice. Dalam Cloud Run, semuanya adalah layanan, baik itu layanan yang sebenarnya atau aplikasi yang memiliki antarmuka web. Jadi, pertimbangkan penggunaannya sebagai deployment layanan, bukan aplikasi.

Kecuali jika aplikasi App Engine terdiri dari beberapa layanan, Anda tidak perlu melakukan penamaan apa pun saat men-deploy aplikasi. Ini mengubah Cloud Run karena Anda perlu membuat nama layanan. Sementara domain appspot.com App Engine menampilkan project ID-nya, misalnya, https://PROJECT_ID.appspot.com, dan mungkin singkatan ID region, misalnya, http://PROJECT_ID.REGION_ID.r.appspot.com.

Namun, domain untuk layanan Cloud Run menampilkan nama layanan, singkatan ID region, dan hash, tetapi bukan project ID-nya, misalnya, https://SVC_NAME-HASH-REG_ABBR.a.run.app. Intinya, mulailah memikirkan nama layanan!

Deploy layanan

Jalankan perintah di bawah ini untuk mem-build image container Anda dan men-deploy ke Cloud Run. Jika diminta, pilih region Anda dan izinkan koneksi yang tidak diautentikasi untuk memudahkan pengujian dan pilih region yang sesuai jika SVC_NAME adalah nama layanan yang Anda deploy.

$ gcloud beta run deploy SVC_NAME --source .
Please choose a target platform:
 [1] Cloud Run (fully managed)
 [2] Cloud Run for Anthos deployed on Google Cloud
 [3] Cloud Run for Anthos deployed on VMware
 [4] cancel
Please enter your numeric choice:  1

To specify the platform yourself, pass `--platform managed`. Or, to make this the default target platform, run `gcloud config set run/platform managed`.

Please specify a region:
 [1] asia-east1
 [2] asia-east2
 [3] asia-northeast1
 [4] asia-northeast2
 [5] asia-northeast3
 [6] asia-south1
 [7] asia-southeast1
 [8] asia-southeast2
 [9] australia-southeast1
 [10] europe-north1
 [11] europe-west1
 [12] europe-west2
 [13] europe-west3
 [14] europe-west4
 [15] europe-west6
 [16] northamerica-northeast1
 [17] southamerica-east1
 [18] us-central1
 [19] us-east1
 [20] us-east4
 [21] us-west1
 [22] us-west2
 [23] us-west3
 [24] us-west4
 [25] cancel
Please enter your numeric choice: <select your numeric region choice>

To make this the default region, run `gcloud config set run/region REGION`.

Allow unauthenticated invocations to [SVC_NAME] (y/N)?  y

Building using Dockerfile and deploying container to Cloud Run service [SVC_NAME] in project [PROJECT_ID] region [REGION]
✓ Building and deploying new service... Done.
  ✓ Uploading sources...
  ✓ Building Container... Logs are available at [https://console.cloud.google.com/cloud-build/builds/BUILD-HASH?project=PROJECT_NUM].
  ✓ Creating Revision... Deploying Revision.
  ✓ Routing traffic...
  ✓ Setting IAM Policy...
Done.
Service [SVC_NAME] revision [SVC_NAME-00001-vos] has been deployed and is serving 100 percent of traffic.
Service URL: https://SVC_NAME-HASH-REG_ABBR.a.run.app

Kunjungi URL yang ditentukan di browser Anda untuk mengonfirmasi bahwa deployment berhasil.

Seperti yang ditunjukkan perintah gcloud, pengguna dapat menetapkan berbagai setelan default untuk mengurangi output dan interaktivitas seperti yang ditunjukkan di atas. Misalnya, untuk menghindari semua interaksi, Anda dapat menggunakan perintah deploy one-liner berikut:

$ gcloud beta run deploy SVC_NAME --source . --platform managed --region REGION --allow-unauthenticated

Jika Anda menggunakan perintah ini, pastikan untuk memilih nama layanan yang sama SVC_NAME dan nama REGION yang diinginkan, bukan pilihan menu yang diindeks seperti yang kami lakukan secara interaktif di atas.

Pastikan bahwa aplikasi berfungsi di Cloud Run seperti di App Engine. Jika Anda beralih ke rangkaian ini tanpa melakukan codelab sebelumnya, aplikasi itu sendiri tidak akan berubah. Aplikasi akan mendaftarkan semua kunjungan ke halaman web utama (/) dan terlihat seperti ini setelah Anda mengunjungi situs cukup waktu:

aplikasi visitme

Kode Anda sekarang seharusnya cocok dengan yang ada di folder repo Modul 4, baik 2.x atau 3.x. Selamat, Anda telah menyelesaikan codelab Modul 4 ini.

Opsional: Pembersihan

Bagaimana dengan pembersihan agar tidak ditagih hingga Anda siap untuk beralih ke codelab migrasi berikutnya? Karena sekarang Anda menggunakan produk lain, pastikan untuk meninjau panduan harga Cloud Run.

Opsional: Nonaktifkan layanan

Jika Anda belum siap untuk membuka tutorial berikutnya, nonaktifkan layanan untuk menghindari biaya tambahan. Jika sudah siap untuk beralih ke codelab berikutnya, Anda dapat mengaktifkannya kembali. Meskipun dinonaktifkan, aplikasi tidak akan mendapatkan traffic yang dikenakan biaya, namun hal lain yang dapat ditagih adalah penggunaan Datastore jika melebihi kuota gratis, jadi cukup hapus hingga berada di bawah batas tersebut.

Di sisi lain, jika Anda tidak akan melanjutkan migrasi dan ingin menghapus semuanya, Anda dapat menghapus layanan atau mematikan project sepenuhnya.

Langkah berikutnya

Selamat, Anda telah mem-build aplikasi dalam container, yang mengakhiri tutorial ini! Dari sini, langkah berikutnya adalah mempelajari cara melakukan hal yang sama dengan Cloud Buildpacks di codelab Modul 5 (link di bawah) atau melakukan migrasi App Engine lainnya:

  • Melakukan migrasi ke Python 3 jika Anda belum melakukannya. Aplikasi contoh sudah kompatibel dengan 2.x dan 3.x. Jadi, satu-satunya perubahan adalah bagi pengguna Docker untuk memperbarui Dockerfile agar menggunakan image Python 3.
  • 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
    • Anda harus sudah memigrasikan aplikasi ke Python 3
  • Modul 7: Task Queues Push App Engine (diperlukan jika Anda menggunakan Task Queues [push])
    • Tambahkan tugas push taskqueue App Engine ke aplikasi Modul 1
    • Siapkan pengguna untuk bermigrasi ke Cloud Tasks di Modul 8
  • Modul 3:
    • Memodernisasi akses Datastore dari Cloud NDB ke Cloud Datastore
    • Ini adalah library yang digunakan untuk aplikasi Python 3 App Engine dan aplikasi non-App Engine
  • Modul 6: Melakukan Migrasi ke Cloud Firestore
    • Melakukan migrasi ke Cloud Firestore untuk mengakses fitur Firebase
    • Meskipun Cloud Firestore mendukung Python 2, codelab ini hanya tersedia di Python 3.

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:

Resource migrasi

Link ke folder repo untuk Modul 2 dan 3 (START) dan Modul 4 (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 2

Python 3

Modul 2

kode

(kode)

Modul 3

(kode)

kode

Modul 4

kode

kode

Resource App Engine dan Cloud Run

Berikut adalah resource tambahan terkait migrasi khusus ini: