1. Pengantar
Terakhir Diperbarui: 01-11-2024
Bagaimana cara memodernisasi aplikasi PHP lama ke Google Cloud?
(📽️ tonton video pengantar berdurasi 7 menit untuk codelab ini)
Biasanya ada aplikasi lama yang berjalan di lokal yang perlu dimodernisasi. Artinya, membuat aplikasi tersebut skalabel, aman, dan dapat di-deploy di berbagai lingkungan.
Dalam workshop ini, Anda akan:
- Buat container Aplikasi PHP.
- Beralih ke Layanan Database Terkelola ( Cloud SQL).
- Men-deploy ke Cloud Run (alternatif zero-ops untuk GKE/Kubernetes).
- Amankan Aplikasi dengan Identity and Access Management (IAM) dan Secret Manager.
- Tentukan pipeline CI/CD melalui Cloud Build. Cloud Build dapat dihubungkan dengan repo Git Anda yang dihosting di penyedia Git populer seperti GitHub atau GitLab, dan dipicu setiap kali push ke main, misalnya.
- Menghosting gambar aplikasi di Cloud Storage. Hal ini dicapai melalui pemasangan, dan tidak diperlukan kode untuk mengubah aplikasi.
- Memperkenalkan fungsi AI Generatif melalui Gemini, yang diorkestrasi melalui Cloud Functions (serverless).
- Pelajari SLO dan operasikan aplikasi yang baru dimuat ulang.
Dengan mengikuti langkah-langkah ini, Anda dapat memodernisasi aplikasi PHP secara bertahap, sehingga meningkatkan skalabilitas, keamanan, dan fleksibilitas deployment-nya. Selain itu, dengan beralih ke Google Cloud, Anda dapat memanfaatkan infrastruktur dan layanannya yang canggih untuk memastikan aplikasi berjalan lancar di lingkungan native cloud.
Kami yakin bahwa apa yang akan Anda pelajari dengan mengikuti langkah-langkah sederhana ini dapat diterapkan untuk aplikasi dan organisasi Anda sendiri dengan bahasa/stack yang berbeda dan kasus penggunaan yang berbeda.
Tentang Aplikasi
Aplikasi ( kode, berdasarkan lisensi MIT) yang akan Anda fork adalah aplikasi PHP 5.7 dasar dengan autentikasi MySQL. Ide utama Aplikasi ini adalah menyediakan platform tempat pengguna dapat mengupload foto, dan administrator memiliki kemampuan untuk memberi tag pada gambar yang tidak pantas. Aplikasi ini memiliki dua tabel:
- Pengguna. Dilengkapi dengan admin yang telah dikompilasi sebelumnya. Orang baru dapat mendaftar.
- Images. Dilengkapi dengan beberapa contoh gambar. Pengguna yang login dapat mengupload foto baru. Kita akan menambahkan beberapa hal ajaib di sini.
Sasaran Anda
Kita ingin memodernisasi aplikasi lama agar dapat menggunakannya di Google Cloud. Kami akan memanfaatkan alat dan layanannya untuk meningkatkan skalabilitas, meningkatkan keamanan, mengotomatiskan pengelolaan infrastruktur, dan mengintegrasikan fitur lanjutan seperti pemrosesan gambar, pemantauan, dan penyimpanan data menggunakan layanan seperti Cloud SQL, Cloud Run, Cloud Build, Secret Manager, dan lainnya.
Yang lebih penting, kami ingin melakukannya langkah demi langkah sehingga Anda dapat mempelajari proses pemikiran di balik setiap langkah, dan biasanya setiap langkah membuka kemungkinan baru untuk langkah berikutnya (contoh: modul 2 -> 3, dan 6 -> 7).
Belum yakin? Tonton video berdurasi 7 menit ini di YouTube.
Yang Anda butuhkan
- Komputer dengan browser, yang terhubung ke internet.
- Beberapa kredit GCP. Mintalah kepada penggemar Google setempat ;)
- Perintah
gcloud
berfungsi. - Apakah Anda bekerja secara lokal? Download di sini. Anda juga memerlukan editor yang bagus (misalnya vscode atau intellij).
- Ingin melakukan semuanya "di Cloud"? Anda dapat menggunakan Cloud Shell.
- Pengguna GitHub. Anda memerlukannya untuk membuat cabang kode asli 🧑🏻💻 gdgpescara/app-mod-workshop dengan repo git Anda sendiri. Hal ini diperlukan untuk memiliki pipeline CI/CD Anda sendiri (commit otomatis -> build -> deploy)
Contoh solusi dapat ditemukan di sini:
- Repositori penulis: https://github.com/Friends-of-Ricc/app-mod-workshop
- Repo workshop asli, di folder
.solutions/
, per bab.
Workshop ini dapat digunakan dari komputer lokal Anda atau juga dilakukan sepenuhnya di browser.
2. Penyiapan kredit dan Fork
Menukarkan kredit GCP dan menyiapkan lingkungan GCP [opsional]
Untuk menjalankan workshop ini, Anda memerlukan Akun Penagihan dengan sejumlah kredit. Jika sudah memiliki penagihan sendiri, Anda dapat melewati langkah ini.
Buat akun Gmail Google baru (*) untuk ditautkan ke kredit GCP Anda. Minta link kepada instruktur Anda untuk menukarkan kredit GCP atau gunakan kredit di sini: bit.ly/PHP-Amarcord-credits .
Login dengan akun yang baru dibuat dan ikuti petunjuknya.
(
) Mengapa saya memerlukan akun Gmail baru?*
Kami melihat beberapa orang gagal menyelesaikan codelab karena akun mereka (terutama email kerja atau siswa) sebelumnya pernah menggunakan GCP dan memiliki Kebijakan organisasi yang membatasi kemampuan mereka untuk melakukannya. Sebaiknya buat akun Gmail baru atau gunakan akun Gmail yang sudah ada (gmail.com) tanpa pernah menggunakan GCP sebelumnya.
Klik tombol untuk menukarkan kredit.
Isi formulir berikut dengan Nama dan Nama Belakang Anda, lalu setujui Persyaratan dan Ketentuan.
Anda mungkin harus menunggu beberapa detik sebelum Akun Penagihan muncul di sini: https://console.cloud.google.com/billing
Setelah selesai, buka Konsol Google Cloud dan buat project baru dengan mengklik Pemilih Project di menu dropdown kiri atas tempat "Tidak ada organisasi" ditampilkan. Lihat di bawah
Buat project baru jika Anda belum memilikinya seperti yang ditunjukkan pada screenshot di bawah. Ada opsi "PROJECT BARU" di pojok kanan atas.
Pastikan untuk menautkan project baru dengan akun penagihan uji coba GCP sebagai berikut.
Anda siap menggunakan Google Cloud Platform. Jika Anda adalah pemula atau hanya ingin melakukan semuanya di lingkungan Cloud, Anda dapat mengakses Cloud Shell dan editornya melalui tombol berikut di sudut kiri atas seperti yang ditunjukkan di bawah.
Pastikan project baru Anda dipilih di kiri atas:
Tidak dipilih (buruk):
Dipilih (baik):
Membuat Fork Aplikasi dari GitHub
- Buka aplikasi demo: https://github.com/gdgpescara/app-mod-workshop
- Klik 🍴 fork.
- Jika belum memiliki akun GitHub, Anda harus membuat akun baru.
- Edit konten sesuai keinginan.
- Meng-clone kode Aplikasi menggunakan
git clone
https://github.com/
YOUR-GITHUB-USER/YOUR-REPO-NAME
- Buka folder project yang di-clone dengan editor favorit Anda. Jika memilih Cloud Shell, Anda dapat melakukannya dengan mengklik "Buka Editor" seperti yang ditunjukkan di bawah.
Anda memiliki semua yang diperlukan dengan Editor Google Cloud Shell seperti yang ditunjukkan pada gambar berikut
Hal ini dapat dilakukan secara visual dengan mengklik "Buka Folder" dan memilih folder, kemungkinan app-mod-workshop
di folder utama Anda.
3. Modul 1: Membuat Instance SQL
Membuat Instance Google Cloud SQL
Aplikasi PHP kita akan terhubung ke database MySQL, sehingga kita perlu mereplikasinya ke Google Cloud untuk migrasi yang mudah. Cloud SQL adalah pilihan yang tepat karena memungkinkan Anda menjalankan database MySQL yang dikelola sepenuhnya di Cloud. Berikut langkah-langkah yang harus diikuti:
- Buka halaman Cloud SQL: https://console.cloud.google.com/sql/instances
- Klik "Create Instance"
- Aktifkan API (jika diperlukan). Proses ini mungkin memerlukan waktu beberapa detik.
- Pilih MySQL.
- (Kami mencoba mendapatkan versi termurah untuk Anda, sehingga lebih tahan lama):
- Edisi: Enterprise
- Setelan default: development (kami mencoba Sandbox dan tidak berhasil)
- Mysql Ver: 5.7 (wow, memori terindah!)
- ID instance: pilih
appmod-phpapp
(jika Anda mengubahnya, jangan lupa untuk mengubah skrip dan solusi mendatang juga). - Sandi: apa pun yang Anda inginkan, tetapi catat sebagai CLOUDSQL_INSTANCE_PASSWORD
- Region: tetapkan sama seperti yang Anda pilih untuk seluruh aplikasi (misalnya, Milan =
europe-west8
) - Ketersediaan zona: Zona Tunggal (kita menghemat uang untuk demo)
Klik tombol Create Instance untuk men-deploy database Cloud SQL; ⌛ prosesnya memerlukan waktu sekitar 10 menit⌛. Sementara itu, lanjutkan membaca dokumentasi; Anda juga dapat mulai menyelesaikan modul berikutnya ("Mengemas Aplikasi PHP Anda") karena tidak memiliki dependensi pada modul ini di bagian pertama (hingga Anda memperbaiki koneksi DB).
Catatan. Instance ini akan dikenakan biaya sekitar $7/hari. Pastikan untuk memisahkannya setelah workshop.
Membuat DB dan Pengguna image_catalog di Cloud SQL
Project Aplikasi dilengkapi dengan folder db/
yang berisi dua file sql:
- 01_schema.sql : Berisi kode SQL untuk membuat dua tabel yang berisi data Pengguna dan Gambar.
- 02_seed.sql: Berisi kode SQL untuk memasukkan data ke dalam tabel yang dibuat sebelumnya.
File ini akan digunakan nanti setelah database image_catalog
dibuat. Anda dapat melakukannya dengan melakukan langkah-langkah berikut:
- Buka instance Anda dan Klik tab Databases:
- klik "Create Database"
- sebut saja
image_catalog
(seperti dalam konfigurasi aplikasi PHP).
Kemudian, kita membuat pengguna database. Dengan ini, kita dapat mengautentikasi ke database image_catalog.
- Sekarang klik tab Pengguna
- Klik "Tambahkan akun pengguna".
- Pengguna: mari kita buat:
- Nama pengguna:
appmod-phpapp-user
- Sandi: Pilih sesuatu yang dapat Anda ingat, atau klik "buat"
- Pertahankan "Izinkan semua host (%)".
- klik TAMBAHKAN.
Buka DB ke IP terkenal.
Perhatikan bahwa semua DB di Cloud SQL bersifat 'terisolasi'. Anda harus menyiapkan jaringan secara eksplisit agar dapat diakses.
- Klik instance Anda
- Buka Menu "Koneksi"
- Klik tab "Networking".
- Klik di bagian "Authorized networks". Sekarang tambahkan jaringan (yaitu, subnet).
- Untuk saat ini, mari kita pilih setelan yang cepat tetapi TIDAK AMAN agar Aplikasi dapat berfungsi. Anda dapat membatasinya nanti ke IP yang Anda percayai:
- Nama: "Everyone in the world - INSECURE".
- Jaringan: "
0.0.0.0/0"
(Catatan: ini adalah bagian yang TIDAK AMAN!) - Klik SELESAI
- Klik simpan.
Anda akan melihat sesuatu seperti ini:
Catatan. Solusi ini adalah kompromi yang baik untuk menyelesaikan workshop dalam O(jam). Namun, lihat dokumen KEAMANAN untuk membantu mengamankan solusi Anda untuk produksi.
Saatnya menguji koneksi DB.
Mari kita lihat apakah pengguna image_catalog
yang telah kita buat sebelumnya berfungsi.
Akses "Cloud SQL Studio" di dalam instance dan masukkan Database, Pengguna, dan Sandi yang akan diautentikasi seperti yang ditunjukkan di bawah:
Setelah masuk, Anda dapat membuka SQL Editor dan melanjutkan ke bagian berikutnya.
Mengimpor Database dari codebase
Gunakan SQL Editor untuk mengimpor tabel image_catalog
beserta datanya. Salin kode SQL dari file di repo ( 01_schema.sql, lalu 02_seed.sql) dan jalankan satu per satu dalam urutan berurutan.
Setelah itu, Anda akan mendapatkan dua tabel di image_catalog, yaitu users dan images seperti yang ditunjukkan di bawah:
Anda dapat mengujinya dengan menjalankan kode berikut di editor: select * from images;
Pastikan juga untuk mencatat alamat IP Publik instance Cloud SQL, karena Anda akan memerlukannya nanti. Untuk mendapatkan IP, buka halaman utama instance Cloud SQL di bagian halaman Ringkasan. (Ringkasan > Hubungkan ke Instance ini > Alamat IP Publik).
4. Modul 2: Membuat Container untuk Aplikasi PHP
Kita ingin mem-build aplikasi ini untuk cloud.
Artinya, Anda harus memaketkan kode dalam semacam file ZIP yang berisi semua info untuk menjalankannya di Cloud.
Ada beberapa cara untuk mengemasnya:
- Docker. Sangat populer, tetapi cukup rumit untuk disiapkan dengan benar.
- Buildpack. Kurang populer, tetapi cenderung 'menebak otomatis' apa yang akan di-build dan apa yang akan dijalankan. Sering kali, hal ini berhasil.
Dalam konteks workshop ini, kami akan mengasumsikan bahwa Anda menggunakan Docker.
Jika Anda memilih untuk menggunakan Cloud Shell, sekarang saatnya untuk membukanya kembali (klik di kanan atas konsol cloud).
Tindakan ini akan membuka shell yang praktis di bagian bawah halaman, tempat Anda seharusnya telah melakukan fork kode di langkah penyiapan.
Docker
Jika Anda ingin memiliki kontrol, ini adalah solusi yang tepat untuk Anda. Hal ini masuk akal jika Anda perlu mengonfigurasi library tertentu, dan memasukkan perilaku tertentu yang tidak jelas (chmod dalam upload, file yang dapat dieksekusi non-standar di aplikasi Anda, ..)
Karena pada akhirnya kita ingin men-deploy aplikasi dalam container ke Cloud Run, lihat dokumentasi berikut. Bagaimana cara mem-backport-nya dari PHP 8 ke PHP 5.7? Mungkin Anda dapat menggunakan Gemini untuk melakukannya. Atau, Anda dapat menggunakan versi siap pakai ini:
Versi Dockerfile
terbaru tersedia di sini.
Untuk menguji aplikasi secara lokal, kita perlu mengubah file config.php sedemikian rupa sehingga Aplikasi PHP kita akan terhubung dengan database MYSQL yang tersedia di Google CloudSQL. Berdasarkan hal yang telah Anda siapkan sebelumnya, isi bagian yang kosong:
<?php
// Database configuration
$db_host = '____________';
$db_name = '____________';
$db_user = '____________';
$db_pass = '____________';
try {
$pdo = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("Errore di connessione: " . $e->getMessage());
}
session_start();
?>
DB_HOST
adalah alamat IP publik Cloud SQL, Anda dapat menemukannya di konsol SQL:
DB_NAME
tidak boleh berubah:image_catalog
DB_USER
harusappmod-phpapp-user
DB_PASS
adalah sesuatu yang Anda pilih. Siapkan dalam tanda kutip tunggal dan escape sesuai kebutuhan.
Selain itu, jangan ragu untuk menerjemahkan beberapa 🇮🇹 artikel berbahasa Italia ke dalam bahasa Inggris dengan bantuan Gemini.
Oke, setelah Anda memiliki Dockerfile
dan telah mengonfigurasi Aplikasi PHP untuk terhubung ke DB, mari kita coba!
Instal Docker jika Anda belum memilikinya ( link). Anda tidak memerlukannya jika menggunakan Cloud Shell (keren, bukan?).
Sekarang, coba build dan jalankan Aplikasi PHP dalam Container dengan perintah build dan run docker yang sesuai.
# Build command - don't forget the final . This works if Dockerfile is inside the code folder:
$ docker build -t my-php-app-docker .
# Local Run command: most likely ports will be 8080:8080
$ docker run -it -p <CONTAINER_PORT>:<LOCAL_MACHINE_PORT> my-php-app-docker
Jika semuanya berfungsi, Anda akan dapat melihat halaman web berikut saat terhubung ke host lokal. Sekarang aplikasi Anda berjalan di port 8080, klik ikon "Pratinjau web" (browser dengan mata), lalu Pratinjau di port 8080 (atau "Ubah port" untuk port lain)
Menguji hasilnya di browser
Sekarang aplikasi Anda akan terlihat seperti ini:
Dan jika Anda login dengan Admin/admin123, Anda akan melihat sesuatu seperti ini.
Bagus!!! Selain teks Italia, semuanya berfungsi. 🎉🎉🎉
Jika pembuatan docker Anda bagus, tetapi kredensial DB salah, Anda mungkin mendapatkan sesuatu seperti ini:
Coba lagi, Anda sudah hampir berhasil.
Menyimpan ke Artifact Registry [opsional]
Sekarang, Anda seharusnya memiliki aplikasi PHP dalam container yang berfungsi dan siap di-deploy ke cloud. Selanjutnya, kita memerlukan tempat di cloud untuk menyimpan image Docker dan membuatnya dapat diakses untuk di-deploy ke layanan Google Cloud seperti Cloud Run. Solusi penyimpanan ini disebut Artifact Registry, layanan Google Cloud yang dikelola sepenuhnya dan dirancang untuk menyimpan artefak aplikasi, termasuk image container Docker, paket Maven, modul npm, dan lainnya.
Mari kita buat repositori di Google Cloud Artifact Registry menggunakan tombol yang sesuai.
Pilih nama, format, dan region yang valid dan sesuai untuk menyimpan artefak.
Kembali ke tag lingkungan pengembangan lokal Anda dan kirim image container Aplikasi ke repositori Artifact Registry yang baru saja dibuat. Selesaikan perintah berikut untuk melakukannya.
- docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
- docker push TARGET_IMAGE[:TAG]
Hasilnya akan terlihat seperti screenshot berikut.
Hore 🎉🎉🎉 Anda dapat melanjutkan ke level berikutnya. Sebelum itu, luangkan waktu 2 menit untuk mencoba upload/login/logout dan memahami endpoint aplikasi.Anda akan membutuhkannya nanti.
Kemungkinan error
Jika Anda mendapatkan error containerisasi, coba gunakan Gemini untuk menjelaskan dan memperbaiki error, dengan memberikan:
- Dockerfile Anda saat ini
- Error yang diterima
- [jika diperlukan] kode PHP yang sedang dieksekusi.
Izin Upload. Coba juga endpoint /upload.php
dan coba upload gambar. Anda mungkin mendapatkan error di bawah. Jika ya, Anda harus melakukan beberapa perbaikan chmod/chown
di Dockerfile
.
Peringatan: move_uploaded_file(uploads/image (3).png): gagal membuka streaming: Izin ditolak di /var/www/html/upload.php pada baris 11
PDOException "tidak dapat menemukan driver" (atau "Errore di connessione: tidak dapat menemukan driver"). Pastikan Dockerfile Anda memiliki library PDO yang sesuai untuk mysql (pdo_mysql
), untuk terhubung ke DB. Dapatkan inspirasi dari solusi di sini.
Tidak dapat meneruskan permintaan Anda ke backend. Tidak dapat terhubung ke server di port 8080. Ini berarti Anda mungkin mengekspos port yang salah. Pastikan Anda mengekspos port tempat Apache/Nginx benar-benar ditayangkan. Hal ini tidak sepele. Jika memungkinkan, coba buat port tersebut 8080 (memudahkan penggunaan Cloud Run). Jika Anda ingin mempertahankan port 80 (misalnya, karena Apache menginginkannya), gunakan perintah lain untuk menjalankannya:
$ docker run -it -p 8080:80 # force 80
# Use the PORT environment variable in Apache configuration files.
# https://cloud.google.com/run/docs/reference/container-contract#port
RUN sed -i 's/80/${PORT}/g' /etc/apache2/sites-available/000-default.conf /etc/apache2/ports.conf
5. Modul 3: Men-deploy Aplikasi ke Cloud Run
Mengapa Cloud Run?
Pertanyaan yang bagus. Beberapa tahun yang lalu, Anda pasti akan memilih Google App Engine.
Singkatnya, saat ini, Cloud Run memiliki stack teknologi yang lebih baru, lebih mudah di-deploy, lebih murah, dan diskalakan ke 0 saat Anda tidak menggunakannya. Dengan fleksibilitasnya untuk menjalankan penampung stateless dan integrasinya dengan berbagai layanan Google Cloud, Google Kubernetes Engine sangat ideal untuk men-deploy microservice dan aplikasi modern dengan overhead minimal dan efisiensi maksimum.
Lebih khusus lagi, Cloud Run adalah platform yang terkelola sepenuhnya oleh Google Cloud yang memungkinkan Anda menjalankan aplikasi dalam container stateless di lingkungan serverless. Layanan ini secara otomatis menangani semua infrastruktur, menskalakan dari nol untuk memenuhi traffic yang masuk dan menurunkan skala saat tidak ada aktivitas, sehingga hemat biaya dan efisien. Cloud Run mendukung bahasa atau library apa pun selama dikemas dalam penampung, sehingga memungkinkan fleksibilitas yang besar dalam pengembangan. Layanan ini terintegrasi dengan baik dengan layanan Google Cloud lainnya dan cocok untuk membuat microservice, API, situs, dan aplikasi berbasis peristiwa tanpa perlu mengelola infrastruktur server.
Prasyarat
Untuk menyelesaikan tugas ini, Anda harus menginstal gcloud
di komputer lokal. Jika belum, lihat petunjuknya di sini. Namun, jika Anda menggunakan Google Cloud Shell, tidak ada tindakan yang perlu dilakukan.
Sebelum men-deploy...
Jika Anda bekerja di lingkungan lokal, autentikasi ke Google Cloud dengan perintah berikut
$ gcloud auth login –update-adc # not needed in Cloud Shell
Tindakan ini akan mengautentikasi Anda melalui login OAuth di browser. Pastikan Anda login melalui Chrome dengan pengguna yang sama (misalnya vattelapesca@gmail.com) yang login ke Google Cloud dengan penagihan diaktifkan.
Aktifkan Cloud Run API dengan perintah berikut:
$ gcloud services enable run.googleapis.com cloudbuild.googleapis.com
Pada tahap ini, semuanya siap di-deploy ke Cloud Run.
Men-deploy Aplikasi ke Cloud Run melalui gcloud
Perintah yang memungkinkan Anda men-deploy Aplikasi di Cloud Run adalah gcloud run deploy
. Ada beberapa opsi yang harus ditetapkan untuk mencapai sasaran Anda. Kumpulan opsi minimum (yang dapat Anda berikan melalui command line, atau alat akan meminta Anda dengan perintah interaktif) adalah sebagai berikut:
- Nama Layanan Cloud Run yang ingin Anda deploy untuk Aplikasi. Layanan Cloud Run akan menampilkan URL yang menyediakan endpoint ke Aplikasi Anda.
- Region Google Cloud tempat Aplikasi Anda akan berjalan. (
--region
REGION) - Image Container yang menggabungkan Aplikasi Anda.
- Variabel Lingkungan yang perlu digunakan Aplikasi Anda selama eksekusi.
- Flag Allow-Unauthenticated yang mengizinkan semua orang mengakses Aplikasi Anda tanpa autentikasi lebih lanjut.
Lihat dokumentasi (atau scroll ke bawah untuk melihat kemungkinan solusi) untuk mengetahui cara menerapkan opsi ini ke command line Anda.
Deployment akan memerlukan waktu beberapa menit. Jika semuanya sudah benar, Anda akan melihat tampilan seperti ini di Konsol Google Cloud.
Klik URL yang disediakan oleh Cloud Run dan uji Aplikasi Anda. Setelah diautentikasi, Anda akan melihat tampilan seperti ini.
"gcloud run deploy" tanpa argumen
Anda mungkin telah melihat bahwa gcloud run deploy
mengajukan pertanyaan yang tepat dan mengisi bagian yang kosong. Ini hebat sekali!
Namun, di beberapa modul, kita akan menambahkan perintah ini ke pemicu Cloud Build sehingga kita tidak dapat menggunakan pertanyaan interaktif. Kita perlu mengisi setiap opsi dalam perintah. Jadi, Anda ingin membuat gcloud run deploy --option1 blah --foo bar --region your-fav-region
emas. Bagaimana Anda melakukannya?
- ulangi langkah 2-3-4 hingga gcloud berhenti mengajukan pertanyaan:
- [LOOP]
gcloud run deploy
dengan opsi yang ditemukan sejauh ini - [LOOP] sistem meminta opsi X
- [LOOP] Telusuri di dokumen publik cara menyiapkan X dari CLI dengan menambahkan opsi
--my-option [my-value]
. - Kembali ke langkah 2 sekarang, kecuali jika gcloud selesai tanpa pertanyaan lebih lanjut.
- Deployment gcloud run BLAH BLAH BLAH ini keren! Simpan perintah di suatu tempat, Anda akan memerlukannya nanti untuk langkah Cloud Build.
Solusi yang dapat dilakukan ada di sini. Dokumennya ada di sini.
Selamat 🎉🎉🎉 Anda berhasil men-deploy Aplikasi di Google Cloud dan mencapai langkah pertama Modernisasi.
6. Modul 4: Membersihkan Sandi dengan Secret Manager
Pada langkah sebelumnya, kita berhasil men-deploy dan menjalankan Aplikasi di Cloud Run. Namun, kami melakukannya dengan praktik keamanan yang buruk: menyediakan beberapa secret dalam cleartext.
Iterasi pertama: Perbarui config.php untuk menggunakan ENV
Anda mungkin telah memperhatikan bahwa kita memasukkan sandi DB langsung ke dalam kode di file config.php. Hal ini tidak masalah untuk tujuan pengujian dan untuk melihat apakah Aplikasi berfungsi. Namun, Anda tidak dapat melakukan commit/menggunakan kode seperti itu di lingkungan produksi. Sandi (dan parameter koneksi DB lainnya) harus dibaca secara dinamis dan diberikan ke Aplikasi saat runtime. Ubah file config.php agar membaca parameter db dari variabel ENV. Jika gagal, sebaiknya tetapkan nilai default. Hal ini berguna jika Anda gagal memuat ENV, sehingga output halaman akan memberi tahu Anda apakah menggunakan nilai default. Isi bagian yang kosong dan ganti kode di config.php.
<?php
// Database configuration with ENV variables. Set default values as well
$db_host = getenv('DB_HOST') ?: 'localhost';
$db_name = getenv('DB_NAME') ?: 'image_catalog';
$db_user = getenv('DB_USER') ?: 'appmod-phpapp-user';
$db_pass = getenv('DB_PASS') ?: 'wrong_password';
// Note getenv() is PHP 5.3 compatible
try {
$pdo = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("Errore di connessione: " . $e->getMessage());
}
session_start();
?>
Karena Aplikasi Anda di-containerisasi, Anda perlu menyediakan cara untuk menyediakan variabel ENV ke Aplikasi. Hal ini dapat dilakukan dengan beberapa cara:
- Pada waktu build, di Dockerfile. Tambahkan 4 parameter ke Dockerfile sebelumnya menggunakan sintaksis ENV DB_VAR=ENV_VAR_VALUE. Tindakan ini akan menyiapkan nilai default yang dapat diganti saat runtime. Misalnya, 'DB_NAME' dan 'DB_USER' dapat ditetapkan di sini dan tidak di tempat lain.
- Pada waktu run. Anda dapat menyiapkan variabel ini untuk Cloud Run, baik dari CLI maupun dari UI. Ini adalah tempat yang tepat untuk menempatkan keempat variabel Anda (kecuali jika Anda ingin mempertahankan setelan default di Dockerfile).
Di localhost, Anda mungkin ingin menempatkan variabel ENV dalam file .env
(periksa folder solutions).
Pastikan juga bahwa .env ditambahkan ke .gitignore
: Anda tidak ingin mendorong secret ke GitHub.
echo .env >> .gitignore
Setelah itu, Anda dapat menguji instance secara lokal:
docker run -it -p 8080:8080 --env-file .env my-php-app-docker
Sekarang Anda telah mencapai hal berikut:
- Aplikasi Anda akan membaca variabel secara dinamis dari ENV
- Anda meningkatkan keamanan karena telah menghapus sandi DB dari kode Anda)
Sekarang Anda dapat men-deploy revisi baru ke Cloud Run. Mari kita buka UI dan tetapkan variabel lingkungan secara manual:
- Buka https://console.cloud.google.com/run
- Klik aplikasi Anda
- Klik "Edit dan deploy revisi baru"
- Pada tab pertama "Penampung", klik tab bawah "Variabel dan secret"
- Klik "+ Tambahkan variabel" dan tambahkan semua variabel yang diperlukan. Anda akan melihat tampilan seperti ini:
Apakah ini sudah sempurna? Tidak. Kartu Anda masih dapat dilihat oleh sebagian besar operator. Hal ini dapat dimitigasi dengan Google Cloud Secret Manager.
Iterasi kedua: Secret Manager
Sandi Anda telah menghilang dari kode Anda sendiri: sukses! Tapi tunggu - apakah kita sudah aman?
Sandi Anda masih dapat dilihat oleh siapa saja yang memiliki akses ke Konsol Google Cloud. Bahkan, jika Anda mengakses file deployment YAML Cloud Run, Anda akan dapat mengambilnya. Atau, jika Anda mencoba mengedit atau men-deploy revisi Cloud Run baru, sandi akan terlihat di bagian Variabel & Rahasia seperti yang ditunjukkan pada screenshot di bawah.
Secret Manager Google Cloud adalah layanan terpusat yang aman untuk mengelola informasi sensitif seperti kunci API, sandi, sertifikat, dan secret lainnya.
Dengan Secret Manager, Anda dapat menyimpan, mengelola, dan mengakses secret dengan izin yang terperinci dan enkripsi yang andal. Dengan terintegrasi dengan Identity and Access Management (IAM) Google Cloud, Secret Manager memungkinkan Anda mengontrol siapa yang dapat mengakses secret tertentu, sehingga memastikan keamanan data dan kepatuhan terhadap peraturan.
Layanan ini juga mendukung rotasi dan pembuatan versi secret otomatis, yang menyederhanakan pengelolaan siklus proses secret dan meningkatkan keamanan di aplikasi di seluruh layanan Google Cloud.
Untuk mengakses Secret Manager, buka menu tiga garis dari menu Hamburger ke layanan Security dan temukan di bagian Data Protection seperti yang ditunjukkan pada screenshot di bawah.
Aktifkan Secret Manager API setelah Anda berada di sana seperti pada gambar berikut.
- Sekarang klik "Buat secret": Mari kita sebut secara rasional:
- Nama:
php-amarcord-db-pass
- Nilai secret: 'sandi DB Anda' (abaikan bagian "upload file").
- menganotasi link rahasia ini, akan terlihat seperti
projects/123456789012/secrets/php-amarcord-db-pass
. Ini adalah pointer unik ke secret Anda (Untuk Terraform, Cloud Run, dan lainnya). Nomor ini adalah nomor project unik Anda.
Tips: Coba gunakan konvensi penamaan yang konsisten untuk secret Anda, yang dikhususkan dari kiri ke kanan, misalnya: cloud-devrel-phpamarcord-dbpass
- Organisasi (dengan perusahaan)
- Tim (dalam organisasi)
- Aplikasi (dalam tim)
- Nama variabel (dalam aplikasi)
Dengan begitu, Anda dapat memiliki ekspresi reguler yang mudah untuk menemukan semua secret untuk satu aplikasi.
Membuat revisi Cloud Run baru
Setelah memiliki Secret baru, kita perlu menghapus variabel ENV DB_PASS dan menggantinya dengan Secret baru. Jadi:
- Akses ke Cloud Run menggunakan Konsol Google Cloud
- Pilih aplikasi.
- Klik "Edit & Deploy a New Revision"
- temukan tab "Variables & Secrets".
- Gunakan tombol "+ Referensikan Secret" untuk mereset variabel ENV DB_PASS.
- Gunakan "DB_PASS" yang sama untuk Secret yang dirujuk dan gunakan versi terbaru.
Setelah selesai, Anda akan mendapatkan error berikut
Coba cari tahu cara memperbaikinya. Untuk mengatasinya, Anda perlu mengakses bagian IAM & Admin dan mengubah izin pemberian. Selamat melakukan proses debug!
Setelah Anda mengetahuinya, kembali ke Cloud Run dan deploy ulang revisi baru. Hasilnya akan terlihat seperti gambar berikut:
Tips: Konsol Play (UI) sangat bagus dalam menunjukkan masalah izin. Luangkan waktu untuk membuka semua link untuk entitas Cloud Anda.
7. Modul 5: Menyiapkan CI/CD dengan Cloud Build
Mengapa Pipeline CI/CD?
Sekarang, Anda seharusnya telah mengetik gcloud run deploy
beberapa kali, mungkin menjawab pertanyaan yang sama berulang kali.
Bosan men-deploy aplikasi secara manual dengan gcloud run deploy? Bukankah akan lebih baik jika aplikasi Anda dapat otomatis di-deploy setiap kali Anda mendorong perubahan baru ke repositori Git?
Untuk menggunakan pipeline CI/CD, Anda memerlukan dua hal:
- Repositori Git Pribadi: Untungnya, Anda seharusnya sudah melakukan fork repositori workshop ke akun GitHub Anda di Langkah 2. Jika belum, kembali dan selesaikan langkah tersebut. Repositori yang Anda fork akan terlihat seperti ini:
https://github.com/<YOUR_GITHUB_USER>/app-mod-workshop
- Cloud Build. Layanan yang luar biasa dan murah ini memungkinkan Anda mengonfigurasi otomatisasi build untuk hampir semua hal: Terraform, aplikasi docker, ..
Bagian ini akan berfokus pada penyiapan Cloud Build.
Masuk ke Cloud Build.
Kita akan menggunakan Cloud Build untuk melakukannya:
- build sumber Anda (dengan Dockerfile). Anggap ini sebagai "file .zip besar" yang berisi semua yang Anda perlukan untuk mem-build dan menjalankannya ("artefak build").
- kirim artefak ini ke Artifact Registry (AR).
- Kemudian, lakukan deployment dari AR ke Cloud Run untuk aplikasi "php-amarcord"
- Tindakan ini akan membuat versi ("revisi") baru dari aplikasi yang ada (bayangkan lapisan dengan kode baru) dan kami akan mengonfigurasinya untuk mengalihkan traffic ke versi baru jika push berhasil.
Ini adalah contoh beberapa build untuk aplikasi php-amarcord
saya:
Bagaimana cara melakukannya?
- Dengan membuat satu file YAML yang sempurna:
cloudbuild.yaml
- Dengan membuat pemicu Cloud Build.
- Dengan menghubungkan ke repo GitHub kami melalui UI Cloud Build.
Membuat pemicu (dan Menghubungkan Repositori)
- Buka https://console.cloud.google.com/cloud-build/triggers
- Klik "Create Trigger".
- Mengompilasi:
- Nama: Sesuatu yang bermakna seperti
on-git-commit-build-php-app
- Peristiwa: Push to branch
- Sumber: "Hubungkan repositori baru"
- Tindakan ini akan membuka jendela di sebelah kanan: "Hubungkan repositori"
- Penyedia sumber: "GitHub" (pertama)
- "Lanjutkan"
- Mengautentikasi akan membuka jendela di GitHub untuk melakukan autentikasi silang. Ikuti alur dan bersabarlah. Jika Anda memiliki banyak repo, mungkin perlu waktu beberapa saat.
- "Select repo" Pilih akun/repo Anda dan centang bagian "I understand...".
- Jika Anda mendapatkan error: Aplikasi GitHub tidak diinstal di repositori apa pun, lanjutkan dengan mengklik "Instal Google Cloud Build" dan ikuti petunjuknya.
Klik Hubungkan
- Tepat! Repositori Anda kini terhubung.
- Kembali ke bagian Pemicu....
- Konfigurasi: Dideteksi otomatis (*)
- Lanjutan: Pilih akun layanan "[PROJECT_NUMBER]- compute@developer.gserviceaccount.com"
- xxxxx adalah project ID Anda
- Akun layanan komputasi default cukup baik untuk pendekatan lab - jangan gunakan dalam produksi. ( Pelajari lebih lanjut).
- biarkan semua yang lain apa adanya.
- Klik tombol "Buat".
(*) Ini adalah cara termudah karena memeriksa Dockerfile atau cloudbuild.yaml. Namun, cloudbuild.yaml
memberi Anda kemampuan nyata untuk memutuskan apa yang harus dilakukan pada langkah mana.
Saya punya kekuatan!
Sekarang, pemicu tidak akan berfungsi kecuali jika Anda memberikan akun layanan Cloud Build (apa itu akun layanan? Email "robot" yang bertindak atas nama Anda untuk suatu tugas - dalam hal ini mem-build sesuatu di Cloud).
SA Anda akan gagal mem-build dan men-deploy kecuali jika Anda memberinya wewenang untuk melakukannya. Untungnya, cara melakukannya sangat mudah.
- buka "Cloud Build" > " Setelan".
- Akun layanan "[PROJECT_NUMBER]- compute@developer.gserviceaccount.com"
- Centang kotak ini:
- Cloud Run
- Secret Manager
- Akun Layanan
- Cloud Build
- Centang juga "Set as preferred service account"
Di mana YAML Cloud Build?
Sebaiknya luangkan waktu untuk membuat YAML Build cloud Anda sendiri.
Namun, jika tidak punya waktu, atau tidak ingin meluangkan waktu, Anda bisa mendapatkan inspirasi di folder solusi ini: .solutions
Sekarang Anda dapat mendorong perubahan ke GitHub dan mengamati Cloud Build untuk bagiannya.
Menyiapkan Cloud Build bisa jadi sulit. Harap maklum jika ada beberapa hal yang perlu didiskusikan:
- Memeriksa log di https://console.cloud.google.com/cloud-build/builds;region=global
- Menemukan error Anda.
- Memperbaiki kode, dan menerbitkan ulang git commit / git push.
- Terkadang error tidak ada dalam kode, tetapi dalam beberapa konfigurasi. Dalam hal ini, Anda dapat mengeluarkan build baru dari UI (cloud build > "Triggers" > Run)
Perhatikan bahwa jika Anda menggunakan solusi ini, masih ada beberapa pekerjaan yang harus dilakukan. Misalnya, Anda perlu menetapkan variabel ENV untuk endpoint dev/prod yang baru dibuat:
Anda dapat melakukannya dengan dua cara:
- Melalui UI - dengan menetapkan variabel ENV lagi
- Melalui CLI dengan membuat skrip "sempurna" untuk Anda. Contohnya dapat ditemukan di sini: gcloud-run-deploy.sh . Anda perlu menyesuaikan beberapa hal, misalnya endpoint dan nomor project; Anda dapat menemukan nomor project di Ringkasan Cloud.
Bagaimana cara melakukan commit kode ke GitHub?
Workshop ini tidak membahas cara terbaik untuk git push
ke GitHub. Namun, jika Anda mengalami masalah dan berada di Cloud Shell, ada dua cara:
- CLI. Tambahkan kunci ssh secara lokal dan tambahkan remote dengan git@github.com:YOUR_USER/app-mod-workshop.git (bukan http)
- VSCode. Jika menggunakan editor Cloud Shell, Anda dapat menggunakan tab Kontrol sumber (ctrl-shift-G), mengklik "sinkronkan perubahan", dan mengikuti petunjuk. Anda seharusnya dapat mengautentikasi akun GitHub ke vscode dan pull/push dari sana menjadi mudah.
Jangan lupa untuk git add clodubuild.yaml
di antara file lain, atau file tersebut tidak akan berfungsi.
"Paritas dev/prod" Deep vs Shallow [opsional]
Jika menyalin versi model dari sini, Anda akan memiliki dua versi DEV dan PROD yang identik. Hal ini keren, dan sesuai dengan aturan 10 Aplikasi Dua Belas Faktor.
Namun, kita menggunakan dua endpoint Web yang berbeda agar aplikasi mengarah ke Database yang sama. Hal ini cukup baik untuk workshop; namun, dalam kehidupan nyata, Anda perlu meluangkan waktu untuk membuat lingkungan produksi yang tepat. Artinya, Anda memiliki dua database (satu untuk pengembangan dan satu untuk produksi) dan juga memilih tempat untuk menyimpannya guna pemulihan dari bencana / ketersediaan tinggi. Hal ini di luar cakupan workshop ini, tetapi ini adalah bahan pertimbangan.
Jika Anda memiliki waktu untuk melakukan produksi versi "dalam", perhatikan semua resource yang perlu diduplikasi, seperti:
- Database Cloud SQL (dan mungkin instance SQL).
- Bucket GCS
- Cloud Function.
- Anda dapat menggunakan Gemini 1.5 Flash sebagai model dalam pengembangan (lebih murah, lebih cepat), dan Gemini 1.5 Pro (lebih canggih).
Secara umum, setiap kali Anda melakukan sesuatu pada aplikasi, pikirkan secara kritis: apakah produksi harus memiliki nilai yang sama ini atau tidak? Jika tidak, duplikasikan upaya Anda. Hal ini tentu saja jauh lebih mudah dengan Terraform, tempat Anda dapat memasukkan lingkungan (-dev, -prod) sebagai akhiran ke resource.
8. Modul 6: Pindah ke Google Cloud Storage
Penyimpanan
Saat ini aplikasi menyimpan status dalam penampung docker. Jika mesin rusak, aplikasi meledak, atau jika Anda mendorong revisi baru, revisi baru akan dijadwalkan, dengan penyimpanan baru yang kosong: 🙈
Bagaimana cara memperbaikinya? Ada sejumlah pendekatan.
- Menyimpan gambar di DB. Itulah yang akhirnya saya lakukan dengan aplikasi PHP sebelumnya. Ini adalah solusi paling sederhana karena tidak menambah kerumitan. Namun, hal ini pasti akan menambah latensi dan beban ke DB Anda.
- Memigrasikan aplikasi Cloud Run ke solusi yang cocok untuk penyimpanan: GCE + Persistent disk? Mungkin GKE + Storage? Catatan: Anda akan kehilangan fleksibilitas jika mendapatkan kontrol.
- Pindahkan ke GCS. Google Cloud Storage menawarkan Penyimpanan terbaik di kelasnya untuk seluruh Google Cloud dan merupakan solusi idiomatis Cloud yang paling lengkap. Namun, kita harus memahami library PHP. Apakah kami memiliki library PHP 5.7 untuk GCS? Apakah
PHP 5.7
mendukungComposer
(sepertinya PHP 5.3.2 adalah versi paling awal yang didukung oleh Composer)? - Mungkin menggunakan sidecar docker?
- Atau, mungkin gunakan Pemasangan Volume Cloud Run GCS. Kedengarannya luar biasa.
🤔 Memigrasikan penyimpanan (terbuka)
[Open Ended] Dalam latihan ini, kami ingin Anda menemukan solusi untuk memindahkan gambar dengan cara yang dipertahankan dengan cara tertentu.
Pengujian penerimaan
Saya tidak ingin memberi tahu Anda solusinya, tetapi saya ingin hal ini terjadi:
- Anda mengupload
newpic.jpg
. Anda akan melihatnya di aplikasi. - Anda mengupgrade aplikasi ke versi baru.
newpic.jpg
masih ada, terlihat.
💡 Kemungkinan solusi (GCS Cloud Run Volume Mounts)
Ini adalah solusi yang sangat elegan yang memungkinkan kita mencapai upload file stateful tanpa menyentuh kode sama sekali (selain menampilkan deskripsi gambar, tetapi itu tidak penting dan hanya untuk kepuasan mata).
Tindakan ini akan memungkinkan Anda memasang folder dari Cloud Run ke GCS, sehingga:
- Semua upload ke GCS sebenarnya akan terlihat di aplikasi Anda.
- Semua upload ke aplikasi Anda sebenarnya akan diupload ke GCS
- Keajaiban akan terjadi pada objek yang diupload di GCS (bab 7).
Catatan. Harap baca detail FUSE. Hal ini TIDAK boleh dilakukan jika performa menjadi masalah.
Membuat bucket GCS
GCS adalah layanan penyimpanan yang selalu ada di Google Cloud. Layanan ini telah teruji, dan digunakan oleh setiap layanan GCP yang memerlukan penyimpanan.
Perhatikan bahwa Cloud Shell mengekspor PROJECT_ID sebagai GOOGLE_CLOUD_PROJECT:
$ export PROJECT_ID=$GOOGLE_CLOUD_PROJECT
#!/bin/bash
set -euo pipefail
# Your Cloud Run Service Name, eg php-amarcord-dev
SERVICE_NAME='php-amarcord-dev'
BUCKET="${PROJECT_ID}-public-images"
GS_BUCKET="gs://${BUCKET}"
# Create bucket
gsutil mb -l "$GCP_REGION" -p "$PROJECT_ID" "$GS_BUCKET/"
# Copy original pictures there - better if you add an image of YOURS before.
gsutil cp ./uploads/*.png "$GS_BUCKET/"
Mengonfigurasi Cloud Run untuk memasang bucket di folder /uploads/
Sekarang mari kita ke bagian yang elegan. Kita membuat volume php_uploads
dan menginstruksikan Cloud Run untuk melakukan pemasangan FUSE di MOUNT_PATH
(seperti /var/www/html/uploads/
):
#!/bin/bash
set -euo pipefail
# .. keep variables from previous script..
# Uploads folder within your docker container.
# Tweak it for your app code.
MOUNT_PATH='/var/www/html/uploads/'
# Inject a volume mount to your GCS bucket in the right folder.
gcloud --project "$PROJECT_ID" beta run services update "$SERVICE_NAME" \
--region $GCP_REGION \
--execution-environment gen2 \
--add-volume=name=php_uploads,type=cloud-storage,bucket="$BUCKET" \
--add-volume-mount=volume=php_uploads,mount-path="$MOUNT_PATH"
Sekarang, ulangi langkah ini untuk semua endpoint yang ingin Anda arahkan ke Cloud Storage.
Anda juga dapat mencapai hal yang sama dari UI
- Di tab "Volume", buat Volume Mount yang mengarah ke bucket Anda, dengan jenis "Bucket Cloud Storage", misalnya dengan nama "php_uploads".
- Di bagian Container > Volume Mounts, pasang volume yang baru saja Anda buat di titik volume yang diminta oleh aplikasi. Hal ini bergantung pada dockerfile, tetapi mungkin terlihat seperti
var/www/html/uploads/
.
Apa pun yang Anda lakukan, jika berhasil, mengedit revisi Cloud Run baru akan menampilkan sesuatu seperti ini:
Sekarang, uji aplikasi baru yang mengupload satu gambar baru ke endpoint /upload.php
.
Gambar akan mengalir dengan lancar di GCS tanpa menulis satu baris PHP pun:
Apa yang baru saja terjadi?
Sesuatu yang sangat ajaib telah terjadi.
Aplikasi lama dengan kode lama masih berfungsi. Stack baru yang dimodernisasi memungkinkan kita memiliki semua gambar/foto di aplikasi dengan nyaman di Cloud Bucket stateful. Sekarang, tidak ada batasan:
- Ingin mengirim email setiap kali gambar dengan label "berbahaya" atau "telanjang" masuk? Anda dapat melakukannya tanpa menyentuh kode PHP.
- Ingin menggunakan model Multimodal Gemini setiap kali gambar masuk untuk mendeskripsikannya, dan mengupload DB dengan deskripsinya? Anda dapat melakukannya tanpa menyentuh kode PHP. Anda tidak percaya? Lanjutkan membaca di bab 7.
Kita baru saja membuka peluang besar di sini.
9. Modul 7: Memperkuat Aplikasi Anda dengan Google Gemini
Sekarang Anda memiliki aplikasi PHP baru yang modern dan keren (seperti Fiat 126
2024) dengan penyimpanan Cloud.
Apa yang dapat dilakukan dengannya?
Prasyarat
Di bab sebelumnya, solusi model memungkinkan kita memasang image /uploads/
di GCS, yang secara de facto memisahkan logika Aplikasi dari penyimpanan image.
Latihan ini mengharuskan Anda untuk:
- Telah berhasil menyelesaikan latihan di bab 6 (penyimpanan).
- Memiliki bucket GCS dengan upload gambar, tempat orang mengupload gambar di aplikasi Anda dan gambar mengalir ke bucket Anda.
Menyiapkan Cloud Function (dalam python)
Pernahkah Anda bertanya-tanya cara menerapkan aplikasi berbasis peristiwa? Seperti:
- saat <event> terjadi => kirim email
- saat <event> terjadi => jika <condition> bernilai benar (true), perbarui Database.
Peristiwa dapat berupa apa saja, mulai dari kumpulan data baru yang tersedia di BigQuery, objek baru yang diubah di folder di GCS, atau pesan baru yang menunggu dalam antrean di Pub/Sub.
Google Cloud mendukung beberapa paradigma untuk mencapai hal ini. Terutama:
- EventArc. Lihat cara menerima peristiwa GCS. Sangat cocok untuk membuat DAG dan mengatur tindakan berdasarkan if-then-else di Cloud.
- Cloud Scheduler. Sangat cocok untuk tugas cron tengah malam di Cloud, misalnya.
- Cloud Workflows. Serupa dengan Arc Peristiwa, memungkinkan Anda
- Cloud Run Functions (dikenal sebagai
lambdas
). - Cloud Composer Pada dasarnya adalah Apache Airflow versi Google, yang juga bagus untuk DAG.
Dalam latihan ini, kita akan mempelajari Cloud Function untuk mencapai hasil yang cukup spektakuler. Kami juga akan memberikan latihan opsional untuk Anda.
Perhatikan bahwa contoh kode disediakan di bagian .solutions/
Menyiapkan Cloud Function (🐍 python)
Kami mencoba membuat GCF yang sangat ambisius.
- Saat image baru dibuat di GCS.. (mungkin karena seseorang telah menguploadnya di aplikasi - tetapi tidak hanya itu)
- .. memanggil Gemini untuk mendeskripsikannya dan mendapatkan deskripsi tekstual gambar .. (sebaiknya periksa MIME dan pastikan itu adalah gambar, bukan PDF, MP3, atau Teks)
- .. dan perbarui DB dengan deskripsi ini. (tindakan ini mungkin memerlukan patch DB untuk menambahkan kolom
description
ke tabelimages
).
Melakukan patch pada DB untuk menambahkan description
ke gambar
- Buka Cloud SQL Studio:
- Masukkan pengguna dan sandi Anda untuk DB Gambar
- Masukkan SQL ini yang menambahkan kolom untuk deskripsi gambar:
ALTER TABLE images ADD COLUMN description TEXT;
Dan bingo! Coba sekarang untuk memeriksa apakah berhasil:
SELECT * FROM images;
Anda akan melihat kolom deskripsi baru:
Tulis f(x) Gemini
Catatan. Fungsi ini sebenarnya dibuat dengan bantuan Gemini Code Assist.
Catatan. Membuat fungsi ini dapat menyebabkan error izin IAM. Beberapa di antaranya didokumentasikan di bawah dalam paragraf "Kemungkinan error".
- Mengaktifkan API
- Buka https://console.cloud.google.com/functions/list
- Klik "Create Function"
- Mengaktifkan API dari wizard API:
Anda dapat membuat GCF dari UI atau dari command line. Di sini kita akan menggunakan command line.
Kemungkinan kode dapat ditemukan di bagian .solutions/
- Buat folder untuk menghosting kode Anda, misalnya "gcf/". Masukkan folder.
- Buat file
requirements.txt
:
google-cloud-storage
google-cloud-aiplatform
pymysql
- Buat fungsi python. Contoh kode di sini: gcf/main.py.
#!/usr/bin/env python
"""Complete this"""
from google.cloud import storage
from google.cloud import aiplatform
import vertexai
from vertexai.generative_models import GenerativeModel, Part
import os
import pymysql
import pymysql.cursors
# Replace with your project ID
PROJECT_ID = "your-project-id"
GEMINI_MODEL = "gemini-1.5-pro-002"
DEFAULT_PROMPT = "Generate a caption for this image: "
def gemini_describe_image_from_gcs(gcs_url, image_prompt=DEFAULT_PROMPT):
pass
def update_db_with_description(image_filename, caption, db_user, db_pass, db_host, db_name):
pass
def generate_caption(event, context):
"""
Cloud Function triggered by a GCS event.
Args:
event (dict): The dictionary with data specific to this type of event.
context (google.cloud.functions.Context): The context parameter contains
event metadata such as event ID
and timestamp.
"""
pass
- Kirim fungsi. Anda dapat menggunakan skrip yang mirip dengan ini: gcf/push-to-gcf.sh.
Catatan 1. Pastikan untuk menyediakan ENV dengan nilai yang tepat, atau cukup tambahkan di bagian atas (GS_BUCKET=blah
, ..):
Catatan 2. Tindakan ini akan mendorong semua kode lokal (.
), jadi pastikan untuk mengapit kode Anda dalam folder tertentu dan menggunakan .gcloudignore
seperti seorang profesional untuk menghindari pengiriman library yang besar. ( contoh).
#!/bin/bash
set -euo pipefail
# add your logic here, for instance:
source .env || exit 2
echo "Pushing ☁️ f(x)☁ to 🪣 $GS_BUCKET, along with DB config.. (DB_PASS=$DB_PASS)"
gcloud --project "$PROJECT_ID" functions deploy php_amarcord_generate_caption \
--runtime python310 \
--region "$GCP_REGION" \
--trigger-event google.cloud.storage.object.v1.finalized \
--trigger-resource "$BUCKET" \
--set-env-vars "DB_HOST=$DB_HOST,DB_NAME=$DB_NAME,DB_PASS=$DB_PASS,DB_USER=$DB_USER" \
--source . \
--entry-point generate_caption \
--gen2
Catatan: dalam contoh ini, generate_caption
akan menjadi metode yang dipanggil, dan Cloud Function akan meneruskan peristiwa GCS ke metode tersebut dengan semua info yang relevan (nama bucket, nama objek, ..). Luangkan waktu untuk men-debug dict python peristiwa tersebut.
Menguji fungsi
Unit Tests
Fungsi ini memiliki banyak komponen yang saling terhubung. Anda mungkin ingin menguji semua yang tunggal.
Contohnya ada di gcf/test.py.
UI Cloud Functions
Luangkan juga waktu untuk menjelajahi fungsi Anda di UI. Setiap tab layak dijelajahi, terutama Source
(favorit saya), Variables
, Trigger
, dan Logs
; Anda akan menghabiskan banyak waktu di Logs
untuk memecahkan masalah error (lihat juga kemungkinan error di bagian bawah halaman ini). Pastikan juga untuk memeriksa Permissions
.
Pengujian E2E
Saatnya menguji fungsi secara manual.
- Buka aplikasi Anda, lalu login
- Upload gambar (tidak terlalu besar, kami telah melihat masalah dengan gambar besar)
- periksa di UI bahwa gambar telah diupload.
- Periksa di Cloud SQL Studio apakah deskripsi telah diperbarui. Login dan jalankan kueri ini:
SELECT * FROM images
.
Dan ini terbukti efektif. Kita mungkin juga ingin memperbarui frontend untuk menampilkan deskripsi tersebut.
Memperbarui PHP untuk ditampilkan [opsional]
Kami telah membuktikan bahwa aplikasi berfungsi. Namun, sebaiknya pengguna juga dapat melihat deskripsi tersebut.
Kita tidak perlu menjadi pakar PHP untuk menambahkan deskripsi ke index.php
. Kode ini akan berfungsi (ya, Gemini juga menulisnya untuk saya):
<?php if (!empty($image['description'])): ?>
<p class="font-bold">Gemini Caption:</p>
<p class="italic"><?php echo $image['description']; ?></p>
<?php endif; ?>
Posisikan kode ini di dalam foreach
sesuai keinginan Anda.
Pada langkah berikutnya, kita juga akan melihat versi UI yang lebih menarik, berkat Gemini Code Assist. Versi yang bagus mungkin terlihat seperti ini:
Kesimpulan
Anda memiliki Cloud Function yang dipicu pada objek baru yang diupload ke GCS yang dapat menganotasi konten gambar seperti yang dapat dilakukan manusia, dan otomatis memperbarui DB. Wow!
Apa langkah selanjutnya? Anda dapat mengikuti alasan yang sama untuk mendapatkan dua fungsi yang bagus.
[opsional] Tambahkan Cloud Functions lebih lanjut [terbuka]
Ada beberapa fitur tambahan yang dapat dipertimbangkan.
📩 Pemicu Email
Pemicu email yang mengirimi Anda email setiap kali seseorang mengirim gambar.
- Terlalu sering? Tambahkan batasan lebih lanjut: Gambar BESAR, atau gambar yang konten Gemini-nya berisi kata "telanjang/ketelanjangan/kekerasan".
- Pertimbangkan untuk memeriksa
EventArc
untuk hal ini.
🚫 Moderasi otomatis foto tidak pantas
Saat ini, admin manusia menandai gambar sebagai "tidak pantas". Bagaimana jika Gemini yang melakukan tugas berat dan memoderasi ruang? Tambahkan pengujian untuk menandai konten pemicu yang tidak pantas dan memperbarui DB seperti yang telah kita pelajari di fungsi sebelumnya. Ini berarti pada dasarnya mengambil fungsi sebelumnya, mengubah perintah, dan memperbarui DB berdasarkan jawaban.
Peringatan. AI generatif memiliki output yang tidak dapat diprediksi. Pastikan "output materi iklan" dari Gemini dimasukkan "ke dalam jalur". Anda mungkin meminta jawaban deterministik seperti skor keyakinan dari 0 hingga 1, JSON, .. Anda dapat melakukannya dengan banyak cara, misalnya: * Menggunakan library python pydantic
, langchain
, .. * Gunakan Output Terstruktur Gemini.
Tips. Anda dapat memiliki BEBERAPA fungsi atau memiliki satu perintah yang menerapkan jawaban JSON (berfungsi dengan baik dengan "Output Terstruktur Gemini" seperti yang ditandai di atas) seperti:
Apa perintah untuk membuat ini?
{
"description": "This is the picture of an arrosticino",
"suitable": TRUE
}
Anda dapat menambahkan kolom tambahan perintah untuk mendapatkan insight seperti: apakah ada hal yang baik tentang hal itu? Apakah itu buruk? Apakah Anda mengenali tempat ini? Apakah ada teks (OCR kini semakin mudah):
goods
: "It looks like yummie food"bads
: "Tampak seperti makanan tidak sehat"OCR
: "Da consumare preferibilmente prima del 10 Novembre 2024"location
: "Pescara, Lungomare"
Meskipun biasanya lebih baik memiliki fungsi N untuk hasil N, akan sangat bermanfaat jika Anda membuat fungsi yang melakukan 10 hal. Lihat artikel dari Riccardo ini untuk mengetahui caranya.
Kemungkinan error (sebagian besar IAM / izin)
Saat pertama kali mengembangkan solusi ini, saya menemukan beberapa masalah izin IAM. Saya akan menambahkannya di sini untuk menunjukkan empati dan memberikan beberapa ide tentang cara memperbaikinya.
Error: tidak memiliki izin yang memadai untuk Akun Layanan
- Perhatikan bahwa untuk men-deploy fungsi GCF yang memproses bucket GCS, Anda perlu menyiapkan izin yang sesuai ke Akun Layanan yang Anda gunakan untuk tugas tersebut, seperti pada gambar:
Anda mungkin juga harus mengaktifkan EventArc API - beberapa menit sebelum API tersebut tersedia sepenuhnya.
Error: Cloud Run invoker tidak ada
- Komentar lain dari UI untuk pemberian izin GCF adalah ini ( Peran Cloud Run Invoker):
Error ini dapat diperbaiki dengan menjalankan perintah dalam image, yang mirip dengan fix-permissions.sh
Masalah ini dijelaskan di sini: https://cloud.google.com/functions/docs/securing/authenticating
Error: Batas memori terlampaui
Saat pertama kali saya menjalankannya, log saya dapat mengatakan: "‘Batas memori 244 MiB terlampaui dengan 270 MiB yang digunakan. Pertimbangkan untuk meningkatkan batas memori, lihat https://cloud.google.com/functions/docs/configuring/memory'". Sekali lagi, tambahkan RAM ke GCF Anda. Hal ini sangat mudah dilakukan di UI. Berikut kemungkinan masalahnya:
Atau, Anda juga dapat memperbaiki skrip deployment Cloud Run untuk meningkatkan MEM/CPU. Proses ini memerlukan waktu sedikit lebih lama.
Error: PubSub Published
Membuat pemicu dengan GCF v1 akan menampilkan error ini:
Sekali lagi, masalah ini mudah diperbaiki dengan membuka IAM dan memberi Akun Layanan Anda peran "Pub/Sub Publisher".
Error: Vertex AI belum digunakan
Jika Anda menerima error ini:
Izin Ditolak: 403 Vertex AI API belum pernah digunakan di project YOUR_PROJECT atau dinonaktifkan. Aktifkan dengan membuka https://console.developers.google.com/apis/api/aiplatform.googleapis.com/overview?project=YOR_PROJECT
Anda hanya perlu mengaktifkan Vertex AI API. Cara termudah untuk mengaktifkan SEMUA API yang diperlukan adalah:
- https://console.cloud.google.com/vertex-ai
- Klik "enable all recommended APIS".
Error: Pemicu EventArc tidak ditemukan.
Jika Anda mendapatkan pesan ini, deploy ulang fungsi.
Error: 400 Agen layanan sedang disediakan
400 Agen layanan sedang disediakan ( https://cloud.google.com/vertex-ai/docs/general/access-control#service-agents ). Agen layanan diperlukan untuk membaca file Cloud Storage yang disediakan. Jadi, harap coba lagi dalam beberapa menit.
Jika hal ini terjadi, tunggu beberapa saat atau hubungi Googler.
10. Modul 8: Membuat SLO Ketersediaan
Dalam Bab ini, kita akan mencoba mencapai hal ini:
- Membuat SLI
- Membuat SLO berdasarkan SLI
- Membuat Pemberitahuan berdasarkan SLO
Ini adalah topik yang sangat penting bagi penulis, karena Riccardo bekerja di area SRE / DevOps di Google Cloud.
(terbuka) Buat SLI dan SLO untuk aplikasi ini
Seberapa baik aplikasi jika Anda tidak dapat mengetahui kapan aplikasi tersebut tidak berfungsi?
Apa yang dimaksud dengan SLO?
Wah! Google menciptakan SLO. Untuk membaca lebih lanjut, saya dapat menyarankan:
- Buku SRE - bab 2 - Menerapkan SLO. ( 👉 buku SRE lainnya)
- Art of SLOs ( video keren). Ini adalah pelatihan yang luar biasa untuk mempelajari lebih lanjut cara membuat SLO yang sempurna untuk layanan Anda.
- Kursus SRE di Coursera. Saya berkontribusi pada hal itu.
Langkah 1: Buat SLI/SLO Ketersediaan
Mari kita mulai dengan SLO Ketersediaan, karena ini adalah hal termudah dan mungkin yang paling penting yang ingin Anda ukur.
Untungnya, Cloud Run dilengkapi dengan dukungan SLO bawaan, berkat Istio.
Setelah aplikasi Anda berjalan di Cloud Run, hal ini sangat mudah dilakukan, hanya perlu waktu 30 detik.
- Buka halaman Cloud Run Anda.
- Klik/pilih aplikasi Anda.
- Pilih tab
SLOs
. - Klik "+ Buat SLO".
- Ketersediaan, Berbasis permintaan
- Lanjutkan
- Bulan Kalender / 99%.
- klik "Buat SLO".
Langkah 2: Siapkan Pemberitahuan pada SLO ini
Sebaiknya buat 2 pemberitahuan:
- Satu dengan burnrate rendah ("Slowburn") untuk memberi tahu Anda melalui email (menyimulasikan tiket prioritas rendah).
- Satu dengan burnrate tinggi ("Fastburn") untuk memberi tahu Anda melalui SMS (menyimulasikan tiket prioritas tinggi / pager)
Buka SLO tab
Anda dari sebelumnya.
Lakukan hal ini dua kali:
- Klik "Buat Pemberitahuan SLO" (tombol 🔔 dengan tanda plus di dalamnya, di sebelah kanan)
- Durasi lihat balik, Nilai minimum Laju Pengeluaran:
- [FAST]. Pertama:
60
menit /10
x - [SLOW]. Kedua:
720
menit /2
x - Saluran notifikasi: klik Kelola saluran notifikasi
- Pertama, "Email" -> Tambahkan baru -> ..
- Kedua, "SMS" -> Tambahkan baru -> Verifikasi di ponsel.
- Tips: Saya suka menggunakan emoji dalam nama. Sangat menyenangkan untuk demo.
- Setelah selesai, klik X besar di kanan atas.
- Pilih ponsel terlebih dahulu (cepat), email berikutnya (lambat).
- Tambahkan beberapa contoh dokumentasi seperti:
[PHP Amarcord] Riccardo told me to type sudo reboot or to check documentation in http://example.com/playbooks/1.php but I guess he was joking
.
Tepat!
Hasil akhir
Kita dapat menganggap latihan ini selesai setelah Anda memiliki 1 SLO yang berfungsi + 2x pemberitahuan untuk ketersediaan Anda, dan pemberitahuan tersebut dikirim ke email dan ponsel Anda.
Jika mau, Anda dapat menambahkan Latensi (dan sebaiknya Anda melakukannya) atau bahkan yang lebih kompleks. Untuk latensi, pilih latensi yang menurut Anda wajar; jika ragu, pilih 200 md.
11. Langkah berikutnya
Anda telah menyelesaikan SEMUA, apa yang belum ada?
Beberapa hal yang perlu dipertimbangkan:
Bermain dengan Gemini
Anda dapat menggunakan Gemini dalam dua versi:
- Vertex AI. "Cara Enterprise", yang terjalin dengan GCP Anda, yang telah kita pelajari di bab 7 (GCF+Gemini). Semua autentikasi berfungsi dengan baik, dan layanan saling terhubung dengan baik.
- AI Google. "Cara konsumen". Anda mendapatkan Kunci API Gemini dari sini dan mulai membuat skrip kecil yang dapat dikaitkan dengan beban kerja apa pun yang sudah Anda miliki (pekerjaan eksklusif, cloud lain, localhost, ..). Anda cukup mengganti kunci API dan kode akan mulai berfungsi secara ajaib.
Sebaiknya Anda mencoba mempelajari (2) dengan project favorit Anda sendiri.
UI Lifting
Saya tidak mahir dalam UI. Namun, Gemini tidak. Anda cukup mengambil satu halaman PHP, dan mengatakan sesuatu seperti ini:
I have a VERY old PHP application. I want to touch it as little as possible. Can you help me:
1. add some nice CSS to it, a single static include for tailwind or similar, whatever you prefer
2. Transform the image print with description into cards, which fit 4 per line in the canvas?
Here's the code:
-----------------------------------
[Paste your PHP page, for instance index.php - mind the token limit!]
Anda dapat dengan mudah mendapatkannya dalam waktu kurang dari 5 menit, hanya dengan satu Cloud Build. :)
Respons dari Gemini sangat sempurna (artinya, saya tidak perlu mengubah apa pun):
Berikut tata letak baru di aplikasi pribadi penulis:
Catatan: kode ditempelkan sebagai gambar karena kami tidak ingin mendorong Anda untuk mengambil kode, tetapi untuk membuat Gemini menulis kode untuk Anda, dengan batasan UI/frontend materi iklan Anda sendiri; percayalah, Anda hanya perlu melakukan perubahan sangat kecil setelahnya.
Keamanan
Mengamankan aplikasi ini dengan benar bukanlah tujuan dari workshop 4 jam ini, karena akan meningkatkan waktu untuk menyelesaikan workshop ini sebesar 1-2 urutan magnitudo.
Namun, topik ini sangat penting. Kami telah mengumpulkan beberapa ide di SECURITY
.
12. Selamat!
Selamat 🎉🎉🎉 , Anda telah berhasil memodernisasi aplikasi PHP lama dengan Google Cloud.
Sebagai ringkasan, dalam codelab ini Anda telah mempelajari:
- Cara men-deploy database di Google Cloud SQL dan cara memigrasikan database yang ada ke dalamnya.
- Cara membuat container aplikasi PHP dengan Docker dan Buildpack serta menyimpan image-nya ke Google Cloud Artifact Registry
- Cara men-deploy Aplikasi dalam container ke Cloud Run dan membuatnya berjalan dengan Cloud SQL
- Cara menyimpan/menggunakan parameter konfigurasi sensitif (seperti sandi DB) secara rahasia menggunakan Google Secret Manager
- Cara menyiapkan pipeline CI/CD dengan Google Cloud Build untuk mem-build dan men-deploy Aplikasi PHP secara otomatis setiap kali kode di-push ke repo GitHub.
- Cara menggunakan Cloud Storage untuk "meng-cloud-kan" resource aplikasi Anda
- Cara memanfaatkan teknologi serverless untuk membuat alur kerja yang luar biasa di atas Google Cloud tanpa menyentuh kode aplikasi Anda.
- Gunakan kemampuan multimodal Gemini untuk kasus penggunaan yang sesuai.
- Menerapkan prinsip SRE dalam Google Cloud
Ini adalah awal yang bagus untuk perjalanan Anda dalam Modernisasi aplikasi dengan Google Cloud.
🔁 Masukan
Jika Anda ingin memberi tahu kami tentang pengalaman Anda dengan workshop ini, pertimbangkan untuk mengisi formulir masukan ini.
Kami menerima masukan Anda serta PRs untuk potongan kode yang Anda banggakan.
🙏 Terima kasih
Penulis ingin berterima kasih kepada Mirko Gilioli dan Maurizio Ipsale dari Datatonic atas bantuannya dalam penulisan dan pengujian solusi.