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.
Tujuan codelab ini adalah untuk menunjukkan kepada developer App Engine Python 2 cara bermigrasi dari Memcache App Engine ke Cloud Memorystore (untuk Redis). Ada juga migrasi implisit dari App Engine ndb
ke Cloud NDB, tetapi hal itu utamanya dibahas dalam codelab Modul 2; lihat untuk mendapatkan informasi
langkah demi langkah.
Anda akan mempelajari cara
- Menyiapkan instance Cloud Memorystore (dari Konsol Cloud atau alat
gcloud
) - Menyiapkan konektor Akses VPC Cloud Serverless (dari Cloud Console atau alat
gcloud
) - Bermigrasi dari Memcache App Engine ke Cloud Memorystore
- Mengimplementasikan cache dengan Cloud Memorystore dalam aplikasi contoh
- Migrasikan dari
ndb
App Engine ke Cloud NDB
Yang Anda butuhkan
- Project Google Cloud dengan akun penagihan aktif (ini bukan codelab gratis)
- Keterampilan Python dasar
- Pengetahuan perintah Linux umum yang berfungsi
- Pengetahuan dasar tentang mengembangkan dan men-deploy aplikasi App Engine
- Aplikasi App Engine Modul 12 yang berfungsi (selesaikan codelab Modul 12 [direkomendasikan] atau salin aplikasi Modul 12 dari repo)
Survei
Bagaimana Anda akan menggunakan tutorial ini?
Bagaimana penilaian Anda terhadap pengalaman dengan Python?
Bagaimana penilaian Anda terhadap pengalaman menggunakan layanan Google Cloud?
2. Latar belakang
Codelab ini menunjukkan cara memigrasikan aplikasi contoh dari Memcache App Engine (dan NDB) ke Cloud Memorystore (dan Cloud NDB). Proses ini melibatkan penggantian dependensi pada layanan paket App Engine, sehingga membuat aplikasi Anda lebih portabel. Anda dapat memilih untuk tetap menggunakan App Engine atau mempertimbangkan untuk beralih ke alternatif yang dijelaskan sebelumnya.
Migrasi ini memerlukan upaya lebih banyak dibandingkan dengan yang lain dalam seri ini. Pengganti yang direkomendasikan untuk Memcache App Engine adalah Cloud Memorystore, layanan penyimpanan cache berbasis cloud yang terkelola sepenuhnya. Memorystore mendukung sepasang mesin cache open source yang populer, yaitu Redis dan Memcached. Modul migrasi ini menggunakan Cloud Memorystore for Redis. Anda dapat mempelajari lebih lanjut di ringkasan Memorystore dan Redis.
Karena Memorystore memerlukan server yang berjalan, Cloud VPC juga diperlukan. Secara khusus, konektor Akses VPC Serverless harus dibuat agar aplikasi App Engine dapat terhubung ke instance Memorystore melalui alamat IP pribadinya. Setelah menyelesaikan latihan ini, Anda akan memperbarui aplikasi sehingga meskipun perilakunya seperti sebelumnya, Cloud Memorystore akan menjadi layanan penyimpanan cache, yang menggantikan layanan Memcache App Engine.
Tutorial ini dimulai dengan aplikasi contoh Modul 12 di Python 2, diikuti dengan upgrade minor tambahan yang bersifat opsional ke Python 3. Jika sudah terbiasa mengakses layanan paket App Engine dari Python 3 melalui Python 3 App Engine SDK, Anda dapat memulai dengan aplikasi contoh Modul 12 versi Python 3. Tindakan ini akan menyebabkan penghapusan penggunaan SDK karena Memorystore bukan layanan paket App Engine. Mempelajari cara menggunakan Python 3 App Engine SDK berada di luar cakupan tutorial ini.
Tutorial ini menampilkan langkah-langkah utama berikut:
- Penyiapan/persiapan
- Menyiapkan layanan penyimpanan dalam cache
- Update file konfigurasi
- Memperbarui aplikasi utama
3. Penyiapan/persiapan
Menyiapkan project Cloud
Sebaiknya gunakan kembali project yang sama dengan yang Anda gunakan untuk menyelesaikan codelab Modul 12. Atau, Anda dapat membuat project baru atau menggunakan kembali project lain yang sudah ada. Setiap codelab dalam seri ini memiliki "MULAI" (kode dasar pengukuran awal) dan "FINISH" (aplikasi yang dimigrasikan). Kode FINISH diberikan agar Anda dapat membandingkan solusi Anda dengan solusi kami jika mengalami masalah. Anda dapat melakukan rollback ke START kapan saja jika terjadi masalah. Checkpoint ini dirancang untuk memastikan Anda berhasil mempelajari cara melakukan migrasi.
Apa pun project Cloud yang Anda gunakan, pastikan project tersebut memiliki akun penagihan aktif. Pastikan juga App Engine diaktifkan. Tinjau dan pastikan Anda memahami implikasi biaya umum dalam menjalankan tutorial ini. Namun, tidak seperti yang lain dalam seri ini, codelab ini menggunakan resource Cloud yang tidak memiliki paket gratis, sehingga akan dikeluarkan beberapa biaya untuk menyelesaikan latihan. Informasi biaya yang lebih spesifik akan diberikan bersama dengan rekomendasi untuk pengurangan penggunaan, termasuk petunjuk di bagian akhir tentang melepaskan resource untuk meminimalkan biaya penagihan.
Dapatkan aplikasi contoh dasar pengukuran
Dari kode dasar pengukuran Modul 12 yang menjadi awalan kita, codelab ini akan memandu Anda melakukan migrasi langkah demi langkah. Setelah selesai, Anda akan masuk di aplikasi Modul 13 yang berfungsi dan sangat mirip dengan kode di salah satu folder FINISH. Berikut adalah referensi tersebut:
- START: Aplikasi Module 12 Python 2 (
mod12
) atau Python 3 (mod12b
) - FINISH: Aplikasi Module 13 Python 2 (
mod13a
) atau Python 3 (mod13b
) - Seluruh repositori migrasi (clone atau download ZIP)
Folder START harus berisi file berikut:
$ ls README.md app.yaml main.py requirements.txt templates
Jika Anda memulai dari versi Python 2, akan ada file appengine_config.py
dan mungkin folder lib
jika Anda menyelesaikan codelab Modul 12.
Deploy (ulang) aplikasi Modul 12
Langkah persiapan yang tersisa:
- Biasakan kembali diri Anda dengan alat command line
gcloud
(jika perlu) - Deploy (ulang) kode Modul 12 ke App Engine (jika perlu)
Pengguna Python 2 harus menghapus dan menginstal ulang folder lib
dengan perintah berikut:
rm -rf ./lib; pip install -t lib -r requirements.txt
Sekarang semua orang (pengguna Python 2 dan 3) harus mengupload kode ke App Engine dengan perintah ini:
gcloud app deploy
Setelah berhasil di-deploy, konfirmasi tampilan dan fungsi aplikasi seperti aplikasi di Modul 12, yaitu aplikasi web yang melacak kunjungan, lalu simpan dalam cache untuk pengguna yang sama selama satu jam:
Karena kunjungan terbaru di-cache, pemuatan ulang halaman akan dimuat cukup cepat.
4. Menyiapkan layanan penyimpanan dalam cache
Cloud Memorystore bukan serverless. Instance diperlukan; dalam hal ini yang menjalankan Redis. Tidak seperti Memcache, Memorystore adalah produk Cloud mandiri dan tidak memiliki paket gratis. Jadi, pastikan untuk memeriksa informasi harga Memorystore for Redis sebelum melanjutkan. Untuk meminimalkan biaya latihan ini, sebaiknya sediakan jumlah resource minimal yang dapat dioperasikan: tingkat layanan Dasar dan kapasitas 1 GB.
Instance Memorystore berada di jaringan yang berbeda dengan aplikasi App Engine (instance) Anda. Oleh karena itu, konektor Akses VPC Serverless harus dibuat agar App Engine dapat mengakses resource Memorystore Anda. Untuk meminimalkan biaya VPC, pilih jenis instance (f1-micro
) dan jumlah instance paling sedikit yang akan diminta (sebaiknya minimal 2, maksimum 3). Lihat juga halaman informasi harga VPC.
Kami mengulangi rekomendasi ini untuk mengurangi biaya seiring kami memandu Anda dalam membuat setiap sumber daya yang diperlukan. Selain itu, saat membuat resource Memorystore dan VPC di Konsol Cloud, Anda akan melihat kalkulator harga untuk setiap produk di pojok kanan atas, sehingga Anda dapat memperkirakan biaya bulanan (lihat ilustrasi di bawah). Nilai tersebut otomatis disesuaikan jika Anda mengubah opsi. Inilah yang diperkirakan akan Anda lihat:
Kedua resource diperlukan, dan tidak masalah resource mana yang Anda buat terlebih dahulu. Jika Anda membuat instance Memorystore terlebih dahulu, aplikasi App Engine tidak dapat menjangkaunya tanpa konektor VPC. Demikian pula, jika Anda membuat konektor VPC terlebih dahulu, jaringan VPC tersebut tidak dapat diajak berinteraksi dengan aplikasi App Engine Anda. Dalam tutorial ini, Anda dapat membuat instance Memorystore terlebih dahulu lalu diikuti oleh konektor VPC.
Setelah kedua resource online, Anda akan menambahkan informasi yang relevan ke app.yaml
sehingga aplikasi Anda dapat mengakses cache. Anda juga dapat merujuk pada panduan Python 2 atau Python 3 dalam dokumentasi resmi. Panduan penyimpanan data dalam cache di halaman migrasi Cloud NDB ( Python 2 atau Python 3) juga layak dirujuk.
Membuat instance Cloud Memorystore
Karena Cloud Memorystore tidak memiliki paket gratis, sebaiknya alokasikan resource paling sedikit untuk menyelesaikan codelab. Anda dapat meminimalkan biaya dengan menggunakan setelan ini:
- Pilih tingkat layanan terendah: Basic (default konsol: "Standard",
gcloud
default: "Basic"). - Pilih jumlah penyimpanan paling sedikit: 1 GB (default konsol: 16 GB, default
gcloud
: 1 GB). - Biasanya, versi terbaru dari semua software memerlukan jumlah resource paling besar, tetapi memilih versi terlama mungkin juga tidak direkomendasikan. Versi terbaru kedua saat ini adalah versi Redis 5.0 (default konsol: 6.x)
Dengan mempertimbangkan setelan tersebut, bagian berikutnya akan memandu Anda membuat instance dari Konsol Cloud. Jika Anda lebih suka melakukannya dari command line, lewati saja.
Dari Cloud Console
Buka halaman Cloud Memorystore di Cloud Console (Anda mungkin akan diminta untuk memasukkan informasi penagihan). Jika belum mengaktifkan Memorystore, Anda akan diminta untuk melakukannya:
Setelah mengaktifkannya (dan mungkin bersama dengan penagihan), Anda akan masuk ke dasbor Memorystore. Di sini Anda dapat melihat semua instance yang telah dibuat dalam project. Project yang ditampilkan di bawah ini tidak memiliki baris, sehingga Anda akan melihat "Tidak ada baris untuk ditampilkan". Untuk membuat instance Memorystore, klik Create instance di bagian atas:
Halaman ini menampilkan formulir untuk diisi dengan setelan yang Anda inginkan untuk membuat instance Memorystore:
Agar biaya untuk tutorial ini dan aplikasi contohnya tetap hemat, ikuti rekomendasi yang dibahas sebelumnya. Setelah menentukan pilihan, klik Buat. Proses pembuatan memerlukan waktu beberapa menit. Setelah selesai, salin alamat IP instance dan nomor port untuk ditambahkan ke app.yaml
.
Dari command line
Meskipun membuat instance Memorystore dari Cloud Console adalah informasi visual yang informatif, sebagian orang lebih memilih command line. Pastikan Anda telah menginstal dan melakukan inisialisasi gcloud
sebelum melanjutkan.
Seperti halnya Konsol Cloud, Cloud Memorystore for Redis harus diaktifkan. Jalankan perintah gcloud services enable redis.googleapis.com
dan tunggu hingga selesai, seperti contoh ini:
$ gcloud services enable redis.googleapis.com Operation "operations/acat.p2-aaa-bbb-ccc-ddd-eee-ffffff" finished successfully.
Jika layanan telah diaktifkan, menjalankan perintah (lagi) tidak akan memiliki efek samping (negatif). Setelah layanan diaktifkan, mari kita buat instance Memorystore. Perintah tersebut akan terlihat seperti ini:
gcloud redis instances create NAME --redis-version VERSION \ --region REGION --project PROJECT_ID
Memilih nama untuk instance Memorystore Anda; lab ini menggunakan "demo-ms
" sebagai nama bersama dengan ID project "my-project
". Region aplikasi contoh ini adalah us-central1
(sama seperti us-central
), tetapi Anda dapat menggunakan region yang lebih dekat dengan Anda jika mengkhawatirkan latensi. Anda harus memilih region yang sama dengan aplikasi App Engine. Anda dapat memilih versi Redis mana pun yang diinginkan, tetapi kami menggunakan versi 5 seperti yang direkomendasikan sebelumnya. Dengan setelan tersebut, ini adalah perintah yang akan Anda keluarkan (beserta output terkait):
$ gcloud redis instances create demo-ms --region us-central1 \ --redis-version redis_5_0 --project my-project Create request issued for: [demo-ms] Waiting for operation [projects/my-project/locations/us-central1/operations/operation-xxxx] to complete...done. Created instance [demo-ms].
Tidak seperti setelan default Cloud Console, gcloud
ditetapkan secara default ke resource minimal. Hasilnya adalah tingkat layanan atau jumlah penyimpanan tidak diperlukan dalam perintah tersebut. Membuat instance Memorystore membutuhkan waktu beberapa menit, dan setelah selesai, perhatikan alamat IP dan nomor port instance karena keduanya akan segera ditambahkan ke app.yaml
.
Konfirmasi instance yang dibuat
Dari Cloud Console atau command line
Baik membuat instance dari Konsol Cloud maupun command line, Anda dapat memastikan bahwa instance tersedia dan siap digunakan dengan perintah ini: gcloud redis instances list --region REGION
Berikut adalah perintah untuk memeriksa instance di region us-central1
beserta output yang diharapkan yang menunjukkan instance yang baru saja kita buat:
$ gcloud redis instances list --region us-central1 INSTANCE_NAME VERSION REGION TIER SIZE_GB HOST PORT NETWORK RESERVED_IP STATUS CREATE_TIME demo-ms REDIS_5_0 us-central1 BASIC 1 10.aa.bb.cc 6379 default 10.aa.bb.dd/29 READY 2022-01-28T09:24:45
Saat dimintai informasi instance atau untuk mengonfigurasi aplikasi Anda, pastikan untuk menggunakan HOST
dan PORT
(bukan RESERVED_IP
). Dasbor Cloud Memorystore di Konsol Cloud sekarang akan menampilkan instance tersebut:
Dari virtual machine Compute Engine
Jika memiliki virtual machine (VM) Compute Engine, Anda juga dapat mengirimkan perintah langsung instance Memorystore dari VM untuk memastikan bahwa VM tersebut berfungsi. Perlu diketahui bahwa penggunaan VM mungkin menimbulkan biaya terkait, terlepas dari resource yang sudah Anda gunakan.
Buat konektor Akses VPC Serverless
Seperti Cloud Memorystore, Anda dapat membuat konektor VPC Cloud serverless di Konsol Cloud atau command line. Demikian pula, Cloud VPC tidak memiliki paket gratis, jadi sebaiknya alokasikan resource paling sedikit untuk menyelesaikan codelab demi meminimalkan biaya, dan hal tersebut dapat dicapai dengan setelan berikut:
- Pilih jumlah maksimum instance terendah: 3 (konsol &
gcloud
default: 10) - Pilih jenis mesin dengan biaya paling rendah:
f1-micro
(default konsol:e2-micro
, tanpa defaultgcloud
)
Bagian berikutnya akan memandu Anda membuat konektor dari Konsol Cloud menggunakan setelan Cloud VPC di atas. Jika Anda lebih suka melakukannya dari command line, lewati ke bagian berikutnya.
Dari Cloud Console
Buka "Serverless VPC access" di Jaringan Cloud di Konsol Cloud (Anda mungkin akan diminta untuk memberikan informasi penagihan). Jika Anda belum mengaktifkan API, Anda akan diminta untuk melakukannya:
Setelah mengaktifkan API (dan mungkin bersama dengan penagihan), Anda akan masuk ke dasbor yang menampilkan semua konektor VPC yang dibuat. Project yang digunakan pada screenshot di bawah tidak memiliki keduanya, jadi tertulis, "Tidak ada baris untuk ditampilkan". Di konsol, klik Create Connector di bagian atas:
Lengkapi formulir dengan setelan yang diinginkan:
Pilih setelan yang sesuai untuk aplikasi Anda. Untuk tutorial ini dan aplikasi contohnya dengan kebutuhan minimal, masuk akal untuk meminimalkan biaya, jadi ikuti rekomendasi yang dibahas sebelumnya. Setelah menentukan pilihan, klik Buat. Memerlukan waktu beberapa menit untuk menyelesaikan konektor VPC.
Dari command line
Sebelum membuat konektor VPC, aktifkan API Akses VPC Serverless terlebih dahulu. Anda akan melihat output serupa setelah mengeluarkan perintah berikut:
$ gcloud services enable vpcaccess.googleapis.com Operation "operations/acf.p2-aaa-bbb-ccc-ddd-eee-ffffff" finished successfully.
Dengan mengaktifkan API, konektor VPC dibuat dengan perintah yang terlihat seperti ini:
gcloud compute networks vpc-access connectors create CONNECTOR_NAME \ --range 10.8.0.0/28 --region REGION --project PROJECT_ID
Pilih nama untuk konektor Anda serta alamat IP awal blok CIDR /28
yang tidak digunakan. Tutorial ini membuat asumsi berikut:
- ID Project:
my-project
- Nama konektor VPC:
demo-vpc
- Instance min: 2 (default) dan instance maks: 3
- Jenis instance:
f1-micro
- Region:
us-central1
- Blok CIDR IPv4:
10.8.0.0/28
(seperti yang direkomendasikan di Konsol Cloud)
Anda akan mendapatkan output yang mirip dengan yang Anda lihat di bawah ini jika Anda menjalankan perintah berikut dengan mempertimbangkan asumsi di atas:
$ gcloud compute networks vpc-access connectors create demo-vpc \ --max-instances 3 --range 10.8.0.0/28 --machine-type f1-micro \ --region us-central1 --project my-project Create request issued for: [demo-vpc] Waiting for operation [projects/my-project/locations/us-central1/operations/xxx] to complete...done. Created connector [demo-vpc].
Perintah di atas tidak menentukan nilai default, seperti instance min 2 dan jaringan bernama default
. Pembuatan konektor VPC selesai dalam waktu beberapa menit.
Konfirmasi bahwa konektor dibuat
Setelah proses selesai, berikan perintah gcloud
berikut, dengan asumsi bahwa region tersebut adalah us-central1
, untuk mengonfirmasi bahwa region tersebut telah dibuat dan siap digunakan:
$ gcloud compute networks vpc-access connectors list --region us-central1 CONNECTOR_ID REGION NETWORK IP_CIDR_RANGE SUBNET SUBNET_PROJECT MIN_THROUGHPUT MAX_THROUGHPUT STATE demo-vpc us-central1 default 10.8.0.0/28 200 300 READY
Demikian pula, dasbor kini akan menampilkan konektor yang baru saja Anda buat:
Catat project ID Cloud, nama konektor VPC, dan region.
Setelah Anda membuat resource Cloud tambahan yang diperlukan, baik dengan command line atau di konsol, sekarang saatnya mengupdate konfigurasi aplikasi untuk mendukung penggunaannya.
5. Update file konfigurasi
Langkah pertama adalah membuat semua pembaruan yang diperlukan pada file konfigurasi. Tujuan utama codelab ini adalah membantu pengguna Python 2 melakukan migrasi, tetapi konten tersebut biasanya diikuti dengan informasi tentang porting lebih lanjut ke Python 3 di setiap bagian di bawah ini.
requirements.txt
Di bagian ini, kita menambahkan paket untuk mendukung Cloud Memorystore serta Cloud NDB. Untuk Cloud Memorystore for Redis, Anda cukup menggunakan klien Redis standar untuk Python (redis
) karena tidak ada library klien Cloud Memorystore. Tambahkan redis
dan google-cloud-ndb
ke requirements.txt
, yang menggabungkan flask
dari Modul 12:
flask
redis
google-cloud-ndb
File requirements.txt
ini tidak menampilkan nomor versi apa pun, yang berarti versi terbaru akan dipilih. Jika muncul inkompatibilitas, tentukan nomor versi yang akan dikunci dalam versi yang berfungsi.
app.yaml
Bagian baru untuk ditambahkan
Runtime Python 2 App Engine memerlukan paket pihak ketiga tertentu saat menggunakan Cloud API seperti Cloud NDB, yaitu grpcio
dan setuptools
. Pengguna Python 2 harus mencantumkan library bawaan seperti ini beserta versi yang tersedia di app.yaml
. Jika Anda belum memiliki bagian libraries
, buat dan tambahkan kedua library seperti berikut:
libraries:
- name: grpcio
version: latest
- name: setuptools
version: latest
Saat memigrasikan aplikasi Anda, aplikasi tersebut mungkin sudah memiliki bagian libraries
. Jika ya, serta grpcio
dan setuptools
tidak ada, cukup tambahkan keduanya ke bagian libraries
yang ada.
Selanjutnya, aplikasi contoh kami memerlukan informasi instance Cloud Memorystore dan konektor VPC. Jadi, tambahkan dua bagian baru berikut ke app.yaml
, terlepas dari runtime Python yang sedang Anda gunakan:
env_variables:
REDIS_HOST: 'YOUR_REDIS_HOST'
REDIS_PORT: 'YOUR_REDIS_PORT'
vpc_access_connector:
name: projects/PROJECT_ID/locations/REGION/connectors/CONNECTOR
Itu saja selama pembaruan yang diperlukan. app.yaml
yang telah diperbarui sekarang akan terlihat seperti ini:
runtime: python27
threadsafe: yes
api_version: 1
handlers:
- url: /.*
script: main.app
libraries:
- name: grpcio
version: 1.0.0
- name: setuptools
version: 36.6.0
env_variables:
REDIS_HOST: 'YOUR_REDIS_HOST'
REDIS_PORT: 'YOUR_REDIS_PORT'
vpc_access_connector:
name: projects/PROJECT_ID/locations/REGION/connectors/CONNECTOR
Di bawah ini adalah "sebelum dan sesudah" mengilustrasikan update yang harus Anda terapkan ke app.yaml
:
*Perbedaan Python 3
Bagian ini bersifat opsional dan hanya jika Anda melakukan porting ke Python 3. Untuk melakukannya, ada sejumlah perubahan yang perlu dibuat pada konfigurasi Python 2 Anda. Lewati bagian ini jika Anda tidak melakukan upgrade saat ini.
threadsafe
atau api_version
tidak digunakan untuk runtime Python 3, jadi hapus kedua setelan ini. Runtime App Engine terbaru tidak mendukung library pihak ketiga bawaan atau penyalinan library bawaan non. Satu-satunya persyaratan untuk paket pihak ketiga adalah mencantumkannya di requirements.txt
. Akibatnya, seluruh bagian libraries
dari app.yaml
dapat dihapus.
Selanjutnya, runtime Python 3 memerlukan penggunaan framework web yang melakukan perutean sendiri. Oleh karena itu, kami menunjukkan kepada developer cara bermigrasi dari webp2 ke Flask di Modul 1. Akibatnya, semua pengendali skrip harus diubah menjadi auto
. Karena tidak menayangkan file statis apa pun, aplikasi ini menjadi "tidak ada gunanya" agar pengendali dicantumkan (karena semuanya adalah auto
), sehingga seluruh bagian handlers
juga dapat dihapus. Akibatnya, penyesuaian app.yaml
baru Anda yang disingkat untuk Python 3 akan dipersingkat agar terlihat seperti ini:
runtime: python39
env_variables:
REDIS_HOST: 'YOUR_REDIS_HOST'
REDIS_PORT: 'YOUR_REDIS_PORT'
vpc_access_connector:
name: projects/PROJECT_ID/locations/REGION/connectors/CONNECTOR
Merangkum perbedaan di app.yaml
saat melakukan porting ke Python 3:
- Menghapus setelan
threadsafe
danapi_version
- Hapus bagian
libraries
- Hapus bagian
handlers
(atau hanya pengendaliscript
jika aplikasi Anda menayangkan file statis)
Ganti nilai
Nilai-nilai di bagian baru untuk Memorystore dan konektor VPC hanyalah placeholder. Ganti nilai dalam huruf kapital tersebut (YOUR_REDIS_HOST, YOUR_REDIS_PORT, PROJECT_ID, REGION, CONNECTOR_NAME
) dengan nilai yang disimpan dari saat Anda membuat resource tersebut sebelumnya. Sehubungan dengan instance Memorystore Anda, pastikan untuk menggunakan HOST
(bukan RESERVED_IP
) dan PORT
. Berikut adalah cara command line cepat untuk mendapatkan HOST
dan PORT
dengan asumsi nama instance demo-ms
dan REGION
-nya adalah us-central1
:
$ gcloud redis instances describe demo-ms --region us-central1 \ --format "value(host,port)" 10.251.161.51 6379
Jika contoh alamat IP instance Redis kita adalah 10.10.10.10
menggunakan port 6379
dalam project my-project
yang terletak di region us-central1
dengan nama konektor VPC demo-vpc
, bagian di app.yaml
ini akan terlihat seperti ini:
env_variables:
REDIS_HOST: '10.10.10.10'
REDIS_PORT: '6379'
vpc_access_connector:
name: projects/my-project/locations/us-central1/connectors/demo-vpc
Buat atau update appengine_config.py
Menambahkan dukungan untuk library pihak ketiga bawaan
Sama seperti yang kita lakukan dengan app.yaml
sebelumnya, tambahkan penggunaan library grpcio
dan setuptools
. Ubah appengine_config.py
untuk mendukung library pihak ketiga bawaan. Jika hal ini tampak familier, hal ini juga diperlukan di Modul 2 saat bermigrasi dari App Engine ndb
ke Cloud NDB. Perubahan persis yang diperlukan adalah menambahkan folder lib
ke working set setuptools.pkg_resources
:
*Perbedaan Python 3
Bagian ini bersifat opsional dan hanya jika Anda melakukan porting ke Python 3. Salah satu perubahan App Engine generasi kedua yang diterima adalah penyalinan (terkadang disebut "vendor") paket pihak ketiga (non-bawaan) dan mereferensikan paket pihak ketiga bawaan di app.yaml
tidak lagi diperlukan, yang berarti Anda dapat menghapus seluruh file appengine_config.py
.
6. Memperbarui file aplikasi
Hanya ada satu file aplikasi, main.py
, sehingga semua perubahan di bagian ini hanya memengaruhi file tersebut. Kami telah memberikan gambaran tentang perubahan yang akan kami lakukan untuk memigrasikan aplikasi ini ke Cloud Memorystore. Ini hanya dimaksudkan untuk ilustrasi dan tidak dimaksudkan untuk Anda analisis secara mendalam. Semua pekerjaan ada dalam perubahan yang kita buat pada kode.
Mari kita bahas bagian ini satu per satu, mulai dari atas.
Memperbarui impor
Bagian impor di main.py
untuk Modul 12 menggunakan Cloud NDB dan Cloud Tasks; berikut adalah impornya:
SEBELUM:
from flask import Flask, render_template, request
from google.appengine.api import memcache
from google.appengine.ext import ndb
Beralih ke Memorystore membutuhkan pembacaan variabel lingkungan, yang berarti kita memerlukan modul os
Python serta redis
, klien Python Redis. Karena Redis tidak dapat meng-cache objek Python, arahkan daftar kunjungan terbaru menggunakan pickle
, jadi impor juga. Salah satu manfaat Memcache adalah serialisasi objek terjadi secara otomatis, sedangkan Memorystore sedikit lebih dikenal sebagai "DIY". Terakhir, upgrade dari App Engine ndb
ke Cloud NDB dengan mengganti google.appengine.ext.ndb
dengan google.cloud.ndb
. Setelah perubahan ini, impor Anda sekarang akan terlihat seperti berikut:
SETELAH:
import os
import pickle
from flask import Flask, render_template, request
from google.cloud import ndb
import redis
Memperbarui inisialisasi
Inisialisasi Modul 12 terdiri dari pembuatan instance objek aplikasi Flask app
dan menyetel konstanta selama cache selama satu jam:
SEBELUM:
app = Flask(__name__)
HOUR = 3600
Penggunaan Cloud API memerlukan klien, jadi buat instance klien Cloud NDB segera setelah Flask. Selanjutnya, dapatkan alamat IP dan nomor port untuk instance Memorystore dari variabel lingkungan yang Anda tetapkan di app.yaml
. Berbekal informasi tersebut, buat instance klien Redis. Berikut adalah tampilan kode Anda setelah update tersebut:
SETELAH:
app = Flask(__name__)
ds_client = ndb.Client()
HOUR = 3600
REDIS_HOST = os.environ.get('REDIS_HOST', 'localhost')
REDIS_PORT = os.environ.get('REDIS_PORT', '6379')
REDIS = redis.Redis(host=REDIS_HOST, port=REDIS_PORT)
*Migrasi Python 3
Bagian ini bersifat opsional dan jika Anda memulai dari aplikasi Modul 12 versi Python 3. Jika demikian, ada beberapa perubahan yang diperlukan terkait dengan impor dan inisialisasi.
Pertama, karena Memcache adalah layanan paket App Engine, penggunaannya dalam aplikasi Python 3 memerlukan SDK App Engine, khususnya menggabungkan aplikasi WSGI (serta konfigurasi yang diperlukan lainnya):
SEBELUM:
from flask import Flask, render_template, request
from google.appengine.api import memcache, wrap_wsgi_app
from google.appengine.ext import ndb
app = Flask(__name__)
app.wsgi_app = wrap_wsgi_app(app.wsgi_app)
HOUR = 3600
Karena kita bermigrasi ke Cloud Memorystore (bukan layanan yang dipaketkan App Engine seperti Memcache), penggunaan SDK harus dihapus. Cara ini sangat mudah karena Anda hanya perlu menghapus seluruh baris yang mengimpor memcache
dan wrap_wsgi_app
. Hapus juga baris yang memanggil wrap_wsgi_app()
. Update ini membuat bagian aplikasi ini (sebenarnya, seluruh aplikasi) tetap identik dengan versi Python 2.
SETELAH:
import os
import pickle
from flask import Flask, render_template, request
from google.cloud import ndb
import redis
app = Flask(__name__)
ds_client = ndb.Client()
HOUR = 3600
REDIS_HOST = os.environ.get('REDIS_HOST', 'localhost')
REDIS_PORT = os.environ.get('REDIS_PORT', '6379')
REDIS = redis.Redis(host=REDIS_HOST, port=REDIS_PORT)
Terakhir, hapus penggunaan SDK dari app.yaml
(hapus baris: app_engine_apis: true
) dan requirements.txt
(hapus baris: appengine-python-standard
).
Bermigrasi ke Cloud Memorystore (dan Cloud NDB)
Model data Cloud NDB dimaksudkan agar kompatibel dengan App Engine ndb
, yang berarti definisi objek Visit
tetap sama. Dengan meniru migrasi Modul 2 ke Cloud NDB, semua panggilan Datastore di store_visit()
dan fetch_visits()
akan ditingkatkan dan disematkan dalam blok with
baru (karena penggunaan pengelola konteks Cloud NDB diperlukan). Berikut adalah panggilan sebelum perubahan tersebut:
SEBELUM:
def store_visit(remote_addr, user_agent):
'create new Visit entity in Datastore'
Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()
def fetch_visits(limit):
'get most recent visits'
return Visit.query().order(-Visit.timestamp).fetch(limit)
Tambahkan blok with ds_client.context()
ke kedua fungsi, dan masukkan panggilan Datastore di dalam (dan diindentasi). Dalam hal ini, tidak diperlukan perubahan untuk panggilan itu sendiri:
SETELAH:
def store_visit(remote_addr, user_agent):
'create new Visit entity in Datastore'
with ds_client.context():
Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()
def fetch_visits(limit):
'get most recent visits'
with ds_client.context():
return Visit.query().order(-Visit.timestamp).fetch(limit)
Selanjutnya, mari kita lihat
perubahan dalam {i>cache<i}. Berikut adalah fungsi main()
dari Modul 12:
SEBELUM:
@app.route('/')
def root():
'main application (GET) handler'
# check for (hour-)cached visits
ip_addr, usr_agt = request.remote_addr, request.user_agent
visitor = '{}: {}'.format(ip_addr, usr_agt)
visits = memcache.get('visits')
# register visit & run DB query if cache empty or new visitor
if not visits or visits[0].visitor != visitor:
store_visit(ip_addr, usr_agt)
visits = list(fetch_visits(10))
memcache.set('visits', visits, HOUR) # set() not add()
return render_template('index.html', visits=visits)
Redis memiliki fungsi "mendapatkan" dan "{i>set<i}" seperti Memcache. Yang kita lakukan adalah menukar library klien masing-masing, bukan? Hampir benar. Seperti yang disebutkan sebelumnya, kita tidak dapat meng-cache daftar Python dengan Redis (karena perlu diserialisasi terlebih dahulu, sesuatu yang ditangani oleh Memcache secara otomatis), jadi dalam panggilan set()
, "acar" kunjungan ke dalam string dengan pickle.dumps()
. Demikian pula, saat mengambil kunjungan dari cache, Anda harus memisahkannya dengan pickle.loads()
tepat setelah get()
. Berikut adalah pengendali utama setelah menerapkan perubahan tersebut:
SETELAH:
@app.route('/')
def root():
'main application (GET) handler'
# check for (hour-)cached visits
ip_addr, usr_agt = request.remote_addr, request.user_agent
visitor = '{}: {}'.format(ip_addr, usr_agt)
rsp = REDIS.get('visits')
visits = pickle.loads(rsp) if rsp else None
# register visit & run DB query if cache empty or new visitor
if not visits or visits[0].visitor != visitor:
store_visit(ip_addr, usr_agt)
visits = list(fetch_visits(10))
REDIS.set('visits', pickle.dumps(visits), ex=HOUR)
return render_template('index.html', visits=visits)
Ini menyimpulkan perubahan yang diperlukan dalam main.py
yang mengonversi penggunaan Memcache aplikasi contoh ke Cloud Memorystore. Bagaimana dengan template HTML dan porting ke Python 3?
Perbarui file template HTML dan port ke Python 3?
Kejutan! Tidak ada yang bisa dilakukan di sini karena aplikasi ini dirancang untuk berjalan di Python 2 dan 3 tanpa perubahan kode atau library kompatibilitas. Anda akan menemukan main.py
. identik di seluruh "FINISH" mod13a
(2.x) dan mod13b
(3.x) folder. Hal yang sama berlaku untuk requirements.txt
, selain dari perbedaan nomor versi (jika digunakan). Karena antarmuka pengguna tetap tidak berubah, tidak ada update untuk templates/index.html
.
Semua yang diperlukan untuk menjalankan aplikasi ini di Python 3 App Engine telah diselesaikan sebelumnya dalam konfigurasi: perintah yang tidak perlu dihapus dari app.yaml
dan appengine_config.py
serta folder lib
dihapus karena tidak digunakan di Python 3.
7. Ringkasan/Pembersihan
Bagian ini mengakhiri codelab ini dengan men-deploy aplikasi, yang memverifikasi bahwa aplikasi berfungsi sebagaimana mestinya dan dalam output yang ditampilkan. Setelah validasi aplikasi, lakukan semua pembersihan dan pertimbangkan langkah berikutnya.
Men-deploy dan memverifikasi aplikasi
Pemeriksaan terakhir adalah selalu men-deploy aplikasi contoh. Developer Python 2: hapus dan instal ulang lib
dengan perintah di bawah. (Jika sudah menginstal Python 2 dan 3 pada sistem, Anda mungkin harus menjalankan pip2
secara eksplisit.)
rm -rf ./lib pip install -t lib -r requirements.txt
Developer Python 2 dan 3 sekarang harus men-deploy aplikasi mereka dengan:
gcloud app deploy
Karena Anda hanya menghubungkan ulang berbagai perangkat untuk layanan caching yang benar-benar berbeda, aplikasi itu sendiri harus beroperasi secara identik dengan aplikasi Modul 12:
Langkah ini menyelesaikan codelab. Kami mengundang Anda untuk membandingkan aplikasi contoh yang telah diupdate dengan salah satu folder Modul 13, mod13a
(Python 2) atau mod13b
(Python 3).
Pembersihan
Umum
Jika sudah selesai untuk saat ini, sebaiknya nonaktifkan aplikasi App Engine agar tidak menimbulkan penagihan. Namun, jika Anda ingin menguji atau bereksperimen lagi, platform App Engine memiliki kuota gratis, dan asalkan Anda tidak melebihi tingkat penggunaan tersebut, Anda tidak akan dikenai biaya. Itu berlaku untuk komputasi, tetapi mungkin juga ada biaya untuk layanan App Engine yang relevan. Jadi, periksa halaman harganya untuk mengetahui informasi selengkapnya. Jika migrasi ini melibatkan layanan Cloud lainnya, layanan tersebut akan ditagih secara terpisah. Dalam kedua kasus tersebut, jika berlaku, lihat "Khusus untuk codelab ini" di bawah ini.
Untuk pengungkapan penuh, deployment ke platform komputasi serverless Google Cloud seperti App Engine akan menimbulkan biaya build dan penyimpanan yang kecil. Cloud Build memiliki kuota gratisnya sendiri seperti halnya Cloud Storage. Penyimpanan gambar tersebut menghabiskan sebagian kuota tersebut. Namun, Anda mungkin tinggal di region yang tidak memiliki paket gratis tersebut, jadi perhatikan penggunaan penyimpanan Anda untuk meminimalkan potensi biaya. "Folder" Cloud Storage tertentu yang harus Anda tinjau mencakup:
console.cloud.google.com/storage/browser/LOC.artifacts.PROJECT_ID.appspot.com/containers/images
console.cloud.google.com/storage/browser/staging.PROJECT_ID.appspot.com
- Link penyimpanan di atas bergantung pada
PROJECT_ID
dan *LOC
*asi Anda, misalnya, "us
" jika aplikasi Anda dihosting di AS.
Di sisi lain, jika Anda tidak akan melanjutkan aplikasi ini atau codelab migrasi terkait lainnya dan ingin menghapus semuanya sepenuhnya, nonaktifkan project Anda.
Khusus untuk codelab ini
Layanan yang tercantum di bawah bersifat unik untuk codelab ini. Lihat dokumentasi setiap produk untuk mengetahui informasi selengkapnya:
- Cloud Memorystore memerlukan instance dan tidak memiliki paket gratis; untuk mempelajari biaya penggunaan lebih lanjut, lihat halaman harganya.
- Konektor Akses VPC Cloud Serverless memerlukan instance dan tidak memiliki paket gratis; Untuk mempelajari biaya penggunaan lebih lanjut, lihat bagiannya di halaman harga VPC Cloud.
- Cloud Datastore (Cloud Firestore dalam mode Datastore) memiliki paket gratis; lihat halaman harganya untuk mengetahui informasi selengkapnya.
Tutorial ini melibatkan penggunaan empat produk Cloud:
- App Engine
- Cloud Datastore
- Cloud Memorystore
- VPC Cloud
Berikut adalah petunjuk untuk melepaskan resource ini dan untuk menghindari/meminimalkan biaya penagihan.
Mematikan instance Memorystore dan konektor VPC
Berikut adalah produk-produk tanpa paket gratis, sehingga Anda dikenai penagihan saat ini. Jika Anda tidak menghentikan project Cloud (lihat bagian berikutnya), Anda harus menghapus instance Memorystore serta konektor VPC untuk menghentikan penagihan. Mirip dengan saat membuat resource ini, Anda juga dapat merilisnya dari Cloud Console atau command line.
Dari Cloud Console
Untuk menghapus instance Memorystore, kembali ke dasbor Memorystore dan klik ID instance:
Setelah berada di halaman detail instance tersebut, klik "Hapus" dan konfirmasi:
Untuk menghapus konektor VPC, buka dasbor dan centang kotak di samping konektor yang ingin dihapus, lalu klik "Hapus" dan konfirmasi:
Dari command line
Sepasang perintah gcloud
berikut akan menghapus masing-masing instance Memorystore dan konektor VPC:
gcloud redis instances delete INSTANCE --region REGION
gcloud compute networks vpc-access connectors delete CONNECTOR --region REGION
Jika belum menetapkan project ID dengan gcloud config set project
, Anda mungkin harus memberikan --project PROJECT_ID
. Jika instance Memorystore Anda disebut demo-ms
dan konektor VPC bernama demo-vpc
, dan keduanya berada di region us-central1
, berikan sepasang perintah berikut dan konfirmasi:
$ gcloud redis instances delete demo-ms --region us-central1 You are about to delete instance [demo-ms] in [us-central1]. Any associated data will be lost. Do you want to continue (Y/n)? Delete request issued for: [demo-ms] Waiting for operation [projects/PROJECT/locations/REGION/operations/operation-aaaaa-bbbbb-ccccc-ddddd] to complete...done. Deleted instance [demo-ms]. $ $ gcloud compute networks vpc-access connectors delete demo-vpc --region us-central1 You are about to delete connector [demo-vpc] in [us-central1]. Any associated data will be lost. Do you want to continue (Y/n)? Delete request issued for: [demo-vpc] Waiting for operation [projects/PROJECT/locations/REGION/operations/aaaaa-bbbb-cccc-dddd-eeeee] to complete...done. Deleted connector [demo-vpc].
Setiap permintaan memerlukan waktu beberapa menit untuk dijalankan. Langkah-langkah ini bersifat opsional jika Anda memilih untuk menghentikan seluruh project Cloud seperti yang dijelaskan sebelumnya, tetapi Anda tetap dikenai biaya hingga proses penonaktifan tersebut selesai.
Langkah berikutnya
Selain tutorial ini, modul migrasi lain yang berfokus untuk beralih dari layanan paket lama yang perlu dipertimbangkan meliputi:
- 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
App Engine bukan lagi satu-satunya platform serverless di Google Cloud. Jika Anda memiliki aplikasi App Engine kecil atau aplikasi yang memiliki fungsi terbatas dan ingin mengubahnya menjadi microservice mandiri, atau Anda ingin memecah aplikasi monolitik menjadi beberapa komponen yang dapat digunakan kembali, berikut adalah alasan bagus untuk mempertimbangkan beralih ke Cloud Functions. 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. Skenario ini dibahas dalam modul berikut:
- Bermigrasi dari App Engine ke Cloud Functions: lihat Modul 11
- Bermigrasi dari App Engine ke Cloud Run: lihat Modul 4 untuk menyimpan aplikasi Anda ke dalam container dengan Docker, atau Modul 5 untuk melakukannya tanpa container, pengetahuan Docker, atau
Dockerfile
Beralih 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
Di bawah ini adalah referensi tambahan untuk developer yang mempelajari lebih lanjut Modul Migrasi ini atau terkait serta produk terkait. Ini mencakup tempat untuk memberikan masukan tentang konten ini, link ke kode, dan berbagai dokumentasi yang mungkin berguna bagi Anda.
Masalah/masukan Codelab
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 12 (START) dan Modul 13 (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 13 (codelab ini) |
Referensi {i>online<i}
Di bawah ini adalah referensi online yang mungkin relevan untuk tutorial ini:
App Engine
- Dokumentasi App Engine
- Runtime App Engine (lingkungan standar) Python 2
- Menggunakan library bawaan App Engine di Python 2 App Engine
- Runtime App Engine (lingkungan standar) Python 3
- Perbedaan antara Python 2 & 3 runtime App Engine (lingkungan standar)
- Panduan migrasi App Engine (lingkungan standar) Python 2 ke 3
- Informasi harga dan kuota App Engine
App Engine NDB dan Cloud NDB
- Ringkasan App Engine NDB
- Penggunaan Datastore NDB App Engine
- Dokumen Google Cloud NDB
- Repo Google Cloud NDB
- Informasi harga Cloud Datastore
Memcache App Engine dan Cloud Memorystore
- Ringkasan Memcache App Engine
- Referensi
memcache
App Engine Python 2 - Referensi
memcache
App Engine Python 3 - Panduan migrasi App Engine
memcache
ke Cloud Memorystore - Dokumentasi Cloud Memorystore
- Dokumentasi Cloud Memorystore for Redis
- Informasi harga Cloud Memorystore for Redis
- Versi Redis yang didukung Cloud Memorystore
- Halaman beranda Cloud Memorystore
- Membuat instance Memorystore baru di Konsol Cloud
- Halaman beranda klien Python Redis
- Dokumentasi library klien Redis Python
VPC Cloud
- Dokumen VPC Google Cloud
- Halaman beranda VPC Google Cloud
- Informasi harga VPC Cloud
- Buat konektor Akses VPC Serverless baru di Konsol Cloud
Informasi Cloud lainnya
- Python di Google Cloud Platform
- Library klien Python Google Cloud
- Google Cloud "Selalu Gratis" tingkat lanjut
- Google Cloud SDK (alat command line
gcloud
) - Semua dokumentasi Google Cloud
Lisensi
Karya ini dilisensikan berdasarkan Lisensi Umum Creative Commons Attribution 2.0.