Python ile Hello Cloud Run

1. Giriş

96d07289bb51daa7.png

Cloud Run, HTTP istekleriyle çağrılabilen durum bilgisiz container'lar çalıştırmanıza olanak tanıyan yönetilen bir işlem platformudur. Cloud Run, açık kaynak kodlu Knative projesi üzerinde derlenmiştir. Böylece iş yükleriniz platformlar arasında taşınabilir. Cloud Run sunucusuzdur: Tüm altyapı yönetimini soyutladığı için en önemli işe, yani harika uygulamalar geliştirmeye odaklanabilirsiniz.

Bu eğitimin amacı, basit bir web uygulaması oluşturup Cloud Run'a dağıtmaktır.

2. Kurulum ve şartlar

Yönlendirmesiz ortam kurulumu

  1. Google 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 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. Bu bilgiyi istediğiniz zaman güncelleyebilirsiniz.
  • Proje kimliği, tüm Google Cloud projelerinde benzersizdir ve sabittir (ayarlandıktan sonra değiştirilemez). Cloud Console, benzersiz bir dizeyi otomatik olarak oluşturur. Genellikle bu dizenin ne olduğuyla ilgilenmezsiniz. Çoğu codelab'de proje kimliğinize (genellikle PROJECT_ID olarak tanımlanır) başvurmanız gerekir. Oluşturulan kimliği beğenmezseniz başka bir rastgele kimlik oluşturabilirsiniz. Dilerseniz kendi adınızı deneyerek kullanılabilir olup olmadığını kontrol edebilirsiniz. Bu adım tamamlandıktan sonra değiştirilemez ve proje süresince geçerli kalır.
  • Bazı API'lerin kullandığı üçüncü bir değer olan Proje Numarası da vardır. Bu üç değer hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
  1. Ardından, Cloud kaynaklarını/API'lerini 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ırılmayı önlemek için kaynakları kapatmak üzere oluşturduğunuz kaynakları veya projeyi silebilirsiniz. Yeni Google Cloud kullanıcıları 300 ABD doları değerinde ücretsiz deneme programından yararlanabilir.

Cloud Shell'i başlatma

Google Cloud, dizüstü bilgisayarınızdan uzaktan çalıştırılabilir ancak 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 'i 853e55310c205094.png 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 ekran gösterildiyse Devam'ı tıklayın.

9c92662c6a846a5c.png

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

9f0e51b578fecce5.png

Bu sanal makineye, ihtiyaç duyacağınız tüm geliştirme araçları yüklenmiştir. 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ı tarayıcıyla 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].

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, aşağıdakine benzer bir başarı mesajı verir:

Operation "operations/..." finished successfully.

Artık çalışmaya ve uygulamanızı yazmaya başlayabilirsiniz...

4. Uygulamayı yazma

Bu adımda, HTTP isteklerine yanıt veren basit bir Flask tabanlı Python uygulaması oluşturacaksınız.

Çalışma dizini

Cloud Shell'i kullanarak helloworld-python adlı bir çalışma dizini oluşturun ve bu dizine geçin:

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

main.py

main.py adlı bir dosya oluşturun:

touch main.py

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

10af7b1a6240e9f4.gif

Dosyayı doğrudan Cloud Shell Düzenleyici ile 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 kullanıcı dostu 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ı doğrudan Cloud Shell Düzenleyici ile 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ı doğrudan Cloud Shell Düzenleyici ile düzenlemek için şu komutu kullanın:

cloudshell edit Procfile

Procfile

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

Çalışma dizininde tüm dosyaların bulunduğundan emin olun:

ls

Bu işlem sonucunda aşağıdaki dosyalar listelenmelidir:

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ğıdakine benzer 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österiyor:

 * 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 seçeneğini belirleyin:

6c9ff9e5c692c58e.gif

Bu işlemle Hello World! mesajını gösteren 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) da açabilirsiniz:

curl localhost:8080

Aşağıdaki yanıtı alırsınız:

Hello World!

İşiniz bittiğinde ana Cloud Shell oturumuna dönün ve python main.py komutunu CTRL+C ile durdurun.

Sanal ortamdan çıkın:

deactivate

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

rm -r venv/

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

6. Cloud Run'a dağıt

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. Dağıtımınız için kullanacağınız bölgeyi tanımlayın. Örneğin:

REGION="europe-west9"

Çalışma dizininde olduğunuzdan emin olun:

ls

Bu işlem sonucunda aşağıdaki dosyalar listelenmelidir:

main.py  Procfile  requirements.txt

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

gcloud run deploy helloworld-python \
  --source . \
  --platform managed \
  --region $REGION \
  --allow-unauthenticated
  • Bu komutla varsayılan bir bölge tanımlayabilirsiniz: gcloud config set run/region $REGION
  • Ayrıca, bu komutla Cloud Run'ı varsayılan olarak yönetilen hale getirebilirsiniz: gcloud config set run/platform managed
  • --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.

İlk kez kullandığınızda Artifact Registry deposu oluşturmanız istenir. 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 kapsayıcı görüntünüzün oluşturulmasını 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 tamamlanana kadar bekleyin. İşlem başarılı olduğunda 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 ifade gösterilir:

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şlem, beklenen karşılama mesajını göstermelidir:

Hello me!

Tebrikler! Cloud Run'a bir uygulama dağıttınız. Cloud Run, alınan istekleri işlemek için kapsayıcı resminizi otomatik olarak ve yatay yönde ölçeklendirir, talep azaldığında ise ölçeği küçültür. Yalnızca istek işleme sırasında kullanılan CPU, bellek ve ağ iletişimi için ödeme yaparsınız.

7. Temizleme

Cloud Run, hizmet kullanılmadığında ücret almaz ancak container görüntüsünü Artifact Registry'de depoladığınız için ücretlendirilebilirsiniz. Ücretlendirilmemek için deponuzu veya Cloud projenizi silebilirsiniz. Cloud projenizi sildiğinizde, bu projede kullanılan tüm kaynaklar için faturalandırma durdurulur.

Kapsayıcı resmi 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. Mevcut proje kimliğinizi alın:
PROJECT_ID=$(gcloud config get-value core/project)
  1. Silmek istediğiniz projenin bu olduğundan emin olun:
echo $PROJECT_ID
  1. Projeyi silme:
gcloud projects delete $PROJECT_ID

8. Tebrikler!

96d07289bb51daa7.png

Basit bir web uygulaması oluşturup 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.