1. Ringkasan
Lab ini menunjukkan fitur dan kemampuan yang dirancang untuk menyederhanakan alur kerja pengembangan bagi engineer software yang bertugas mengembangkan aplikasi Python dalam lingkungan yang di-container. Pengembangan container yang umum mengharuskan pengguna memahami detail container dan proses build container. Selain itu, developer biasanya harus menghentikan alur kerja mereka, keluar dari IDE untuk menguji dan men-debug aplikasi mereka di lingkungan jarak jauh. Dengan alat dan teknologi yang disebutkan dalam tutorial ini, developer dapat bekerja secara efektif dengan aplikasi yang di-containerisasi tanpa keluar dari IDE mereka.
Yang akan Anda pelajari
Dalam lab ini, Anda akan mempelajari metode untuk mengembangkan dengan container di GCP, termasuk:
- Membuat aplikasi starter Python baru
- Menjelaskan proses pengembangan
- Mengembangkan layanan REST CRUD sederhana
2. Penyiapan dan Persyaratan
Penyiapan lingkungan mandiri
- Login ke Google Cloud Console dan buat project baru atau gunakan kembali project yang sudah ada. Jika belum memiliki akun Gmail atau Google Workspace, Anda harus membuatnya.



- Nama project adalah nama tampilan untuk peserta project ini. String ini adalah string karakter yang tidak digunakan oleh Google API, dan Anda dapat memperbaruinya kapan saja.
- Project ID harus unik di semua project Google Cloud dan tidak dapat diubah (tidak dapat diubah setelah ditetapkan). Cloud Console otomatis menghasilkan string unik; biasanya Anda tidak peduli dengan kata-katanya. Pada sebagian besar codelab, Anda harus mereferensikan Project ID (dan biasanya diidentifikasi sebagai
PROJECT_ID). Jadi, jika Anda tidak menyukainya, buat ID acak lain, atau, Anda dapat mencoba sendiri dan melihat apakah tersedia. Kemudian file akan "dibekukan" setelah project dibuat. - Ada nilai ketiga, Nomor Project yang digunakan oleh beberapa API. Pelajari lebih lanjut ketiga nilai ini di dokumentasi.
- Selanjutnya, Anda harus mengaktifkan penagihan di Cloud Console untuk menggunakan API/resource Cloud. Menjalankan operasi dalam codelab ini seharusnya tidak memerlukan banyak biaya, bahkan mungkin tidak sama sekali. Untuk menonaktifkan resource agar tidak menimbulkan penagihan di luar tutorial ini, ikuti petunjuk "pembersihan" yang ada di akhir codelab. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis senilai $300 USD.
Mulai Cloud Shell Editor
Lab ini dirancang dan diuji untuk digunakan dengan Editor Google Cloud Shell. Untuk mengakses editor:
- mengakses project google Anda di https://console.cloud.google.com.
- Di pojok kanan atas, klik ikon editor cloud shell

- Panel baru akan terbuka di bagian bawah jendela
- Klik tombol Open Editor

- Editor akan terbuka dengan penjelajah di sebelah kanan dan editor di area tengah
- Panel terminal juga harus tersedia di bagian bawah layar
- Jika terminal TIDAK terbuka, gunakan kombinasi tombol `ctrl+`` untuk membuka jendela terminal baru
Penyiapan Lingkungan
Di Cloud Shell, tetapkan project ID dan nomor project untuk project Anda. Simpan sebagai variabel PROJECT_ID dan PROJECT_ID.
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID \
--format='value(projectNumber)')
Mendapatkan kode sumber
- Kode sumber untuk lab ini terletak di container-developer-workshop di GoogleCloudPlatform di GitHub. Buat clone dengan perintah di bawah, lalu ubah ke direktori.
git clone https://github.com/GoogleCloudPlatform/container-developer-workshop.git &&
cd container-developer-workshop/labs/python
mkdir music-service && cd music-service
cloudshell workspace .
Jika terminal TIDAK terbuka, gunakan kombinasi tombol `ctrl+`` untuk membuka jendela terminal baru
Menyediakan infrastruktur yang digunakan dalam lab ini
Di lab ini, Anda akan men-deploy kode ke GKE dan mengakses data yang disimpan dalam database Spanner. Skrip penyiapan di bawah akan menyiapkan infrastruktur ini untuk Anda. Proses penyediaan akan memerlukan waktu lebih dari 10 menit. Anda dapat melanjutkan beberapa langkah berikutnya saat penyiapan sedang diproses.
../setup.sh
3. Membuat aplikasi awal Python baru
- Buat file bernama
requirements.txtdan salin konten berikut ke dalamnya
Flask
gunicorn
google-cloud-spanner
ptvsd==4.3.2
- Buat file bernama
app.pydan tempelkan kode berikut ke dalamnya
import os
from flask import Flask, request, jsonify
from google.cloud import spanner
app = Flask(__name__)
@app.route("/")
def hello_world():
message="Hello, World!"
return message
if __name__ == '__main__':
server_port = os.environ.get('PORT', '8080')
app.run(debug=False, port=server_port, host='0.0.0.0')
- Buat file bernama Dockerfile dan tempelkan kode berikut ke dalamnya
FROM python:3.8
ARG FLASK_DEBUG=0
ENV FLASK_DEBUG=$FLASK_DEBUG
ENV FLASK_APP=app.py
WORKDIR /app
COPY requirements.txt .
RUN pip install --trusted-host pypi.python.org -r requirements.txt
COPY . .
ENTRYPOINT ["python3", "-m", "flask", "run", "--port=8080", "--host=0.0.0.0"]
Catatan: FLASK_DEBUG=1 memungkinkan Anda memuat ulang perubahan kode secara otomatis ke aplikasi flask Python. Dockerfile ini memungkinkan Anda meneruskan nilai ini sebagai argumen build.
Membuat Manifes
Di terminal Anda, jalankan perintah berikut untuk membuat skaffold.yaml dan deployment.yaml default
- Lakukan inisialisasi Skaffold dengan perintah berikut
skaffold init --generate-manifests
Saat diminta, gunakan tombol panah untuk memindahkan kursor dan tombol spasi untuk memilih opsi.
Pilih:
8080untuk portyuntuk menyimpan konfigurasi
Memperbarui Konfigurasi Skaffold
- Mengubah nama aplikasi default
- Buka
skaffold.yaml - Pilih nama gambar yang saat ini ditetapkan sebagai
dockerfile-image - Klik kanan, lalu pilih Ubah Semua Kemunculan
- Ketik nama baru sebagai
python-app - Edit lebih lanjut bagian build menjadi
- menambahkan
docker.buildArgske kartuFLASK_DEBUG=1 - Menyinkronkan setelan untuk memuat perubahan apa pun pada file
*.pydari IDE ke container yang sedang berjalan
Setelah pengeditan, bagian build di file skaffold.yaml akan seperti di bawah:
build:
artifacts:
- image: python-app
docker:
buildArgs:
FLASK_DEBUG: 1
dockerfile: Dockerfile
sync:
infer:
- '**/*.py'
Mengubah File Konfigurasi Kubernetes
- Mengubah Nama default
- Buka file
deployment.yaml - Pilih nama gambar yang saat ini ditetapkan sebagai
dockerfile-image - Klik kanan, lalu pilih Ubah Semua Kemunculan
- Ketik nama baru sebagai
python-app
4. Menjelaskan proses pengembangan
Setelah menambahkan logika bisnis, Anda kini dapat men-deploy dan menguji aplikasi. Bagian berikut akan menyoroti penggunaan plugin Cloud Code. Selain itu, plugin ini terintegrasi dengan skaffold untuk menyederhanakan proses pengembangan Anda. Saat Anda men-deploy ke GKE dalam langkah-langkah berikut, Cloud Code dan Skaffold akan otomatis membangun image container Anda, mengirimkannya ke Container Registry, lalu men-deploy aplikasi Anda ke GKE. Hal ini terjadi di balik layar dengan mengabstraksi detail dari alur developer.
Men-deploy ke Kubernetes
- Di panel di bagian bawah Cloud Shell Editor, pilih Cloud Code 

- Di panel yang muncul di bagian atas, pilih Jalankan di Kubernetes. Jika diminta, pilih Ya untuk menggunakan konteks Kubernetes saat ini.

Perintah ini memulai build kode sumber, lalu menjalankan pengujian. Build dan pengujian akan memerlukan waktu beberapa menit untuk dijalankan. Pengujian ini mencakup pengujian unit dan langkah validasi yang memeriksa aturan yang ditetapkan untuk lingkungan deployment. Langkah validasi ini sudah dikonfigurasi, dan memastikan Anda mendapatkan peringatan tentang masalah deployment meskipun Anda sedang bekerja di lingkungan pengembangan.
- Saat pertama kali Anda menjalankan perintah, perintah akan muncul di bagian atas layar yang menanyakan apakah Anda menginginkan konteks kubernetes saat ini. Pilih "Ya" untuk menyetujui dan menggunakan konteks saat ini.
- Selanjutnya, perintah akan ditampilkan untuk menanyakan registry container mana yang akan digunakan. Tekan enter untuk menerima nilai default yang diberikan
- Pilih tab Output di panel bawah untuk melihat progres dan notifikasi

- Pilih "Kubernetes: Run/Debug - Detailed" di drop-down channel di sebelah kanan untuk melihat detail tambahan dan streaming log secara live dari penampung

Setelah build dan pengujian selesai, tab Output akan menampilkan: Attached debugger to container "python-app-8476f4bbc-h6dsl" successfully., dan URL http://localhost:8080 akan tercantum.
- Di terminal Cloud Code, arahkan kursor ke URL pertama dalam output (http://localhost:8080), lalu di tips alat yang muncul, pilih Open Web Preview.
- Tab browser baru akan terbuka dan menampilkan pesan
Hello, World!
Hot Reload
- Buka file
app.py. - Ubah pesan salam menjadi
Hello from Python
Segera perhatikan bahwa di jendela Output, tampilan Kubernetes: Run/Debug, watcher menyinkronkan file yang diperbarui dengan container di Kubernetes
Update initiated Build started for artifact python-app Build completed for artifact python-app Deploy started Deploy completed Status check started Resource pod/python-app-6f646ffcbb-tn7qd status updated to In Progress Resource deployment/python-app status updated to In Progress Resource deployment/python-app status completed successfully Status check succeeded ...
- Jika beralih ke tampilan
Kubernetes: Run/Debug - Detailed, Anda akan melihatnya mengenali perubahan file, lalu mem-build dan men-deploy ulang aplikasi
files modified: [app.py]
Syncing 1 files for gcr.io/veer-pylab-01/python-app:3c04f58-dirty@sha256:a42ca7250851c2f2570ff05209f108c5491d13d2b453bb9608c7b4af511109bd
Copying files:map[app.py:[/app/app.py]]togcr.io/veer-pylab-01/python-app:3c04f58-dirty@sha256:a42ca7250851c2f2570ff05209f108c5491d13d2b453bb9608c7b4af511109bd
Watching for changes...
[python-app] * Detected change in '/app/app.py', reloading
[python-app] * Restarting with stat
[python-app] * Debugger is active!
[python-app] * Debugger PIN: 744-729-662
- Muat ulang browser Anda untuk melihat hasil yang diperbarui.
Proses debug
- Buka tampilan Debug dan hentikan thread saat ini
. - Klik
Cloud Codedi menu bawah, lalu pilihDebug on Kubernetesuntuk menjalankan aplikasi dalam modedebug.
- Di tampilan
Kubernetes Run/Debug - DetailedjendelaOutput, perhatikan bahwa skaffold akan men-deploy aplikasi ini dalam mode debug.
- Saat pertama kali dijalankan, perintah akan menanyakan lokasi sumber di dalam container. Nilai ini terkait dengan direktori di Dockerfile.
Tekan Enter untuk menerima default

Proses build dan deployment aplikasi akan memerlukan waktu beberapa menit.
- Saat proses selesai. Anda akan melihat debugger terlampir.
Port forwarding pod/python-app-8bd64cf8b-cskfl in namespace default, remote port 5678 -> http://127.0.0.1:5678
- Status bar bawah mengubah warnanya dari biru menjadi oranye yang menunjukkan bahwa status bar tersebut berada dalam mode Debug.
- Di tampilan
Kubernetes Run/Debug, perhatikan bahwa container yang Dapat di-debug telah dimulai
**************URLs***************** Forwarded URL from service python-app: http://localhost:8080 Debuggable container started pod/python-app-8bd64cf8b-cskfl:python-app (default) Update succeeded ***********************************
Memanfaatkan Titik Henti Sementara
- Buka file
app.py. - Cari pernyataan yang bertuliskan
return message - Tambahkan titik henti sementara ke baris tersebut dengan mengklik spasi kosong di sebelah kiri nomor baris. Indikator merah akan ditampilkan untuk menunjukkan bahwa titik henti sementara telah ditetapkan
- Muat ulang browser Anda dan perhatikan bahwa debugger menghentikan proses pada titik henti sementara dan memungkinkan Anda menyelidiki variabel dan status aplikasi yang berjalan dari jarak jauh di GKE
- Klik ke bagian VARIABEL
- Klik Locals, di sana Anda akan menemukan variabel
"message". - Klik dua kali nama variabel "message" dan di jendela pop-up, ubah nilainya menjadi sesuatu yang berbeda seperti
"Greetings from Python" - Klik tombol Lanjutkan di panel kontrol debug

- Tinjau respons di browser Anda yang kini menampilkan nilai yang diperbarui yang baru saja Anda masukkan.
- Hentikan mode "Debug" dengan menekan tombol berhenti
dan hapus titik henti sementara dengan mengklik titik henti sementara lagi.
5. Mengembangkan Layanan REST CRUD Sederhana
Pada tahap ini, aplikasi Anda telah sepenuhnya dikonfigurasi untuk pengembangan dalam container dan Anda telah mempelajari alur kerja pengembangan dasar dengan Cloud Code. Di bagian berikut, Anda akan mempraktikkan apa yang telah Anda pelajari dengan menambahkan endpoint layanan REST yang terhubung ke database terkelola di Google Cloud.
Menulis kode layanan REST
Kode di bawah membuat layanan REST sederhana yang menggunakan Spanner sebagai database yang mendukung aplikasi. Buat aplikasi dengan menyalin kode berikut ke dalam aplikasi Anda.
- Buat aplikasi utama dengan mengganti
app.pydengan konten berikut
import os
from flask import Flask, request, jsonify
from google.cloud import spanner
app = Flask(__name__)
instance_id = "music-catalog"
database_id = "musicians"
spanner_client = spanner.Client()
instance = spanner_client.instance(instance_id)
database = instance.database(database_id)
@app.route("/")
def hello_world():
return "<p>Hello, World!</p>"
@app.route('/singer', methods=['POST'])
def create():
try:
request_json = request.get_json()
singer_id = request_json['singer_id']
first_name = request_json['first_name']
last_name = request_json['last_name']
def insert_singers(transaction):
row_ct = transaction.execute_update(
f"INSERT Singers (SingerId, FirstName, LastName) VALUES" \
f"({singer_id}, '{first_name}', '{last_name}')"
)
print("{} record(s) inserted.".format(row_ct))
database.run_in_transaction(insert_singers)
return {"Success": True}, 200
except Exception as e:
return e
@app.route('/singer', methods=['GET'])
def get_singer():
try:
singer_id = request.args.get('singer_id')
def get_singer():
first_name = ''
last_name = ''
with database.snapshot() as snapshot:
results = snapshot.execute_sql(
f"SELECT SingerId, FirstName, LastName FROM Singers " \
f"where SingerId = {singer_id}",
)
for row in results:
first_name = row[1]
last_name = row[2]
return (first_name,last_name )
first_name, last_name = get_singer()
return {"first_name": first_name, "last_name": last_name }, 200
except Exception as e:
return e
@app.route('/singer', methods=['PUT'])
def update_singer_first_name():
try:
singer_id = request.args.get('singer_id')
request_json = request.get_json()
first_name = request_json['first_name']
def update_singer(transaction):
row_ct = transaction.execute_update(
f"UPDATE Singers SET FirstName = '{first_name}' WHERE SingerId = {singer_id}"
)
print("{} record(s) updated.".format(row_ct))
database.run_in_transaction(update_singer)
return {"Success": True}, 200
except Exception as e:
return e
@app.route('/singer', methods=['DELETE'])
def delete_singer():
try:
singer_id = request.args.get('singer')
def delete_singer(transaction):
row_ct = transaction.execute_update(
f"DELETE FROM Singers WHERE SingerId = {singer_id}"
)
print("{} record(s) deleted.".format(row_ct))
database.run_in_transaction(delete_singer)
return {"Success": True}, 200
except Exception as e:
return e
port = int(os.environ.get('PORT', 8080))
if __name__ == '__main__':
app.run(threaded=True, host='0.0.0.0', port=port)
Menambahkan Konfigurasi Database
Untuk terhubung ke Spanner secara aman, siapkan aplikasi agar menggunakan Workload Identity. Hal ini memungkinkan aplikasi Anda bertindak sebagai akun layanannya sendiri dan memiliki izin individual saat mengakses database.
- Perbarui
deployment.yaml. Tambahkan kode berikut di bagian akhir file (pastikan Anda mempertahankan indentasi tab dalam contoh di bawah)
serviceAccountName: python-ksa
nodeSelector:
iam.gke.io/gke-metadata-server-enabled: "true"
Men-deploy dan Memvalidasi Aplikasi
- Di panel di bagian bawah Cloud Shell Editor, pilih
Cloud Code, lalu pilihDebug on Kubernetesdi bagian atas layar. - Setelah build dan pengujian selesai, tab Output akan menampilkan:
Resource deployment/python-app status completed successfully, dan URL akan tercantum: "Forwarded URL from service python-app: http://localhost:8080" - Tambahkan beberapa entri.
Dari Terminal cloudshell, jalankan perintah di bawah
curl -X POST http://localhost:8080/singer -H 'Content-Type: application/json' -d '{"first_name":"Cat","last_name":"Meow", "singer_id": 6}'
- Uji GET dengan menjalankan perintah di bawah di terminal
curl -X GET http://localhost:8080/singer?singer_id=6
- Uji Penghapusan: Sekarang coba hapus entri dengan menjalankan perintah berikut. Ubah nilai item-id jika diperlukan.
curl -X DELETE http://localhost:8080/singer?singer_id=6
This throws an error message
500 Internal Server Error
Identifikasi dan perbaiki masalahnya
- Mode debug dan temukan masalahnya. Berikut ini beberapa tips:
- Kita tahu ada yang salah dengan DELETE karena tidak memberikan hasil yang diinginkan. Jadi, Anda akan menetapkan titik henti sementara di
app.pydalam metodedelete_singer. - Jalankan eksekusi langkah demi langkah dan amati variabel di setiap langkah untuk mengamati nilai variabel lokal di jendela kiri.
- Untuk mengamati nilai tertentu seperti
singer_iddanrequest.args, tambahkan variabel ini ke jendela Watch.
- Perhatikan bahwa nilai yang ditetapkan ke
singer_idadalahNone. Ubah kode untuk memperbaiki masalah.
Cuplikan kode yang diperbaiki akan terlihat seperti ini.
@app.route('/delete-singer', methods=['DELETE', 'GET'])
def delete_singer():
try:
singer_id = request.args.get('singer_id')
- Setelah aplikasi dimulai ulang, uji lagi dengan mencoba menghapus.
- Hentikan sesi proses debug dengan mengklik kotak merah di toolbar debug

6. Pembersihan
Selamat! Dalam lab ini, Anda telah membuat aplikasi Python baru dari awal dan mengonfigurasinya agar berfungsi secara efektif dengan container. Kemudian, Anda men-deploy dan men-debug aplikasi ke cluster GKE jarak jauh dengan mengikuti alur developer yang sama seperti yang ditemukan dalam stack aplikasi tradisional.
Untuk membersihkan setelah menyelesaikan lab:
- Hapus file yang digunakan dalam lab
cd ~ && rm -rf container-developer-workshop
- Hapus project untuk menghapus semua infrastruktur dan resource terkait