1. Giriş
Last Updated: 2024-11-01
Eski bir PHP uygulamasını Google Cloud'da nasıl modernleştiririz?
(📽️ Bu codelab'in 7 dakikalık tanıtım videosunu izleyin)
Şirket içinde çalıştırılan ve modernleştirilmesi gereken eski uygulamalar olması yaygın bir durumdur. Bu, uygulamaları ölçeklenebilir, güvenli ve farklı ortamlarda dağıtılabilir hale getirmek anlamına gelir.
Bu atölye çalışmasında şunları yapacaksınız:
- PHP uygulamasını kapsayıcıya alın.
- Yönetilen bir veritabanı hizmetine ( Cloud SQL) geçin.
- Cloud Run'a dağıtma (GKE/Kubernetes'e sıfır operasyonlu bir alternatiftir).
- Identity and Access Management (IAM) ve Secret Manager ile uygulamayı güvenli hale getirin.
- Cloud Build aracılığıyla 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 dala yapılan her push işleminde tetiklenebilir.
- Uygulama resimlerini Cloud Storage'da barındırın. Bu, bağlama yoluyla gerçekleştirilir ve uygulamayı değiştirmek için kod gerekmez.
- Cloud Functions (sunucusuz) aracılığıyla düzenlenen Gemini üzerinden üretken yapay zeka işlevini kullanıma sunun.
- Hizmet düzeyi hedefleri (SLO) ve yeni 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çerek uygulamanızın bulutta yerel bir ortamda sorunsuz çalışmasını sağlamak için güçlü altyapısından ve hizmetlerinden yararlanabilirsiniz.
Bu basit adımları uygulayarak öğreneceklerinizi, farklı dil/yığın ve farklı kullanım alanları olan kendi uygulamanız ve kuruluşunuz için de kullanabileceğinizi düşünüyoruz.
Uygulama hakkında
Fork edeceğiniz uygulama ( MIT lisansı kapsamındaki kod), MySQL kimlik doğrulaması içeren temel bir PHP 5.7 uygulamasıdır. Uygulamanın temel amacı, kullanıcıların fotoğraf yükleyebileceği ve yöneticilerin uygunsuz resimleri etiketleyebileceği bir platform sağlamaktır. Uygulamada iki tablo bulunur:
- Kullanıcılar. Yöneticilerle önceden derlenmiş olarak gelir. Yeni kullanıcılar kaydolabilir.
- Görseller Birkaç örnek resimle birlikte gelir. Giriş yapmış kullanıcılar yeni resimler yükleyebilir. Buraya biraz sihir katacağız.
Hedefiniz
Google Cloud'da kullanmak için eski uygulamayı modernleştirmek istiyoruz. Ölçeklenebilirliği artırmak, güvenliği iyileştirmek, altyapı yönetimini otomatikleştirmek ve Cloud SQL, Cloud Run, Cloud Build, Secret Manager gibi hizmetleri kullanarak görüntü işleme, izleme ve veri depolama gibi ileri seviye özellikleri entegre etmek için bu platformun araçlarından ve hizmetlerinden yararlanacağız.

Daha da önemlisi, her adımın arkasındaki düşünce sürecini öğrenebilmeniz için bu süreci adım adım ilerletmek istiyoruz. Genellikle her adım, sonraki adımlar için yeni olanaklar sunar (örnek: 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
- İnternete bağlı bir tarayıcısı olan bilgisayar
- Bazı GCP kredileri. Bunun için sonraki adıma bakın.
- Cloud Shell'i kullanacaksınız. Gerekli tüm önceden yüklenmiş komutlar ve bir IDE ile birlikte gelir.
- GitHub hesabı. Orijinal kodu 🧑🏻💻 gdgpescara/app-mod-workshop kendi Git kod deponuzla dallandırmak için bu işlem gereklidir. Kendi CI/CD ardışık düzeninizi (otomatik commit -> build -> deploy) oluşturmak için bu gereklidir.
Örnek çözümleri burada bulabilirsiniz:
- Yazar deposu: https://github.com/Friends-of-Ricc/app-mod-workshop
- Bölümlere göre
.solutions/klasörlerindeki orijinal atölye deposu.
Bu atölye çalışması, Cloud Shell'de (tarayıcıda) tamamlanacak şekilde tasarlanmıştır.
Ancak bu işlem yerel bilgisayarınızdan da denenebilir.
2. Kredi oluşturma ve Fork

GCP kredisini kullanma ve GCP ortamınızı ayarlama [isteğe bağlı]
Bu atölyeyi düzenlemek için bir miktar kredisi olan bir faturalandırma hesabına ihtiyacınız vardır. Kendi faturalandırmanız varsa bu adımı atlayabilirsiniz.
GCP kredinize bağlamak için yepyeni bir Google Gmail hesabı oluşturun (*). GCP kredisini kullanmak için eğitmeninizden bağlantıyı isteyin veya kredileri şu bağlantıdan kullanın: bit.ly/PHP-Amarcord-credits .
Yeni oluşturulan hesapla oturum açın ve talimatları uygulayın.

(
) Neden yepyeni bir Gmail hesabına ihtiyacım var?*
Hesaplarının (özellikle iş veya öğrenci e-postaları) daha önce GCP ile etkileşime girmesi ve kuruluş politikalarının bu işlemi yapmalarını kısıtlaması nedeniyle kullanıcıların codelab'i geçemediğini gördük. Yeni bir Gmail hesabı oluşturmanızı veya daha önce GCP'ye maruz kalmamış mevcut bir Gmail hesabını (gmail.com) kullanmanızı öneririz.
Krediyi kullanmak için düğmeyi tıklayın.

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 "No organization" (Kuruluş yok) ifadesinin gösterildiği yerdeki proje seçiciyi tıklayarak yeni bir proje oluşturun. Aşağıya bakın

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.

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

Google Cloud Platform'u kullanmaya hazırsınız. Yeni başlıyorsanız veya her şeyi Cloud ortamında yapmak istiyorsanız Cloud Shell'e ve düzenleyicisine aşağıdaki resimde gösterildiği gibi sol üst köşedeki düğmeyi kullanarak erişebilirsiniz.

Sol üstte yeni projenizin seçili olduğundan emin olun:
Seçili değil (kötü):

Seçilen (iyi):

Uygulamayı GitHub'dan çatallama
- Demo uygulamasına gidin: https://github.com/gdgpescara/app-mod-workshop
- 🍴 Çatal simgesini tıklayın.
- GitHub hesabınız yoksa yeni bir hesap oluşturmanız gerekir.
- Öğeleri istediğiniz gibi düzenleyin.

- Aşağıdaki komutu kullanarak uygulama kodunu klonlayın:
git clonehttps://github.com/YOUR-GITHUB-USER/YOUR-REPO-NAME
- Klonlanan proje klasörünü favori düzenleyicinizle açın. Cloud Shell'i seçerseniz aşağıda gösterildiği gibi "Open Editor"ı (Düzenleyiciyi Aç) tıklayarak yapabilirsiniz.

Aşağıdaki şekilde gösterildiği gibi, Google Cloud Shell Düzenleyici ile ihtiyacınız olan her şeye sahip olursunuz.

Bunu görsel olarak yapmak için "Klasörü Aç"ı tıklayıp klasörü (büyük ihtimalle ana klasörünüzdeki app-mod-workshop) seçin.
3. 1. Modül: SQL örneği oluşturma
Google Cloud SQL örneğini oluşturma
PHP uygulamamız bir MySQL veritabanına bağlanacağından sorunsuz bir taşıma 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 bu iş için mükemmeldir. Şu adımları uygulayabilirsiniz:
- Cloud SQL sayfasına gidin: https://console.cloud.google.com/sql/instances
- "Create Instance" (Örnek Oluştur) seçeneğini tıklayın.
- API'yi etkinleştirin (gerekirse). Bu işlem birkaç saniye sürebilir.
- MySQL'i seçin.
- (Daha uzun süre dayanması için size en ucuz sürümü sunmaya çalışıyoruz):
- Sürüm: Enterprise
- Önceden ayarlanmış: development (Korumalı alanı denedik ancak bizim için uygun olmadı)
- MySQL sürümü: 5.7 (Geçmişe dönüş!)
- Örnek kimliği:
appmod-phpappseçin (Bunu değiştirirseniz gelecekteki komut dosyalarını ve çözümleri de buna göre değiştirmeyi unutmayın). - Şifre: İstediğiniz şifreyi kullanabilirsiniz ancak CLOUDSQL_INSTANCE_PASSWORD olarak not edin.
- Bölge: Uygulamanın geri kalanı için seçtiğinizle aynı tutun (ör. Milano =
europe-west8) - Alt bölgesel kullanılabilirlik: Tek alt bölge (demoda paradan tasarruf ediyoruz)
Cloud SQL veritabanını dağıtmak için Örnek Oluştur düğmesini tıklayın. ⌛ İşlemin tamamlanması yaklaşık 10 dakika sürer⌛. Bu sırada dokümanları okumaya devam edin. Ayrıca, ilk bölümde (DB bağlantısını düzeltene kadar) bu modüle bağımlılığı olmadığından bir sonraki modülü ("PHP Uygulamanızı Kapsülleme") çözmeye de başlayabilirsiniz.
Not. Bu örnek size yaklaşık 7 ABD doları/gün maliyet getirmelidir. Atölye çalışmasından sonra bu işi bağımsız bir birime dönüştürdüğünüzden emin olun.
Cloud SQL'de image_catalog veritabanı ve kullanıcısı oluşturma
Uygulama projesi, iki SQL dosyası içeren bir db/ klasörüyle birlikte gelir:
- 01_schema.sql : Kullanıcılar ve Görseller verilerini içeren iki tablo oluşturmak için SQL kodu içerir.
- 02_seed.sql: Verileri daha önce oluşturulan tablolara yerleştirmek için SQL kodu içerir.
Bu dosyalar, image_catalog veritabanı oluşturulduktan sonra kullanılır. Bunun için aşağıdaki adımları uygulayın:
- Örneğinizi açın ve Veritabanları sekmesini tıklayın:
- "Veritabanı Oluştur"u tıklayın.
image_catalogolarak adlandırın (PHP uygulama yapılandırmasında olduğu gibi).

Ardından, veritabanı kullanıcısını oluştururuz. Böylece image_catalog veritabanında kimlik doğrulaması yapabiliriz.
- Şimdi Kullanıcılar sekmesini tıklayın.
- "Kullanıcı hesabı ekle"yi tıklayın.
- Kullanıcı: Bir tane oluşturalım:
- Kullanıcı adı:
appmod-phpapp-user - Şifre: Hatırlayabileceğiniz bir şifre seçin veya "Oluştur"u tıklayın.
- "Tüm ana makinelere izin ver (%)"i etkin tutun.
- EKLE'yi tıklayın.
Bilinen IP'ler için veritabanını açın.
Cloud SQL'deki tüm veritabanlarının "izole" olarak oluşturulduğunu unutmayın. Erişilebilecek bir ağı açıkça ayarlamanız gerekir.
- Örneğinizi tıklayın.
- "Bağlantılar" menüsünü açın.
- "Ağ iletişimi" sekmesini tıklayın.
- "Yetkili ağlar" bölümünde tıklayın. Şimdi bir ağ (ör. alt ağ) ekleyin.
- Şimdilik uygulamanın çalışmasına izin vermek için hızlı ancak GÜVENSİZ bir ayar seçelim. Daha sonra erişimi yalnızca güvendiğiniz IP'lerle kısıtlayabilirsiniz:
- Ad: "Dünyadaki herkes - GÜVENLİ DEĞİL".
- Ağ: "
0.0.0.0/0"(Not: Bu, GÜVENLİ OLMAYAN kısımdır.) - BİTTİ'yi tıklayın.
- Kaydet'i tıklayın.
Aşağıdakine benzer bir tablo görürsünüz:

Not. Bu çözüm, atölyeyi O(saat) içinde tamamlamak için iyi bir uzlaşma noktasıdır. Ancak, çözümünüzün üretim için güvenliğini sağlamanıza yardımcı olması için GÜVENLİK belgesini inceleyin.
Veritabanı bağlantısını test etme zamanı!
Daha önce oluşturduğumuz image_catalog kullanıcının çalışıp çalışmadığına bakalım.
Örnekteki "Cloud SQL Studio"ya erişin ve aşağıda gösterildiği gibi kimlik doğrulaması için Veritabanı, Kullanıcı ve Şifre'yi girin:

Artık SQL Düzenleyici'yi açabilir ve bir sonraki bölüme geçebilirsiniz.
Veritabanını kod tabanından içe aktarma
Verileriyle birlikte image_catalog tablolarını içe aktarmak için SQL Düzenleyici'yi kullanın. Depodaki dosyalardan ( 01_schema.sql ve ardından 02_seed.sql) SQL kodunu kopyalayın ve bunları sırayla çalıştırın.
Bundan sonra, image_catalog'da aşağıdaki gibi users ve images olmak üzere iki tablo görmeniz gerekir:

Aşağıdaki kodu düzenleyicide çalıştırarak test edebilirsiniz: select * from images;
Ayrıca Cloud SQL örneğinin herkese açık IP adresini not etmeyi unutmayın. Bu adrese daha sonra ihtiyacınız olacak. IP'yi almak için Genel Bakış sayfasındaki Cloud SQL örneğinin ana sayfasına gidin. (Genel bakış > Bu örneğe bağlan > Genel IP adresi).
4. 2. Modül: PHP uygulamanızı kapsayıcıya alın

Bu uygulamayı bulut için oluşturmak istiyoruz.
Bu, kodu, bulutta çalıştırmak için gereken tüm bilgileri içeren bir ZIP dosyası içinde paketlemek anlamına gelir.
Paketlemenin birkaç yolu vardır:
- Docker. Çok popüler olsa da doğru şekilde ayarlamak oldukça karmaşıktır.
- Buildpack'ler. Daha az popülerdir ancak neyin oluşturulacağını ve neyin çalıştırılacağını "otomatik olarak tahmin etme" eğilimindedir. Çoğu zaman bu yöntem işe yarar.
Bu atölye çalışması kapsamında Docker kullandığınızı varsayacağız.
Cloud Shell'i kullanmayı seçtiyseniz şimdi onu yeniden açma zamanı (Cloud Console'un sağ üst kısmını tıklayın).

Bu işlem, sayfanın en altında uygun bir kabuk açar. Kurulum adımında kodu burada çatallamış olmanız gerekir.

Docker
Kontrolü elinizde tutmak istiyorsanız bu çözüm sizin için uygundur. Bu, 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.) yerleştirmeniz gerektiğinde anlamlıdır.
Container mimarisine alınmış uygulamamızı nihayetinde Cloud Run'a dağıtmak istediğimiz için aşağıdaki belgeleri inceleyin. Bunu PHP 8'den PHP 5.7'ye nasıl geri taşırsınız? Belki bu konuda Gemini'dan yardım alabilirsiniz. Alternatif olarak, önceden hazırlanmış bu sürümü kullanabilirsiniz:
# Use the official PHP image: https://hub.docker.com/_/php
FROM php:5.6-apache
# Configure PHP for Cloud Run.
# Precompile PHP code with opcache.
# Install PHP's extension for MySQL
RUN docker-php-ext-install -j "$(nproc)" opcache mysqli pdo pdo_mysql && docker-php-ext-enable pdo_mysql
RUN set -ex; \
{ \
echo "; Cloud Run enforces memory & timeouts"; \
echo "memory_limit = -1"; \
echo "max_execution_time = 0"; \
echo "; File upload at Cloud Run network limit"; \
echo "upload_max_filesize = 32M"; \
echo "post_max_size = 32M"; \
echo "; Configure Opcache for Containers"; \
echo "opcache.enable = On"; \
echo "opcache.validate_timestamps = Off"; \
echo "; Configure Opcache Memory (Application-specific)"; \
echo "opcache.memory_consumption = 32"; \
} > "$PHP_INI_DIR/conf.d/cloud-run.ini"
# Copy in custom code from the host machine.
WORKDIR /var/www/html
COPY . .
# Setup the PORT environment variable in Apache configuration files: https://cloud.google.com/run/docs/reference/container-contract#port
ENV PORT=8080
# Tell Apache to use 8080 instead of 80.
RUN sed -i 's/80/${PORT}/g' /etc/apache2/sites-available/000-default.conf /etc/apache2/ports.conf
# Note: This is quite insecure and opens security breaches. See last chapter for hardening ideas.
# Uncomment at your own risk:
#RUN chmod 777 /var/www/html/uploads/
# Configure PHP for development.
# Switch to the production php.ini for production operations.
# RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
# https://github.com/docker-library/docs/blob/master/php/README.md#configuration
RUN mv "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini"
# Expose the port
EXPOSE 8080
En yeni 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'de bulunan MySQL veritabanına bağlanacağı şekilde değiştirmemiz gerekiyor. Daha önce ayarladıklarınıza 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 genel IP adresidir. Bu adresi SQL konsolunda bulabilirsiniz:

DB_NAMEdeğişmemelidir:image_catalogDB_USER,appmod-phpapp-userolmalıdır.DB_PASS, sizin seçtiğiniz bir şeydir. Tek tırnak içinde ayarlayın ve gerektiğinde kaçış karakteri kullanın.
Ayrıca, 🇮🇹 İtalyanca olan birkaç parçayı Gemini'ın yardımıyla İngilizceye çevirebilirsiniz.
Dockerfile'nız olduğuna ve PHP uygulamanızı veritabanınıza bağlanacak şekilde yapılandırdığınıza göre, şimdi bunu deneyelim.
Henüz yüklemediyseniz Docker'ı yükleyin ( bağlantı). Cloud Shell kullanıyorsanız bu işleme gerek yoktur.
Şimdi de uygun docker build ve run komutlarıyla container mimarisine alınmış PHP uygulamanızı oluşturup ç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 düzgün çalışıyorsa yerel ana makineye bağlandığınızda aşağıdaki web sayfasını görebilirsiniz. Uygulamanız artık 8080 numaralı bağlantı noktasında çalışıyor. "Web önizlemesi" simgesini (gözlü bir tarayıcı) ve ardından 8080 numaralı bağlantı noktasında önizle'yi (veya diğer bağlantı noktaları için "Bağlantı noktasını değiştir") tıklayın.

Sonucu tarayıcınızda test etme
Uygulamanız artık aşağıdaki gibi görünmelidir:

Yönetici/admin123 ile giriş yaparsanız aşağıdakine benzer bir ekran görürsünüz.

Harika!!! İtalyanca metin dışında her şey çalışıyor. 🎉🎉🎉
Dockerlaştırma işleminiz başarılı ancak veritabanı kimlik bilgileri yanlışsa aşağıdakine benzer bir hata mesajı alabilirsiniz:

Tekrar deneyin, neredeyse başardı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ü depolamak ve Cloud Run gibi Google Cloud hizmetlerine dağıtmak için erişilebilir hale getirmek üzere bulutta bir yere ihtiyacımız var. Bu depolama çözümüne Artifact Registry adı verilir. Artifact Registry, Docker container görüntüleri, Maven paketleri, npm modülleri ve daha fazlası dahil olmak üzere uygulama yapılarını depolamak için tasarlanmış, tümüyle yönetilen bir Google Cloud hizmetidir.
Uygun düğmeyi kullanarak Google Cloud Artifact Registry'de bir depo oluşturalım.

Yapıların depolanması için uygun bir ad, biçim ve bölge seçin.

Yerel geliştirme ortamı etiketine geri dönün ve uygulama kapsayıcı görüntüsünü yeni oluşturulan Artifact Registry deposuna aktarın. Bu işlemi yapmak için aşağıdaki komutları tamamlayı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ünmelidir.

Tebrikler 🎉🎉🎉, bir sonraki seviyeye geçebilirsiniz. Bu süre zarfında, yükleme/giriş/çıkış işlemlerini deneyerek ve uygulama uç noktalarına alışarak 2 dakika geçirebilirsiniz.Bunlara daha sonra ihtiyacınız olacak.
Olası hatalar
Kapsülleme hataları alırsanız hatayı açıklayıp düzeltmek için Gemini'ı kullanmayı deneyin. Şunları sağlayın:
- Mevcut Dockerfile'ınız
- Alınan hata
- [Gerekirse] yürütülen PHP kodu.
Yükleme İzinleri. Ayrıca /upload.php uç noktasını deneyin ve resim yüklemeyi deneyin. Aşağıdaki hatayı alabilirsiniz. Bu durumda chmod/chown içinde Dockerfile düzeltmeniz 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'ınızda mysql için uygun PDO kitaplıklarının (pdo_mysql) bulunduğundan emin olun. Buradaki çözümlerden ilham alın.
İsteğiniz bir arka uca yönlendirilemiyor. 8080 bağlantı noktasındaki bir sunucuya bağlanılamadı. Bu, muhtemelen yanlış bağlantı noktasını kullanıma sunduğunuz anlamına gelir. Apache/Nginx'in gerçekten hizmet verdiği bağlantı noktasını kullanıma sunduğunuzdan emin olun. Bu önemsiz bir konu 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ı kullanmaya devam etmek istiyorsanız (ör. Apache bu şekilde çalışmak istediği 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

Neden Cloud Run?
Haklı bir soru! Yıllar önce kesinlikle Google App Engine'i seçerdiniz.
Basitçe söylemek gerekirse Cloud Run, günümüzde daha yeni bir teknoloji yığınına sahiptir, dağıtımı daha kolaydır, daha ucuzdur ve kullanılmadığında 0'a kadar ölçeklenebilir. Durum bilgisiz tüm container'ları çalıştırma esnekliği ve çeşitli Google Cloud hizmetleriyle entegrasyonu sayesinde, mikro hizmetleri ve modern uygulamaları minimum ek yük ve maksimum verimlilikle dağıtmak için idealdir.
Daha spesifik olarak Cloud Run, Google Cloud tarafından sunulan ve sunucusuz bir ortamda durum bilgisiz container mimarisine alınmış uygulamalar çalıştırmanızı sağlayan, tümüyle yönetilen bir platformdur. Gelen trafiği karşılamak için sıfırdan ölçeklendirme ve boşta kalma durumunda ölçeği küçültme gibi tüm altyapı işlemlerini otomatik olarak yönetir. Bu sayede, maliyet açısından uygun ve verimli bir çözüm sunar. Cloud Run, bir kapsayıcıda paketlenmiş olması koşuluyla herhangi bir dili veya kitaplığı destekler. Bu sayede geliştirme sürecinde büyük bir esneklik sağlanır. Diğer Google Cloud hizmetleriyle iyi entegre olur ve sunucu altyapısını yönetmeye gerek kalmadan mikro hizmetler, API'ler, web siteleri ve etkinliğe dayalı uygulamalar oluşturmak için uygundur.
Ön koşullar
Bu görevi tamamlamak için yerel makinenizde gcloud yüklü olmalıdır. Değilse buradaki talimatlara bakın. Bunun yerine Google Cloud Shell'deyseniz herhangi bir işlem yapmanız gerekmez.
Dağıtmadan önce...
Yerel ortamınızda çalışıyorsanız aşağıdaki bilgilerle Google Cloud'da kimliğinizi doğrulayın.
$ gcloud auth login –update-adc # not needed in Cloud Shell
Bu işlem, tarayıcınızda OAuth giriş bilgileriyle kimliğinizi doğrular. Chrome'da, faturalandırmanın etkin olduğu Google Cloud'da oturum açmış olan kullanıcıyla (ör. vattelapesca@gmail.com) oturum açtığınızdan emin olun.
Aşağıdaki komutla 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 aracılığıyla Cloud Run'a dağıtma
Uygulamayı Cloud Run'a dağıtmanıza olanak tanıyan komut gcloud run deploy komutudur. Hedefinize ulaşmak için ayarlayabileceğiniz çeşitli seçenekler vardır. Minimum seçenek grubu (komut satırı aracılığıyla sağlayabileceğiniz veya aracın etkileşimli istemle soracağı) şunlardır:
- Uygulamanız için dağıtmak istediğiniz Cloud Run hizmetinin adı. Cloud Run hizmeti, uygulamanızın uç noktasını sağlayan bir URL döndürür.
- Uygulamanızın çalışacağı Google Cloud Bölgesi. (
--regionBÖLGE) - Uygulamanızı sarmalayan Container Görüntüsü.
- Uygulamanızın yürütülmesi sırasında kullanması gereken ortam değişkenleri.
- Allow-Unauthenticated flag (Kimliği doğrulanmamış erişime izin ver) işareti, herkesin uygulamanıza ek kimlik doğrulaması yapmadan erişmesine izin verir.
Bu seçeneği komut satırınıza nasıl uygulayacağınızı öğ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 aşağıdakine benzer bir şey görürsünüz.


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.

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 Cloud Build derleme tetikleyicisine ekleyeceğimiz için etkileşimli sorulara yer veremeyeceğiz. Komuttaki her seçeneği doldurmamız gerekir. Bu nedenle, altın gcloud run deploy --option1 blah --foo bar --region your-fav-region'yı oluşturmak istersiniz. Nasıl yapacaksınız?
- gcloud soru sormayı bırakana kadar 2-3-4 arasındaki adımları tekrarlayın:
- [LOOP]
gcloud run deployile şu ana kadar bulunan seçenekler - [LOOP] sistemleri X seçeneğini istiyor
- [LOOP] CLI ekleme seçeneği
--my-option [my-value]ile X'i nasıl ayarlayacağınızı herkese açık dokümanlarda arayın. - gcloud başka soru sormadan tamamlanmadığı sürece 2. adıma geri dönün.
- Bu gcloud run deploy BLAH BLAH BLAH harika! Komutu bir yere kaydedin. Daha sonra Cloud Build adımında bu komuta ihtiyacınız olacak.
Olası bir çözümü burada bulabilirsiniz. Dokümanlara buradan ulaşabilirsiniz.
Tebrikler 🎉🎉🎉 Uygulamanızı Google Cloud'da başarıyla dağıtarak modernizasyonun ilk adımını tamamladınız.
6. 4. Modül: Secret Manager ile Şifreyi Temizleme

Önceki adımda uygulamamızı Cloud Run'da başarılı bir şekilde dağıtıp çalıştırabildik. Ancak bunu bazı gizli anahtarları şifresiz metin olarak sağlayarak kötü bir güvenlik uygulamasıyla yaptık.
İlk yineleme: ENV kullanmak için config.php dosyanızı güncelleyin.
config.php dosyasındaki kodda doğrudan veritabanı şifresini girdiğimizi fark etmiş olabilirsiniz. Bu, test amaçları ve uygulamanın çalışıp çalışmadığını görmek için uygundur. Ancak üretim ortamında bu şekilde kod gönderme/kullanma işlemi yapamazsınız. Şifre (ve diğer DB bağlantı parametreleri) dinamik olarak okunmalı ve çalışma zamanında uygulamaya sağlanmalıdır. config.php dosyasını, veritabanı parametrelerini ENV değişkenlerinden okuyacak şekilde değiştirin. Başarısız olursa varsayılan değerler ayarlamayı düşünebilirsiniz. ENV'yi yükleyememeniz durumunda bu işe yarar. Böylece sayfa çıkışı, varsayılan değerlerin kullanılıp kullanılmadığı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') ?: '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 kapsama alındığından, ENV değişkenlerini uygulamaya sağlamanın bir yolunu sunmanız gerekir. Bu işlem birkaç şekilde yapılabilir:
- Derleme sırasında Dockerfile'da. ENV DB_VAR=ENV_VAR_VALUE söz dizimini kullanarak önceki Dockerfile'ınıza 4 parametre ekleyin. Bu işlem, çalışma zamanında geçersiz kılınabilecek varsayılan değerleri ayarlar. Örneğin, "DB_NAME" ve "DB_USER" yalnızca burada ayarlanabilir.
- Çalışma zamanında. Bu değişkenleri Cloud Run için ayarlayabilirsiniz. Bunu KSA'dan veya kullanıcı arayüzünden yapabilirsiniz. Bu, 4 değişkeninizin tümünü yerleştirmek için doğru yerdir (Dockerfile'da ayarlanan varsayılanları korumak istemiyorsanız).
Yerel ana makinede, ENV değişkenlerinizi bir .env dosyasına yerleştirmek isteyebilirsiniz (solutions klasörünü kontrol edin).
Ayrıca, .env dosyasının .gitignore öğesine 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 yapabilirsiniz:
- Uygulamanız, değişkeni ENV'nizden dinamik olarak okur.
- DB şifresini kodunuzdan kaldırdığınız için güvenliği artırdınız.
Artık Cloud Run'a yeni bir düzeltme dağıtabilirsiniz. Kullanıcı arayüzüne geçip ortam değişkenlerini manuel olarak ayarlayalım:
- https://console.cloud.google.com/run adresine gidin.
- Uygulamanızı tıklayın.
- "Yeni bir düzeltmeyi düzenle ve dağıt"ı tıklayın.
- İlk sekme olan "Container(s)" (Kapsayıcılar) bölümünde alttaki "Variables and secrets" (Değişkenler ve sırlar) sekmesini tıklayın.
- "+ Değişken ekle"yi tıklayın ve gereken tüm değişkenleri ekleyin. Sonuç olarak aşağıdaki gibi bir görüntü elde edersiniz:


Bu mükemmel mi? Hayır. PASS'ınız çoğu operatör tarafından hâlâ görülebilir. Bu durum, Google Cloud Secret Manager ile azaltılabilir.
İkinci yineleme: Secret Manager
Şifreleriniz kendi kodunuzdan kayboldu: zafer! Ama bir dakika, 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 Diziler 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 Secret Manager, belirli gizli anahtarlara kimlerin erişebileceğini kontrol etmenize olanak tanıyarak veri güvenliğini ve düzenleyici kurumun belirlediği kurallara uygunluğu sağlar.
Ayrıca, otomatik gizli anahtar rotasyonu ve sürüm oluşturmayı destekleyerek gizli anahtar yaşam döngüsü yönetimini basitleştirir ve Google Cloud hizmetlerindeki uygulamalarda güvenliği artırır.
Secret Manager'a 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.

Aşağıdaki resimde gösterildiği gibi, Secret Manager API'yi etkinleştirin.

- Şimdi "Gizli oluştur"u tıklayın:
- Ad:
php-amarcord-db-pass - Gizli anahtar değeri: "your DB password" (ignore the "upload file" part).
- Bu gizli bağlantıya not ekleyin. Bağlantı
projects/123456789012/secrets/php-amarcord-db-passgibi 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: Sırlarınız için tutarlı adlandırma kuralları kullanmaya çalışın. Örneğin, soldan sağa doğru uzmanlaşın: 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 uygulamadaki tüm sırlarınızı bulmak için kolay normal ifadeler oluşturabilirsiniz.
Yeni bir Cloud Run düzeltmesi oluşturma
Yeni bir gizli anahtar oluşturduğumuz 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 bir düzeltmeyi düzenle ve dağıt"ı tıklayın.
- "Variables & Secrets" (Değişkenler ve Gizli Anahtarlar) sekmesini bulun.
- DB_PASS ENV değişkenini sıfırlamak için "+ Gizli Anahtara referans ver" düğmesini kullanın.
- Referans verilen gizli diziler için aynı "DB_PASS" değerini kullanın ve en son sürümü kullanın.

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

Sorunu nasıl düzelteceğinizi bulmaya çalışın. Bu sorunu çözmek için IAM ve Yönetici bölümüne erişip izinleri değiştirmeniz gerekir. İyi hata ayıklamalar!
Sorunu çözdükten sonra Cloud Run'a dönüp yeni bir düzeltmeyi yeniden dağıtın. Sonuç aşağıdaki şekilde görünmelidir:

İpucu: Geliştirici Konsolu (kullanıcı arayüzü), izin sorunlarını belirtme konusunda çok iyidir. Bulut öğelerinizin tüm bağlantılarına göz atın.
7. 5. Modül: Cloud Build ile CI/CD'nizi ayarlama

Neden CI/CD ardışık düzeni?
Bu noktada, gcloud run deploy simgesini birkaç kez yazmış olmalısınız. Belki de aynı soruyu tekrar tekrar yanıtlamışsınızdır.
Uygulamanızı gcloud run deploy ile manuel olarak dağıtmaktan bıktınız mı? Uygulamanızın, Git deponuza her yeni değişiklik gönderdiğinizde otomatik olarak dağıtılması harika olmaz mıydı?
CI/CD işlem hattını kullanmak için iki şeye ihtiyacınız vardır:
- Kişisel bir 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 bu adımı tamamlayın. Çatalını oluşturduğunuz deponuz şu şekilde görünmelidir:
https://github.com/<YOUR_GITHUB_USER>/app-mod-workshop - Cloud Build. Bu harika ve ucuz hizmet sayesinde neredeyse her şey için derleme otomasyonları yapılandırabilirsiniz: Terraform, Docker'a alınmış uygulamalar vb.
Bu bölümde Cloud Build'in kurulumuna odaklanılacaktır.
Cloud Build'e giriş
Bunun için Cloud Build'i kullanacağız:
- kaynağınızı oluşturun (Dockerfile ile). Bunu, oluşturmak ve uygulamak için ihtiyacınız olan her şeyi ("derleme yapısı") içeren "büyük bir .zip dosyası" olarak düşünebilirsiniz.
- 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ü ("revizyon") oluşturur (yeni kodu içeren bir katman gibi düşünebilirsiniz) ve push işlemi başarılı olursa trafiği yeni sürüme yönlendirecek şekilde yapılandırılır.
Bu, php-amarcord uygulamamın bazı derlemelerine bir örnektir:

Tüm bunları nasıl yapıyoruz?
- Mükemmel bir YAML dosyası oluşturarak:
cloudbuild.yaml - Cloud Build derleme tetikleyicisi oluşturarak.
- Cloud Build kullanıcı arayüzü üzerinden GitHub depomuza bağlanarak.
Tetikleyici oluşturma (ve depo bağlama)
- https://console.cloud.google.com/cloud-build/triggers adresine gidin.
- "Tetikleyici Oluştur"u tıklayın.
- Derleme:
- Ad: Anlamlı bir ad (ör.
on-git-commit-build-php-app) - Etkinlik: Dala aktarım
- Kaynak: "Yeni depo bağla"

- Sağda "Depoyu bağla" penceresi açılır.
- Kaynak sağlayıcı: "Github" (ilk)
- "Devam et"
- Authenticate (Kimlik Doğrula), çapraz kimlik doğrulama için GitHub'da bir pencere açar. Akışı takip edin ve sabırlı olun. Çok sayıda deponuz varsa bu işlem biraz zaman alabilir.
- "Select repo" (Depo seç) Hesabınızı/deponuzu seçin ve "I understand..." (Anlıyorum...) bölümünü işaretleyin.
- Hata mesajını aldıysanız: GitHub Uygulaması, hiçbir deponuzda kurulu değil. "Google Cloud Build'i yükle"yi tıklayarak devam edin ve talimatları uygulayın.
Bağlan'ı tıklayın.
- Bingo! Deponuz bağlandı.
- Tetikleyici bölümüne geri dönün...
- Yapılandırma: Otomatik olarak algılandı (*)
- 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.
(*) Bu, Dockerfile veya cloudbuild.yaml dosyasını kontrol ettiğinden en basit yöntemdir. Ancak cloudbuild.yaml, hangi adımda ne yapacağınıza karar verme konusunda size gerçek bir güç verir.
Güç bende!
Artık Cloud Build hizmet hesabına (Hizmet hesabı nedir? Bir görev için sizin adınıza hareket eden bir "robot"un e-posta adresi (bu örnekte Cloud'da bir şeyler oluşturma).
SA'nızın bunu yapmasına izin vermediğiniz sürece SA'nız oluşturulup dağıtılamaz. Neyse ki bu işlem çok kolay.
- "Cloud Build" > "Ayarlar"a gidin.
- "[PROJECT_NUMBER]- compute@developer.gserviceaccount.com" hizmet hesabı
- Şu kutuları işaretleyin:
- Cloud Run
- Secret Manager
- Hizmet Hesapları
- Cloud Build
- "Tercih edilen hizmet hesabı olarak ayarla" seçeneğini de işaretleyin.

Cloud Build YAML'si nerede?
Kendi Cloud Build 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 bir değişiklik gönderebilir ve Cloud Build'in bu değişikliği nasıl işlediğini gözlemleyebilirsiniz.
Cloud Build'i ayarlamak zor olabilir. Şu tarihe kadar birkaç kez iletişime geçilebilir:
- https://console.cloud.google.com/cloud-build/builds;region=global adresinden günlükleri kontrol etme
- Hatayı bulma
- Koddaki hatayı düzeltip git commit / git push komutunu yeniden verme
- Bazen hata kodda değil, bir yapılandırmada olur. Bu durumda, kullanıcı arayüzünden yeni bir derleme yayınlayabilirsiniz (Cloud Build > "Triggers" > Run).

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

Bunu iki şekilde yapabilirsiniz:
- Kullanıcı arayüzü aracılığıyla: ENV değişkenlerini tekrar ayarlayarak
- CLI aracılığıyla sizin için "mükemmel" komut dosyasını oluşturarak Bir örneği burada bulabilirsiniz: gcloud-run-deploy.sh . Uç nokta ve proje numarası gibi birkaç şeyi ayarlamanız gerekir. Proje numaranızı Cloud'a Genel Bakış bölümünde bulabilirsiniz.
How do i commit code to github?
Bu atölye çalışmasının kapsamı, GitHub'a git push için en iyi yöntemi öğretmeyi kapsamaz. Ancak takılırsanız ve Cloud Shell'deyseniz iki yol vardır:
- CLI. Yerel olarak bir SSH anahtarı ekleyin ve git@github.com:YOUR_USER/app-mod-workshop.git (http yerine) ile bir uzak depo ekleyin.
- VSCode. Cloud Shell Düzenleyici'yi kullanıyorsanız Kaynak kontrolü (ctrl-shift-G) sekmesini kullanabilir, "Değişiklikleri senkronize et"i tıklayıp talimatları uygulayabilirsiniz. GitHub hesabınızın kimliğini VS Code'da doğrulayabilir ve buradan çekme/gönderme işlemlerini kolayca yapabilirsiniz.

Diğer dosyaların arasına git add clodubuild.yaml eklemeyi unutmayın. Aksi takdirde işlem çalışmaz.
Derin ve yüzeysel "geliştirme/üretim eşitliği" [isteğe bağlı]
Model sürümünü buradan kopyaladıysanız iki özdeş DEV ve PROD sürümünüz olur. Bu yaklaşım, On İki Faktörlü Uygulama'nın 10. kuralı ile uyumlu ve faydalı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 çalışması için yeterli olsa da gerçek hayatta uygun bir üretim ortamı oluşturmak için biraz zaman ayırmanız gerekir. Bu, iki veritabanına (biri geliştirme, diğeri üretim için) sahip olmak ve olağanüstü durum kurtarma / yüksek kullanılabilirlik için bunları nerede bulunduracağınızı seçmek anlamına gelir. Bu konu, bu atölyenin kapsamı dışındadır ancak üzerinde düşünülmesi gereken bir noktadır.
Prodüksiyonun "derin" bir versiyonunu yapmaya zamanınız varsa lütfen aşağıdakiler gibi kopyalamanız gereken tüm kaynakları göz önünde bulundurun:
- 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'i (daha ucuz, daha hızlı) ve Gemini 1.5 Pro'yu (daha güçlü) kullanabilirsiniz.
Genel olarak, uygulamayla ilgili her işlem yaptığınızda kritik bir şekilde düşünün: Üretimde bu aynı değere sahip olmalı mı? Aksi takdirde, çabanızı ikiye katlayın. Bu işlem, Terraform ile çok daha kolaydır. Burada ortamınızı (-dev, -prod) kaynaklarınıza sonek olarak ekleyebilirsiniz.
8. 6. Modül: Google Cloud Storage'a geçiş

Depolama

Uygulama şu anda durumu bir Docker kapsayıcısında saklıyor. Makine bozulursa, uygulama çökerse veya yeni bir düzeltme gönderirseniz yeni bir düzeltme planlanır ve yeni, boş bir depolama alanı oluşturulur: 🙈
Bu sorunu nasıl düzeltebiliriz? Birkaç yaklaşım vardır.
- Görüntüleri veritabanında saklayın. Önceki PHP uygulamamda da bu yöntemi kullandım. Karmaşıklık katmadığı için en basit çözüm bu. Ancak bu kesinlikle veritabanınıza gecikme ve yük ekler.
- Cloud Run uygulamanızı depolama alanıyla uyumlu bir çözüme (GCE + Persistent Disk) taşıyabilir miyim? Belki GKE + Storage? Not: Kontrolü artırdığınızda çevikliği kaybedersiniz.
- GCS'ye geçin. Google Cloud Storage, Google Cloud'un tamamı için sınıfının en iyisi depolama hizmetini sunar ve en Cloud idiomatic çö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'i destekliyor mu? (Composer'ın desteklediği en eski sürüm PHP 5.3.2 gibi görünüyor) - Belki Docker sidecar kullanabilirsiniz.
- Alternatif olarak GCS Cloud Run Volume Mounts'u da kullanabilirsiniz. Bu harika bir fikir.
🤔 Depolama alanını taşıma (açık uçlu)
[Açık Uçlu] Bu alıştırmada, resimlerinizi kalıcı olacak şekilde taşımanın bir yolunu bulmanızı istiyoruz.
Kabul testi
Çözümü söylemek istemiyorum ancak şunların olmasını istiyorum:
newpic.jpgyüklediğinizde Uygulamada görürsünüz.- Uygulamayı yeni bir sürüme yükseltirsiniz.
newpic.jpghala orada, görünür durumda.
💡 Olası çözüm (GCS Cloud Run birim bağlamaları)
Bu, kodu HİÇ değiştirmeden (resim açıklaması gösterme dışında, ancak bu önemsizdir ve yalnızca göz zevki içindir) durum bilgisi olan dosya yüklemeleri yapmamızı sağlayan çok zarif bir çözümdür.
Bu işlem, Cloud Run'daki bir klasörü GCS'ye bağlamanıza olanak tanır. Bu nedenle:
- GCS'ye yüklenen tüm dosyalar uygulamanızda görünür.
- Uygulamanıza yapılan tüm yüklemeler aslında GCS'ye yüklenir.
- GCS'ye yüklenen nesneler için Magic özelliği kullanılabilir (7. bölüm).
Not. Lütfen FUSE ile ilgili küçük puntolu yazıları okuyun. Performans sorunları varsa bu kabul edilemez.
GCS paketi oluşturma
GCS, Google Cloud'un her yerde bulunan depolama hizmetidir. Bu hizmet, depolama alanı gerektiren her GCP hizmeti tarafından kullanılır ve savaşta test edilmiş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'ı, paketi /uploads/ klasörüne monte edecek şekilde yapılandırma
Şimdi de işin şık kısmına gelelim. php_uploads birimi oluşturup Cloud Run'a MOUNT_PATH üzerinde FUSE bağlama işlemi yapmasını söylüyoruz (/var/www/html/uploads/ gibi):
#!/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"
Şimdi, Cloud Storage'e 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.
- "Volumes" (Birimler) sekmesinde, paketinize yönlendiren, "Cloud Storage paketi" türünde bir birim bağlama oluşturun. Örneğin, "php_uploads" adını kullanabilirsiniz.
- Container(s) > Volume Mounts (Kapsayıcı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 işlem, Dockerfile'a bağlıdır ancak
var/www/html/uploads/gibi görünebilir .
Her iki durumda da çalışırsa yeni Cloud Run sürümünü düzenlediğinizde aşağıdakine benzer bir ekran görürsünüz:

Şimdi /upload.php uç noktasına yeni bir resim yükleyerek yeni uygulamayı test edin.
Resimler, tek bir satır PHP kodu yazmadan GCS'de sorunsuz bir şekilde akmalıdır:

Ne oldu?
Çok sihirli bir şey oldu.
Eski kod içeren eski bir uygulama hâlâ işini yapıyor. Yeni ve modernleştirilmiş bir yığın, uygulamamızdaki tüm resimlerin/fotoğrafların durum bilgisi olan bir Cloud Bucket'ta rahatça yer almasını sağlar. Artık sınır yok:
- "Tehlikeli" veya "çıplaklık" içeren bir resim geldiğinde e-posta göndermek mi istiyorsunuz? Bunu PHP koduna dokunmadan yapabilirsiniz.
- Bir resim geldiğinde her seferinde Gemini Multimodal modelini kullanarak resmi açıklamak ve açıklamasıyla birlikte veritabanını yüklemek mi istiyorsunuz? Bunu PHP koduna dokunmadan yapabilirsiniz. Bana inanmıyor musun? 7. bölümden okumaya devam edin.
Bu alanda büyük bir fırsat yakaladık.
9. 7. Modül: Google Gemini ile uygulamanızı güçlendirin

Artık Cloudified depolama alanına sahip, modernleştirilmiş, yepyeni bir PHP uygulamanız (ör. 2024 Fiat 126) var.
Ne işe yarar?
Ön koşullar
Önceki bölümde, model bir çözüm sayesinde GCS'ye /uploads/ görüntüleri yerleştirebiliyorduk. Bu çözüm, uygulama mantığını görüntü depolama alanından fiilen ayırıyordu.
Bu alıştırmada ş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 resim yüklediği ve resimlerin GCS paketine aktarıldığı, resim yüklemelerinin bulunduğu bir GCS paketi oluşturun.
Cloud Functions işlevi oluşturma (Python'da)
Etkinliğe dayalı 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üncelle.
Etkinlik; BigQuery'de yeni bir kaydın kullanılabilir olması, GCS'deki bir klasörde yeni bir nesnenin değiştirilmesi veya Pub/Sub'daki bir kuyrukta yeni bir mesajın beklenmesi gibi herhangi bir şey olabilir.
Google Cloud, bunu sağlamak için birden fazla paradigmayı destekler. En önemlisi:
- EventArc. GCS etkinliklerini nasıl alacağınızı öğrenin. DAG'ler oluşturmak ve bulutta eğer-ise-değilse mantığına göre işlemleri düzenlemek için idealdir.
- Cloud Scheduler. Örneğin, bulutta gece yarısı cron işi için idealdir.
- Cloud Workflows Event Arc'a benzer şekilde, aşağıdakileri yapmanıza olanak tanır:
- Cloud Run işlevleri (
lambdasolarak da bilinir). - Cloud Composer. Temel olarak Apache Airflow'un Google sürümü olan bu hizmet, DAG'ler için de mükemmeldir.
Bu alıştırmada, oldukça etkileyici bir sonuç elde etmek için Cloud Functions'ı ayrıntılı olarak inceleyeceğiz. Ayrıca, isteğe bağlı alıştırmalar da sunacağız.
Örnek kodun .solutions/ altında verildiğini unutmayın.
Cloud Function oluşturma (🐍 python)
Çok iddialı bir GCF oluşturmaya çalışıyoruz.
- GCS'de yeni bir resim oluşturulduğunda... (muhtemelen bir kullanıcı uygulamaya yüklediği için, ancak yalnızca bu nedenle değil)
- .. Gemini'ı çağırarak resmi açıklamasını ve resmin metin açıklamasını alabilirsiniz .. (MIME'ı kontrol edip PDF, MP3 veya metin değil, resim olduğundan emin olmak iyi olur.)
- .. ve bu açıklamayla veritabanını güncelleyin. (Bu işlem için
descriptionsütununuimagestablosuna eklemek üzere veritabanının düzeltilmesi gerekebilir.)
description resimlere eklemek için DB'ye yama uygulayın
- Cloud SQL Studio'yu açın:

- Görseller veritabanı için kullanıcı adınızı ve şifrenizi girin.
- Resim açıklaması için bir sütun ekleyen aşağıdaki SQL'i yerleştirin:
ALTER TABLE images ADD COLUMN description TEXT;

İşte bu kadar. Çalışıp çalışmadığını kontrol etmek için hemen deneyin:
SELECT * FROM images;
Yeni açıklama sütununu görmeniz gerekir:

Gemini f(x) işlevini yazın.
Not. Bu işlev, Gemini Code Assist'in yardımıyla oluşturuldu.
Not. Bu işlevi oluştururken IAM izni hatalarıyla karşılaşabilirsiniz. Bazıları aşağıda "Olası hatalar" paragrafında açıklanmıştır.
- API'leri etkinleştirme
- https://console.cloud.google.com/functions/list adresine gidin.
- "Create Function" (İşlev Oluştur) seçeneğini tıklayın.
- API sihirbazından API'leri etkinleştirme:

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/ bölümünde bulabilirsiniz.
- Kodunuzu barındıracak bir klasör oluşturun (ör. "gcf/"). Klasöre girin.
requirements.txtdosyası oluşturma:
google-cloud-storage
google-cloud-aiplatform
pymysql
- Python işlevi oluşturun. Örnek kodu burada bulabilirsiniz: 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
- İşlevi gönderin. Buna benzer bir komut dosyası kullanabilirsiniz: gcf/push-to-gcf.sh.
1. Not. ENV'leri doğru değerlerle sağladığınızdan veya bunları 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örle çevrelediğ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 generate_caption, çağrılan yöntem olacak ve Cloud Function, GCS etkinliğini ilgili tüm bilgilerle (paket adı, nesne adı vb.) birlikte bu yönteme iletecektir. Bu etkinlik Python sözlüğünde hata ayıklamak için biraz zaman ayırı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ında verilmiştir.
Cloud Functions kullanıcı arayüzü
Ayrıca, kullanıcı arayüzünde işlevinizi incelemek için de zaman ayırın. Özellikle Source (en sevdiğim), Variables, Trigger ve Logs olmak üzere her sekme keşfedilmeye değer. Hataları gidermek için Logs sekmesinde çok zaman geçireceksiniz (Bu sayfanın alt kısmındaki olası hatalara da göz atın). Ayrıca Permissions sekmesini de kontrol etmeyi unutmayın.

Uçtan Uca Test
İşlevi manuel olarak test etme zamanı!
- Uygulamanıza gidip giriş yapın.
- Resim yükleyin (çok büyük olmamalı, büyük resimlerde sorunlar görüldü)
- Kullanıcı arayüzünde resmin yüklenip yüklenmediğini kontrol edin.
- Açıklamanın güncellendiğini Cloud SQL Studio'da kontrol edin. Oturum açın ve şu sorguyu çalıştırın:
SELECT * FROM images.

Bu yöntem kesinlikle işe yarıyor! Ayrıca, bu açıklamayı göstermek için ön ucu da 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 da bu açıklamayı görmesi iyi olurdu.
Açıklamayı index.php öğesine eklemek için PHP uzmanı olmamız gerekmez. Bu kodun yapması gerekenler (evet, Gemini da benim için 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 istediğ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. Daha güzel bir sürüm şu şekilde görünebilir:

Sonuçlar
GCS'ye gelen yeni nesneler için tetiklenen bir Cloud Function'ınız var. Bu işlev, resimdeki içeriği bir insanın yapabileceği gibi açıklayabiliyor ve veritabanını otomatik olarak güncelleyebiliyor. İnanılmaz!
Sırada ne var? Aynı mantığı kullanarak iki harika işlev elde edebilirsiniz.
[isteğe bağlı] Başka Cloud Functions ekleyin [açık uçlu]
Aklıma birkaç ek özellik geliyor.
📩 E-posta Tetikleyicisi
Birisi resim gönderdiğinde size e-posta gönderen bir e-posta tetikleyicisi.
- Çok sık mı? Başka bir kısıtlama ekleyin: BÜYÜK bir resim veya Gemini içeriğinde "çıplak/çıplaklık/şiddet" kelimelerinin geçtiği bir resim.
- Bu konuda
EventArcbölümüne göz atabilirsiniz.
🚫 Uygunsuz resimleri otomatik olarak denetleme
Şu anda bir yönetici, resimleri "uygunsuz" olarak işaretliyor. Gemini'ın zorlu görevleri üstlenip alanı yönetmesine ne dersiniz? Uygunsuz tetikleyici içeriği işaretlemek için bir test ekleyin ve önceki işlevde öğrendiğimiz gibi veritabanını güncelleyin. Bu, temelde önceki işlevi alıp istemi değiştirerek ve yanıtı temel alarak veritabanını güncelleyerek yapılır.
Uyarı. Üretken yapay zeka, tahmin edilemeyen çıkışlar verebilir. Gemini'ın "reklam öğesi çıkışı"nın "raylı sisteme" yerleştirildiğinden emin olun. 0 ile 1 arasında bir güven puanı, JSON gibi belirleyici bir yanıt isteyebilirsiniz. Bunu birçok şekilde yapabilirsiniz. Örneğin: * Python kitaplıklarını (pydantic, langchain, ..) kullanarak * Gemini Yapılandırılmış Çıkış'ı kullanarak.
İpucu BİRDEN FAZLA işleviniz olabilir veya JSON yanıtı zorunlu kılan tek bir isteminiz olabilir (yukarıda vurgulandığı gibi "Gemini Yapılandırılmış Çıkış" ile mükemmel çalışır). Örneğin:
Bunu oluşturmak için istem ne olmalıdır?
{
"description": "This is the picture of an arrosticino",
"suitable": TRUE
}
İstemde ek alanlar belirterek şu gibi analizler elde edebilirsiniz: Bu ürünün iyi bir özelliği var mı? Bu konuda kötü olan ne? Bu yeri tanıyor musunuz? Metin var mı? (OCR hiç bu kadar kolay olmamıştı):
goods: "It looks like yummie food" (Lezzetli yemek gibi görünüyor)bads: "Sağlıksız yiyecek gibi görünüyor"OCR: "Da consumare preferibilmente prima del 10 Novembre 2024"location: "Pescara, Lungomare"
N sonuç için N işlevine sahip olmak genellikle daha iyi olsa da 10 işlevi olan bir işlev oluşturmak inanılmaz derecede faydalıdır. Nasıl yapıldığını görmek için Riccardo'nun bu makalesine göz atın.
Olası hatalar (çoğunlukla IAM / izinlerle ilgili)
Bu çözümü ilk geliştirdiğimde bazı IAM izni sorunlarıyla karşılaştım. Bu hataları, empati kurmak ve nasıl düzeltileceğine dair fikir vermek için buraya ekleyeceğim.
Hata: Hizmet hesabı için yeterli izin yok
- 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. Şekilde gösterildiği gibi:

Ayrıca, tam olarak kullanıma sunulmadan birkaç dakika önce EventArc API'lerini etkinleştirmeniz de gerekebilir.
Hata: Cloud Run çağırıcısı eksik
- GCF izinleri için kullanıcı arayüzünden alınan bir diğer yorum da şudur ( Cloud Run Çağırıcı rolü):

Bu hata, resimdeki komut çalıştırılarak düzeltilebilir. Bu komut, fix-permissions.sh komutuna benzer.
Bu sorun şu adreste açıklanmaktadır: https://cloud.google.com/functions/docs/securing/authenticating
Hata: Bellek sınırı aşıldı
İlk çalıştırdığımda günlüklerimde şu mesaj yer alıyordu: "Kullanılan 270 MiB ile 244 MiB'lik bellek sınırı aşıldı. Bellek sınırını artırmayı düşünebilirsiniz. https://cloud.google.com/functions/docs/configuring/memory adresini inceleyin. GCF'nize tekrar RAM ekleyin. Bu işlemi kullanıcı arayüzünde kolayca yapabilirsiniz. Olası bir sorun:

Alternatif olarak, MEM/CPU'yu artırmak için Cloud Run dağıtım komut dosyanızı da düzeltebilirsiniz. Bu işlem biraz daha uzun sürer.
Hata: PubSub Yayınlandı
GCF v1 ile tetikleyici oluşturulurken bir kez şu hata verildi:

Bu sorunu düzeltmek için IAM'e gidip hizmet hesabınıza "Pub/Sub Yayıncısı" rolünü vermeniz yeterlidir.
Hata: Vertex AI kullanılmamış
Bu hatayı alırsanız:
İzin Reddedildi: 403 Vertex AI API, YOUR_PROJECT projesinde 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.
Yalnızca Vertex AI API'lerini etkinleştirmeniz gerekir. Gerekli TÜM API'leri etkinleştirmenin en kolay yolu şudur:
- https://console.cloud.google.com/vertex-ai
- "Önerilen tüm API'leri etkinleştir"i tıklayın.

Hata: EventArc tetikleyicisi bulunamadı.
Bu hatayı alırsanız lütfen işlevi yeniden dağıtın.

Hata: 400 Hizmet aracıları sağlanıyor
400 hizmet aracısı sağlanıyor ( https://cloud.google.com/vertex-ai/docs/general/access-control#service-agents ). Sağlanan Cloud Storage dosyasının okunması için hizmet aracıları gerekir. Lütfen birkaç dakika sonra tekrar deneyin.
Bu durumda bir süre bekleyin veya bir Google çalışanıyla iletişime geçin.
10. 8. Modül: Kullanılabilirlik SLO'ları oluşturma
Bu bölümde şu hedeflere ulaşmaya çalışıyoruz:
- SLI oluşturma
- SLI'lara dayalı SLO'lar oluşturma
- SLO'lara dayalı uyarılar oluşturma

Riccardo, Google Cloud'un SRE / DevOps alanında çalıştığı için bu konu yazar için çok önemlidir.
(açık uçlu) Bu uygulama için SLI'lar ve SLO'lar oluşturun
Bir uygulamanın ne zaman kapalı olduğunu anlayamıyorsanız bu uygulama ne kadar iyidir?
SLO nedir?
Eyvah! SLO'ları Google icat etti. Bu konu hakkında daha fazla bilgi edinmek için şu makaleleri inceleyebilirsiniz:
- SRE Book - chapter 2 - Implementing SLOs (SRE Kitabı - 2. Bölüm - SLO'ları Uygulama). ( 👉 Diğer SRE kitapları)
- Art of SLOs ( harika bir video). Hizmetiniz için mükemmel bir SLO oluşturma hakkında daha fazla bilgi edinmek için harika bir eğitimdir.
- Coursera'daki SRE kursu. Bu başarıda benim de katkım var.
1. adım: Kullanılabilirlik SLI/SLO'su oluşturun
Ölçmek isteyeceğiniz en kolay ve muhtemelen en önemli şey olduğu için Kullanılabilirlik SLO'su 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 bu işlemi gerçekleştirmek çok kolaydır ve 30 saniye sürer.
- Cloud Run sayfanıza gidin.
- Uygulamanızı tıklayın/seçin.
SLOssekmesini seçin.- "+ SLO oluştur"u tıklayın.
- Kullanılabilirlik, İsteğe bağlı
- Devam
- Takvim ayı / %99.
- "SLO oluştur"u tıklayın.

2. adım: Bu SLO'da uyarıları ayarlayın
2 uyarı oluşturmanızı öneririz:
- E-posta yoluyla sizi uyarmak için düşük yanma oranına sahip olan ("Slowburn") (düşük öncelikli bilet simülasyonu).
- SMS ile sizi uyarmak için yüksek yanma oranına sahip olan ("Fastburn") (yüksek öncelikli bilet / çağrı cihazı simülasyonu)
Daha önce kullandığınız SLO tab cihazınıza gidin.
Şunu iki kez yapın:

- "SLO uyarısı oluştur"u (sağdaki artı işaretli 🔔 düğmesi) tıklayın.
- Yeniden inceleme süresi, tüketme hızı eşiği:
- [FAST]. İlk:
60dk /10kez - [YAVAŞ]. İkinci:
720dk /2kez - Bildirim kanalı: Bildirim kanallarını yönet'i tıklayın.
- Öncelikle "E-posta" -> Yeni ekle -> ..
- İkincisi: "SMS" -> Yeni ekle -> Telefonda doğrulayın.
- İpucu: Adlarda emoji kullanmayı seviyorum. Demolar için eğlenceli bir özellik.
- İşlem tamamlandığında sağ üstteki büyük X'i tıklayın.
- Önce telefonu (hızlı), ardından e-postayı (yavaş) seçin.
- Aşağıdakiler gibi örnek belgeler 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!
Sonuç
Kullanılabilirliğiniz için 1 çalışan SLO'nuz ve 2 uyarı olduğunda ve bunlar e-posta adresinize ve telefonunuza uyarı gönderdiğinde bu alıştırmayı tamamlanmış olarak kabul edebiliriz.
İsterseniz bir gecikme (bunu yapmanızı şiddetle tavsiye ederim) veya daha karmaşık bir gecikme ekleyebilirsiniz. Gecikme için makul olduğunu düşündüğünüz bir gecikme süresi seçin. Emin değilseniz 200 ms'yi seçin.
11. Sonraki adımlar
HER ŞEYİ tamamladınız, ne eksik?
Üzerinde düşünmeniz gereken bazı noktalar:
Gemini'ı kullanma
Gemini'ı iki farklı şekilde kullanabilirsiniz:
- Vertex AI. 7. bölümde (GCF+Gemini) ele aldığımız, GCP'nizle iç içe olan"Enterprise yolu". Tüm kimlik doğrulama işlemleri sorunsuz bir şekilde çalışır ve hizmetler mükemmel şekilde birbirine bağlanır.
- Google Yapay Zeka "Tüketici yolu". Buradan bir Gemini API anahtarı alıp halihazırda sahip olduğunuz tüm iş yüklerine (tescilli çalışmalar, diğer bulutlar, localhost vb.) bağlanabilen küçük komut dosyaları oluşturmaya başlayabilirsiniz. API anahtarınızı değiştirmeniz yeterlidir. Kod sihirli bir şekilde çalışmaya başlar.
(2) ile kendi kişisel projelerinizi keşfetmenizi öneririz.
UI Lifting
Kullanıcı arayüzleri konusunda iyi değilim. Ancak Gemini öyle. Tek bir PHP sayfası alıp şu gibi 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 kolayca yapabilirsiniz. :)
Gemini'ın yanıtı mükemmeldi (yani hiçbir şeyi değiştirmem gerekmedi):

Ayrıca, yazarın kişisel uygulamasındaki yeni düzeni de aşağıda görebilirsiniz:

Not: Kodu almanızı değil, Gemini'ın kendi yaratıcı kullanıcı arayüzü/ön uç kısıtlamalarınızla kodu sizin için yazmasını istediğimizden kod, resim olarak yapıştırılır. İnanın, sonrasında çok küçük değişiklikler yapmanız yeterli olur.
Güvenlik
Bu uygulamayı uygun şekilde güvenli hale getirmek, bu 4 saatlik atölye çalışmasının hedefi değildir. Bu işlem, atölye çalışmasının tamamlanma süresini 1-2 kat artıracaktır.
Ancak bu konu çok önemlidir. SECURITY bölümünde bazı fikirleri bir araya getirdik.
12. Tebrikler!
Tebrikler 🎉🎉🎉 , eski PHP uygulamanızı Google Cloud ile başarıyla modernize ettiniz.

Bu codelab'de özetle şunları öğrendiniz:
- Google Cloud SQL'de 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 bir şekilde depolama/kullanma
- Google Cloud Build ile CI/CD ardışık düzeninizi ayarlayarak GitHub deponuza yapılan her kod aktarımında PHP uygulamanızı otomatik olarak oluşturma ve dağıtma
- Uygulama kaynaklarınızı "bulutlaştırmak" için Cloud Storage'ı kullanma
- Uygulama kodunuza dokunmadan Google Cloud üzerinde harika iş akışları oluşturmak için sunucusuz teknolojilerden nasıl yararlanacağınızı öğrenin.
- Uygun bir kullanım alanı için Çoklu format destekli Gemini'ı kullanın.
- Google Cloud'da SRE ilkelerini uygulama
Bu kurs, Google Cloud ile uygulama modernizasyonu yolculuğunuz için harika bir başlangıç noktasıdır.
🔁 Geri bildirim
Bu atölye çalışmasıyla ilgili deneyiminizi bizimle paylaşmak isterseniz geri bildirim formunu doldurabilirsiniz.
Geri bildirimlerinizi ve özellikle gurur duyduğunuz kod parçaları için PR'larınızı bekliyoruz.
🙏 Teşekkürler
Yazar, yazma ve çözümü test etme konusunda yardımcı olan Datatonic'ten Mirko Gilioli ve Maurizio Ipsale'ye teşekkür eder.
