Uygulama Değişikliği Atölyesi

1. Giriş

Son Güncelleme: 01.11.2024

Eski bir PHP uygulamasını Google Cloud'a nasıl modernleştirebiliriz?

(📽️ Bu codelab'in 7 dakikalık tanıtım videosunu izleyin)

Şirket içinde çalışan ve modernleştirilmesi gereken eski uygulamaların olması yaygın bir durumdur. Bu da uygulamanızı farklı ortamlarda ölçeklenebilir, güvenli ve dağıtılabilir hale getirirler.

Bu atölyede şunları yapacaksınız:

  1. PHP uygulamasını kapsayıcıya alın.
  2. Yönetilen bir Veritabanı Hizmeti'ne (Cloud SQL) geçin.
  3. Cloud Run'a dağıtın (GKE/Kubernetes'in sıfır operasyonlu alternatifidir).
  4. Kimlik ve Erişim Yönetimi (IAM) ile Secret Manager'ı kullanarak uygulamayı güvenli hale getirin.
  5. Cloud Build üzerinden bir CI/CD ardışık düzeni tanımlayın. Cloud Build, GitHub veya GitLab gibi popüler Git sağlayıcılarında barındırılan Git deponuza bağlanabilir ve örneğin ana ağa yapılan her push'ta tetiklenebilir.
  6. Uygulama resimlerini Cloud Storage'da barındırın. Bu, bağlama yoluyla yapılır ve uygulamayı değiştirmek için kod gerekmez.
  7. Cloud Functions (sunucusuz) aracılığıyla düzenlenen Gemini aracılığıyla üretken yapay zeka işlevlerini kullanıma sunun.
  8. Hizmet düzeyi hedefleri ve yenilenen uygulamanızı çalıştırma hakkında bilgi edinin.

Bu adımları uygulayarak PHP uygulamanızı kademeli olarak modernleştirebilir, ölçeklenebilirliğini, güvenliğini ve dağıtım esnekliğini artırabilirsiniz. Ayrıca Google Cloud'a geçmek, uygulamanızın bulutta yerel bir ortamda sorunsuz çalışmasını sağlamak için güçlü altyapısından ve hizmetlerinden yararlanmanıza olanak tanır.

Bu basit adımları uygulayarak öğreneceklerinizin, farklı dil/yığın ve farklı kullanım alanlarına sahip kendi uygulamanız ve kuruluşunuz için uygulanabileceğine inanıyoruz.

Uygulama hakkında

Çatallayacağınız uygulama ( MIT lisansı kapsamındaki kod), MySQL kimlik doğrulamasına sahip temel bir PHP 5.7 uygulamasıdır. Uygulamanın temel fikri, kullanıcıların fotoğraf yükleyebileceği ve yöneticilerin uygunsuz resimleri etiketleyebileceği bir platform sunmaktır. Uygulamada iki tablo vardır:

  • Kullanıcılar. Yöneticiler için önceden derlenmiş olarak gelir. Yeni kullanıcılar kaydolabilir.
  • Resimler. Birkaç örnek resimle birlikte geliyor. Giriş yapan kullanıcılar yeni resim yükleyebilir. Buraya biraz sihir katacağız.

Hedefiniz

Eski uygulamayı Google Cloud'da kullanabilmek için modernleştirmek istiyoruz. Cloud SQL, Cloud Run, Cloud Build, Secret Manager gibi hizmetleri kullanarak ölçeklenebilirliği artırmak, güvenliği iyileştirmek, altyapı yönetimini otomatikleştirmek ve resim işleme, izleme ve veri depolama gibi gelişmiş özellikleri entegre etmek için bu araç ve hizmetlerden yararlanacağız.

445f7a9ae37e9b4d.png

Daha da önemlisi, her adımın arkasındaki düşünce sürecini öğrenmeniz için bunu adım adım yapmak istiyoruz. Genellikle her adım, sonraki adımlar için yeni olasılıklar sunar (ör. 2. modül -> 3. modül ve 6. modül -> 7. modül).

Henüz ikna olmadınız mı? YouTube'daki bu 7 dakikalık videoya göz atın.

Gerekenler

  • Tarayıcısı olan, internete bağlı bir bilgisayar.
  • Bazı GCP kredilerini Bölgenizdeki Google meraklısına sorabilirsiniz ;)
  • gcloud komutu çalışıyor.
  • Yerel olarak mı çalışıyorsunuz? Buraya tıklayarak indirin. Ayrıca iyi bir düzenleyiciye (ör. vscode veya intellij) de ihtiyacınız olacak.
  • Her şeyi "bulutta" yapmak mı istiyorsunuz? Ardından Cloud Shell'i kullanabilirsiniz.
  • GitHub kullanıcısı. Orijinal kodu (🧑🏻 💻 gdgpescara/app-mod-workshop) kendi git deponuza dallara ayırmak için buna ihtiyacınız vardır. Bu, kendi CI/CD ardışık düzeninizi (otomatik taahhüt -> derleme -> dağıtma) oluşturmak için gereklidir.

Örnek çözümleri burada bulabilirsiniz:

Bu atölye, yerel bilgisayarınızdan veya tamamen bir tarayıcıda yapılabilir.

2. Kredi oluşturma ve çatallama

6dafc658860c0ce5.png

GCP kredisini kullanma ve GCP ortamınızı ayarlama [isteğe bağlı]

Bu atölyeyi çalıştırmak için biraz kredisi olan bir Faturalandırma Hesabı'na ihtiyacınız vardır. Zaten kendi faturalandırmanız varsa bu adımı atlayabilirsiniz.

GCP kredinize bağlamak için yeni bir Google Gmail hesabı oluşturun (*). Eğitmeninizden GCP kredisini kullanma bağlantısını isteyin veya kredileri buradan kullanın: bit.ly/PHP-Amarcord-credits .

Yeni oluşturulan hesapla oturum açın ve talimatları uygulayın.

ff739240dbd84a30.png

(

) Neden yeni bir Gmail hesabına ihtiyacım var?*

Kullanıcıların, hesapları (özellikle iş veya öğrenci e-postaları) daha önce GCP ile etkileşime geçmiş olduğu ve kurumsal politikalar bu işlemi yapmalarını kısıtladığı için codelab'i geçemediğini gördük. Yeni bir Gmail hesabı oluşturmanızı veya daha önce GCP'ye maruz kalmadan mevcut bir Gmail hesabını (gmail.com) kullanmanızı öneririz.

Krediyi kullanmak için düğmeyi tıklayın.

331658dc50213403.png

Aşağıdaki formu adınız ve soyadınızla doldurup Hükümler ve Koşullar'ı kabul edin.

Faturalandırma hesabının burada görünmesi için birkaç saniye beklemeniz gerekebilir: https://console.cloud.google.com/billing

İşlem tamamlandıktan sonra Google Cloud Console'u açın ve sol üstteki açılır menüde "Kuruluş yok" ifadesinin gösterildiği Proje Seçici'yi tıklayarak yeni bir proje oluşturun. Aşağıya bakın

bd7548f78689db0b.png

Aşağıdaki ekran görüntüsünde gösterildiği gibi, projeniz yoksa yeni bir proje oluşturun. Sağ üst köşede "YENİ PROJE" seçeneği bulunur.

6c82aebcb9f5cd47.png

Yeni projeyi GCP deneme faturalandırma hesabına aşağıdaki gibi bağladığınızdan emin olun.

f202527d254893fb.png

Google Cloud Platform'u kullanmaya hazırsınız. Yeniyseniz veya tüm işlemleri Cloud ortamında gerçekleştirmek istiyorsanız sol üst köşede yer alan aşağıdaki düğmeyi kullanarak Cloud Shell'e ve düzenleyicisine aşağıda gösterildiği gibi erişebilirsiniz.

7d732d7bf0deb12e.png

Sol üstte yeni projenizin seçili olduğundan emin olun:

Seçilmedi (kötü):

c2ffd36a781b276a.png

Seçili (iyi):

594563c158f4f590.png

Uygulamayı GitHub'dan çatallama

  1. Demo uygulamasına gidin: https://github.com/gdgpescara/app-mod-workshop
  2. 🍴 çatalı tıklayın.
  3. GitHub hesabınız yoksa yeni bir hesap oluşturmanız gerekir.
  4. İstediğiniz gibi düzenleyin.

734e51bfc29ee5df.png

  1. Git clone kullanarak uygulama kodunu klonlayın: https://github.com/<YOUR-GITHUB-USER>/<YOUR-REPO-NAME>
  1. Klonlanan proje klasörünü favori düzenleyicinizle açın. Cloud Shell'i seçerseniz aşağıda gösterildiği gibi "Düzenleyiciyi aç"ı tıklayarak bunu yapabilirsiniz.

40f5977ea4c1d1cb.png

Aşağıdaki şekilde gösterildiği gibi, Google Cloud Shell Düzenleyici'de ihtiyacınız olan her şeye sahipsiniz

a4e5ffb3e9a35e84.png

3. 1. Modül: SQL örneği oluşturma

645902e511a432a6.png

Google Cloud SQL örneği oluşturma

PHP uygulamamız bir MySQL veritabanına bağlanacağından, taşıma işlemini kolayca gerçekleştirmek için bu uygulamayı Google Cloud'a kopyalamamız gerekiyor. Cloud SQL, bulutta tümüyle yönetilen bir MySQL veritabanı çalıştırmanıza olanak tanıdığı için mükemmel bir seçimdir. Uygulanacak adımlar şunlardır:

  1. Cloud SQL sayfasına gidin: https://console.cloud.google.com/sql/instances
  2. "Örnek Oluştur"u tıklayın
  3. API'yi etkinleştirin (gerekirse). Bu işlem birkaç saniye sürebilir.
  4. MySQL'i seçin.
  5. (Size en ucuz sürümü sunmaya çalışıyoruz, bu nedenle daha uzun süre dayanacak):
  • Sürüm: Enterprise
  • Hazır Ayar: geliştirme (Korumalı Alan'ı denedik ancak bizim için çalışmadı)
  • Mysql Ver: 5.7 (vay be, geçmişe döndük!)
  1. Örnek kimliği: appmod-phpapp'ü seçin (Bunu değiştirirseniz gelecekteki komut dosyalarını ve çözümleri de buna göre değiştirmeyi unutmayın).
  2. Şifre: dilediğiniz gibi kullanabilirsiniz
  3. Bölge: Uygulamanın geri kalanı için seçtiğiniz bölgeyle aynı olmalıdır (ör. Milano = europe-west8)
  4. Alt bölgesel bilgi dokümanı: Tek alt bölge (demo için paradan tasarruf ediyoruz)

Cloud SQL veritabanını dağıtmak için Örnek Oluştur düğmesini tıklayın. Bu işlemin tamamlanması yaklaşık 10 dakika sürer⌛. Bu sırada dokümanları okumaya devam edin. Ayrıca, ilk bölümdeki bu modüle bağımlı olmadığından (veritabanı bağlantısını düzeltene kadar) sonraki modülü ("PHP uygulamanızı kapsayıcıya alma") çözmeye de başlayabilirsiniz.

Not. Bu örnek, size yaklaşık 7 ABD doları/gün maliyeti getirir. Atölye sonrasında bu ağı kapattığınızdan emin olun.

Cloud SQL'de image_catalog veritabanı ve kullanıcı oluşturma

Uygulama projesi, iki SQL dosyası içeren bir db/ klasörü içerir:

  1. 01_schema.sql: Kullanıcılar ve Resimler verilerini içeren iki tablo oluşturmak için SQL kodu içerir.
  2. 02_seed.sql: Önceki oluşturulan tablolara veri çekmek için SQL kodu içerir.

Bu dosyalar, image_catalog veritabanı oluşturulduktan sonra kullanılır. Bunu yapmak için aşağıdaki adımları uygulayabilirsiniz:

  1. Örneğinizi açın ve Veritabanları sekmesini tıklayın:
  2. "Veritabanı Oluştur"u tıklayın.
  3. image_catalog olarak adlandırın (PHP uygulama yapılandırmasında olduğu gibi).

997ef853e5ebd857.png

Ardından veritabanı kullanıcısını oluştururuz. Bu sayede image_catalog veritabanında kimlik doğrulaması yapabiliriz.

  1. Ardından Kullanıcılar sekmesini tıklayın.
  2. "Kullanıcı hesabı ekle"yi tıklayın.
  3. Kullanıcı: Bir tane oluşturalım:
  • Kullanıcı adı: appmod-phpapp-user
  • Şifre: Hatırlayabileceğiniz bir şey seçin veya "oluştur"u tıklayın.
  • "Tüm ana makinelere izin ver (%)" seçeneğini etkin durumda bırakın.
  1. EKLE'yi tıklayın.

Veritabanını bilinen IP'lere açın.

Cloud SQL'deki tüm veritabanlarının "izole" olarak doğduğunu unutmayın. Erişim sağlanacak bir ağı açıkça ayarlamanız gerekir.

  1. Örneğinizi tıklayın
  2. "Bağlantılar" menüsünü açın
  3. "Ağ iletişimi" sekmesini tıklayın.
  4. Yetkili ağlar'ı tıklayın. Şimdi bir alt ağ ekleyin.
  • Şimdilik uygulamanın çalışması için GÜVENLİ DEĞİL olarak ayarlayalım:
  • Ad: "Dünyadaki herkes - GÜVENLİ DEĞİL" (Bu ucuz çözümün de güvenli olmadığını hatırlatalım).
  • Ağ: "0.0.0.0/0" (Not: Bu GÜVENLİ DEĞİLDİR!)

Kaydet'i tıklayın.

Aşağıdakine benzer bir tablo görürsünüz:

5ccb9062a7071964.png

Not. Bu çözüm, atölyeyi O(saat) içinde bitirmek için iyi bir uzlaşmadır. Ancak, çözümünüzün üretime hazır olması için güvenliğini sağlamak üzere GÜVENLİK dokümanlarını inceleyin.

Veritabanı bağlantısını test etme zamanı!

Daha önce oluşturduğumuz image_catalog kullanıcısının işe yarayıp yaramadığını görelim. Örnekteki Cloud SQL Studio'ya erişin ve kimliği doğrulanacak veritabanı, kullanıcı ve şifreyi aşağıdaki gibi girin:

d56765c6154c11a4.png

Artık SQL Düzenleyici'yi açıp bir sonraki bölüme geçebilirsiniz.

Veritabanını kod tabanından içe aktarma

image_catalog tablolarını verileriyle birlikte içe aktarmak için SQL Editor'ı kullanın. Depodaki sql dosyalarından SQL kodunu alın ve bu dosyaları sırayla birbiri ardına yürütün. 01_schema.sql ve ardından 02_seed.sql.

Ardından, image_catalog içinde aşağıdaki gibi users ve images olmak üzere iki tablo elde edersiniz:

65ba01e4c6c2dac0.png

Düzenleyicide aşağıdakileri çalıştırarak test edebilirsiniz: select * from images;

Ayrıca, herkese açık IP adresini de not edin. Daha sonra bu adrese ihtiyacınız olacak.

4. 2. Modül: PHP uygulamanızı container mimarisine alma

e7f0e9979d8805f5.png

Bu uygulamayı bulut için oluşturmak istiyoruz.

Yani kodu, Cloud'da çalıştırmak için gereken tüm bilgileri içeren bir tür ZIP dosyasına paketlemek gerekir.

Paketlemenin birkaç yolu vardır:

  • Docker Çok popülerdir ancak doğru şekilde ayarlanması oldukça karmaşıktır.
  • Buildpack'ler. Daha az popülerdir ancak ne oluşturulacağını ve nelerin çalıştırılacağını "otomatik olarak tahmin etme" eğilimindedir. Genellikle işe yarar.

Bu atölye çalışması bağlamında, Docker kullandığınızı varsayacağız.

Docker

Kontrolü elinizde tutmak istiyorsanız bu sizin için doğru çözümdür. Belirli kitaplıkları yapılandırmanız ve belirli belirgin olmayan davranışları (yüklemelerde chmod, uygulamanızda standart olmayan bir yürütülebilir dosya vb.) eklemeniz gerektiğinde bu yöntemi kullanabilirsiniz.

Son olarak kapsayıcı uygulamamızı Cloud Run'a dağıtmak istediğimizden aşağıdaki dokümanları inceleyin ve boşlukları doldurmaya çalışın. Şu anda işleri kolaylaştırmak için yalnızca gerekli bilgileri sağlıyoruz. Son Dockerfile'ınız şuna benzer:

# 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 __________

Ayrıca uygulamamızı yerel olarak test etmek için config.php dosyasını, PHP uygulamamızın Google CloudSQL'deki MYSQL veritabanına bağlanacağı şekilde değiştirmemiz gerekiyor. Daha önce ayarladığınız ayarlar doğrultusunda boşlukları doldurun.

  • Db_host, Cloud SQL'in herkese açık IP adresidir. Bu adresi konsolda bulabilirsiniz:

bd27071bf450a8d0.png

  • Db_name değiştirilmelidir: image_catalog
  • Db_user, appmod-phpapp-user olmalıdır
  • Db_pass, sizin seçtiğiniz bir şeydir. Tek tırnak içinde ayarlayın ve gerektiğinde kaçış karakteri ekleyin.
<?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();
?>

Ayrıca Gemini'ın yardımıyla bazı İtalyanca dili İngilizceye çevirebilirsiniz.

Dockerfile'iniz hazır ve PHP uygulamanızı veritabanınıza bağlanacak şekilde yapılandırdınız. Şimdi bunu deneyelim.

Henüz yapmadıysanız Docker'ı yükleyin ( bağlantı). Cloud Shell kullanıyorsanız bu işleme gerek yoktur (Ne kadar da havalı değil mi?).

Şimdi, uygun docker derleme ve çalıştırma komutlarıyla container mimarisine alınmış PHP uygulamanızı derleyip çalıştırmayı deneyin.

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

Her şey çalışıyorsa yerel ana makineye bağlandığınızda aşağıdaki web sayfasını görebilirsiniz.

Cloud Shell kullanıyorsanız yerel bağlantı noktasını (ör. 8080) tarayıcınıza aşağıdaki şekilde de aktarabilirsiniz:

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

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

Uygulamanızın 8080 numaralı bağlantı noktasında çalıştığını öğrendiniz. "Web önizlemesi" simgesini (göz simgesi olan bir tarayıcı) ve ardından 8080 bağlantı noktasında önizle'yi (veya başka bir bağlantı noktası için "Bağlantı noktasını değiştir"i) tıklayın.

33a24673f4550454.png

Sonuçları tarayıcınızda test etme

Uygulamanız şu şekilde görünecektir:

2718ece96b1f18b6.png

Yönetici/yönetici123 olarak giriş yaparsanız da buna benzer bir ekranla karşılaşırsınız.

68b62048c2e86aea.png

Harika. 🎉🎉🎉 işe yarıyor

Docker'ınız iyiyse ancak veritabanı kimlik bilgileri yanlışsa aşağıdaki gibi bir hata mesajı alabilirsiniz:

e22f45b79bab86e1.png

Tekrar deneyin, çok yaklaştınız.

Derleme paketleri [isteğe bağlı]

Buildpack'ler sayesinde uygulama otomatik olarak derlenir. Maalesef tam denetime sahip olmadığınız için beklenmedik yapılandırmayla karşılaşabilirsiniz.

Yerel ortamınızda yeni bir Docker resminiz olmalıdır. Bunun için bir kapsayıcı çalıştırmayı deneyebilirsiniz ancak resmin nasıl oluşturulduğu üzerinde tam kontrolümüz olmadığından uygulama çalışmayabilir. Her durumda, denemeye katılmanızı ve başarılı olursak fikrinizi bizimle paylaşmanızı rica ediyoruz. Teşekkür ederiz.

Artifact Registry'ye kaydetme [isteğe bağlı]

Artık buluta dağıtılmaya hazır, çalışan bir container mimarisine alınmış PHP uygulamanız olmalıdır. İkinci adımda, Docker görüntümüzü bulutta depolayacak ve Cloud Run gibi Google Cloud hizmetlerine dağıtım için erişilebilir hale getirecek bir yere ihtiyacımız var. Bu depolama çözümünün adı Artifact Registry'dir. Docker kapsayıcı görüntüleri, Maven paketleri, npm modülleri ve daha fazlası dahil olmak üzere uygulama yapılarını depolamak için tasarlanmış, tamamen yönetilen bir Google Cloud hizmetidir.

Uygun düğmeyi kullanarak Google Cloud Artifact Registry'de bir depo oluşturalım.

e1123f0c924022e6.png

Geçerli bir ad, biçim ve yapıları depolamaya uygun bir bölge seçin.

4e516ed209c470ee.png

Yerel geliştirme ortamı etiketinize dönün ve uygulama container görüntüsünü az önce oluşturulan Artifact Registry deposuna aktarın. Bunu yapmak için aşağıdaki komutları tamamlayın.

  • docker etiketi SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
  • docker push TARGET_IMAGE[:TAG]

Sonuç, aşağıdaki ekran görüntüsündeki gibi görünmelidir.

1e498feb4e88be9f.png

Aferin 🎉🎉🎉 Bir sonraki seviyeye geçebilirsiniz.

Not. /upload.php uç noktasını da deneyin ve bir resim yüklemeyi deneyin. "İzin reddedildi" mesajını görebilirsiniz. Bu durumda, Dockerfile'da chmod/chown düzeltmesi yapmanız gerekir.

5. 3. Modül: Uygulamayı Cloud Run'a Dağıtma

9ffca42774f6c5d1.png

Neden Cloud Run?

Güzel soru. Yıllar önce kesinlikle Google App Engine'i seçerdiniz.

Basitçe anlatmak gerekirse bugün Cloud Run'ın daha yeni bir teknoloji yığını vardır. Dağıtımı daha kolaydır, daha ucuzdur ve kullanmadığınızda 0'a kadar ölçeklendirilir. Herhangi bir durum bilgisi olmayan kapsayıcıyı çalıştırma esnekliği ve çeşitli Google Cloud hizmetleriyle entegrasyonu sayesinde, mikro hizmetleri ve modern uygulamaları minimum ek maliyet ve maksimum verimlilikle dağıtmak için idealdir.

Daha açık belirtmek gerekirse Cloud Run, Google Cloud'un tümüyle yönetilen bir platformudur. Durum bilgisiz, container mimarisine alınmış uygulamaları sunucusuz bir ortamda çalıştırmanıza olanak tanır. Tüm altyapıyı otomatik olarak yönetir, gelen trafiği karşılamak için ölçeği sıfırdan artırır ve boştayken azaltır. Böylece maliyet etkin ve verimli bir çözüm sunar. Cloud Run, kapsayıcıya paketlenmiş olduğu sürece herhangi bir dili veya kitaplığı destekler. Bu sayede geliştirmede büyük bir esneklik elde edersiniz. Diğer Google Cloud hizmetleriyle iyi entegre olur ve sunucu altyapısını yönetmenize gerek kalmadan mikro hizmetler, API'ler, web siteleri ve olay odaklı uygulamalar oluşturmanıza olanak tanır.

Ön koşullar

Bu görevi tamamlamak için yerel makinenizde gcloud yüklü olmalıdır. Aksi takdirde buradaki talimatları inceleyin. Google Cloud Shell kullanıyorsanız herhangi bir işlem yapmanız gerekmez.

Dağıtmadan önce...

Yerel ortamınızda çalışıyorsanız aşağıdaki

  • $ gcloud auth login –update-adc # not needed in Cloud Shell

Bu işlem, tarayıcınızdaki OAuth girişi aracılığıyla kimliğinizi doğrular. Chrome üzerinden, faturalandırma özelliği etkinleştirilmiş şekilde Google Cloud'a giriş yapan kullanıcıyla (ör. vattelapesca@gmail.com) giriş yaptığınızdan emin olun.

Aşağıdaki komutla Cloud Run API'yi etkinleştirin

  • $ gcloud services enable run.googleapis.com

Bu noktada her şey Cloud Run'a dağıtılmaya hazırdır.

Uygulamanızı gcloud üzerinden Cloud Run'a dağıtma

Uygulamayı Cloud Run'a dağıtmanıza olanak tanıyan komut gcloud run deploy'tır. Hedefinize ulaşmak için ayarlayabileceğiniz çeşitli seçenekler vardır. Minimum ayar aşağıdaki gibidir:

  1. Uygulamanız için dağıtmak istediğiniz Cloud Run Hizmetinin Adı. Cloud Run Hizmeti, uygulamanıza uç nokta sağlayan bir URL döndürür.
  2. Uygulamanızın çalışacağı Google Cloud Bölgesi.
  3. Uygulamanızı sarmalayan Container Görüntüsü.
  4. Uygulamanızın yürütülmesi sırasında kullanması gereken çevre değişkenleri.
  5. Herkesin başka bir kimlik doğrulaması yapmadan uygulamanıza erişmesine izin veren Allow-Unauthenticated işareti

Bu seçeneğin komutunuza nasıl uygulanacağını öğrenmek için belgelere bakın. Dağıtım işlemi birkaç dakika sürer. Her şey doğruysa Google Cloud Console'da buna benzer bir şey görürsünüz.

ef1029fb62f8de81.png

f7191d579c21ca3e.png

Cloud Run tarafından sağlanan URL'yi tıklayın ve uygulamanızı test edin. Kimlik doğrulama işlemi tamamlandığında aşağıdakine benzer bir ekran görürsünüz.

d571a90cd5a373f9.png

"no questions" ile "gcloud run deploy"

gcloud run deploy'ün size doğru soruları sorduğunu ve boşlukları doldurduğunu fark etmiş olabilirsiniz. Bu harika!

Ancak, birkaç modülde bu komutu bir Cloud Build tetikleyicisine ekleyeceğiz. Böylece, sorulara yanıt veremeyiz. Komuttaki tüm seçenekleri doldurmamız gerekir. Altın gcloud run deploy --option1 blah --foo bar --region your-fav-region oluşturmak istiyorsunuz. Nasıl yapacaksınız?

  1. gcloud soru sormayı bırakana kadar 2-3-4 adımlarını tekrarlayın:
  2. [LOOP] Şu ana kadar bulunan seçeneklerle gcloud run deploy
  3. [LOOP] systems ask for option X
  4. [LOOP] --my-option [my-value] seçeneğini ekleyerek X'i CLI'den nasıl ayarlayacağınızı herkese açık dokümanlar bölümünde arayın.
  5. gcloud başka soru sormadan tamamlanmadığı sürece 2. adıma dönün.
  6. Bu gcloud run deploy BLAH BLAH BLAH harika! Komutu bir yere kaydedin. Cloud Build adımı için daha sonra ihtiyacınız olacak.

Olası bir çözüm için burayı inceleyebilirsiniz.

Yaşasın 🎉🎉🎉 Uygulamanızı Google Cloud'a başarıyla dağıttınız ve modernizasyonun ilk adımını attınız.

6. 4. Modül: Secret Manager ile Şifre Temizleme

95cd57b03b4e3c73.png

Önceki adımda Uygulamamızı Cloud Run'da başarıyla dağıtıp çalıştırabildik. Ancak bunu güvenlikle ilgili kötü bir uygulamayla yaptık: Bazı gizli bilgileri açık metin olarak sağladık.

İlk yineleme: ENV'yi kullanmak için config.php dosyanızı güncelleyin

Veritabanı şifresini doğrudan config.php dosyasındaki koda yerleştirdiğimizi fark etmiş olabilirsiniz. Bu, test amacıyla ve uygulamanın çalışıp çalışmadığını görmek için uygundur. Ancak üretim ortamında bu şekilde kod gönderemez/kullanılamazsınız. Şifre (ve diğer veritabanı bağlantısı parametreleri) dinamik olarak okunmalı ve çalışma zamanında uygulamaya sağlanmalıdır. config.php dosyasını, db parametrelerini ENV değişkenlerinden okuyacak şekilde değiştirin. Bu işlem başarısız olursa varsayılan değerleri ayarlayabilirsiniz. Bu, ENV'yi yükleyememeniz durumunda kullanışlıdır. Böylece sayfa çıkışı, varsayılan değerleri kullanıp kullanmadığını size bildirir. Boşlukları doldurun ve config.php dosyasındaki kodu değiştirin.

<?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();
?>

Uygulamanız kapsayıcı içinde olduğundan, ENV değişkenlerini uygulamaya sağlamanın bir yolunu sağlamanız gerekir. Bu, birkaç şekilde yapılabilir:

  • Dockerfile'de derleme sırasında. ENV DB_VAR=ENV_VAR_VALUE söz dizimini kullanarak önceki Dockerfile dosyanıza 4 parametre ekleyin. Bu işlem, çalışma zamanında geçersiz kılınabilecek varsayılan değerler oluşturur. Örneğin, "DB_NAME" ve "DB_USER" buradan ayarlanabilir ve başka hiçbir yerden ayarlanamaz.
  • Çalıştırma sırasında. Bu değişkenleri Cloud Run için hem KSA'dan hem de kullanıcı arayüzünden ayarlayabilirsiniz. 4 değişkeninizin tümünü buraya ekleyebilirsiniz (Dockerfile'da ayarlanan varsayılan değerleri kullanmak istemiyorsanız).

localhost'ta ENV değişkenlerinizi bir .env dosyasına koyabilirsiniz (solutions klasörünü kontrol edin).

Ayrıca .env dosyasının .gitignore dosyanıza eklendiğinden emin olun : Gizli bilgilerinizi Github'a göndermek istemezsiniz.

echo .env >> .gitignore

Ardından örneği yerel olarak test edebilirsiniz:

docker run -it -p 8080:8080 --env-file .env my-php-app-docker

Artık şunları elde ettiniz:

  1. Uygulamanız, değişkeni ENV'nizden dinamik olarak okur.
  2. DB şifresini kodunuzdan kaldırarak güvenliği artırmışsınızdır.)

Artık Cloud Run'a yeni bir düzeltme dağıtabilirsiniz. Kullanıcı arayüzüne gidip ortam değişkenlerini manuel olarak ayarlayalım:

  • https://console.cloud.google.com/run adresine gidin.
  • Uygulamanızı tıklayın
  • "Düzenle ve yeni bir düzeltmeyi dağıt"ı tıklayın
  • İlk sekme olan "Kapsayıcılar"da, alttaki "Değişkenler ve gizli veriler" sekmesini tıklayın.
  • "+ Değişken ekle"yi tıklayın ve gerekli tüm değişkenleri ekleyin. Aşağıdakine benzer bir sonuç elde edersiniz:

7a5fbfa448544d3.png

f2780c35585388ca.png

Bu özellik mükemmel mi? Hayır. PASS'iniz çoğu operatör tarafından hâlâ görülebilir. Bu sorun Google Cloud Secret Manager ile azaltılabilir.

İkinci iterasyon: Secret Manager

Şifreleriniz kendi kodunuzdan kaldırıldı: Zafer! Ama bir dakika, güvende miyiz?

Google Cloud Console'a erişimi olan herkes şifrelerinizi görmeye devam eder. Hatta Cloud Run YAML dağıtım dosyasına erişirseniz bu dosyayı alabilirsiniz. Alternatif olarak, yeni bir Cloud Run düzeltmesini düzenlemeye veya dağıtmaya çalışırsanız şifre, aşağıdaki ekran görüntülerinde gösterildiği gibi Değişkenler ve Gizli Bilgiler bölümünde görünür.

Google Cloud Secret Manager; API anahtarları, şifreler, sertifikalar ve diğer gizli anahtarlar gibi hassas bilgileri yönetmek için kullanılan güvenli ve merkezi bir hizmettir.

Ayrıntılı izinler ve güçlü şifreleme ile gizli anahtarları depolamanıza, yönetmenize ve bunlara erişmenize olanak tanır. Google Cloud Identity and Access Management (IAM) ile entegre olan Secret Manager, belirli gizli anahtarlara kimlerin erişebileceğini kontrol etmenizi sağlayarak veri güvenliği ve düzenlemelere uygunluk sağlar.

Ayrıca otomatik gizli anahtar rotasyonu ve sürümlendirmeyi destekler. Böylece gizli anahtar yaşam döngüsü yönetimini basitleştirir ve Google Cloud hizmetlerindeki uygulamalarda güvenliği artırır.

Gizli Yönetici'ye erişmek için hamburger menüsünden Güvenlik hizmetlerine gidin ve aşağıdaki ekran görüntüsünde gösterildiği gibi Veri Koruma bölümünde bulun.

6df83a1c3cb757f6.png

Bu sayfaya geldiğinizde aşağıdaki resme göre Secret Manager API'yi etkinleştirin.

a96c312e2c098db1.png

  • Şimdi "Gizli anahtar oluştur"u tıklayın: Bu işlemi mantıklı bir şekilde adlandıralım:
  • Ad: php-amarcord-db-pass
  • Gizli anahtar değeri: "DB şifreniz" ("dosya yükleme" bölümünü yoksay).
  • Bu gizli bağlantıyı projects/123456789012/secrets/php-amarcord-db-pass gibi görünecek şekilde ek açıklamayla belirtin. Bu, gizli anahtarınızın benzersiz işaretçisidir (Terraform, Cloud Run ve diğerleri için). Bu numara, benzersiz proje numaranızdır.

İpucu: Soldan sağa özel olarak gizli anahtarlarınız için tutarlı adlandırma kuralları kullanmaya çalışın. Örneğin: cloud-devrel-phpamarcord-dbpass

  • Kuruluş (şirketle birlikte)
  • Ekip (kuruluş içinde)
  • Uygulama (ekip içinde)
  • Değişken adı (uygulama içinde)

Bu sayede, tek bir uygulama için tüm gizli anahtarlarınızı kolayca normal ifadelerle bulabilirsiniz.

Yeni bir Cloud Run düzeltmesi oluşturma

Yeni bir gizli anahtarımız olduğu için DB_PASS ENV değişkenini kaldırıp yeni gizli anahtarla değiştirmemiz gerekiyor. Bu durumda:

  • Google Cloud Console'u kullanarak Cloud Run'a erişim
  • Uygulamayı seçin.
  • "Düzenle ve Yeni Düzeltme Dağıt"ı tıklayın
  • "Değişkenler ve Gizli Anahtarlar" sekmesini bulun.
  • DB_PASS ENV değişkenini sıfırlamak için "+ Gizli bir anahtara referans ver" düğmesini kullanın.
  • Başvuruda bulunulan Gizli Anahtarlar için aynı "DB_PASS" değerini kullanın ve en son sürümü kullanın.

9ed4e35be7654dcb.png

İşlem tamamlandığında aşağıdaki hatayı alırsınız:

da0ccd7af39b04ed.png

Bu sorunu nasıl düzelteceğinizi bulmaya çalışın. Bu sorunu çözmek için IAM ve Yönetici bölümüne erişip izin verme ayarlarını değiştirmeniz gerekir. Hata ayıklamada başarılar!

Sorunu çözdükten sonra Cloud Run'a geri dönün ve yeni bir düzeltmeyi yeniden dağıtın. Sonuç aşağıdaki gibi görünmelidir:

e89f9ca780169b6b.png

İpucu: Geliştirici Konsolu (kullanıcı arayüzü), izin sorunlarını tespit etmek için mükemmel bir araçtır. Cloud varlıklarınızın tüm bağlantılarına göz atın.

7. 5. Modül: CI/CD'nizi Cloud Build ile kurma

ba49b033c11be94c.png

Neden CI/CD ardışık düzeni?

Şimdiye kadar gcloud run deploy simgesini birkaç kez yazmış ve belki de aynı soruyu tekrar tekrar yanıtlamış olabilirsiniz.

Uygulamanızı gcloud run deploy ile manuel olarak dağıtmaktan bıktınız mı? Git deponuza her yeni değişiklik gönderdiğinizde uygulamanızın otomatik olarak dağıtılabilmesi harika olmaz mıydı?

CI/CD ardışık düzenini kullanmak için iki şeye ihtiyacınız vardır:

  1. A Personal Git Repository (Kişisel Git Deposu): Neyse ki 2. adımda atölye deposunu GitHub hesabınıza çatallamış olmalısınız. Aksi halde geri dönüp ilgili adımı tamamlayın. Çatallanan depo aşağıdaki gibi görünecektir: https://github.com/<YOUR_GITHUB_USER>/app-mod-workshop
  2. Cloud Build. Bu şaşırtıcı ve ucuz hizmet, Terraform, dockerized uygulamalar gibi hemen hemen her şey için derleme otomasyonlarını yapılandırmanıza olanak tanır.

Bu bölümde Cloud Build'in kurulumuna odaklanacağız.

Cloud Build'e girin.

Bunu yapmak için Cloud Build'i kullanacağız:

  • Kaynak dosyanızı (Dockerfile ile) derleyin. Bunu, derlemek ve çalıştırmak için ihtiyacınız olan her şeyi içeren bir "büyük .zip dosyası" olarak düşünün ("derleme yapınızı").
  • bu yapıyı Artifact Registry'ye (AR) gönderin.
  • Ardından, "php-amarcord" uygulaması için AR'den Cloud Run'a dağıtım yapın.
  • Bu işlem, mevcut uygulamanın yeni bir sürümünü ("düzeltme") oluşturur (yeni kodu içeren bir katman düşünün). İtme işlemi başarılı olursa trafiği yeni sürüme yönlendirecek şekilde yapılandırırız.

Aşağıda, php-amarcord uygulamam için bazı derlemelere örnek verilmiştir:

f30f42d4571ad5e2.png

Tüm bunları nasıl yapıyoruz?

  1. Tek bir mükemmel YAML dosyası oluşturarak: cloudbuild.yaml
  2. Cloud Build tetikleyicisi oluşturarak.
  3. Cloud Build kullanıcı arayüzü üzerinden GitHub depomuza bağlanarak.

Tetikleyici oluşturma (ve kod deposunu bağlama)

  • https://console.cloud.google.com/cloud-build/triggers adresine gidin.
  • "Tetikleyici Oluştur"u tıklayın.
  • Derleyin:
  • Ad: on-git-commit-build-php-app gibi anlamlı bir ad
  • Etkinlik: Dala aktarım
  • Kaynak: "Yeni depo bağla" alternatif metin
  • Sağ tarafta bir pencere açılır: "Kod deposunu bağla"
  • Kaynak sağlayıcı: "Github" (ilk)
  • "Devam et"
  • Kimlik doğrulama, çapraz kimlik doğrulaması yapmak için GitHub'da bir pencere açar. Akışa uyun ve sabırlı olun. Çok sayıda deponuz varsa bu işlem biraz zaman alabilir.
  • "Repo seçin" Hesabınızı/repo'nuzu seçin ve "Anladım..." bölümünü işaretleyin.
  • Hata aldıysanız: GitHub uygulaması, depolarınızın hiçbirinde yüklü değil. Devam etmek için "Google Cloud Build'i Yükle"yi tıklayın ve talimatları uygulayın.
  • 23e0e0f1219afea3.pngBağlan'ı tıklayın
  • bafd904ec07122d2.png
  • Bingo! Deponuz bağlandı.
  • Tetikleyici bölümüne geri dönelim....
  • Yapılandırma: Otomatik algılama (*)
  • Gelişmiş: "[PROJECT_NUMBER]- compute@developer.gserviceaccount.com" hizmet hesabını seçin.
  • xxxxx, proje kimliğinizdir.
  • Varsayılan Compute hizmet hesabı, laboratuvar yaklaşımı için uygundur. Üretimde kullanmayın. ( Daha fazla bilgi edinin).
  • Diğer her şeyi olduğu gibi bırakın.
  • "Oluştur" düğmesini tıklayın.

(*) Dockerfile veya cloudbuild.yaml dosyasını kontrol ettiği için bu, en basit yöntemdir. Ancak cloudbuild.yaml hangi adımda ne yapacağınıza karar vermeniz için size gerçek bir güç sağlar.

Gücüm var!

Artık Cloud Build hizmet hesabına (hizmet hesabı nedir?) izin vermediğiniz sürece tetikleyici çalışmayacak. Bir görev için sizin adınıza hareket eden "robot"un e-posta adresi (bu durumda, Cloud'da öğe oluşturma).

SA'nız, bunu yapması için yetki vermediğiniz sürece derleme ve dağıtma işlemini yapamaz. Neyse ki bu işlem çok kolay.

  • "Cloud Build" > "Ayarlar"a gidin.
  • "[PROJECT_NUMBER]- compute@developer.gserviceaccount.com" hizmet hesabı
  • Aşağıdaki kutuları işaretleyin:
  • Cloud Run
  • Secret Manager
  • Hizmet Hesapları
  • Cloud Build
  • Ayrıca, "Tercih edilen hizmet hesabı olarak ayarla"yı işaretleyin.

8715acca72286a46.png

Cloud Build YAML'i nerede?

Kendi bulut derleme YAML dosyanızı oluşturmak için biraz zaman ayırmanızı önemle tavsiye ederiz.

Ancak zamanınız yoksa veya zaman ayırmak istemiyorsanız bu çözüm klasöründen ilham alabilirsiniz: .solutions

Artık GitHub'a değişiklik gönderebilir ve Cloud Build'in kendi payına düşeni yaptığını gözlemleyebilirsiniz.

Cloud Build'i ayarlamak zor olabilir. Aşağıdakiler nedeniyle bazı geri bildirimler alabilirsiniz:

  • https://console.cloud.google.com/cloud-build/builds;region=global adresinde günlükleri kontrol etme
  • Hatanızı bulma
  • Kodda düzeltme yapın ve git commit/git push komutunu yeniden çalıştırın.
  • Bazen hata kodda değil, bazı yapılandırmalardadır. Bu durumda, kullanıcı arayüzünden yeni bir derleme yayınlayabilirsiniz (cloud build > "Tetikleyiciler" > Çalıştır).

97acd16980a144ab.png

Bu çözümü kullanırsanız yapmanız gereken bazı işlemler olduğunu unutmayın. Örneğin, yeni oluşturulan geliştirme/ürün uç noktaları için ENV değişkenlerini ayarlamanız gerekir:

3da8723e4ff80c0a.png

Bunu iki şekilde yapabilirsiniz:

  • Kullanıcı arayüzü üzerinden (ENV değişkenlerini tekrar ayarlayarak)
  • KSA üzerinden sizin için "mükemmel" komut dosyasını oluşturarak. Bir örneği burada bulabilirsiniz: gcloud-run-deploy.sh . Örneğin, uç nokta ve proje numarası gibi birkaç şeyi değiştirmeniz gerekir. Proje numaranızı Cloud'a Genel Bakış bölümünde bulabilirsiniz.

Github'a nasıl kod kaydederim?

git push dosyalarını GitHub'a yüklemenin en iyi yolunu öğretmek bu atölyenin kapsamı dışındadır. Ancak, takılıp kalırsanız ve Cloud Shell'deyseniz bunun iki yolu vardır:

  1. KSA. Yerel olarak bir ssh anahtarı ekleyin ve git@github.com:YOUR_USER/app-mod-workshop.git (http yerine) ile uzaktan kumanda ekleyin
  2. VSCode. Cloud Shell düzenleyiciyi kullanıyorsanız Kaynak denetimi (ctrl-shift-G) sekmesini kullanabilir, "Değişiklikleri senkronize et"i tıklayabilir ve talimatları uygulayabilirsiniz. GitHub hesabınızın kimliğini vscode'da doğrulayabilmeniz gerekir. Ardından, oradan çekme/itme işlemini kolayca yapabilirsiniz.

f0d53f839c7fa3b6.png

Diğer dosyalar arasında git add clodubuild.yaml seçeneğini işaretlemeyi unutmayın. Aksi takdirde işlem çalışmaz.

Derin "dev/prod eşleşmesi" ile sığ "dev/prod eşleşmesi" karşılaştırması [isteğe bağlı]

Model sürümünü buradan kopyaladıysanız iki aynı DEV ve PROD sürümü elde edersiniz. Bu, On İki Faktörlü Uygulama'nın 10. kuralı ile uyumlu ve kullanışlıdır.

Ancak, aynı veritabanına işaret eden bir uygulamaya sahip olmak için iki farklı web uç noktası kullanıyoruz. Bu bir atölye için de yeterince yeterli; ancak gerçek hayatta uygun bir üretim ortamı oluşturmak için biraz zaman harcamak istiyorsunuz. Bu, iki veritabanı (biri geliştirme, diğeri üretim için) kullanmanız ve ayrıca olağanüstü durum kurtarma/yüksek kullanılabilirlik için bu veritabanlarının nerede bulunacağını seçmeniz anlamına gelir. Bu konu bu atölyenin kapsamı dışındadır ancak üzerinde düşünmenizi öneririz.

Prodüksiyonun "derin" bir sürümünü oluşturmak için zamanınız varsa lütfen kopyalamanız gereken tüm kaynakları göz önünde bulundurun. Örneğin:

  • Cloud SQL veritabanı (ve muhtemelen SQL örneği).
  • GCS paketi
  • Cloud Functions işlevi.
  • Geliştirme aşamasında model olarak Gemini 1.5 Flash'ı (daha ucuz, daha hızlı) ve Gemini 1.5 Pro'yu (daha güçlü) kullanabilirsiniz.

Genel olarak, uygulamada her işlem yaptığınızda eleştirel düşünün: Üretimin bu değere sahip olup olmaması gerekir mi? Böyle bir durum söz konusu değilse çabanızı tekrarlayın. Bu işlem, elbette Terraform ile çok daha kolaydır. Terraform'da, ortamınızı (-dev, -prod) kaynaklarınıza son ek olarak ekleyebilirsiniz.

8. 6. Modül: Google Cloud Storage'a taşıma

a680e0f287dd2dfb.png

Depolama

Uygulama şu anda durumu bir Docker container'ında depoluyor. Makine bozulur, uygulama patlar veya yeni bir düzeltme gönderirseniz yeni bir düzeltme planlanır ve depolama alanı sıfırlanır (>boş). 🙈

Bunu nasıl düzeltiriz? Çeşitli yaklaşımlar vardır.

  1. Resimleri veritabanında depolayın. Önceki PHP uygulamamda bunu yaptım. Karmaşıklık eklemediği için en basit çözümdür. Ancak kesinlikle veritabanınıza gecikme ve yük ekler.
  2. Cloud Run uygulamanızı depolamaya uygun bir çözüme taşıma: GCE + Kalıcı disk? GKE + Storage olabilir.
  3. GCS'ye geçin. Google Cloud Storage, Google Cloud'un tamamı için sınıfının en iyisi depolama alanı sunar ve en bulutça çözümdür. Ancak bu, PHP kitaplıklarını kullanmamızı gerektirir. GCS için PHP 5.7 kitaplıklarımız var mı? PHP 5.7, Composer'ü destekliyor mu (Composer tarafından desteklenen en eski sürüm PHP 5.3.2 gibi görünüyor)?
  4. Docker yardımcı kullanabilirsiniz.
  5. Dilerseniz GCS Cloud Run Hacim Bağlantıları'nı da kullanabilirsiniz. Kulağa hoş geliyor.

🤔 Depolama alanını taşıma (açık uçlu)

[Açık uçlu] Bu alıştırmada, resimlerinizi kalıcı olacak şekilde taşımak için bir çözüm bulmanızı istiyoruz.

Kabul testi

Çözümü size söylemek istemiyorum ancak şunu yapmanızı istiyorum:

  1. newpic.jpg yüklediniz. Bu bilgileri uygulamada görebilirsiniz.
  2. Uygulamayı yeni bir sürüme yükseltirsiniz.
  3. newpic.jpg hâlâ orada ve görünür durumda.

💡 Olası çözüm (GCS Cloud Run Birim Montajı)

Bu, koda HİÇ dokunmadan durum bilgisine sahip dosya yüklemelerine ulaşmamızı sağlayan çok zarif bir çözümdür (resim açıklaması göstermek dışında, ancak bu önemsiz ve sadece göze hitap eden bir işlemdir).

Bu işlem, Cloud Run'daki bir klasörü GCS'ye bağlamanıza olanak tanır. Bunun için:

  1. GCS'ye yapılan tüm yüklemeler uygulamanızda görünür olacaktır.
  2. Uygulamanıza yapılan tüm yüklemeler aslında GCS'ye yüklenir.
  3. GCS'ye yüklenen nesneler için sihirli bir şey olacak (7. bölüm).

Not. Lütfen FUSE açıklama metnini okuyun. Performans sorunu varsa bu kabul edilemez.

GCS paketi oluşturma

GCS, Google Cloud'un her yerde bulunan depolama hizmetidir. Depolama alanına ihtiyaç duyan her GCP hizmeti tarafından kullanılan bu çözüm, zorlu testlerden geçmiştir.

Cloud Shell'in PROJECT_ID değerini GOOGLE_CLOUD_PROJECT olarak dışa aktardığını unutmayın:

$ 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/"

Cloud Run'u, paketi /uploads/ klasörüne bağlayacak şekilde yapılandırma

Şimdi şık olan bölüme geçelim. php_uploads bir birim oluşturur ve Cloud Run'a MOUNT_PATH (/var/www/html/uploads/ gibi) üzerinde FUSE bağlaması yapmasını talimat veririz:

#!/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"

Ardından, Cloud Storage'a yönlendirmek istediğiniz tüm uç noktalar için bu adımı tekrarlayın.

Aynı işlemi kullanıcı arayüzünden de yapabilirsiniz.

  1. "Hacim" sekmesinde, paketinizi işaret eden "Cloud Storage paketi" türündeki bir Hacim Bağlantısı oluşturun (ör. "php_uploads" adında).
  2. Container'lar > Birim Bağlantıları bölümünde, yeni oluşturduğunuz birimi uygulamanızın istediği birim noktasına bağlayın. Bu, dockerfile'a bağlıdır ancak var/www/html/uploads/ gibi görünebilir.

Her iki durumda da, yeni Cloud Run düzeltmesini düzenlediğinizde aşağıdakine benzer bir görünümle karşılaşırsınız:

6c2bb98fc1b0e077.png

Ardından, /upload.php uç noktasına yeni bir resim yükleyerek yeni uygulamayı test edin.

Görüntüler, tek bir PHP satırı yazmadan GCS'de sorunsuz bir şekilde yayınlanmalıdır:

70032b216afee2d7.png

Ne oldu?

Çok büyülü bir şey oldu.

Eski kod içeren eski bir uygulama hâlâ görevini yapıyor. Yeni ve modern bir yığın, uygulamamızdaki tüm resimleri/resimleri durum bilgisine sahip bir Cloud paketinde rahatça bulundurmamıza olanak tanır. Artık sınır tanımıyorsunuz:

  • "Tehlikeli" veya "çıplak" etiketli bir resim her geldiğinde e-posta göndermek mi istiyorsunuz? Bunu PHP koduna dokunmadan yapabilirsiniz.
  • Her resim geldiğinde açıklamak için bir Gemini Çoklu Modlu model kullanmak ve açıklamayla birlikte veritabanını yüklemek mi istiyorsunuz? Bunu PHP koduna dokunmadan yapabilirsiniz. Bana inanmıyor musunuz? 7. bölüme geçin.

Burada büyük bir fırsat yakaladık.

9. 7. Modül: Uygulamanızı Google Gemini ile destekleme

c00425f0ad83b32c.png

Artık Cloudified depolama alanına sahip, mükemmel, modernleştirilmiş, göz alıcı yeni bir PHP uygulamanız (2024'te Fiat 126 gibi) var.

Ne işe yarar?

Ön koşullar

Önceki bölümde, bir model çözüm, /uploads/ resimlerini GCS'ye bağlamamıza olanak tanıyarak uygulama mantığını resim depolama alanından fiilen ayırdı.

Bu alıştırma için şunları yapmanız gerekir:

  • 6. bölümdeki (depolama) alıştırmayı başarıyla tamamlamış olmanız gerekir.
  • Resim yükleme işlemlerini içeren bir GCS paketiniz olsun. Burada kullanıcılar uygulamanızdan resim yükler, resimler ise paketinize aktarılır.

Cloud Functions işlevi oluşturma (python'da)

Etkinlik odaklı bir uygulamayı nasıl uygulayacağınızı hiç merak ettiniz mi? Örneğin:

  • &lt;event&gt; gerçekleştiğinde => e-posta gönderin
  • <event> gerçekleştiğinde => <condition> doğruysa veritabanını güncelleyin.

Etkinlik, BigQuery'de yeni bir kayıt, GCS'deki bir klasörde değiştirilen yeni bir nesne veya Pub/Sub'da bir sırada bekleyen yeni bir mesaj olabilir.

Google Cloud, bu amaca ulaşmak için birden fazla paradigmayı destekler. Özellikle:

Bu alıştırmada, muhteşem bir sonuç elde etmek için Cloud Functions işlevini inceleyeceğiz. Ayrıca size isteğe bağlı egzersizler sunacağız.

Örnek kodun .solutions/ altında sağlandığını unutmayın.

Cloud Function oluşturma (🐍 python)

Çok iddialı bir EBOB oluşturmaya çalışıyoruz.

  1. GCS'de yeni bir görüntü oluşturulduğunda. (Bunun sebebi ise muhtemelen başka birinin videoyu uygulamaya yüklemiş olmasıdır.
  2. .. Gemini'ı tarif etmesi için çağırın ve resmin metin biçiminde açıklamasını alın .. (MIME'yi kontrol edip PDF, MP3 veya Metin değil, resmi olduğundan emin olmanızı öneririz)
  3. .. ve veritabanını bu açıklamayla güncelleyin. (Bu işlem, images tablosuna description sütunu eklemek için veritabanına yama uygulamayı gerektirebilir).

description resimlere eklemek için veritabanında düzeltme yapma

  1. Cloud SQL Studio'yu açın:

b92b07c4cba658ef.png

  1. Resimler veritabanı için kullanıcı adınızı ve şifrenizi girin
  2. Resim açıklaması için bir sütun ekleyen şu SQL'yi ekleyin:

ALTER TABLE images ADD COLUMN description TEXT;

3691aced78a6389.png

İşte bu. Çalışıp çalışmadığını kontrol etmek için hemen deneyin:

SELECT * FROM images;

Yeni açıklama sütununu göreceksiniz:

bed69d6ad0263114.png

Gemini f(x)'i yazma

Not. Bu işlev aslında Gemini Kod Asistanı yardımıyla oluşturuldu.

Not. Bu işlevi oluştururken IAM izin hatalarıyla karşılaşabilirsiniz. Bazıları aşağıda "Olası hatalar" paragrafında açıklanmıştır.

  1. API'leri etkinleştirme
  2. https://console.cloud.google.com/functions/list adresine gidin.
  3. "İşlev Oluştur"u tıklayın.
  4. API sihirbazından API'leri etkinleştirme:

d22b82658cfd4c48.png

GCF'yi kullanıcı arayüzünden veya komut satırından oluşturabilirsiniz. Burada komut satırını kullanacağız.

Olası bir kodu .solutions/ altında bulabilirsiniz.

  1. Kodunuzu barındıracak bir klasör oluşturun (ör. "gcf/"). Klasöre girin.
  2. requirements.txt dosyası oluşturun:
google-cloud-storage
google-cloud-aiplatform
pymysql
  1. Bir Python işlevi oluşturun. Örnek kod: 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. İşlevi aktarın. Şuna benzer bir komut dosyası kullanabilirsiniz: gcf/push-to-gcf.sh.

1. not. ENV'leri doğru değerlerle sağladığınızdan veya en üste eklediğinizden emin olun (GS_BUCKET=blah, ..):

2. not. Bu işlem, tüm yerel kodu (.) gönderir. Bu nedenle, kodunuzu belirli bir klasöre yerleştirdiğinizden ve büyük kitaplıklar göndermemek için .gcloudignore'ı profesyonelce kullandığınızdan emin olun. ( örnek).

#!/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

Not: Bu örnekte, çağrılan yöntem generate_caption olur ve Cloud işlevi, GCS etkinliğini ilgili tüm bilgilerle (grup adı, nesne adı vb.) iletir. Bu etkinlik python sözlüğünde hata ayıklama işlemini biraz zaman ayırarak yapın.

İşlevi test etme

Birim Testleri

İşlevin birçok hareketli parçası vardır. Tümünü tek tek test etmek isteyebilirsiniz.

Bir örnek gcf/test.py dosyasındadır.

Cloud Functions kullanıcı arayüzü

Ayrıca kullanıcı arayüzünde işlevinizi keşfetmek için biraz zaman ayırın. Her sekme, özellikle de Source (en sevdiğim), Variables, Trigger ve Logs incelenmeye değer. Hataları gidermek için Logs içinde çok zaman harcayacaksınız (Bu sayfanın alt kısmında olası hataları da inceleyin). Ayrıca Permissions öğesini kontrol etmeyi de unutmayın.

cf3ded30d532a2c7.png

E2E Testi

Artık işlevi manuel olarak test edebilirsiniz.

  1. Uygulamanıza gidip giriş yapın
  2. Resim yükleyin (çok büyük değil, büyük resimlerde sorun yaşadık)
  3. resmin yüklendiğini kullanıcı arayüzünde kontrol edin.
  4. Cloud SQL Studio'da açıklamanın güncellenip güncellenmediğini kontrol edin. Giriş yapın ve şu sorguyu çalıştırın: SELECT * FROM images.

43a680b12dbbdda0.png

Bu yöntem kesinlikle işe yarıyor. Ayrıca, bu açıklamayı göstermek için kullanıcı arayüzünü de güncellemek isteyebiliriz.

PHP'yi [isteğe bağlı]göstermek için güncelleme

Uygulamanın çalıştığını kanıtladık. Ancak kullanıcıların bu açıklamayı da görebilmesi iyi olur.

Açıklamayı index.php öğesine eklemek için PHP uzmanı olmamız gerekmez. Bu kod işe yarayacaktır (evet, Gemini bunu benim için de yazdı):

<?php if (!empty($image['description'])): ?>
    <p class="font-bold">Gemini Caption:</p>
    <p class="italic"><?php echo $image['description']; ?></p>
<?php endif; ?>

Bu kodu foreach içine dilediğiniz gibi yerleştirin.

Sonraki adımlarda, Gemini Code Assist sayesinde daha güzel bir kullanıcı arayüzü sürümü de görüyoruz. Güzel bir sürüm şu şekilde görünebilir:

fdc12de0c88c4464.png

Sonuçlar

GCS'ye gelen yeni nesnelerde tetiklenen bir Cloud işleviniz var. Bu işlev, bir insan gibi resmin içeriğine not ekleyebilir ve veritabanını otomatik olarak güncelleyebilir. İnanılmaz!

Sırada ne var? İki muhteşem işlev de elde etmek için aynı mantıktan yararlanabilirsiniz.

[isteğe bağlı] Daha fazla Cloud Functions ekleyin [açık uçlu]

Aklıma birkaç ek özellik geliyor.

📩 E-posta Tetikleyicisi

Bir kullanıcı her resim gönderdiğinde size e-posta gönderen bir e-posta tetikleyici.

  • Çok sık mı? Başka bir kısıtlama daha ekleyin: BÜYÜK resim veya Gemini içeriğinde "çıplaklık/çıplak/şiddet" kelimelerini içeren resimler.
  • Bu konuda EventArc sayfasını inceleyebilirsiniz.

🚫 Uygunsuz resimleri otomatik olarak denetleme

Şu anda bir yönetici, resimleri "uygunsuz" olarak işaretliyor. Gemini'nin ağır işleri üstlenmesine ve alanı denetlemesine ne dersiniz? Uygunsuz tetikleyici içeriği işaretlemek ve veri tabanını önceki işlevde öğrendiğimiz gibi güncellemek için bir test ekleyin. Bu, temel olarak önceki işlevi alıp istemi değiştirmek ve yanıta göre veritabanını güncellemektir.

Uyarı. Üretken yapay zekanın çıkışları tahmin edilemez. Gemini'daki "reklam öğesi çıktılarının" "reklamcılığa" konduğundan emin olun. 0 ile 1 arasında bir güven puanı, JSON gibi belirli bir yanıt isteyebilirsiniz. Bunu birçok şekilde yapabilirsiniz. Örneğin: * pydantic, langchain gibi Python kitaplıklarını kullanın. * Gemini Yapılandırılmış Çıktısı'nı kullanın.

İpucu. ÇOKLU işleviniz veya JSON yanıtı zorunlu kılan tek bir isteminiz olabilir (yukarıda vurgulanan "Gemini Yapılandırılmış Çıktı" ile mükemmel çalışır). Örneğin:

Bu metni oluşturmak için ne tür bir istem kullanıyorsunuz?

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

"İyi bir şey var mı?" gibi analizler elde etmek için istem ek alanları ekleyebilirsiniz. Bu konuda kötü bir şey mi oldu? Bu yeri tanıyor musunuz? Metin var mı (OCR hiç olmadığı kadar kolay):

  • goods: "Lezzetli bir yemek gibi görünüyor"
  • bads: "Sağlıksız bir yiyecek gibi görünüyor"
  • OCR: "Da consumare preferibilmente prima del 10 Novembre 2024"
  • location: "Pescara, Lungomare"

Genellikle N sonucu için N işlevi kullanmak daha iyi olsa da 10 şey yapan bir işlev kullanmak inanılmaz derecede faydalıdır. Nasıl yapabileceğinizi öğrenmek için Riccardo'nun makalesine göz atın.

Olası hatalar (çoğunlukla IAM / izinler)

Bu çözümü ilk geliştirdiğimde bazı IAM izin sorunlarıyla karşılaştım. Bu sorunları empati kurmak ve nasıl düzeltileceğine dair fikir vermek için buraya ekleyeceğiz.

Hata: Hizmet Hesabı için yeterli izin yok

  1. Bir GCS paketini dinleyen bir GCF işlevi dağıtmak için iş için kullandığınız hizmet hesabında uygun izinleri ayarlamanız gerektiğini unutmayın (Şekil 1).

22f51012fa6b4a24.png

EventArc API'lerini de etkinleştirmeniz gerekebilir. Bu API'ler tam olarak kullanıma sunulmadan birkaç dakika önce etkinleştirilmelidir.

Hata: Cloud Run çağırıcısı eksik

  1. GCF izinleri için kullanıcı arayüzünden gelen başka bir yorum (Cloud Run Çağırıcı rolü):

be72e17294f2d3f3.png

Bu hata, resimde fix-permissions.sh'ye benzer bir komut çalıştırılarak düzeltilebilir.

Bu sorun şu adreste açıklanmıştır: https://cloud.google.com/functions/docs/securing/authenticating

Hata: Bellek sınırı aşıldı

İlk kez çalıştırdığımda günlüklerimde şöyle yazıyordu: "Kullanılan 270 MiB ile 244 MiB'lık bellek sınırı aşıldı. Bellek sınırını artırmayı düşünebilirsiniz. https://cloud.google.com/functions/docs/configuring/memory adresine bakın." Yine EBOB'nize RAM ekleyin. Bu işlemi kullanıcı arayüzünde yapmak çok kolaydır. Olası bir sorun:

bed69d6ad0263114.png

Alternatif olarak, Cloud Run dağıtım komut dosyanızı MEM/CPU'yu artıracak şekilde de düzeltebilirsiniz. Bu işlem biraz daha uzun sürer.

Hata: PubSub yayınlandı

GCF v1 ile tetikleyici oluştururken bir kez şu hata oluştu:

e5c338ee35ad4c24.png

Bu sorunu da IAM'ye gidip Hizmet Hesabınıza "Pub/Sub Yayıncı" rolünü vererek kolayca düzeltebilirsiniz.

Hata: Vertex AI kullanılmadı

Bu hatayı alırsanız:

İzin Reddedildi: 403 Vertex AI API, PROJE_ADI adlı projede daha önce kullanılmadı veya devre dışı bırakıldı. https://console.developers.google.com/apis/api/aiplatform.googleapis.com/overview?project=YOR_PROJECT adresini ziyaret ederek etkinleştirin.

Bunun için Vertex AI API'lerini etkinleştirmeniz yeterlidir. Gerekli TÜM API'leri etkinleştirmenin en kolay yolu şudur:

  1. https://console.cloud.google.com/vertex-ai
  2. "Önerilen tüm API'leri etkinleştir"i tıklayın.

492f05ac377f3630.png

Hata: EventArc tetikleyicisi bulunamadı.

Bu hatayı alırsanız lütfen işlevi yeniden dağıtın.

8ec4fc11833d7420.png

Hata: 400 hizmet aracısı için temel hazırlığı yapılıyor

400 hizmet aracısı hazırlanıyor ( https://cloud.google.com/vertex-ai/docs/general/access-control#service-agents ). Sağlanan Cloud Storage dosyasını okumak için hizmet aracılarına ihtiyaç vardır. Lütfen birkaç dakika sonra tekrar deneyin.

Böyle bir durumla karşılaşırsanız biraz bekleyin veya bir Google çalışanına sorun.

10. 8. Modül: Stok durumu hizmet düzeyi hedefleri oluşturma

Bölümde bunu başarmaya çalışıyoruz:

  1. SLI'lar oluşturuluyor
  2. SLI'lere göre SLO oluşturma
  3. SLO'lara Dayalı Uyarılar oluşturma

f63426182c052123.png

Riccardo, Google Cloud'un SRE / DevOps alanında çalıştığı için bu konu yazar için çok değerli bir konudur.

(açık uçlu) Bu uygulama için SLI'lar ve SLO'lar oluşturun

Ne zaman çalışmadığını anlayamadığınızda bir uygulama ne kadar iyidir?

SLO nedir?

Eyvah! SLO'lar Google tarafından icat edildi! Bu konu hakkında daha fazla bilgi edinmek için şunları önerebilirim:

1. Adım: Kullanılabilirlik SLI/SLO'su oluşturun

Ölçmek istediğiniz en kolay ve muhtemelen en önemli şey olduğu için kullanılabilirlik hizmet düzeyi hedefi ile başlayalım.

Neyse ki Cloud Run, Istio sayesinde önceden oluşturulmuş SLO desteğine sahip.

Uygulamanız Cloud Run'da olduğunda bunu yapmak çok kolaydır. Bu işlem 30 saniye sürer.

  • Cloud Run sayfanıza gidin.
  • Uygulamanızı tıklayın/seçin.
  • SLOs sekmesini seçin.
  • "+ SLO Oluştur"u tıklayın.
  • Kullanılabilirlik, İstek tabanlı
  • Devam
  • Takvim ayı / %99.
  • "Hizmet düzeyi hedefi oluştur"u tıklayın.

e471c7ebdc56cdf6.png

2. Adım: Bu hizmet düzeyi hedefi için uyarı ayarlarını yapın

2 uyarı oluşturmanızı öneririm:

  1. Sizi e-postayla uyaracak düşük bir harcama oranı ("Yavaş harcama") olan bir kampanya (düşük öncelikli bileti simüle eder).
  2. Sizi SMS aracılığıyla uyarmak için yüksek bir kullanım oranı ("Hızlı Kullanım") olan bir tanesi (yüksek öncelikli bileti/çağrı cihazını simüle eder)

Önceki SLO tab sayfanıza gidin.

Bunu iki kez yapın:

314bfd6b9ef0a260.png

  • "SLO Uyarısı Oluştur"u tıklayın (sağda, içinde artı işareti olan 🔔 düğmesi)
  • Yeniden inceleme süresi, Tüketme hızı eşiği:
  • [HIZLI]. İlk: 60 dk. / 10 x
  • [SLOW]. Saniye: 720 dk. / 2 x
  • Bildirim kanalı: Bildirim kanallarını yönet'i tıklayın.
  • Öncelikle "E-posta" -> Yeni ekle -> ..
  • İkincisi, "SMS" -> Yeni ekle -> Telefonda doğrula.
  • İpucu: Adlarda emoji kullanmayı seviyorum. Demolar için eğlenceli bir yöntemdir.
  • İşiniz bittiğinde sağ üstteki büyük X'i tıklayın.
  • Önce telefonu seç (hızlı), sonra e-posta gönder (yavaş).
  • Aşağıdakiler gibi bazı örnek dokümanlar ekleyin:
  • [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.

Bingo!

Nihai sonuç

1 çalışan hizmet düzeyi hedefi ve müsaitlik durumunuz için 2 uyarı oluşturduktan ve bu uyarılar e-postanıza ve telefonunuza gönderilmeye başladıktan sonra bu alıştırmayı tamamlamış sayılırsınız.

İsterseniz bir gecikme (bunu yapmanızı önemle tavsiye ederiz) veya daha da karmaşık bir gecikme ekleyebilirsiniz. Gecikme için makul olduğunu düşündüğünüz bir gecikme süresi seçin. Şüphe duyuyorsanız 200 ms'yi seçin.

11. Sonraki adımlar

HER ŞEYİ tamamladınız. Eksik olan nedir?

Üzerinde düşünmeniz gereken bazı noktalar:

Gemini ile oynama

Gemini'yi iki şekilde kullanabilirsiniz:

  1. Vertex AI. 7. bölümde (GCF+Gemini) incelediğimiz, GCP'nizle iç içe geçen "kurumsal yöntem". Tüm kimlik doğrulama işlemleri sorunsuz bir şekilde çalışır ve hizmetler birbirine mükemmel şekilde bağlanır.
  2. Google Yapay Zeka "Tüketici yolu". Burada bir Gemini API anahtarı alır ve mevcut iş yükünüze (tescilli çalışma, diğer bulutlar, yerel ana makine vb.) bağlanabilecek küçük komut dosyaları oluşturmaya başlarsınız. API anahtarınızı yerine koymanız yeterlidir ve kod sihirli bir şekilde çalışmaya başlar.

Kendi özel projelerinizi kullanarak (2) seçeneğini keşfetmenizi öneririz.

Kullanıcı Arayüzü Geliştirme

Kullanıcı arayüzleri konusunda iyi değilim. Ancak Gemini öyle. Tek bir PHP sayfası alıp şöyle bir şey söyleyebilirsiniz:

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!]

Bu işlemi 5 dakikadan kısa sürede, tek bir Cloud Build ile kolayca yapabilirsiniz. :)

Gemini'nin yanıtı mükemmeldi (yani hiçbir şeyi değiştirmem gerekmedi):

8a3d5fe37ec40bf8.png

Yazarın kişisel uygulamasındaki yeni düzeni de burada görebilirsiniz:

81620eb90ae3229a.png

Not: Sizi kodu almaya teşvik etmek istemediğimiz için kod resim olarak yapıştırılmıştır. Ancak Gemini'ın kodu sizin yerinize kendi reklam öğesi kullanıcı arayüzü/ön uç kısıtlamalarıyla yazmasını sağlamak istiyorsanız sadece çok küçük değişiklikler yapmanız gerekir.

Güvenlik

Bu 4 saatlik atölyenin amacı, bu uygulamayı gerektiği gibi güvence altına almak değildir.

Fikir edinmek için SECURITY doc sayfasını inceleyin.

12. Tebrikler!

Tebrikler 🎉🎉🎉 eski PHP uygulamanızı Google Cloud ile başarıyla modernleştirdiniz.

24cb9a39b1841fbd.png

Özet olarak, bu codelab'de şunları öğrendiniz:

  • Google Cloud SQL'de MySQL veritabanı dağıtma ve mevcut veritabanınızı bu veritabanına taşıma.
  • PHP uygulamanızı Docker ve Buildpacks ile container mimarisine alma ve görüntüsünü Google Cloud Artifact Registry'de depolama
  • Container mimarisine alınmış Uygulamanızı Cloud Run'a dağıtma ve Cloud SQL ile çalıştırma
  • Google Secret Manager'ı kullanarak hassas yapılandırma parametrelerini (ör. veritabanı şifresi) gizli olarak depolama/kullanma
  • GitHub deponuza yapılan her kod aktarımında PHP uygulamanızı otomatik olarak derleyip dağıtmak için Google Cloud Build ile CI/CD ardışık düzeninizi ayarlama.
  • Uygulama kaynaklarınızı "bulutlaştırmak" için Cloud Storage'ı kullanma
  • Uygulama kodunuza dokunmadan Google Cloud'da muhteşem iş akışları oluşturmak için sunucusuz teknolojilerden nasıl yararlanabilirsiniz?
  • Uygun bir kullanım alanı için Gemini'nin çoklu formatlı özelliklerini kullanın.

Bu, Google Cloud ile uygulama modernleştirme yolculuğunuza mükemmel bir başlangıç oldu.

🔁 Geri bildirim

Bu atölyeyle ilgili deneyiminizden bahsetmek isterseniz bu geri bildirim formunu doldurabilirsiniz.

Özellikle gurur duyduğunuz kod parçalarıyla ilgili geri bildirimlerinizi ve PR'lerinizi bekliyoruz.

🙏 Teşekkürler

Yazar, çözümün yazılması ve test edilmesi konusundaki yardımları için Datatonic'ten Mirko Gilioli ve Maurizio Ipsale'ye teşekkür eder.