Workshop Mod Aplikasi

1. Pengantar

Terakhir Diperbarui: 01-11-2024

Bagaimana cara memodernisasi aplikasi PHP lama ke Google Cloud?

(📽️ tonton video pengantar 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:

  1. Buat container Aplikasi PHP.
  2. Beralih ke Layanan Database Terkelola ( Cloud SQL).
  3. Men-deploy ke Cloud Run (alternatif zero-ops untuk GKE/Kubernetes).
  4. Mengamankan Aplikasi dengan Identity and Access Management (IAM) dan Secret Manager.
  5. 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.
  6. Menghosting gambar aplikasi di Cloud Storage. Hal ini dicapai melalui pemasangan, dan tidak diperlukan kode untuk mengubah aplikasi.
  7. Memperkenalkan fungsi AI Generatif melalui Gemini, yang diorkestrasi melalui Cloud Functions (serverless).
  8. Pelajari SLO dan operasikan aplikasi yang baru dimuat ulang.

Dengan mengikuti langkah-langkah ini, Anda dapat secara bertahap memodernisasi aplikasi PHP, sehingga meningkatkan skalabilitas, keamanan, dan fleksibilitas deployment-nya. Selain itu, dengan beralih ke Google Cloud, Anda dapat memanfaatkan infrastruktur dan layanannya yang andal untuk memastikan aplikasi berjalan lancar di lingkungan native cloud.

Kami yakin hal yang akan Anda pelajari dengan mengikuti langkah-langkah sederhana ini dapat diterapkan untuk aplikasi dan organisasi Anda sendiri dengan bahasa/stack 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 keajaiban 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.

445f7a9ae37e9b4d.png

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 beberapa penggemar Google lokal Anda ;)
  • 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:

Workshop ini dapat dilihat dari komputer lokal Anda atau dilakukan sepenuhnya di browser.

2. Penyiapan kredit dan Fork

6dafc658860c0ce5.png

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 Google Gmail baru (*) untuk ditautkan ke kredit GCP Anda. Minta link kepada instruktur Anda untuk menukarkan kredit GCP atau gunakan kredit tersebut di sini: bit.ly/PHP-Amarcord-credits .

Login dengan akun yang baru dibuat dan ikuti petunjuknya.

ff739240dbd84a30.png

(

) 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 (gmail.com) yang sudah ada tanpa eksposur sebelumnya ke GCP.

Klik tombol untuk menukarkan kredit.

331658dc50213403.png

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

bd7548f78689db0b.png

Buat project baru jika Anda tidak memilikinya seperti yang ditunjukkan pada screenshot di bawah. Ada opsi "PROJECT BARU" di pojok kanan atas.

6c82aebcb9f5cd47.png

Pastikan untuk menautkan project baru dengan akun penagihan uji coba GCP sebagai berikut.

f202527d254893fb.png

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.

7d732d7bf0deb12e.png

Pastikan project baru Anda dipilih di kiri atas:

Tidak dipilih (buruk):

c2ffd36a781b276a.png

Dipilih (baik):

594563c158f4f590.png

Fork Aplikasi dari GitHub

  1. Buka aplikasi demo: https://github.com/gdgpescara/app-mod-workshop
  2. Klik TAG garpu.
  3. Jika tidak memiliki akun GitHub, Anda harus membuat akun baru.
  4. Edit konten sesuai keinginan.

734e51bfc29ee5df.png

  1. Clone kode Aplikasi menggunakan git clone https://github.com/<YOUR-GITHUB-USER>/<YOUR-REPO-NAME>
  1. 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.

40f5977ea4c1d1cb.png

Anda memiliki semua yang diperlukan dengan Google Cloud Shell Editor seperti yang ditunjukkan pada gambar berikut

a4e5ffb3e9a35e84.png

3. Modul 1: Membuat Instance SQL

645902e511a432a6.png

Membuat Instance Google Cloud SQL

Aplikasi PHP kita akan terhubung ke database MySQL dan oleh karena itu kita perlu mereplikasinya ke Google Cloud untuk migrasi tanpa kesulitan. Cloud SQL adalah pilihan yang tepat karena memungkinkan Anda menjalankan database MySQL yang dikelola sepenuhnya di Cloud. Berikut adalah langkah-langkah yang harus diikuti:

  1. Buka halaman Cloud SQL: https://console.cloud.google.com/sql/instances
  2. Klik "Create Instance"
  3. Aktifkan API (jika diperlukan). Proses ini mungkin memerlukan waktu beberapa detik.
  4. Pilih MySQL.
  5. (Kami mencoba mendapatkan versi termurah untuk Anda, sehingga lebih tahan lama):
  • Edisi: Enterprise
  • Preset: pengembangan (kami telah mencoba Sandbox dan tidak berhasil untuk kami)
  • Mysql Ver: 5.7 (wow, nostalgia!)
  1. ID instance: pilih appmod-phpapp (jika Anda mengubahnya, jangan lupa untuk mengubah skrip dan solusi mendatang juga).
  2. Sandi: apa pun yang Anda inginkan, tetapi catat sebagai CLOUDSQL_INSTANCE_PASSWORD
  3. Region: tetapkan sama seperti yang Anda pilih untuk seluruh aplikasi (misalnya, Milan = europe-west8)
  4. 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 image_catalog dan Pengguna di Cloud SQL

Project Aplikasi dilengkapi dengan folder db/ yang berisi dua file sql:

  1. 01_schema.sql : Berisi kode SQL untuk membuat dua tabel yang berisi data Pengguna dan Gambar.
  2. 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:

  1. Buka instance Anda dan klik tab Databases:
  2. klik "Create Database"
  3. sebut saja image_catalog (seperti dalam konfigurasi aplikasi PHP).

997ef853e5ebd857.pngS

Kemudian, kita membuat pengguna database. Dengan ini, kita dapat melakukan autentikasi ke database image_catalog.

  1. Sekarang klik tab Pengguna
  2. Klik "Tambahkan akun pengguna".
  3. Pengguna: mari kita buat:
  • Nama pengguna: appmod-phpapp-user
  • Sandi: Pilih sesuatu yang dapat Anda ingat, atau klik "buat"
  • Pertahankan "Izinkan semua host (%)".
  1. klik TAMBAHKAN.

Buka DB ke IP terkenal.

Perlu diperhatikan bahwa semua DB di Cloud SQL terlahir 'terisolasi'. Anda harus menyiapkan jaringan secara eksplisit agar dapat diakses.

  1. Klik instance Anda
  2. Buka Menu "Koneksi"
  3. Klik tab "Networking".
  4. Klik di bagian Jaringan yang diizinkan. Sekarang tambahkan subnet.
  • Untuk saat ini, mari kita pilih TIDAK AMAN agar Aplikasi dapat berfungsi:
  • Nama: "Semua orang di dunia - TIDAK AMAN" (mari kita ingatkan diri kita sendiri bahwa solusi murah ini juga tidak aman).
  • Jaringan: "0.0.0.0/0" (Catatan: ini TIDAK AMAN!)

Klik simpan.

Anda akan melihat sesuatu seperti ini:

5ccb9062a7071964.pngS

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 ke Cloud SQL Studio di dalam instance dan masukkan Database, Pengguna, dan Sandi yang akan diautentikasi seperti yang ditunjukkan di bawah:

d56765c6154c11a4.png

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. Ambil kode SQL dari file sql di repo dan jalankan satu per satu dalam urutan berurutan. 01_schema.sql, lalu 02_seed.sql.

Setelah itu, Anda akan mendapatkan dua tabel di image_catalog, yaitu users dan images seperti yang ditunjukkan di bawah:

65ba01e4c6c2dac0.pngS

Anda dapat mengujinya dengan menjalankan kode berikut di editor: select * from images;

Pastikan juga untuk mencatat alamat IP Publik, Anda akan memerlukannya nanti.

4. Modul 2: Membuat Container untuk Aplikasi PHP

e7f0e9979d8805f5.png

Kita ingin mem-build aplikasi ini untuk cloud.

Ini berarti mengemas kode dalam semacam file ZIP yang berisi semua info untuk menjalankannya di {i>Cloud<i}.

Ada beberapa cara untuk mengemasnya:

  • Docker. Sangat populer, tetapi cukup rumit untuk disiapkan dengan benar.
  • Buildpack. Kurang populer, tetapi cenderung 'otomatis menebak' apa yang harus dibangun dan apa yang harus dijalankan. Seringkali itu berhasil!

Dalam konteks workshop ini, kami akan mengasumsikan bahwa Anda menggunakan Docker.

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 kita pada akhirnya ingin men-deploy aplikasi dalam container ke Cloud Run, periksa dokumentasi berikut dan coba isi bagian yang kosong. Kami hanya menyediakan hal-hal penting untuk memudahkan Anda saat ini. Dockerfile final Anda akan terlihat seperti ini:

# Use an official PHP image with Apache
# Pull a suitable php image
FROM __________# Define the env variable for the Apache listening port 8080
ENV __________

# Set working directory inside the container
WORKDIR __________

# Install required PHP extensions: PDO, MySQL, and other dependencies
RUN __________

# Copy all application files into the container
COPY __________

# Configure Apache to listen on port 8080. Use ‘sed' command to change the default listening port.
RUN __________

# When in doubt, always expose to port 8080
EXPOSE __________

# Start Apache in the foreground
CMD __________

Selain itu, untuk menguji aplikasi secara lokal, kita perlu mengubah file config.php sedemikian rupa sehingga Aplikasi PHP kita akan terhubung dengan db MYSQL yang tersedia di Google CloudSQL. Berdasarkan penyiapan yang telah Anda lakukan sebelumnya, isi bagian yang kosong.

  • Db_host adalah alamat IP publik Cloud SQL, Anda dapat menemukannya di konsol:

bd27071bf450a8d0.png

  • Db_name tidak boleh diubah: image_catalog
  • Db_user harus appmod-phpapp-user
  • Db_pass adalah sesuatu yang Anda pilih. Atur dalam tanda kutip tunggal dan escape sesuai kebutuhan.
<?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();
?>

Selain itu, jangan ragu untuk menerjemahkan beberapa bagian dalam bahasa Italia ke dalam bahasa Inggris dengan bantuan Gemini.

Baiklah. Setelah Dockerfile Anda dan Aplikasi PHP dikonfigurasi agar 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.

  • Docker build -t <IMAGE_TAG_NAME>.
  • docker run -it -p <CONTAINER PORT>:<LOCAL MACHINE PORT> <IMAGE_TAG_NAME>

Jika semuanya berfungsi, Anda akan dapat melihat halaman web berikut saat terhubung ke host lokal.

Jika menggunakan Cloud Shell, Anda juga dapat mengekspor port lokal (misalnya 8080) ke browser, seperti ini:

docker build -t my-php-app-docker app-mod-workshop/ -f Dockerfile

docker run -it -p 8080:8080 my-php-app-docker

Setelah mengetahui bahwa aplikasi Anda berjalan di port 8080, klik ikon "Web preview" (browser dengan mata), lalu Preview on port 8080 (atau "Ubah port" untuk port lainnya)

33a24673f4550454.png

Menguji hasilnya di browser

Sekarang aplikasi Anda akan terlihat seperti ini:

2718ece96b1f18b6.png

Dan jika Anda login dengan Admin/admin123, Anda akan melihat sesuatu seperti ini.

68b62048c2e86aea.png

Bagus!!! Berhasil 🎉🎉🎉

Jika pembuatan docker Anda bagus, tetapi kredensial DB salah, Anda mungkin mendapatkan sesuatu seperti ini:

e22f45b79bab86e1.png

Coba lagi, Anda sudah dekat!

Buildpack [opsional]

Dengan Buildpack, aplikasi akan di-build secara otomatis. Sayangnya, Anda tidak memiliki kontrol penuh sehingga mungkin akan menemui konfigurasi tak terduga.

Anda harus memiliki image docker baru di lingkungan lokal. Anda dapat mencoba menjalankan container untuknya, tetapi kami tidak memiliki kontrol penuh terkait cara membuat image, sehingga Aplikasi mungkin tidak berfungsi. Apa pun hasilnya, kami mengundang Anda untuk bereksperimen dan jika berhasil, bagikan pendapat Anda. Terima kasih.

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

e1123f0c924022e6.png

Pilih nama, format, dan region yang valid dan sesuai untuk menyimpan artefak.

4e516ed209c470ee.pngS

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]
  • push push TARGET_IMAGE[:TAG]

Hasilnya akan terlihat seperti screenshot berikut.

1e498feb4e88be9f.pngS

Hore 🎉🎉🎉 Anda dapat melanjutkan ke level berikutnya.

Catatan. Coba juga endpoint /upload.php dan coba upload foto. Anda mungkin mendapatkan pesan "Izin ditolak". Jika ya, Anda harus melakukan beberapa perbaikan chmod/chown di Dockerfile.

5. Modul 3: Men-deploy Aplikasi ke Cloud Run

9ffca42774f6c5d1.png

Mengapa Cloud Run?

Pertanyaan yang bagus. Bertahun-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 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 Anda tidak melihat petunjuk 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 menggunakan 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

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. Set minimum adalah sebagai berikut:

  1. Nama Layanan Cloud Run yang ingin di-deploy untuk Aplikasi Anda. Layanan Cloud Run akan kembali kepada Anda URL yang menyediakan endpoint untuk Aplikasi Anda.
  2. Region Google Cloud tempat Aplikasi Anda akan berjalan.
  3. Image Container yang menggabungkan Aplikasi Anda.
  4. Variabel Lingkungan yang perlu digunakan Aplikasi Anda selama eksekusi.
  5. Flag Allow-Unauthenticated yang mengizinkan semua orang mengakses Aplikasi Anda tanpa autentikasi lebih lanjut

Lihat dokumentasi untuk melihat cara menerapkan opsi ini ke perintah Anda. Deployment akan memerlukan waktu beberapa menit. Jika semuanya sudah benar, Anda akan melihat tampilan seperti ini di Konsol Google Cloud.

ef1029fb62f8de81.png

f7191d579c21ca3e.png

Klik URL yang disediakan oleh Cloud Run dan uji Aplikasi Anda. Setelah diautentikasi, Anda akan melihat sesuatu seperti ini.

d571a90cd5a373f9.png

"gcloud run deploy" dengan "no questions"

Anda mungkin telah melihat bahwa gcloud run deploy mengajukan pertanyaan yang tepat dan mengisi bagian yang kosong. Ini hebat sekali!

Namun, dalam beberapa modul, kita akan menambahkan perintah ini ke pemicu Cloud Build sehingga kita tidak perlu mengajukan pertanyaan. 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?

  1. ulangi langkah 2-3-4 hingga gcloud berhenti mengajukan pertanyaan:
  2. [LOOP] gcloud run deploy dengan opsi yang ditemukan sejauh ini
  3. [LOOP] sistem meminta opsi X
  4. [LOOP] Telusuri di dokumen publik cara menyiapkan X dari CLI dengan menambahkan opsi --my-option [my-value].
  5. Kembali ke langkah 2 sekarang, kecuali jika gcloud selesai tanpa pertanyaan lebih lanjut.
  6. Deployment gcloud run BLAH BLAH BLAH ini keren! Simpan perintah di suatu tempat, Anda akan memerlukannya nanti untuk langkah Cloud Build.

Solusi yang mungkin adalah di sini.

Selamat 🎉🎉🎉 Anda berhasil men-deploy Aplikasi di Google Cloud dan mencapai langkah pertama Modernisasi.

6. Modul 4: Membersihkan Sandi dengan Secret Manager

95cd57b03b4e3c73.png

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, Anda harus mempertimbangkan untuk menetapkan 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') ?: _______;
$db_name = getenv('DB_NAME') ?: 'image_catalog';
$db_user = getenv('DB_USER') ?: 'appmod-phpapp-user';
$db_pass = getenv('DB_PASS') ?: _______;
// 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:

  1. Aplikasi Anda akan membaca variabel secara dinamis dari ENV
  2. Anda meningkatkan keamanan karena Anda menghapus sandi DB dari kode Anda)

Sekarang Anda dapat men-deploy revisi baru ke Cloud Run. Mari kita buka UI dan menetapkan 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:

7a5fbfa448544d3.pngS

f2780c35585388ca.png

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.

Google Cloud Secret Manager adalah layanan terpusat yang aman untuk mengelola informasi sensitif seperti kunci API, sandi, sertifikat, dan rahasia 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.

6df83a1c3cb757f6.png

Aktifkan Secret Manager API setelah Anda berada di sana seperti pada gambar berikut.

a96c312e2c098db1.png

  • 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 tersebut 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)
  • Pendaftaran (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 Google Cloud Console
  • 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.

9ed4e35be7654dcb.png

Setelah selesai, Anda akan mendapatkan error berikut

da0ccd7af39b04ed.png

Coba cari tahu cara memperbaikinya. Untuk mengatasinya, Anda perlu mengakses bagian IAM & Admin dan mengubah izin pemberian. Selamat men-debug!

Setelah Anda mengetahuinya, kembali ke Cloud Run dan deploy ulang revisi baru. Hasilnya akan terlihat seperti gambar berikut:

e89f9ca780169b6b.png

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

ba49b033c11be94c.png

Mengapa Pipeline CI/CD?

Sekarang, Anda seharusnya sudah mengetik gcloud run deploy beberapa kali, mungkin menjawab pertanyaan yang sama berulang kali.

Lelah 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:

  1. 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 buat fork akan terlihat seperti ini: https://github.com/<YOUR_GITHUB_USER>/app-mod-workshop
  2. 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, hasilkan 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:

f30f42d4571ad5e2.png

Bagaimana cara melakukannya?

  1. Dengan membuat satu file YAML yang sempurna: cloudbuild.yaml
  2. Dengan membuat pemicu Cloud Build.
  3. Dengan terhubung ke repositori github kami melalui UI Cloud Build.

Membuat pemicu (dan Menghubungkan Repositori)

  • Buka https://console.cloud.google.com/cloud-build/triggers
  • Klik "Buat Pemicu".
  • Mengompilasi:
  • Nama: Sesuatu yang bermakna seperti on-git-commit-build-php-app
  • Peristiwa: Push to branch
  • Sumber: "Hubungkan repositori baru" teks alternatif
  • 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 repositori, mungkin perlu waktu agak lama.
  • "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.
  • 23e0e0f1219afea3.pngKlik Hubungkan
  • bafd904ec07122d2.png
  • 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 semuanya apa adanya.
  • Klik tombol "Buat".

(*) Ini adalah cara paling sederhana untuk memeriksa Dockerfile atau cloudbuild.yaml. Namun, cloudbuild.yaml memberi Anda kemampuan nyata untuk menentukan tindakan di langkah mana.

Saya punya kekuatan!

Sekarang, pemicu tidak akan berfungsi kecuali jika Anda memberikan akun layanan Cloud Build (apa yang dimaksud dengan 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 itu 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 "Tetapkan sebagai akun layanan pilihan"

8715acca72286a46.png

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)

97acd16980a144ab.png

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:

3da8723e4ff80c0a.pngS

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 meng-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:

  1. CLI. Tambahkan kunci ssh secara lokal dan tambahkan remote dengan git@github.com:YOUR_USER/app-mod-workshop.git (bukan http)
  2. 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.

f0d53f839c7fa3b6.png

Jangan lupa 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 untuk membuat aplikasi mengarah ke Database yang sama. Ini cukup bagus untuk workshop; namun, pada kenyataannya, Anda ingin meluangkan waktu untuk menciptakan 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:

  • Cloud SQL Database (dan mungkin instance SQL).
  • Bucket GCS
  • dan 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

a680e0f287dd2dfb.png

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 yang direset (=>kosong). 🙈

Bagaimana cara memperbaikinya? Ada sejumlah pendekatan.

  1. Menyimpan gambar di DB. Itulah yang akhirnya saya lakukan dengan aplikasi PHP sebelumnya. Ini adalah solusi paling sederhana karena tidak menambah kerumitan. Tetapi ia menambahkan latensi dan beban ke DB Anda pasti!
  2. Memigrasikan aplikasi Cloud Run ke solusi yang cocok untuk penyimpanan: GCE + Persistent disk? Mungkin GKE + Storage?
  3. 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 mendukung Composer (sepertinya PHP 5.3.2 adalah versi paling awal yang didukung oleh Composer)?
  4. Mungkin menggunakan sidecar docker?
  5. 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:

  1. Anda mengupload newpic.jpg. Anda akan melihatnya di aplikasi.
  2. Anda mengupgrade aplikasi ke versi baru.
  3. 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:

  1. Semua upload ke GCS benar-benar akan terlihat di aplikasi Anda.
  2. Semua upload ke aplikasi Anda sebenarnya akan diupload ke GCS
  3. 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 melakukannya dari UI

  1. Di tab "Volume", buat Volume Mount yang mengarah ke bucket Anda, dengan jenis "Bucket Cloud Storage", misalnya dengan nama "php_uploads".
  2. 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:

6c2bb98fc1b0e077.png

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:

70032b216afee2d7.png

Apa yang baru saja terjadi?

Sesuatu yang sangat ajaib telah terjadi.

Aplikasi lama dengan kode lama masih melakukan tugasnya. Stack baru yang dimodernisasi memungkinkan kita memiliki semua gambar/gambar dalam 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. Kamu tidak percaya padaku? Lanjutkan membaca di bab 7.

Kita baru saja membuka peluang besar di sini.

9. Modul 7: Memperkuat Aplikasi Anda dengan Google Gemini

c00425f0ad83b32c.png

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 gambar /uploads/ di GCS, yang de facto memisahkan logika Aplikasi dari penyimpanan gambar.

Latihan ini mengharuskan Anda untuk:

  • Telah berhasil menyelesaikan latihan di bab 6 (penyimpanan).
  • Memiliki bucket GCS dengan upload gambar, tempat orang-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? Misalnya:

  • saat &lt;event&gt; 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 menunggu dalam antrean di Pub/Sub.

Google Cloud mendukung beberapa paradigma untuk mencapai hal ini. Terutama:

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.

  1. Saat image baru dibuat di GCS.. (mungkin karena seseorang telah menguploadnya di aplikasi - tetapi tidak hanya itu)
  2. .. memanggil Gemini untuk mendeskripsikannya dan mendapatkan deskripsi tekstual gambar .. (sebaiknya periksa MIME dan pastikan itu adalah gambar, bukan PDF, MP3, atau Teks)
  3. .. dan perbarui DB dengan deskripsi ini. (tindakan ini mungkin memerlukan patch DB untuk menambahkan kolom description ke tabel images).

Melakukan patch pada DB untuk menambahkan description ke gambar

  1. Buka Cloud SQL Studio:

b92b07c4cba658ef.png

  1. Masukkan pengguna dan sandi Anda untuk Images DB
  2. Masukkan SQL ini yang menambahkan kolom untuk deskripsi gambar:

ALTER TABLE images ADD COLUMN description TEXT;

3691aced78a6389.png

Dan bingo! Coba sekarang untuk memeriksa apakah berhasil:

SELECT * FROM images;

Anda akan melihat kolom deskripsi baru:

bed69d6ad0263114.png

Tulis f(x) Gemini

Catatan. Fungsi ini sebenarnya dibuat dengan bantuan bantuan Kode Gemini.

Catatan. Membuat fungsi ini dapat menyebabkan error izin IAM. Beberapa di antaranya didokumentasikan di bawah dalam paragraf "Kemungkinan error".

  1. Mengaktifkan API
  2. Buka https://console.cloud.google.com/functions/list
  3. Klik "Create Function"
  4. Mengaktifkan API dari wizard API:

d22b82658cfd4c48.png

Anda dapat membuat GCF dari UI atau dari command line. Di sini kita akan menggunakan command line.

Kemungkinan kode dapat ditemukan di bagian .solutions/

  1. Buat folder untuk menghosting kode Anda, misalnya "gcf/". Masukkan folder.
  2. Buat file requirements.txt:
google-cloud-storage
google-cloud-aiplatform
pymysql
  1. Buat fungsi python. Kode contoh 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
  1. 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 bagian yang bergerak. Anda mungkin ingin dapat menguji semua solusi tersebut.

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.

cf3ded30d532a2c7.png

Pengujian E2E

Saatnya menguji fungsi secara manual.

  1. Buka aplikasi Anda, dan login
  2. Upload gambar (tidak terlalu besar, kami melihat masalah pada gambar yang besar)
  3. memeriksa UI ketika gambar diunggah.
  4. Periksa di Cloud SQL Studio apakah deskripsi telah diperbarui. Login dan jalankan kueri ini: SELECT * FROM images.

43a680b12dbbdda0.png

Dan ini berhasil. Kita mungkin juga ingin memperbarui frontend untuk menampilkan deskripsi tersebut.

Mengupdate PHP untuk menampilkan [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 selanjutnya, kita juga akan melihat versi UI yang lebih bagus, berkat Gemini Code Assist. Versi yang bagus mungkin terlihat seperti ini:

fdc12de0c88c4464.png

Kesimpulan

Anda mendapatkan 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 mencapai dua fungsionalitas hebat.

[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: Foto yang BESAR, atau gambar yang konten Gemininya berisi kata "ketelanjangan/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 pekerjaan 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 menanyakan 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:

Perintah apa yang akan digunakan untuk menghasilkan ini?

{
    "description": "This is the picture of an arrosticino",
    "suitable": TRUE
}

Anda dapat menambahkan kolom perintah tambahan untuk mendapatkan insight seperti: apakah ada hal yang menarik? Apakah itu buruk? Apakah Anda mengenali tempat tersebut? Apakah ada teks (OCR tidak pernah semudah ini):

  • 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 menggunakan fungsi N untuk hasil N, akan sangat bermanfaat untuk melakukan fungsi yang dapat melakukan 10 hal. Baca artikel oleh Riccardo ini untuk melihat 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

  1. 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:

22f51012fa6b4a24.png

Anda mungkin juga harus mengaktifkan EventArc API - beberapa menit sebelum API tersebut tersedia sepenuhnya.

Error: Cloud Run invoker tidak ada

  1. Komentar lain dari UI untuk pemberian izin GCF adalah ini ( Peran Cloud Run Invoker):

be72e17294f2d3f3.png

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 benjolan:

bed69d6ad0263114.png

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:

e5c338ee35ad4c24.png

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:

  1. https://console.cloud.google.com/vertex-ai
  2. Klik "enable all recommended APIS".

492f05ac377f3630.png

Error: Pemicu EventArc tidak ditemukan.

Jika Anda mendapatkan pesan ini, deploy ulang fungsi.

8ec4fc11833d7420.pngS

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:

  1. Membuat SLI
  2. Membuat SLO berdasarkan SLI
  3. Membuat Pemberitahuan berdasarkan SLO

f63426182c052123.png

Topik ini sangat penting bagi penulisnya, karena Riccardo bekerja di area SRE / DevOps di Google Cloud.

(bersifat terbuka) Membuat 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 yang menciptakan SLO. Untuk membaca lebih lanjut, saya dapat menyarankan:

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, proses ini sangat mudah dilakukan, hanya memerlukan 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".

e471c7ebdc56cdf6.png

Langkah 2: Siapkan Pemberitahuan pada SLO ini

Sebaiknya buat 2 pemberitahuan:

  1. Satu dengan tingkat kejenuhan rendah ("Slowburn") untuk memperingatkan Anda melalui email (menyimulasikan tiket harga rendah).
  2. Satu dengan burnrate tinggi ("Fastburn") untuk memberi tahu Anda melalui SMS (menyimulasikan tiket prioritas tinggi/pager)

Buka SLO tab dari sebelumnya.

Lakukan hal ini dua kali:

314bfd6b9ef0a260.png

  • 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 tanda X besar di kanan atas.
  • Pilih nomor telepon terlebih dahulu (cepat), lalu email (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 Anda anggap 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:

  1. Vertex AI. "Cara Enterprise", yang terjalin dengan GCP Anda, yang telah kita pelajari di bab 7 (GCF+Gemini). Semua otentikasi bekerja secara ajaib, dan layanan saling berhubungan dengan indah.
  2. 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 bisa mendapatkannya dengan mudah dalam waktu kurang dari 5 menit, cukup dengan satu Cloud Build. :)

Respons dari Gemini sangat bagus (artinya, saya tidak perlu mengubah apa pun):

8a3d5fe37ec40bf8.png

Berikut tata letak baru di aplikasi pribadi penulis:

81620eb90ae3229a.png

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 adalah sasaran dari workshop 4 jam ini.

Untuk beberapa ide, lihat SECURITY doc.

12. Selamat!

Selamat 🎉🎉🎉 , Anda telah berhasil memodernisasi aplikasi PHP lama dengan Google Cloud.

24cb9a39b1841fbd.png

Sebagai ringkasan dalam codelab ini, Anda telah mempelajari:

  • Cara men-deploy database MYSQL di Google Cloud SQL dan cara memigrasikan database yang ada ke dalamnya.
  • Cara memasukkan aplikasi PHP ke dalam container dengan Docker dan Buildpacks, 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.

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 mengucapkan terima kasih kepada Mirko Gilioli dan Maurizio Ipsale dari Datatonic atas bantuannya dalam penulisan dan pengujian solusi.