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 modernize ederiz?

(📽️ 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ındır. Bu, bunları ölçeklenebilir, güvenli ve farklı ortamlarda dağıtılabilir hale getirmek anlamına gelir.

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) ve Secret Manager ile uygulamayı güvenle koruyun.
  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 üzerinden Üretken Yapay Zeka işlevini kullanıma sunun.
  8. SLOs 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çiş yaptığınızda güçlü altyapısından ve hizmetlerinden yararlanarak uygulamanızın bulutta yerel bir ortamda sorunsuz şekilde çalışmasını sağlayabilirsiniz.

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 resim içerir. Giriş yapmış kullanıcılar yeni resimler 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 deponuzla dallandırmak için bu komuta 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ölyeyi yerel bilgisayarınızdan kullanabilir veya tamamen tarayıcıda tamamlayabilirsiniz.

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 yepyeni 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 ile karşılaşmamış 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 vardır.

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. Yeni başlayan biriyseniz veya her şeyi bulut ortamında yapmak istiyorsanız Cloud Shell'e ve düzenleyicisine aşağıdaki gibi sol üst köşedeki düğmeyi kullanarak 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. Öğeleri istediğiniz gibi düzenleyin.

734e51bfc29ee5df.png

  1. Uygulama kodunu şunu kullanarak klonlayın:
  2. git clone 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

Bunu görsel olarak yapmak için "Klasörü Aç"ı tıklayıp klasörü (muhtemelen ana klasörünüzdeki app-mod-workshop) seçebilirsiniz.

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

645902e511a432a6.png

Google Cloud SQL örneğini oluşturma

PHP uygulamamız bir MySQL veritabanına bağlanacağından, sorunsuz bir taşıma işlemi için bu veritabanını 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. Şu adımları uygulayın:

  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ştir'i tıklayın (gerekirse). Bu işlem birkaç saniye sürebilir.
  4. MySQL'i seçin.
  5. (Daha uzun ömürlü olması için size en ucuz sürümü göndermeye çalışıyoruz):
  • Sürüm: Enterprise
  • Önceden ayar: geliştirme (Korumalı alanı denedik ancak bizim için işe yaramadı)
  • Mysql Sürümü: 5.7 (vay be, geçmişe yolculuk!)
  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: İstediğiniz şifreyi girin ancak CLOUDSQL_INSTANCE_PASSWORD olarak not edin.
  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 sayfayı 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: Önceden oluşturulan tablolara veri eklemek 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 "yalıtılmış" olarak oluşturulduğ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"ın altındaki bölümü tıklayın. Ardından bir ağ (ör. alt ağ) ekleyin.
  • Şimdilik, uygulamanın çalışması için hızlı ancak GÜVENLİ DEĞİL bir ayar seçelim. Daha sonra bu ayarı güvendiğiniz IP'lerle kısıtlamak isteyebilirsiniz:
  • Ad: "Everyone in the world - INSECURE".
  • Ağ: "0.0.0.0/0" (Not: Bu, GÜVENLİ OLMAYAN bölümdür.)
  • BİTTİ'yi tıklayın.
  1. 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 Düzenleyici'yi kullanın. Depodaki dosyalardan SQL kodunu ( 01_schema.sql ve ardından 02_seed.sql) kopyalayıp sırayla tek tek çalıştırın.

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, Cloud SQL örneğinin herkese açık IP adresini not ettiğinizden emin olun. Bu bilgiye daha sonra ihtiyacınız olacak. IP'yi almak için Genel bakış sayfasının altındaki Cloud SQL örneği ana sayfasına gidin. (Genel Bakış > Bu Örneğe Bağlan > Herkese Açık IP Adresi).

4. 2. Modül: PHP uygulamanızı kapsayıcıya 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.

Cloud Shell'i kullanmayı seçtiyseniz şimdi yeniden açabilirsiniz (Cloud Console'un sağ üst kısmını tıklayın).

ec6a6b90b39e03e.png

Bu işlem, sayfanın alt kısmında uygun bir kabuk açar. Kurulum adımında kodu buradan ayırmış olmanız gerekir.

6999b906c0dedeb7.png

Docker

Kontrol sahibi olmak 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ıya alınmış uygulamamızı Cloud Run'a dağıtmak istediğimizden aşağıdaki dokümanları inceleyin. Bunu php 8'den PHP 5.7'ye nasıl geri taşıyabilirsiniz? Bunun için Gemini'yi kullanabilirsiniz. Alternatif olarak, önceden derlenmiş bu sürümü kullanabilirsiniz:

fbd8c2ace2faa70b.png

En son Dockerfile sürümüne buradan ulaşabilirsiniz.

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 bilgilere göre boşlukları doldurun:

<?php
// Database configuration
$db_host = '____________';
$db_name = '____________';
$db_user = '____________';
$db_pass = '____________';

try {
    $pdo = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die("Errore di connessione: " . $e->getMessage());
}

session_start();
?>
  • DB_HOST, Cloud SQL'in herkese açık IP adresidir. Bu adresi SQL konsolunda bulabilirsiniz:

bd27071bf450a8d0.png

  • DB_NAME değişmemelidir: image_catalog
  • DB_USER, appmod-phpapp-user olmalıdır
  • DB_PASS, seçtiğiniz bir öğedir. Tek tırnak içinde ayarlayın ve gerektiğinde kaçış karakteri ekleyin.

Ayrıca, 🇮🇹 İtalyanca olan birkaç parçayı Gemini ile İngilizceye çevirebilirsiniz.

Tamam, Dockerfile'yi edindiniz ve PHP uygulamanızı veritabanınıza bağlanacak şekilde yapılandırdınız. Şimdi bunu deneyelim.

Henüz yüklü değilse 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.

# Build command - don't forget the final . This works if Dockerfile is inside the code folder:
$ docker build -t my-php-app-docker .   

# Local Run command: most likely ports will be 8080:8080
$ docker run -it -p <CONTAINER_PORT>:<LOCAL_MACHINE_PORT> my-php-app-docker

Her şey yolunda giderse yerel ana makineye bağlandığınızda aşağıdaki web sayfasını görebilirsiniz. Uygulamanız artık 8080 bağlantı noktasında çalışıyor. "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/admin123 ile giriş yaparsanız aşağıdakine benzer bir ekran görürsünüz.

68b62048c2e86aea.png

Harika. İtalyanca metin dışında her şey çalışı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.

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. Ardından, Docker görüntümüzü depolayacak ve Cloud Run gibi Google Cloud hizmetlerine dağıtılabilmesi için erişilebilir hale getirecek bir bulut alanına 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 kapsayıcı görüntüsünü yeni oluşturulan Artifact Registry deposuna aktarın. Bunu yapmak için aşağıdaki komutları uygulayın.

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

Sonuç aşağıdaki ekran görüntüsüne benzer şekilde görünecektir.

1e498feb4e88be9f.png

Aferin 🎉🎉🎉 Sonraki seviyeye geçebilirsiniz. O zamana kadar 2 dakikanızı ayırıp yükleme/giriş yapma/çıkış yapma işlemlerini deneyebilir ve uygulama uç noktalarıyla tanışabilirsiniz.Bunlara daha sonra ihtiyacınız olacak.

Olası hatalar

Kapsayıcı oluşturma hataları alırsanız hatayı açıklamak ve düzeltmek için Gemini'yi kullanmayı deneyin. Bunun için aşağıdaki bilgileri sağlayın:

  • Mevcut Dockerfile'iniz
  • Alınan hata
  • [gerekirse] yürütülen PHP kodu.

Yükleme İzinleri'ni seçin. /upload.php uç noktasını da deneyin ve bir resim yüklemeyi deneyin. Aşağıdaki hatayı alabilirsiniz. Bu durumda, Dockerfile'da chmod/chown düzeltmesi yapmanız gerekir.

Uyarı: move_uploaded_file(uploads/image (3).png): failed to open stream: Permission denied in /var/www/html/upload.php on line 11

PDOException "could not find driver" (veya "Errore di connessione: could not find driver"). Veritabanına bağlanmak için Dockerfile'inizde mysql (pdo_mysql) için uygun PDO kitaplıklarının bulunduğundan emin olun. Buradaki çözümlerden ilham alabilirsiniz.

İsteğiniz arka uç bir sunucuya yönlendirilemedi. 8080 numaralı bağlantı noktasındaki bir sunucuya bağlanamadı. Bu, muhtemelen yanlış bağlantı noktasını gösterdiğiniz anlamına gelir. Apache/Nginx'in gerçekte sunulduğu bağlantı noktasını gösterdiğinizden emin olun. Bu durum önemsiz değildir. Mümkünse bu bağlantı noktasını 8080 olarak ayarlayın (Cloud Run ile hayatınızı kolaylaştırır). 80 numaralı bağlantı noktasını kullanmak istiyorsanız (ör. Apache bunu istediği için) çalıştırmak için farklı bir komut kullanın:

$ docker run -it -p 8080:80 # force 80

# Use the PORT environment variable in Apache configuration files.

# https://cloud.google.com/run/docs/reference/container-contract#port

RUN sed -i 's/80/${PORT}/g' /etc/apache2/sites-available/000-default.conf /etc/apache2/ports.conf

5. 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 söylemek gerekirse, Cloud Run'un günümüzde daha yeni bir teknoloji grubu var. Ayrıca, dağıtımı daha kolay, daha ucuz ve kullanmadığınızda 0'a kadar ölçeklenebilir. 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 ayrıntılı olarak belirtmek gerekirse Cloud Run, Google Cloud tarafından sunulan ve durum bilgisiz container'lara alınmış uygulamaları sunucusuz bir ortamda çalıştırmanızı sağlayan, tümüyle yönetilen bir platformdur. 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ızda bir 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 komutu kullanarak Cloud Run API'yi etkinleştirin:

  • $ gcloud services enable run.googleapis.com cloudbuild.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 seçenek grubu (komut satırı üzerinden sağlayabilir veya araç size etkileşimli istemle sorabilir) şunlardır:

  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. (--region BÖLGE)
  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 komut satırınıza nasıl uygulanacağını öğrenmek için dokümanlara bakın (veya olası bir çözüm için aşağı kaydırı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ıktan sonra aşağıdakine benzer bir ekran görürsünüz.

d571a90cd5a373f9.png

Bağımsız değişken içermeyen"gcloud run deploy"

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

Ancak birkaç modülde bu komutu bir Cloud Build tetikleyicisine ekleyeceğiz. Böylece etkileşimli sorulara yer veremeyiz. Komuttaki her seçeneği doldurmamız gerekiyor. 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] gcloud run deploy with options found so far
  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 tamamlanmazsa 2. adıma geri 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. Dokümanlar burada.

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ırdık. Ancak bunu güvenlikle ilgili kötü bir uygulamayla yaptık: Bazı gizli bilgileri açık metin olarak sağladık.

İlk iterasyon: config.php dosyanızı ENV'yi kullanacak şekilde 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. ENV'yi yükleyememeniz durumunda bu durum faydalıdır. Böylece sayfa çıkışı, varsayılan değerlerin kullanılıp kullanılmadığını size bildirir. Boşlukları doldurun ve config.php dosyasında kodu değiştirin.

<?php
// Database configuration with ENV variables. Set default values as well 
$db_host = getenv('DB_HOST') ?: 'localhost';
$db_name = getenv('DB_NAME') ?: 'image_catalog';
$db_user = getenv('DB_USER') ?: 'appmod-phpapp-user';
$db_pass = getenv('DB_PASS') ?: 'wrong_password';
// Note getenv() is PHP 5.3 compatible
try {
    $pdo = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die("Errore di connessione: " . $e->getMessage());
}

session_start();
?>

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 aşağıdakileri başardınız:

  1. Uygulamanız, değişkeni ENV'nizden dinamik olarak okur.
  2. Kodunuzdan veritabanı şifresini kaldırdığınız için güvenliği iyileştirmişsinizdir.)

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
  • "Yeni düzeltmeyi düzenle ve 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 mükemmel mi? Hayır. PASS'iniz çoğu operatör tarafından hâlâ görülebilir. Bu risk, Google Cloud Secret Manager ile azaltılabilir.

İkinci iterasyon: Secret Manager

Şifreleriniz kendi kodunuzdan kaldırıldı. Zafer sizindir. Ama bekleyin. Hâlâ güvende miyiz?

Şifreleriniz, Google Cloud Console'a erişimi olan herkes tarafından görülebilir. 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 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'un Identity and Access Management (IAM) ile entegre olan Gizli Anahtar Yöneticisi, belirli gizli anahtarlara kimlerin erişebileceğini kontrol etmenize olanak tanıyarak veri güvenliğini ve yasal uygunluğu 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: "Veri tabanı şifreniz" ("Dosya yükle" kısmını yoksayın).
  • Bu gizli bağlantıyı annotate edin. projects/123456789012/secrets/php-amarcord-db-pass gibi görünmelidir. 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: Gizli anahtarlarınız için tutarlı bir adlandırma kuralı kullanmaya çalışın. Örneğin, soldan sağa doğru uzmanlaşma: 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 uygulamaya ait tüm anahtarlarınızı bulmak için kolay normal ifade kullanabilirsiniz.

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.
  • "Yeni Düzeltmeyi Düzenle ve 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şvurulan Gizli Bilgiler için aynı "DB_PASS" değerini ve en son sürümü kullanın.

9ed4e35be7654dcb.png

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

da0ccd7af39b04ed.png

Sorunun nasıl düzeltileceğini 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ıklama işleminde başarılar dileriz.

Sorunu çözdükten sonra Cloud Run'a dönüp yeni bir düzeltme yayınlayabilirsiniz. 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: Cloud Build ile CI/CD'nizi ayarlama

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. Kişisel Git Deposu: Neyse ki 2. adımda atölye deposunu GitHub hesabınıza dallandırmış olmanız gerekir. Aksi halde geri dönüp ilgili adımı tamamlayın. Çatallanan deponuz şu şekilde görünmelidir: https://github.com/<YOUR_GITHUB_USER>/app-mod-workshop
  2. Cloud Build. Bu şaşırtıcı ve ucuz hizmet, hemen hemen her şey için derleme otomasyonlarını yapılandırmanıza olanak tanır: Terraform, docker'lı uygulamalar vb.

Bu bölümde Cloud Build'i ayarlamaya 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.
  • Derleme:
  • Ad: on-git-commit-build-php-app gibi anlamlı bir ad
  • Etkinlik: Dala aktarım
  • Kaynak: "Connect new repository" alternatif metin
  • Sağ tarafta "Depo bağla" penceresi açılır.
  • 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: GitHub Uygulaması, hiçbir deponuzda kurulu değil. "Google Cloud Build'i yükle"yi tıklayıp 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. Bu hesabı üretimde kullanmayın. ( Daha fazla bilgi)
  • 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 verme konusunda size gerçek bir güç verir.

Gücüm bana yeter.

Artık Cloud Build hizmet hesabına (hizmet hesabı nedir? 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ı da 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 oluşturabilirsiniz (cloud build > "Tetikleyiciler" > Çalıştır).

97acd16980a144ab.png

Bu çözümü kullanırsanız daha yapılması gereken bazı işlemler olduğunu unutmayın. Örneğin, yeni oluşturulan dev/prod 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
  • CLI ü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 gönderirim?

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

  1. CLI. Yerel olarak bir ssh anahtarı ekleyin ve git@github.com:KULLANICINIZ/uygulama-mod-workshop.git (http yerine) ile uzak bir anahtar 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ünüz olur. 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 çalıştay için yeterlidir ancak gerçek hayatta uygun bir üretim ortamı oluşturmak için biraz zaman harcamanız gerekir. 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 üretim aşamasında Gemini 1.5 Pro'yu (daha güçlü) kullanabilirsiniz.

Genel olarak, uygulamayla ilgili her işlem yaptığınızda eleştirel bir şekilde düşünün: Üretimde bu değer aynı olmalı mı yoksa farklı mı? Aksi takdirde, çabalarını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

dc3a4b8ea92aaef6.png

Uygulama şu anda durumu bir Docker kapsayıcısında depoluyor. Makine bozulur, uygulama patlar veya yeni bir düzeltme gönderirseniz yeni ve boş bir depolama alanı içeren yeni bir düzeltme planlanır: 🙈

Bu sorunu nasıl çözeriz? Bunun için birkaç yaklaşım vardır.

  1. Resimleri veritabanında depolayın. Önceki PHP uygulamamda bunu yaptım. Karmaşıklık katmadığı için en basit çözümdür. Ancak bu işlem, veritabanınıza kesinlikle gecikme ve yük ekler.
  2. Cloud Run uygulamanızı depolamaya uygun bir çözüme taşıma: GCE + Kalıcı disk? GKE + Depolama Alanı olabilir mi? Not: Kontrolde kazandığınızı çeviklikte kaybedersiniz.
  3. GCS'ye taşıyın. Google Cloud Storage, Google Cloud'un tamamı için sınıfının en iyisi depolama alanı sunar ve en bulut dilinde çözümdür. Ancak bu işlem için PHP kitaplıklarını kullanmamız gerekir. 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 sidecar kullanabilir misiniz?
  5. Dilerseniz GCS Cloud Run Hacim Bağlantıları'nı da kullanabilirsiniz. Bu harika.

🤔 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 dosyasını yüklersiniz. Bu bilgileri uygulamada görebilirsiniz.
  2. Uygulamayı yeni bir sürüme yükseltebilirsiniz.
  3. newpic.jpg hâlâ orada ve görünür durumda.

💡 Olası çözüm (GCS Cloud Run Birim Bağlantıları)

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 aslında uygulamanızda görünü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'in küçük yazılarını 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'yi 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ızı sağlıyor. Artık sınır tanımıyorsunuz:

  • "Tehlikeli" veya "çıplak" etiketi içeren bir resim her geldiğinde e-posta göndermek mi istiyorsunuz? Bunu PHP koduna dokunmadan yapabilirsiniz.
  • Her resim geldiğinde Gemini çok modlu modelini kullanarak resmi açıklamak 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ın kapısını araladık.

9. 7. Modül: Uygulamanızı Google Gemini ile güçlendirin

c00425f0ad83b32c.png

Artık Cloud depolama alanına sahip, modernleştirilmiş, yeni ve muhteşem bir PHP uygulamanız (2024 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.
  • Kullanıcıların uygulamanıza yüklediği resimlerin GCS paketinize aktarıldığı bir resim yükleme paketiniz olmalıdır.

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

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

  • <event> gerçekleştiğinde => e-posta gönder
  • <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, oldukça etkileyici bir sonuç elde etmek için Cloud Functions'ı ayrıntılı olarak inceleyeceğiz. Ayrıca size isteğe bağlı egzersizler sunacağız.

Örnek kodun .solutions/ bölümünde sağlandığını unutmayın.

Cloud Function oluşturma (🐍 python)

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

  1. GCS'de yeni bir resim oluşturulduğunda.. (muhtemelen bir kullanıcı tarafından uygulamaya yüklenmesinden dolayı, ancak bununla sınırlı değildir)
  2. .. Gemini'yi arayıp açıklamasını isteyin ve resmin metin açıklamasını alın .. (MIME'yi kontrol edip PDF, MP3 veya metin değil, resim olduğundan emin olun.)
  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 yama 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örürsünüz:

bed69d6ad0263114.png

Gemini f(x) yazın

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. Aşağıdakine 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. ( example).

#!/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 tekil öğeleri 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 (favorim), Variables, Trigger ve Logs keşfedilmeye değer. Hataları gidermek için Logs'te çok zaman geçireceksiniz (bu sayfanın alt kısmındaki olası hataları da inceleyin). Permissions'i de kontrol etmeyi unutmayın.

cf3ded30d532a2c7.png

E2E Testi

İşlevi manuel olarak test etme zamanı.

  1. Uygulamanıza gidip giriş yapın
  2. Bir resim yükleyin (çok büyük olmamalıdır, büyük resimlerle ilgili sorunlarla karşılaştık)
  3. Kullanıcı arayüzünde resmin yüklenip yüklenmediğini 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österecek şekilde 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 dosyasına 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 ek açıklama ekleyebilir ve veritabanını otomatik olarak güncelleyebilir. İnanılmaz!

Sırada ne var? İki harika işleve ulaşmak için aynı mantığı uygulayabilirsiniz.

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

Birkaç ek özellikten bahsedebiliriz.

📩 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 önceki işlevde öğrendiğimiz gibi veritabanını 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'den gelen "reklam öğesi çıkışının" "raylara" yerleştirildiğinden 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
}

İstem kutusuna ek alanlar ekleyerek "Bu konuda iyi bir şey var mı?" gibi analizler elde edebilirsiniz. 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. Anlayış göstermek ve nasıl düzeltileceğine dair fikir vermek için bunları 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, resimdeki komutu çalıştırarak (fix-permissions.sh'ye benzer) düzeltilebilir.

Bu sorun şu adreste açıklanmaktadı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 "244 MiB'lik bellek sınırı 270 MiB kullanılarak aşıldı. Bellek sınırını artırmayı düşünebilirsiniz. https://cloud.google.com/functions/docs/configuring/memory adresine bakın." GCF'nize tekrar 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'a gidip hizmet hesabınıza "Pub/Sub Yayıncısı" rolünü vererek kolayca düzeltebilirsiniz.

Hata: Vertex AI kullanılmadı

Bu hatayı alırsanız:

İzin Reddedildi: 403 Vertex AI API, PROJE_ADI 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ırlama işlemi 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

Bu bölümde şu hedeflere ulaşmaya çalışıyoruz:

  1. SLI oluşturma
  2. SLI'lere göre SLO oluşturma
  3. SLO'lara dayalı uyarı oluşturma

f63426182c052123.png

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

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

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

Hizmet düzeyi hedefi nedir?

Eyvah! Google, SLO'ları icat etti. 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ğiyle birlikte gelir.

Uygulamanız Cloud Run'da olduğunda bunu yapmak çok kolaydır. Bu işlem 30 saniyemi alıyor.

  • 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 kullanım oranı ("Fastburn") olan bir tane (yüksek öncelikli bileti / pager'ı simüle eder)

Önceki SLO tab hesabınıza gidin.

Bunu iki kez yapın:

314bfd6b9ef0a260.png

  • "SLO Uyarısı Oluştur"u (sağ tarafta, içinde artı işareti olan 🔔 düğmesi) tıklayın.
  • Yeniden inceleme süresi, Tüketme hızı eşiği:
  • [FAST]. İ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 -> ..
  • İkinci olarak, "SMS" -> Yeni ekle -> Telefonda doğrula'yı tıklayın.
  • İpucu: Adlarda emoji kullanmayı seviyorum. Demolar için eğlencelidir.
  • İşiniz bittiğinde sağ üstteki büyük X'i tıklayın.
  • Önce telefon (hızlı), ardından e-posta (yavaş) seçin.
  • 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 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?

Düşünmenizi önerdiğimiz 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 projelerinizle (2) seçeneğini keşfetmeyi denemenizi öneririz.

Kullanıcı Arayüzü Geliştirme

Kullanıcı arayüzleri konusunda iyi değilim. Ancak Gemini bunu yapabilir. 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üzen ise şu şekildedir:

81620eb90ae3229a.png

Not: Kodu almanızı değil, Gemini'nin kendi reklam öğesi kullanıcı arayüzü/ön uç kısıtlamalarınızla sizin için yazmasını sağlamak istediğimizden kod resim olarak yapıştırılır. İnanın, sonrasında çok küçük değişiklikler yapmanız gerekir.

Güvenlik

Bu uygulamanın güvenliğini düzgün bir şekilde sağlamak, bu 4 saatlik atölyenin hedefi değildir. Aksi takdirde, atölyenin tamamlanma süresi 1-2 kat artar.

Ancak bu konu çok önemli. SECURITY bölümünde bazı fikirleri topladık.

12. Tebrikler!

Tebrikler 🎉🎉🎉 Eski PHP uygulamanızı Google Cloud ile başarıyla modernize ettiniz.

24cb9a39b1841fbd.png

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

  • Google Cloud SQL'de veritabanı dağıtma ve mevcut veritabanınızı buraya 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'a 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.
  • Google Cloud'da SRE ilkelerini uygulama

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.