Python ile Hello Cloud Run

1. Giriş

96d07289bb51daa7.png

Cloud Run, HTTP istekleriyle çağrılabilen durum bilgisiz container'lar çalıştırmanızı sağlayan bir yönetilen bilgi işlem platformudur. İş yüklerinizin platformlar arasında taşınabilirliğini sağlayan Knative açık kaynak projesi üzerinde derlenmiştir. Cloud Run sunucusuzdur: Tüm altyapı yönetimini soyutladığı için en önemli işe, yani harika uygulamalar geliştirmeye odaklanabilirsiniz.

Bu eğiticinin amacı, basit bir web uygulaması oluşturmak ve bunu Cloud Run'a dağıtmaktır.

2. Kurulum ve şartlar

Kendi hızınızda ortam kurulumu

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

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Proje adı, bu projenin katılımcıları için görünen addır. Google API'leri tarafından kullanılmayan bir karakter dizesidir. İstediğiniz zaman güncelleyebilirsiniz.
  • Proje Kimliği, tüm Google Cloud projelerinde benzersizdir ve değiştirilemez (belirlendikten sonra değiştirilemez). Cloud Console, otomatik olarak benzersiz bir dize oluşturur. bunun ne olduğunu umursamıyorsunuz. Çoğu codelab'de proje kimliğinizi (genellikle PROJECT_ID olarak tanımlanır) belirtmeniz gerekir. Oluşturulan kimliği beğenmezseniz rastgele bir kimlik daha oluşturabilirsiniz. Alternatif olarak, kendi ölçümünüzü deneyip mevcut olup olmadığına bakabilirsiniz. Bu adımdan sonra değiştirilemez ve proje süresince kalır.
  • Bilginiz olması açısından, bazı API'lerin kullandığı üçüncü bir değer, yani Proje Numarası daha vardır. Bu değerlerin üçü hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
  1. Sonraki adımda, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i çalıştırmanın maliyeti, yüksek değildir. Bu eğitim dışında faturalandırmanın tekrarlanmasını önlemek amacıyla kaynakları kapatmak için oluşturduğunuz kaynakları silebilir veya projeyi silebilirsiniz. Yeni Google Cloud kullanıcıları 300 ABD doları değerindeki ücretsiz denemeden yararlanabilir.

Cloud Shell'i başlatma

Google Cloud dizüstü bilgisayarınızdan uzaktan çalıştırılabilse de bu eğitimde, Cloud'da çalışan bir komut satırı ortamı olan Cloud Shell'i kullanacaksınız.

Cloud Shell'i etkinleştirme

  1. Cloud Console'da, Cloud Shell'i etkinleştir 853e55310c205094.png simgesini tıklayın.

3c1dabeca90e44e5.png

Cloud Shell'i ilk kez başlatıyorsanız ne olduğunu açıklayan bir ara ekran gösterilir. Ara bir ekran görüntülendiyse Devam'ı tıklayın.

9c92662c6a846a5c.png

Temel hazırlık ve Cloud Shell'e bağlanmak yalnızca birkaç dakika sürer.

9f0e51b578fecce5.png

Gereken tüm geliştirme araçları bu sanal makinede yüklüdür. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud'da çalışarak ağ performansını ve kimlik doğrulamasını büyük ölçüde iyileştirir. Bu codelab'deki çalışmalarınızın tamamı olmasa bile büyük bir kısmı tarayıcıyla yapılabilir.

Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin proje kimliğinize ayarlandığını göreceksiniz.

  1. Kimlik doğrulamanızın tamamlandığını onaylamak için Cloud Shell'de aşağıdaki 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 projenizi bildiğini onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud config list project

Komut çıkışı

[core]
project = <PROJECT_ID>

Doğru değilse aşağıdaki komutla ayarlayabilirsiniz:

gcloud config set project <PROJECT_ID>

Komut çıkışı

Updated property [core/project].

3. API'leri etkinleştirme

Cloud Shell'den Artifact Registry, Cloud Build ve Cloud Run API'lerini etkinleştirin:

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

Bu işlem, şuna benzer bir başarı mesajı verir:

Operation "operations/..." finished successfully.

Artık çalışmaya ve uygulamanızı yazmaya hazırsınız...

4. Uygulamayı yazma

Bu adımda, HTTP isteklerine yanıt veren, Flask tabanlı basit bir Python uygulaması derleyeceksiniz.

Çalışma dizini

Cloud Shell'i kullanarak helloworld-python adında bir çalışma dizini oluşturun ve bu dizine geçiş yapın:

mkdir ~/helloworld-python
cd ~/helloworld-python

main.py

main.py adlı bir dosya oluşturun:

touch main.py

Tercih ettiğiniz komut satırı düzenleyicisiyle (nano, vim veya emacs) veya Cloud Shell Düzenleyici düğmesini tıklayarak dosyayı düzenleyin:

10af7b1a6240e9f4.gif

Dosyayı Cloud Shell Düzenleyici ile doğrudan düzenlemek için şu komutu kullanın:

cloudshell edit main.py

main.py

from flask import Flask, request

app = Flask(__name__)


@app.get("/")
def hello():
    """Return a friendly HTTP greeting."""
    who = request.args.get("who", default="World")
    return f"Hello {who}!\n"


if __name__ == "__main__":
    # Development only: run "python main.py" and open http://localhost:8080
    # When deploying to Cloud Run, a production-grade WSGI HTTP server,
    # such as Gunicorn, will serve the app.
    app.run(host="localhost", port=8080, debug=True)

Bu kod, HTTP GET isteklerine uyumlu bir mesajla yanıt veren temel bir web hizmeti oluşturur.

requirements.txt

Bağımlılıkları tanımlamak için requirements.txt adlı bir dosya ekleyin:

touch requirements.txt

Dosyayı Cloud Shell Düzenleyici ile doğrudan düzenlemek için şu komutu kullanın:

cloudshell edit requirements.txt

requirements.txt

# https://pypi.org/project/flask
Flask==3.0.2

# https://pypi.org/project/gunicorn
gunicorn==21.2.0

Procfile

Son olarak, uygulamanın nasıl sunulacağını belirtmek için Procfile adlı bir dosya ekleyin:

touch Procfile

Dosyayı Cloud Shell Düzenleyici ile doğrudan düzenlemek için şu komutu kullanın:

cloudshell edit Procfile

Procfile

web: gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app

Tüm dosyaların çalışma dizininde bulunduğundan emin olun:

ls

Bu işlem aşağıdaki dosyaları listelemelidir:

main.py  Procfile  requirements.txt

Uygulamanız dağıtılmaya hazır, ancak önce test edelim...

5. Uygulamayı test etme

Uygulamayı test etmek için sanal bir ortam oluşturun:

virtualenv venv

Sanal ortamı etkinleştirin:

source venv/bin/activate

Bağımlılıkları yükleyin:

pip install -r requirements.txt

Aşağıdaki gibi bir onay mesajı alırsınız:

...
Successfully installed Flask ... gunicorn ...

Uygulamayı başlatın:

python main.py

Günlükler, geliştirme modunda olduğunuzu gösterir:

 * Serving Flask app 'main'
 * Debug mode: on
   WARNING: This is a development server.
   Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Running on http://localhost:8080
   Press CTRL+C to quit
...

Cloud Shell penceresinde, Web Preview simgesini tıklayın ve Preview on port 8080 öğesini seçin:

6c9ff9e5c692c58e.gif

Bu işlemle Hello World! mesajının gösterildiği bir tarayıcı penceresi açılır.

Ayrıca, + simgesini tıklayıp yerel olarak çalışan uygulamaya bir web isteği göndererek başka bir Cloud Shell oturumu (yeni bir terminal sekmesi) açabilirsiniz:

curl localhost:8080

Bunun için aşağıdaki yanıtı almanız gerekir:

Hello World!

İşlemi tamamladığınızda ana Cloud Shell oturumuna geri dönün ve CTRL+C ile python main.py komutunu durdurun.

Sanal ortamdan çıkın:

deactivate

Son olarak, sanal ortam dizinini kaldırın:

rm -r venv/

Uygulamanız beklendiği gibi çalışıyor: Hadi dağıtalım...

6. Cloud Run'a dağıt

Cloud Run bölgeseldir. Diğer bir deyişle, Cloud Run hizmetlerinizi çalıştıran altyapı belirli bir bölgede yer alır ve Google tarafından yönetilir. Bu sayede, söz konusu bölgedeki tüm alt bölgelerde yedek olarak kullanılabilir. Dağıtımınız için kullanacağınız bölgeyi tanımlayın. Örneğin:

REGION="europe-west9"

Hâlâ çalışma dizininde olduğunuzdan emin olun:

ls

Bu işlem aşağıdaki dosyaları listelemelidir:

main.py  Procfile  requirements.txt

Uygulamayı Cloud Run'a dağıtın:

gcloud run deploy helloworld-python \
  --source . \
  --platform managed \
  --region $REGION \
  --allow-unauthenticated
  • Şu komutla varsayılan bir bölge tanımlayabilirsiniz: gcloud config set run/region $REGION
  • Ayrıca, şu komutla Cloud Run'ın varsayılan olarak yönetilmesini de sağlayabilirsiniz: gcloud config set run/platform managed
  • --allow-unauthenticated seçeneği, hizmeti herkese açık hale getirir. Kimliği doğrulanmamış istekleri önlemek için bunun yerine --no-allow-unauthenticated kullanın.

İlk kez Artifact Registry deposu oluşturma istemi alırsınız. Doğrulamak için Enter'a dokunun:

Deploying from source requires an Artifact Registry Docker repository to store
built containers. A repository named [cloud-run-source-deploy] in region [REGION]
will be created.

Do you want to continue (Y/n)?

Bu işlem, kaynak kodunuzun Artifact Registry deposuna yüklenmesini ve container görüntünüzün derlemesini başlatır:

Building using Buildpacks and deploying container ...
* Building and deploying new service... Building Container.           
  OK Creating Container Repository...
  OK Uploading sources...
  * Building Container... Logs are available at ...

Ardından, dağıtımın tamamlanması için biraz bekleyin. İşlem başarılı olursa komut satırında hizmet URL'si gösterilir:

...
OK Building and deploying new service... Done.
  OK Creating Container Repository...
  OK Uploading sources...
  OK Building Container... Logs are available at ...
  OK Creating Revision... Creating Service.
  OK Routing traffic...
  OK Setting IAM Policy...
Done.
Service [SERVICE]... has been deployed and is serving 100 percent of traffic.
Service URL: https://SERVICE-PROJECTHASH-REGIONID.a.run.app

Hizmet URL'sini şu komutla alabilirsiniz:

SERVICE_URL=$( \
  gcloud run services describe helloworld-python \
  --platform managed \
  --region $REGION \
  --format "value(status.url)" \
)
echo $SERVICE_URL

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

https://helloworld-python-PROJECTHASH-REGIONID.a.run.app

Artık hizmet URL'sini bir web tarayıcısında açarak uygulamanızı kullanabilirsiniz:

c836b93e5601e2cf.gif

Uygulamayı Cloud Shell'den de çağırabilirsiniz:

curl $SERVICE_URL?who=me

Bu işlemle, beklenen karşılama mesajı gösterilir:

Hello me!

Tebrikler! Cloud Run'a az önce bir uygulama dağıttınız. Cloud Run, alınan istekleri işlemek için container görüntünüzü otomatik ve yatay olarak ölçeklendirir. Ardından, talep azaldığında ölçeği küçültür. Yalnızca istek işleme sırasında tüketilen CPU, bellek ve ağ için ödeme yaparsınız.

7. Temizleme

Cloud Run, hizmet kullanılmadığında ücret almaz ancak container görüntüsünün Artifact Registry'de depolanması için sizden ücret alınabilir. Ücret ödemek istemiyorsanız deponuzu veya Cloud projenizi silebilirsiniz. Cloud projenizi sildiğinizde, söz konusu projede kullanılan tüm kaynakların faturalandırması durdurulur.

Container görüntüsü deponuzu silmek için:

gcloud artifacts repositories delete cloud-run-source-deploy \
  --location $REGION

Cloud Run hizmetinizi silmek için:

gcloud run services delete helloworld-python \
  --platform managed \
  --region $REGION

Google Cloud projenizi silmek için:

  1. Geçerli proje kimliğinizi alın:
PROJECT_ID=$(gcloud config get-value core/project)
  1. Silmek istediğiniz projenin şu olduğundan emin olun:
echo $PROJECT_ID
  1. Projeyi silin:
gcloud projects delete $PROJECT_ID

8. Tebrikler!

96d07289bb51daa7.png

Basit bir web uygulaması oluşturdunuz ve bu uygulamayı Cloud Run'a dağıttınız.

Daha fazla bilgi

Lisans

Bu çalışma, Creative Commons Attribution 2.0 Genel Amaçlı Lisans ile lisans altına alınmıştır.