Cloud Run ile Üç Kolay Adımda Geliştirmeden Üretime

1. Giriş

Uygulamaları yönetmek neden bu kadar zor?

Bunun önemli bir nedeni, geliştiricilerin genellikle yarı zamanlı sistem yöneticisi olmasıdır. Modern bir üretim düzeyinde web uygulaması geliştirme, dağıtma ve yönetme konusunda aşağıdaki (kısmi) endişe listesini göz önünde bulundurun :

4d018476b4a73b47.png

Seni bilmem ama ben bu konularda endişelenmek istemiyorum. Aslında düşünmek istediğim şey uygulama mantığım:

6dfd143d20e5548b.png

Cloud Run'ın özünde yatan fikir budur: Uygulamanıza odaklanabilmenizi sağlamak ve yönetim ile bakımla ilgili tüm işleri, bu alandaki becerilerini geliştirmek ve mükemmelleştirmek için milyonlarca saat harcamış olan Google'a bırakmak.

Yukarıda belirtilen yönetimsel zorluklara ek olarak şunlarla da uğraşmanız gerekir:

  • Bağımlılıklar: Uygulamanızın çalıştığı ortam, mümkün olduğunda test edildiği ortamla tam olarak eşleşmelidir. Bu, işletim sistemi, destek kitaplıkları, dil yorumlayıcısı veya derleyici, donanım yapılandırması ve diğer birçok faktör dahil olmak üzere çeşitli boyutları kapsayabilir.
  • Dağıtım: Bir uygulamanın yerel sürümünden internette geniş çapta paylaşılan bir sürüme geçiş genellikle çalışma zamanı ortamının değiştirilmesini, karmaşıklıkta büyük bir artışı ve zorlu bir öğrenme sürecini gerektirir.

Cloud Run, bu ve diğer birçok endişenizi sizin yerinize giderir. Ancak sözüme güvenmek yerine birlikte bir uygulama oluşturalım ve yalnızca birkaç basit adımda yerel bir geliştirme ortamından üretime hazır bir bulut uygulamasına geçişin ne kadar kolay olduğunu görelim.

Yapacaklarınız...

  • Basit bir web uygulaması oluşturacak ve geliştirme ortamınızda beklendiği gibi çalıştığını doğrulayacaksınız.
  • Ardından, aynı uygulamanın kapsayıcılı sürümüne geçeceksiniz. Bu süreçte, kapsayıcılığın ne anlama geldiğini ve neden bu kadar faydalı olduğunu keşfedeceksiniz.
  • Son olarak, uygulamanızı buluta dağıtacak ve komut satırı ile Google Cloud Console'u kullanarak Cloud Run hizmetinizi yönetmenin ne kadar kolay olduğunu göreceksiniz.

Öğrenecekleriniz...

  • Python'da basit bir web sunucusu uygulaması oluşturma
  • Uygulamanızı her yerde çalışan bir Docker container'ına nasıl paketlersiniz?
  • Uygulamanızı buluta dağıtarak herkesin yeni yapımınızı denemesini sağlama
  • Buildpack'leri kullanarak yukarıdaki adımları daha da basitleştirme
  • Google Cloud komut satırı aracını ve Cloud Console web kullanıcı arayüzünü kullanma

İhtiyacınız olanlar...

  • Web tarayıcısı
  • Google Hesabı

Bu laboratuvar, yeni başlayanlar da dahil olmak üzere her seviyeden geliştiriciye yöneliktir. Python kullanacak olsanız da neler olduğunu anlamak için Python programlamayı bilmeniz gerekmez. Çünkü kullandığınız tüm kodları açıklayacağız.

2. Hazırlanın

5110b5081a1e1c49.png

Bu bölümde, laboratuvarı kullanmaya başlamak için yapmanız gereken her şey açıklanmaktadır.

Yönlendirmesiz ortam kurulumu

  1. Cloud Console'da oturum açın ve yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. (Gmail veya Google Workspace hesabınız yoksa oluşturmanız gerekir.)

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

Proje kimliğini unutmayın. Bu kimlik, tüm Google Cloud projelerinde benzersiz bir addır (Yukarıdaki ad zaten alınmış olduğundan sizin için çalışmayacaktır). Bu codelab'in ilerleyen kısımlarında PROJECT_ID olarak adlandırılacaktır.

  1. Ardından, Google Cloud kaynaklarını kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir.

Bu codelab'i tamamlamak neredeyse hiç maliyetli değildir. Bu eğitimin ötesinde faturalandırma ücreti alınmaması için kaynakları nasıl kapatacağınız konusunda size tavsiyelerde bulunan "Temizleme" bölümündeki talimatları uyguladığınızdan emin olun. Google Cloud'un yeni kullanıcıları 300 ABD doları değerinde ücretsiz deneme programından yararlanabilir.

Cloud Shell'i başlatma

Bu laboratuvarda, Google'ın bulutunda çalışan bir sanal makine tarafından barındırılan bir komut yorumlayıcı olan Cloud Shell oturumunda çalışacaksınız. Bu bölümü kendi bilgisayarınızda yerel olarak da çalıştırabilirsiniz ancak Cloud Shell'i kullanmak, herkesin tutarlı bir ortamda tekrarlanabilir bir deneyime erişmesini sağlar. Laboratuvarın ardından bu bölümü kendi bilgisayarınızda tekrar deneyebilirsiniz.

704a7b7491bd157.png

Cloud Shell'i etkinleştirme

  1. Cloud Console'da Cloud Shell'i etkinleştir 'i 4292cbf4971c9786.png tıklayın.

bce75f34b2c53987.png

Cloud Shell'i daha önce hiç başlatmadıysanız ne olduğunu açıklayan bir ara ekran (ekranın alt kısmı) gösterilir. Bu durumda Devam'ı tıkladığınızda bu ekranı bir daha görmezsiniz. Bu tek seferlik ekran aşağıdaki gibi görünür:

70f315d7b402b476.png

Cloud Shell'in temel hazırlığı ve bağlanması yalnızca birkaç dakikanızı alır.

fbe3a0674c982259.png

Bu sanal makine, ihtiyaç duyduğunuz tüm geliştirme araçlarını içerir. 5 GB boyutunda kalıcı bir ana dizin bulunur ve Google Cloud'da çalışır. Bu sayede ağ performansı ve kimlik doğrulama önemli ölçüde güçlenir. Bu codelab'deki çalışmalarınızın neredeyse tamamını yalnızca bir tarayıcı veya Chromebook'unuzla yapabilirsiniz.

Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin, proje kimliğinize ayarlandığını görürsünüz.

  1. Kimliğinizin doğrulandığını onaylamak için Cloud Shell'de şu komutu çalıştırın:
gcloud auth list

Komut çıkışı

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. gcloud komutunun projeniz hakkında bilgi sahibi olduğunu onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud config list project

Komut çıkışı

[core]
project = <PROJECT_ID>

Değilse şu komutla ayarlayabilirsiniz:

gcloud config set project <PROJECT_ID>

Komut çıkışı

Updated property [core/project].

Terminalinizde, sonraki adımlarda işinizi kolaylaştıracak bazı ortam değişkenleri ayarlayın:

export PROJ=$GOOGLE_CLOUD_PROJECT 
export APP=hello 
export PORT=8080
export REGION="us-central1"
export TAG="gcr.io/$PROJ/$APP"

API'leri etkinleştirme

Bu hizmetlerin nerede (ve neden) gerekli olduğunu sonraki adımlarda göreceksiniz. Ancak şimdilik projenize Cloud Build, Container Registry ve Cloud Run hizmetlerine erişim izni vermek için bu komutu çalıştırın:

gcloud services enable cloudbuild.googleapis.com         \
                       containerregistry.googleapis.com  \
                       run.googleapis.com          

Bu işlem, şuna benzer bir başarılı mesajı oluşturur:

Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.

3. Basit bir web uygulaması oluşturma

eef530b56b8e93a3.png

Cloud Shell panelinizin üst kısmındaki Open Editor düğmesini tıklayarak başlayın. Şöyle görünür:

9b81c8a37a6bcdd8.png

Ardından, Visual Studio Code'a benzer bir IDE ortamına yönlendirilirsiniz. Bu ortamda projeler oluşturabilir, kaynak kodu düzenleyebilir, programlarınızı çalıştırabilirsiniz. Ekranınız çok dar ise konsol ile düzenleme/terminal pencereniz arasındaki bölme çizgisini genişletebilir veya daraltabilirsiniz. Bunun için, bu iki bölge arasındaki yatay çubuğu (burada vurgulanmıştır) sürükleyin:

8dea35450851af53.png

Sırasıyla Open Editor ve Open Terminal düğmelerini tıklayarak düzenleyici ile terminal arasında geçiş yapabilirsiniz. Şimdi bu iki ortam arasında geçiş yapmayı deneyin.

Ardından, Dosya->Yeni Klasör'ü seçerek bu laboratuvar için çalışmanızı saklayacağınız bir klasör oluşturun, hello girin ve OK simgesini tıklayın. Bu laboratuvarda oluşturduğunuz tüm dosyalar ve Cloud Shell'de yaptığınız tüm çalışmalar bu klasörde yer alır.

Şimdi bir requirements.txt dosyası oluşturun. Bu, Python'a uygulamanızın hangi kitaplıklara bağlı olduğunu bildirir. Bu basit web uygulamasında, web sunucuları oluşturmak için Flask adlı popüler bir Python modülünü ve gunicorn adlı bir web sunucusu çerçevesini kullanacaksınız. Yeni bir dosya oluşturmak için Cloud Editor penceresinde File->New File (Dosya->Yeni Dosya) menüsünü tıklayın. Yeni dosyanın adı istendiğinde requirements.txt girin ve OK düğmesine basın. Yeni dosyanın hello proje klasörüne eklendiğinden emin olun.

Uygulamanızın Python Flask paketine ve gunicorn web sunucusuna bağlı olduğunu belirtmek için yeni dosyaya aşağıdaki satırları girin.

Flask
gunicorn

Cloud Editor, değişiklikleri otomatik olarak kaydettiği için bu dosyayı açıkça kaydetmeniz gerekmez.

1. sürüm: Hello world!

Aynı tekniği kullanarak main.py adlı başka bir yeni dosya oluşturun. Bu dosya, uygulamanızın ana (ve tek) Python kaynak dosyası olacaktır. Yeni dosyanın hello proje klasörüne kaydedildiğinden emin olun.

Bu dosyaya aşağıdaki kodu ekleyin:

from flask import Flask
import os
import random

app = Flask(__name__)  # Create a Flask object.
PORT = os.environ.get("PORT")  # Get PORT setting from the environment.

# The app.route decorator routes any GET requests sent to the root path
# to this function, which responds with a "Hello world!" HTML document.
@app.route("/", methods=["GET"])
def say_hello():
    html = "<h1>Hello world!</h1>"
    return html


# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=PORT)

Terminale geri dönün ve şu komutla proje klasörüne geçin:

cd hello

Proje bağımlılıklarınızı yüklemek için aşağıdaki komutu çalıştırın:

pip3 install -r requirements.txt

Şimdi terminalde şu komutu çalıştırarak uygulamanızı başlatın:

python3 main.py

Bu noktada uygulamanız, Cloud Shell oturumunuza ayrılmış sanal makinede çalışıyor. Cloud Shell, sanal makinenizde çalışan web sunucularına (ör. az önce başlattığınız sunucu) küresel internetin herhangi bir yerinden erişmenizi sağlayan bir proxy mekanizması içerir.

web preview düğmesini ve ardından Preview on Port 8080 menü öğesini aşağıdaki gibi tıklayın:

fe45e0192080efd6.png

Bu işlem, çalışan uygulamanız için bir web tarayıcısı sekmesi açar. Bu sekme aşağıdaki gibi görünmelidir:

b1f06501509aefb9.png

2. sürüm: URL yolunu yansıtma

Cloud Editor'a (Open Editor düğmesiyle) dönün ve main.py dosyanızı aşağıdaki gibi güncelleyerek isteğe bağlı bir URL son ekini yansıtma desteği ekleyin:

from flask import Flask
import os
import random

app = Flask(__name__)  # Create a Flask object.
PORT = os.environ.get("PORT")  # Get PORT setting from environment.

# The app.route decorator routes any GET requests sent to the root path
# to this function, which responds with a "Hello world!" HTML document.
# If something is specified as the URL path (after the '/'), say_hello()
# responds with "Hello X", where X is the string at the end of the URL.
@app.route("/", methods=["GET"])
@app.route("/<name>", methods=["GET"])     # ← NEW
def say_hello(name="world"):               # ← MODIFIED
    html = f"<h1>Hello {name}!</h1>"       # ← MODIFIED
    return html


# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=PORT)

Open Terminal düğmesini kullanarak Terminal'e geri dönün ve çalışan uygulamanızı durdurmak için control-C (C tuşuna basarken kontrol tuşunu basılı tutun) girin. Ardından, aşağıdaki kodu girerek uygulamayı yeniden başlatın:

python3 main.py

Çalışan uygulamanız için bir web tarayıcısı sekmesi açmak üzere tekrar web preview düğmesini ve ardından Preview on Port 8080 menü öğesini tıklayın. "Hello world!" mesajını tekrar görmelisiniz.Ancak şimdi eğik çizgi karakterinden sonraki URL metnini istediğiniz bir dizeyle (ör. /your-name) değiştirin ve şuna benzer bir şey gördüğünüzü doğrulayın:

93b87996f88fa370.png

3. sürüm: Rastgele Renkler

Şimdi Cloud Editor'e (Open Editor düğmesiyle) dönüp main.py dosyanızı aşağıdaki gibi güncelleyerek rastgele arka plan renkleri desteği ekleyin:

from flask import Flask
import os
import random

app = Flask(__name__)  # Create a Flask object.
PORT = os.environ.get("PORT")  # Get PORT setting from the environment.

# This function decides whether foreground text should be
# displayed in black or white, to maximize fg/bg contrast.
def set_text_color(rgb):                      # ← NEW
    sum = round(                              # ← NEW
        (int(rgb[0]) * 0.299)                 # ← NEW
        + (int(rgb[1]) * 0.587)               # ← NEW
        + (int(rgb[2]) * 0.114)               # ← NEW
    )                                         # ← NEW
    return "black" if sum > 186 else "white"  # ← NEW


# The app.route decorator routes any GET requests sent to the root path
# to this function, which responds with a "Hello world!" HTML document.
# If something is specified as the URL path (after the '/'), say_hello()
# responds with "Hello X", where X is the string at the end of the URL.
# To verify each new invocation of these requests, the HTML document
# includes CSS styling to produce a randomly colored background.
@app.route("/", methods=["GET"])
@app.route("/<name>", methods=["GET"])
def say_hello(name="world"):
    bg = random.sample(range(1, 255), 3)                       # ← NEW
    hex = (int(bg[0]) * 256) + (int(bg[1]) * 16) + int(bg[2])  # ← NEW
    fg_color = set_text_color(bg)                              # ← NEW
    bg_color = f"#{hex:06x}"                                   # ← NEW
    style = f"color:{fg_color}; background-color:{bg_color}"   # ← NEW
    html = f'<h1 style="{style}">Hello {name}!</h1>'           # ← MODIFIED
    return html


# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=PORT)

Open Terminal düğmesini kullanarak Terminal'e geri dönün ve çalışan uygulamanızı durdurmak için control-C (C tuşuna basarken kontrol tuşunu basılı tutun) girin. Ardından, aşağıdaki kodu girerek uygulamayı yeniden başlatın:

python3 main.py

Tekrar web preview düğmesini ve ardından Preview on Port 8080 menü öğesini tıklayarak çalışan uygulamanız için bir web tarayıcısı sekmesi açın. Oluşturulan metni, belirtilen herhangi bir sonek veya varsayılan "Hello world!" dizesiyle birlikte rastgele renklendirilmiş bir arka planın önünde şu şekilde görmelisiniz:

baf8d028f15ea7f4.png

Uygulamayı her ziyaret ettiğinizde rastgele arka plan renginin değiştiğini görmek için sayfayı birkaç kez yeniden yükleyin.

Böylece uygulamanız tamamlandı. Tebrikler! Bir sonraki adımda, uygulamanızı nasıl bir kapsayıcıya paketleyeceğinizi ve bunun neden yararlı olduğunu öğreneceksiniz.

4. Uygulamanızı Kapsayıcıya Alma

17cc234ec3325a8a.png

Kapsayıcı nedir?

Genel olarak container'lar ve özellikle Docker, bir uygulamayı tüm bağımlılıklarıyla birlikte çalıştırabileceğimiz modüler bir kutu oluşturmamıza olanak tanır. Sonuca kapsayıcı görüntü adı verilir. Bu bölümde, uygulamanızı ve tüm bağımlılıklarını kapsüllemek için kullanacağınız bir kapsayıcı görüntüsü oluşturacaksınız.

Bağımlılıklardan bahsetmişken, önceki bir adımda uygulamanızı geliştirici ortamında çalıştırırken pip3 install -r requirements.txt komutunu çalıştırmanız ve requirements.txt dosyasının tüm bağımlı kitaplıklarınızı ve ilgili sürümleri içerdiğinden emin olmanız gerekiyordu. Kapsayıcılarla, kapsayıcı görüntüsünü oluşturduğunuzda bu gereksinimleri yüklersiniz. Bu nedenle, kapsayıcı tüketicisinin herhangi bir şey yüklemesi konusunda endişelenmesine gerek yoktur.

Bu container görüntüsü, uygulamanızı Cloud Run'da dağıtmak için temel yapı taşı olacaktır. Container'lar neredeyse tüm sanal veya gerçek sunucularda kullanılabildiğinden uygulamanızı istediğiniz yere dağıtmanıza ve bir hizmet sağlayıcıdan diğerine ya da şirket içi ortamdan buluta taşımanıza olanak tanır.

Container'lar, uygulamalarınızın aşağıdaki özelliklere sahip olmasını sağlar:

  • Yeniden üretilebilir: Kapsayıcılar bağımsız ve eksiksizdir.
  • taşınabilir: Container'lar, sektörler arası yapı taşlarıdır. Uygulamaların bulut sağlayıcılar ve ortamlar arasında taşınabilir olmasını sağlar.

Kısacası, container'lar nihayet "bir kez yazıp her yerde çalıştırma" olanağı sunar. Bu kuralın bir istisnası, oluşturulan kapsayıcının yalnızca oluşturulduğu işlemci türünde çalıştırılabiliyor olmasıdır. Ancak diğer donanım yapılandırmaları için de kapsayıcı sürümleri oluşturmanın yolları vardır.

Yeterince konuştuk, şimdi kapsayıcı oluşturalım. Docker adlı bir container oluşturmak için belirli bir teknoloji kullanacaksınız.

Cloud Editor'da Dockerfile adlı yeni bir dosya oluşturun. Bu dosya, resminizi oluşturmak için kullanılan bir taslaktır. Docker'a işletim ortamınız ve kaynak kodunuz, bağımlılıklarınızı nasıl yükleyeceğiniz, uygulamanızı nasıl oluşturacağınız ve kodunuzu nasıl çalıştıracağınız hakkında bilgi verir.

# Use an official lightweight Python image.
FROM python:3.9-slim

# Copy local code to the container image.
WORKDIR /app
COPY main.py .
COPY requirements.txt .

# Install dependencies into this container so there's no need to 
# install anything at container run time.
RUN pip install -r requirements.txt

# Service must listen to $PORT environment variable.
# This default value facilitates local development.
ENV PORT 8080

# Run the web service on container startup. Here you use the gunicorn
# server, with one worker process and 8 threads. For environments 
# with multiple CPU cores, increase the number of workers to match 
# the number of cores available.
CMD exec gunicorn --bind 0.0.0.0:$PORT --workers 1 --threads 8 --timeout 0 main:app

Cloud Terminal'de aşağıdaki komutu çalıştırarak Cloud Build'i kullanarak container görüntünüzü oluşturun:

gcloud builds submit --tag $TAG

Kayıt defterine gönderildikten sonra, resim adını içeren bir SUCCESS mesajı görürsünüz. Bu mesaj şuna benzer: gcr.io/<project-id>/hello. Görüntü artık Google Container Registry'de saklanıyor ve istediğiniz zaman, istediğiniz yerde yeniden kullanılabiliyor.

Şu komutu kullanarak mevcut projenizle ilişkili tüm kapsayıcı resimlerini listeleyebilirsiniz:

gcloud container images list

Şimdi bu docker komutlarını kullanarak uygulamayı Cloud Shell'den yerel olarak çalıştırıp test edin:

docker run -p $PORT:$PORT -e PORT=$PORT $TAG

-p $PORT:$PORT seçeneği, Docker'a ana makine ortamındaki harici bağlantı noktasını $PORT (yukarıda 8080 olarak ayarlanmıştır) çalışan kapsayıcının içindeki aynı bağlantı noktası numarasıyla eşlemesini söyler. Bu, yazdığınız sunucu kodu ile uygulamanızı test ederken bağlandığınız harici bağlantı noktası numarası aynı (8080) olacağından hayatı kolaylaştırır. Ancak, ana makinedeki herhangi bir rastgele harici bağlantı noktasını kapsayıcının içindeki istediğiniz dahili bağlantı noktasıyla eşlemek için -p seçeneğini de aynı kolaylıkla kullanabilirsiniz.

-e PORT=$PORT seçeneği, Docker'a kapsayıcının içinde çalışan uygulamanız için $PORT ortam değişkenini (yukarıda 8080 olarak ayarlanmıştır) kullanılabilir hale getirmesini söyler.

Artık bir web tarayıcısını kapsayıcının içinde çalışan Python koduna yönlendirerek uygulamanızı test etmeye hazırsınız. Cloud Shell penceresinde "Web önizlemesi" simgesini tıklayın ve önceki adımda yaptığınız gibi "8080 numaralı bağlantı noktasında önizle"yi seçin.

Sonuç tanıdık olmalıdır. Uygulamayı doğrudan Cloud Shell terminalinizde çalıştırdığınızda olduğu gibi, rastgele renkteki bir arka planın önünde oluşturulan metni görmelisiniz. Uygulamayı her ziyaret ettiğinizde rastgele arka plan renginin değiştiğini görmek için sayfayı birkaç kez yeniden yükleyin.

Tebrikler! Artık uygulamanızın container mimarisine alınmış bir sürümünü çalıştırdınız. Bir sonraki bölümde, tek bir kod satırına dokunmadan container resminizi üretim kalitesinde bir web uygulamasına dönüştüreceksiniz.

5. Buluta...

1b0665d94750ded6.gif

Uygulamanızı container mimarisine aldığınıza göre bu harika uygulamayı dünyanın geri kalanıyla paylaşmak isteyeceksiniz. Bu nedenle, uygulamayı Cloud'a dağıtmanın zamanı geldi. Ancak bu fotoğrafı paylaşmaktan daha fazlasını yapmak istiyorsunuz. Şunlardan emin olmak istiyorsanız:

  • Güvenilir şekilde çalışır: Uygulamanızı çalıştıran bir bilgisayar kilitlenirse otomatik hata toleransı elde edersiniz.
  • Otomatik ölçeklendirme: Uygulamanız, yüksek trafik seviyelerine ayak uydurur ve kullanılmadığında kapladığı alanı otomatik olarak azaltır.
  • Kullanmadığınız kaynaklar için sizden ücret almayarak maliyetlerinizi en aza indirir. Yalnızca trafiğe yanıt verirken kullanılan kaynaklar için ücretlendirilirsiniz.
  • Özel bir alan adı üzerinden erişilebilir. Hizmetinize özel bir alan adı atamak için tek tıklamayla çözüme erişebilirsiniz.
  • Mükemmel yanıt süresi sunar. Soğuk başlatmalar makul düzeyde yanıt verir ancak minimum örnek yapılandırması belirterek bu durumu daha iyi hale getirebilirsiniz.
  • Standart SSL/TLS web güvenliği kullanılarak uçtan uca şifrelemeyi destekler. Bir hizmet dağıttığınızda, standart web şifrelemesini ve gerekli sertifikaları ücretsiz ve otomatik olarak alırsınız.

Uygulamanızı Google Cloud Run'a dağıtarak yukarıdakilerin tümüne ve daha fazlasına sahip olursunuz.

Uygulamanızı Cloud Run'a Dağıtma

Öncelikle, yeni düzeltmeyi eskiden ayırt edebilmeniz için uygulamanızı değiştirelim. Bunu yapmak için main.py dosyasını, varsayılan mesaj "Hello world!" yerine "Hello from Cloud Run!" olacak şekilde değiştirin. Başka bir deyişle, main.py dosyasında bu satırı şu şekilde değiştirin:

def say_hello(name="world"):

şuna dönüştürün:

def say_hello(name="from Cloud Run"):

Cloud Run bölgeseldir. Bu nedenle, Cloud Run hizmetlerinizi çalıştıran altyapı belirli bir bölgede bulunur ve Google tarafından bu bölgedeki tüm bölgelerde yedekli olarak kullanılabilir şekilde yönetilir. Yukarıdaki "Başlarken" bölümünde, REGION ortam değişkeni aracılığıyla varsayılan bir bölge tanımladınız.

Aşağıdaki komutu kullanarak container görüntünüzü yeniden oluşturun ve container mimarisine alınmış uygulamanızı Cloud Run'a dağıtın:

gcloud builds submit --tag $TAG
gcloud run deploy "$APP"   \
  --image "$TAG"           \
  --platform "managed"     \
  --region "$REGION"       \
  --allow-unauthenticated
  • gcloud config set run/region $REGION ile varsayılan bir bölge de tanımlayabilirsiniz.
  • --allow-unauthenticated seçeneği, hizmeti herkese açık hâle getirir. Kimliği doğrulanmamış istekleri önlemek için bunun yerine --no-allow-unauthenticated politikasını kullanın.

Burada belirtilen görüntü, son adımda oluşturduğunuz Docker görüntüsüdür. Sonuçta elde edilen görüntüyü Google Container Registry'de depolayan Cloud Build hizmeti sayesinde Cloud Run hizmeti, görüntüyü bulup sizin için dağıtabilir.

Dağıtım tamamlanana kadar birkaç dakika bekleyin. İşlem başarılı olduğunda komut satırında hizmet URL'si gösterilir:

Deploying container to Cloud Run service [hello] in project [PROJECT_ID...
✓ Deploying new service... Done.                                   
  ✓ Creating Revision... Revision deployment finished. Waiting for health check...
  ✓ Routing traffic...
  ✓ Setting IAM Policy...
Done.
Service [hello] revision [hello-...] has been deployed and is serving 100 percent of traffic.
Service URL: https://hello-....a.run.app

Hizmet URL'nizi şu komutla da alabilirsiniz:

gcloud run services describe hello  \
  --platform managed                \
  --region $REGION                  \
  --format "value(status.url)"

Bu işlem sonucunda aşağıdakine benzer bir mesaj gösterilir:

https://hello-....a.run.app

Bu bağlantı, Cloud Run hizmetiniz için TLS güvenliğine sahip özel bir URL'dir. Bu bağlantı, hizmetinizi devre dışı bırakmadığınız sürece kalıcıdır ve internetin her yerinde kullanılabilir. Geçici bir sanal makineye bağlı olan ve daha önce bahsedilen Cloud Shell'in proxy mekanizmasını kullanmaz.

Çalışan uygulamanız için bir web tarayıcısı sekmesi açmak üzere vurgulanan Service URL simgesini tıklayın. Sonuçta, rastgele renklendirilmiş bir arka planın önünde "Hello from Cloud Run!" (Cloud Run'dan merhaba!) mesajınız gösterilmelidir.

Tebrikler! Uygulamanız artık Google'ın bulutunda çalışıyor. Uygulamanız, TLS (HTTPS) şifrelemesiyle ve akıl almaz düzeylerdeki trafiğe otomatik ölçeklendirmeyle herkese açık olarak kullanılabilir.

Ancak bu sürecin daha da kolay olabileceğini düşünüyorum...

6. Kapsayıcıyı Otomatik Olarak Oluşturma

Bunlar çok güzel ama Dockerfile'lar ve container'lar hakkında düşünmek bile istemiyorsam ne yapmalıyım? Çoğu geliştirici gibi ben de yalnızca uygulama kodumu yazmaya odaklanmak ve kapsülleme işlemini başkasına bırakmak istiyorum. Cloud Run, tam da bu nedenle var olan Buildpacks adlı açık kaynak standardını desteklediği için şanslısınız. Bu standart, bir dizi kaynak dosyadan kapsayıcı oluşturma sürecini otomatikleştirir.

Geliştiricilerin, örneğin kapsayıcılarının oluşturulma biçiminde yüksek düzeyde özelleştirme yapmak istedikleri durumlarda açık bir Dockerfile kullanmayı tercih edebileceğini unutmayın. Ancak bu alıştırmadaki gibi yaygın durumlarda buildpack'ler iyi çalışır ve Dockerfile oluşturma ihtiyacını ortadan kaldırır. Buildpack'leri kullanmak için kodunuzu değiştirelim.

Öncelikle, yeni düzeltmeyi eskiden ayırt edebilmeniz için uygulamanızı değiştirelim. Bunu, main.py dosyasını varsayılan mesaj "Hello from Cloud Run!" yerine "Hello from Cloud Run with Buildpacks!" olacak şekilde değiştirerek yapın. Başka bir deyişle, main.py dosyasında bu satırı şu şekilde değiştirin:

def say_hello(name="from Cloud Run"):

şuna dönüştürün:

def say_hello(name="from Cloud Run with Buildpacks"):

Şimdi Procfile adlı yeni bir dosya oluşturarak derleme paketlerinden yararlanalım. Cloud Editor'da bu dosyayı oluşturun ve şu metin satırını ekleyin:

web: python3 main.py

Bu, geri derleme sistemine uygulamanızı otomatik olarak oluşturulan kapsayıcıda nasıl çalıştıracağını söyler. Bu talimatla birlikte artık Dockerfile'a bile ihtiyacınız yok. Bunu doğrulamak için Dockerfile'ınızı silin ve Cloud Shell terminalinde aşağıdaki komutu çalıştırın:

gcloud beta run deploy "$APP"  \
    --source .                 \
    --platform "managed"       \
    --region "$REGION"         \
    --allow-unauthenticated

Bu, uygulamanızı dağıtmak için son adımda çalıştırdığınız komuta benzer ancak bu kez --image seçeneğini --source . seçeneğiyle değiştirdiniz. Bu komut, gcloud komutuna, geçerli dizinde bulduğu kaynak dosyalarına (--source . içindeki dot, geçerli dizinin kısaltmasıdır) göre container görüntünüzü oluşturmak için buildpack'leri kullanmasını istediğinizi bildirir. Hizmet, kapsayıcı resmini örtülü olarak ele aldığından bu gcloud komutunda bir resim belirtmeniz gerekmez.

Bu dağıtımın çalıştığını doğrulamak için tekrar vurgulanan Service URL simgesini tıklayarak çalışan uygulamanıza ait bir web tarayıcısı sekmesi açın ve hizmetinizin rastgele renklendirilmiş bir arka planın önünde "Hello from Cloud Run with Buildpacks!" (Buildpack'lerle Cloud Run'dan merhaba!) mesajını gösterdiğinden emin olun.

Dockerfile ürününüzü üretmek için derleme paketlerini kullandığınızda üç kolay adımı ikiye indirmiş olursunuz:

  1. Geliştirme ortamınızda bir uygulama oluşturun.
  2. Tek bir komutla tamamen aynı kodu buluta dağıtın.

7. Komut Satırını Kullanmak Zorunlu mu?

Hayır Neredeyse tüm Google Cloud hizmetlerinde olduğu gibi, Cloud Run ile etkileşim kurmanın üç yolu vardır:

  • Az önce gördüğünüz gcloud komut satırı aracı.
  • Cloud Console aracılığıyla zengin bir web kullanıcı arayüzü. Bu arayüz, sezgisel bir tıklama etkileşimi stilini destekler.
  • Java, C#, Python, Go, JavaScript, Ruby, C/C++ ve diğerleri gibi birçok popüler dil için kullanılabilen Google istemci kitaplıklarını kullanarak programatik olarak.

Konsol kullanıcı arayüzünü kullanarak Cloud Run uygulamanızın ek bir örneğini dağıtalım. Sol üstteki menüden Cloud Run Service açılış sayfasına gidin:

e2b4983b38c81796.png

Ardından, Cloud Run hizmetlerinizin aşağıdaki gibi bir özetini görürsünüz:

b335e7bf0a3af845.png

Dağıtım sürecini başlatmak için "Hizmet Oluştur" bağlantısını tıklayın:

51f61a8ddc7a4c0b.png

Hizmet adı olarak "hello-again" girin, varsayılan dağıtım platformunu ve bölgesini kullanın ve "Next"i (İleri) tıklayın.

8a17baa45336c4c9.png

Kapsayıcı resmi için şu URL'yi girin: gcr.io/cloudrun/hello. Bu, Google tarafından test amacıyla oluşturulmuş bir kapsayıcıdır. Ardından, kullanabileceğiniz birçok yapılandırma ayarından bazılarını görmek için "Gelişmiş Ayarlar" açılır listesini tıklayın. Özelleştirebileceğiniz birkaç öğeyi aşağıda bulabilirsiniz:

  • bağlantı noktası numarası ve container giriş noktası (container oluşturulurken belirtilen giriş noktasını geçersiz kılar)
  • donanım: bellek ve CPU sayısı
  • ölçeklendirme: minimum ve maksimum örnek sayısı
  • ortam değişkenleri
  • Diğerleri: istek zaman aşımı ayarı, kapsayıcı başına maksimum istek sayısı, HTTP/2

İletişimi ilerletmek için "Sonraki" düğmesini tıklayın. Sonraki iletişim kutusunda hizmetinizin nasıl tetikleneceğini belirleyebilirsiniz. "Giriş" için "Tüm trafiğe izin ver"i, "Kimlik doğrulama" için ise "Kimliği doğrulanmamış trafiğe izin ver"i seçin.

e78281d1cff3418.png

Bu ayarlar, kimlik doğrulama kimlik bilgileri belirtilmeden herkesin genel internetin herhangi bir yerinden Cloud Run uygulamanıza erişmesine izin verdiği için en liberal ayarlardır. Uygulamanız için daha kısıtlayıcı ayarlar isteyebilirsiniz ancak bu eğitim alıştırması için basit tutalım.

Şimdi Create düğmesini tıklayarak Cloud Run hizmetinizi oluşturun. Birkaç saniye sonra, yeni hizmetinizin Cloud Run hizmetlerinin özet listenizde göründüğünü görmeniz gerekir. Özet satırında, bazı önemli yapılandırma ayarlarıyla birlikte en son dağıtım (tarih/saat ve kim tarafından) bilgileri yer alır. Yeni hizmetinizle ilgili ayrıntılara inmek için hizmet adı bağlantısını tıklayın.

Hizmetinizi doğrulamak için özet sayfasının üst kısmına yakın bir yerde gösterilen URL'yi tıklayın. Bu URL, aşağıdaki örnekte vurgulanmıştır:

6c35cf0636dddc51.png

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

3ba6ab4fe0da1f84.png

Yeni bir Cloud Run hizmeti dağıttığınıza göre birden fazla dağıtımı yönetmenin bazı yollarını görmek için REVISIONS sekmesini seçin.

2351ee7ec4a356f0.png

Yeni düzeltmeleri doğrudan konsoldan dağıtmak için aşağıdaki örnek ekran görüntüsünde vurgulandığı gibi EDIT & DEPLOY NEW REVISION düğmesini tıklayabilirsiniz:

a599fa88d00d6776.png

Yeni bir düzeltme oluşturmak için bu düğmeyi şimdi tıklayın. Kapsayıcı URL'sinin yanında, aşağıda gösterildiği gibi SELECT düğmesini tıklayın:

5fd1b1f8e1f11d40.png

Açılan iletişim kutusunda, daha önce Buildpack'leri kullanarak Cloud Build'den dağıttığınız basit web uygulamasını bulun ve seç'i tıklayın. Aşağıdaki bölümden kapsayıcı resmini seçtiğinizden emin olun:

gcr.io/<project>/cloud-run-source-deploy

folder gibi:

8a756c6157face3a.png

Seçtikten sonra en alta gidip DEPLOY düğmesini tıklayın. Uygulamanızın yeni bir sürümünü dağıttınız. Doğrulamak için hizmet URL'nizi tekrar ziyaret edin ve artık renkli "Buildpack'lerle Cloud Run'dan merhaba!" web uygulamanızı gördüğünüzü doğrulayın.

Gördüğünüz gibi, düzeltmeler sekmesinde dağıttığınız her düzeltmenin özeti yer alır. Bu hizmet için artık iki düzeltme görmelisiniz. Düzeltme adının solundaki radyo düğmesini tıklayarak belirli bir düzeltmeyi seçebilirsiniz. Bu durumda, düzeltme ayrıntılarının özeti ekranın sağ tarafında gösterilir. Bu düğmeleri seçerek iki düzeltmenizin iki farklı kapsayıcı resminden türetildiğini görebilirsiniz.

MANAGE TRAFFIC düğmesi, belirli bir düzeltmeye gönderilen gelen isteklerin dağıtımını değiştirmenize olanak tanır. Belirli bir düzeltmeye ne kadar trafik gönderileceğini hassas bir şekilde ayarlama özelliği, çeşitli değerli kullanım alanları sunar:

  • Uygulamanızın yeni bir sürümünü, gelen trafiğin küçük bir bölümüyle canary testi yapma
  • Sorunlu bir sürümden gelen trafiği önceki bir düzeltmeye geri döndürme
  • A/B testi

MANAGE TRAFFIC düğmesini şu yerlerde bulabilirsiniz:

519d3c22ae028287.png

Şu şekilde 50/50 trafik yükü belirterek iki düzeltmeniz arasında 50/50 trafik yükü yapılandırın:

8c37d4f115d9ded4.png

Şimdi KAYDET düğmesini tıklayın ve hizmetinizin URL'sini tekrar tekrar ziyaret ederek 50/50 bölünmeyi doğrulayın. İsteklerinizin ortalama olarak yarısının mevcut düzeltme ("Hello from Cloud Run with Buildpacks!") tarafından, yarısının ise önceki düzeltme ("It's running!") tarafından karşılandığını kontrol edin.

Hizmet Ayrıntıları sayfasındaki diğer sekmeler, performansı, trafiği ve günlükleri izleme olanağı sunar. Bu sayede, hizmetinizin ne kadar zorlu ve ne kadar iyi çalıştığı hakkında değerli bilgiler edinebilirsiniz. Ayrıca, "İzinler" sekmesini kullanarak hizmetinize erişimi hassas bir şekilde ayarlayabilirsiniz. Burada sunulan özellikler hakkında bilgi edinmek için bu sayfadaki sekmeleri inceleyin.

Programatik Arayüz

Daha önce belirtildiği gibi, Cloud Run hizmetlerinizi programatik olarak oluşturma, dağıtma ve yönetme seçeneğiniz de vardır. Manuel görevler için bu seçenek, komut satırı veya web konsolundan daha gelişmiştir ancak Cloud Run hizmetlerini otomatikleştirmek için kesinlikle tercih edilmesi gereken yöntemdir. Birkaç popüler programlama dilinde Google istemci kitaplıklarını kullanabilirsiniz.

8. Uygulamanızı Test Etme

198ada162d1f0bf1.png

Bu son adımda, uygulamanızı yük testi yapmak ve gelen talebe göre nasıl ölçeklendiğini görmek için yapay bir yük testi çalıştıracaksınız. Cloud Shell'e önceden yüklenmiş olan ve yükleme testleri çalıştırmamıza ve sonuçları sunmamıza olanak tanıyan hey adlı bir aracı kullanacaksınız.

Testi çalıştırma

Cloud Shell terminalinde, yük testi çalıştırmak için şu komutu çalıştırın:

hey -q 1000 -c 200 -z 30s https://hello-...run.app

Komut bağımsız değişkenleri aşağıdaki şekilde yorumlanır:

  • -q 1000 - Yükü saniyede yaklaşık 1.000 istek olacak şekilde yönlendirmeye çalışın.
  • -c 200 - 200 paralel çalışan ayırın
  • -z 30s: Yük testini 30 saniye boyunca çalıştırır.
  • bu komut satırında son bağımsız değişken olarak hizmet URL'nizi kullandığınızdan emin olun

Testinizin sonuçları aşağıdaki gibi görünmelidir:

 Summary:
 Total:        30.2767 secs
 Slowest:      3.3633 secs
 Fastest:      0.1071 secs
 Average:      0.1828 secs
 Requests/sec: 1087.2387
 Total data:   3028456 bytes
 Size/request: 92 bytes

Response time histogram:
 0.107 [1]     |
 0.433 [31346] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
 0.758 [1472]  |■■
 1.084 [82]    |
 1.410 [4]     |
...

Latency distribution:
...
 50% in 0.1528 secs
 75% in 0.1949 secs
 90% in 0.2442 secs
 95% in 0.4052 secs
 99% in 0.7062 secs

Details (average, fastest, slowest):
...
 req write:    0.0000 secs, 0.0000 secs, 0.0232 secs
 resp wait:    0.1824 secs, 0.1070 secs, 3.2953 secs
 resp read:    0.0000 secs, 0.0000 secs, 0.0010 secs
Status code distribution:
 [200] 32918 responses

Bu özet, ilgilendiğimiz birkaç noktayı açıklıyor:

  • 30 saniye boyunca saniyede yaklaşık 1.000 olmak üzere 32.918 istek gönderildi.
  • Hata yoktu (yalnızca 200 HTTP yanıtı).
  • Ortalama gecikme 180 ms idi.
  • Minimum gecikme 107 ms, en kötü durum 3,3 sn
  • 90. yüzdelik dilim gecikmesi 244 ms idi.

Cloud Run konsolunda METRICS sekmesini kontrol ederseniz performansla ilgili hikayenin sunucu tarafını görebilirsiniz:

e635c6831c468dd3.png

9. Temizleme

Cloud Run, hizmet kullanılmadığında ücret almaz ancak oluşturulan container görüntüsünü depolama için ücretlendirilebilirsiniz.

Ücretlendirilmemek için GCP projenizi silebilirsiniz. Bu işlem, söz konusu projede kullanılan tüm kaynaklar için faturalandırmayı durdurur. Alternatif olarak, aşağıdaki komutu kullanarak kapsayıcı resminizi silebilirsiniz:

gcloud container images delete $TAG

Cloud Run hizmetlerinizi silmek için aşağıdaki komutları kullanın:

gcloud run services delete hello --platform managed --region $REGION --quiet
gcloud run services delete hello-again --platform managed --region $REGION --quiet

10. Tebrikler!

9a31f4fdbbf1ddcb.png

Tebrikler. Üretim için Cloud Run uygulamasını başarıyla oluşturup dağıttınız. Bu süreçte container'lar ve kendi container'ınızı oluşturma hakkında bilgi edindiniz. Ayrıca, hem gcloud komut satırı aracını hem de Cloud Console'u kullanarak uygulamanızı Cloud Run ile dağıtmanın ne kadar kolay olduğunu gördünüz. Artık muhteşem eserlerinizi tüm dünyayla nasıl paylaşacağınızı biliyorsunuz.

Sizi önemli bir soruyla baş başa bırakmak istiyorum:

Uygulamanızı geliştirme ortamınızda çalışır hale getirdikten sonra, Cloud Run'ın sunduğu tüm üretim düzeyinde özelliklerle birlikte buluta dağıtmak için kaç satır kodu değiştirmeniz gerekti?

Yanıt tabii ki sıfır. :)

Göz atabileceğiniz Codelab'ler...

Keşfedebileceğiniz diğer harika özellikler...

Referans belgeler...

11. Harekete Geçirici Mesaj

Google Cloud logosu

Bu codelab'i beğendiyseniz ve Google Cloud ile daha fazla pratik deneyim kazanmak istiyorsanız hemen Google Cloud Innovators'a katılın.

Innovators genel üye rozeti logosu

Google Cloud Innovators ücretsizdir ve şunları içerir:

  • Google çalışanlarından doğrudan en son bilgileri öğrenmek için canlı tartışmalar, soru-cevap oturumları ve yol haritası oturumları
  • En son Google Cloud haberleri doğrudan gelen kutunuza gelsin.
  • Dijital rozet ve video konferans arka planı
  • Öğrenim Merkezi'nde 500 kredi değerinde laboratuvar ve eğitim

Kaydolmak için burayı tıklayın.