Python Flask web uygulamasını App Engine esnek ortamına dağıtma

Özet

Bu codelab'de, Python Flask web uygulamasının App Engine esnek ortamına nasıl dağıtılacağını öğreneceksiniz. Örnek uygulama, kullanıcının bir kişinin yüzünün fotoğrafını yüklemesini ve kişinin mutlu olma olasılığını öğrenmesini sağlar. Uygulama; Vision, Storage ve Datastore için Google Cloud API'lerini kullanır.

App Engine Hakkında

Trafik ve veri depolama gereksinimleriniz değiştikçe Google App Engine uygulamalarını kolayca oluşturabilir, kolayca sürdürebilir ve ölçeklendirebilirsiniz. App Engine ile bakımı yapılacak sunucu yoktur. Uygulamanızı yüklemeniz yeterlidir.

App Engine uygulamaları, gelen trafiğe göre otomatik olarak ölçeklendirilir. Yük dengeleme, mikro hizmetler, yetkilendirme, SQL ve CNAME veritabanları, trafik bölme, günlük kaydı, arama, sürüm belirleme, kullanıma sunma ve geri alma işlemleri ve güvenlik taraması yerel olarak desteklenir ve son derece özelleştirilebilirdir.

App Engine'in Esnek Ortamı şu programlama dillerinin tümünü destekler: C#, Go, Java, Node.js, PHP, Python ve Ruby. App Engine Esnek, uygulamanızı Google Compute Engine sanal makinelerinde çalışan Docker kapsayıcılarında çalıştırır. App Engine'in Standart Ortamı, Python dahil olmak üzere belirli diller için alternatif bir seçenektir. App Engine Standard, uygulamanızı daha kısıtlayıcı bir korumalı alanda çalışır. Daha fazla bilgi için App Engine Ortamı Seçme bölümüne bakın.

Neler öğreneceksiniz?

  • App Engine Esnek Ortamına basit bir web uygulaması dağıtma
  • Vision, Storage ve Datastore için Google Cloud istemci kitaplıklarına erişme
  • Çeşitli bulut kaynaklarını yönetmek için Google Cloud Console ve Google Cloud SDK'yı kullanma
  • Cloud Shell'i kullanma

Gerekenler

  • Python'a aşina olma
  • Vim, Emacs veya Nano gibi standart Linux metin düzenleyicilerini kullanma

Proje Oluşturma

Google Hesabınız (Gmail veya Google Apps) yoksa bir hesap oluşturmanız gerekir. Google Cloud Platform Console'da (console.cloud.google.com) oturum açın ve yeni bir proje oluşturun:

Proje kimliğini tüm Google Cloud projeleri genelinde benzersiz bir ad olarak hatırlayın (yukarıdaki ad zaten alınmıştı ve maalesef sizin için çalışmaz). Daha sonra bu codelab'den PROJECT_ID olarak bahsedilecektir.

Faturalandırma

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

Bu codelab'i gözden geçirmeniz için size birkaç dolar tutarından daha fazla ödeme yapmanız gerekmez, ancak daha fazla kaynak kullanmaya karar verirseniz veya çalışır durumda bırakırsanız daha fazla harcama yapabilirsiniz.

Yeni Google Cloud Platform kullanıcıları 300 ABD doları değerindeki ücretsiz denemeden yararlanabilir.

Google Cloud, dizüstü bilgisayarınızdan uzaktan çalıştırılabilir. Ancak bu codelab'de, Cloud'da çalışan bir komut satırı ortamı olan Google Cloud Shell'i kullanacağız. Bu Debian tabanlı sanal makine; ihtiyaç duyacağınız tüm geliştirme araçları (gcloud, python, virtualenv, pip ve daha fazlası) yüklü olarak gelir ve kalıcı 5 GB ana dizin sunar. Bu sayede Google Cloud, ağ performansını ve kimlik doğrulamayı büyük ölçüde iyileştirir. Yani, bu codelab için ihtiyacınız olan tek şey bir tarayıcıdır (evet, Chromebook'ta çalışır).

Google Cloud Shell'i etkinleştirmek için geliştirici konsolunun sağ üst tarafındaki düğmeyi tıklayın (temel hazırlığın yapılması ve ortama bağlanmanız yalnızca birkaç dakika sürer):

Cloud shell'e bağlandıktan sonra kimliğinizin zaten doğrulanmış olduğunu ve projenin PROJECT_ID'nize ayarlanmış olduğunu görmeniz gerekir:

gcloud auth list
Credentialed accounts:
- <myaccount>@<mydomain>.com (active)
gcloud config list project
[core]
Project = <PROJECT_ID>

Herhangi bir nedenle proje ayarlanmadıysa aşağıdaki komutu vermeniz yeterlidir:

gcloud config set project <PROJECT_ID>

PROJECT_ID'nizi mi arıyorsunuz? Kurulum adımlarında hangi Proje Kimliğini kullandığınızı kontrol edin veya konsolu kontrol panelinde arayın:

GitHub veri deposunu klonlamak için komut satırındaki Cloud Shell'de aşağıdaki komutu çalıştırın:

git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git

Dizini python-docs-samples/codelabs/flex_and_vision olarak değiştirin:

cd python-docs-samples/codelabs/flex_and_vision

Vision, Storage ve Datastore API'lerini kullanmaya başlamadan önce aşağıdaki komutlarla API'leri etkinleştirmeniz gerekir:

gcloud services enable vision.googleapis.com
gcloud services enable storage-component.googleapis.com
gcloud services enable datastore.googleapis.com

Vision, Storage ve Datastore API'lerine istekte bulunmak için hizmet hesabı kimlik bilgilerine ihtiyacınız vardır. Projenize ait hizmet hesabı kimlik bilgileri gcloud aracı kullanılarak oluşturulabilir.

PROJECT_ID'niz için [PROJE_KİMLİĞİNİZ] değerini kendi proje kimliğinizle değiştirerek bir ortam değişkeni belirleyin:

export PROJECT_ID=[YOUR_PROJECT_ID]

Yerel olarak test ederken Google Cloud API'lerine erişmek için bir Hizmet Hesabı oluşturun:

gcloud iam service-accounts create codelab \
  --display-name "My Codelab Service Account"

Yeni oluşturduğunuz Hizmet Hesabına uygun izinleri verin:

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member serviceAccount:codelab@${PROJECT_ID}.iam.gserviceaccount.com \
--role roles/owner

Hizmet Hesabınızı oluşturduktan sonra bir Hizmet Hesabı anahtarı oluşturun:

gcloud iam service-accounts keys create ~/key.json \
--iam-account codelab@${PROJECT_ID}.iam.gserviceaccount.com

Bu komut, ana dizininizdeki key.json adlı bir JSON dosyasında depolanan bir hizmet hesabı anahtarı oluşturur.

Oluşturulan anahtarın mutlak yolunu kullanarak hizmet hesabınız için Cloud Shell'de bir ortam değişkeni ayarlayın:

export GOOGLE_APPLICATION_CREDENTIALS="/home/${USER}/key.json"

Vision API'yi yetkilendirme hakkında daha fazla bilgi edinebilirsiniz.

Sanal Ortamınızı Başlatma ve Bağımlılıkları Yükleme

virtualenv ile env adında izole bir Python 3 ortamı oluşturun:

virtualenv -p python3 env

env adlı yeni oluşturulan virtualenv dosyanızı girin:

source env/bin/activate

requirements.txt dosyasından projenize bağımlılık yüklemek için pip'i kullanın.

pip install -r requirements.txt

requirements.txt dosyası, projeniz için ihtiyaç duyduğunuz paket bağımlılıklarının listesidir. Yukarıdaki komut, listelenen bu paket bağımlılıklarının tümünü virtualenv'e indirmiştir.

App Engine Uygulaması Oluşturma

Ardından, aşağıdakileri kullanarak App Engine örneği oluşturun:

gcloud app create

Depolama Paketi Oluşturma

Öncelikle, CLOUD_STORAGE_BUCKET ortam değişkenini PROJECT_ID'nizin adıyla eşit olacak şekilde ayarlayın. (Kolay olması için paketinize genellikle PROJECT_ID'niz ile aynı adı vermeniz önerilir).

export CLOUD_STORAGE_BUCKET=${PROJECT_ID}

Uygulamamızda, Cloud Shell'den gsutil adlı bir araçla oluşturmanız gereken bir Cloud Storage paketi kullanılır. PROJECT_ID'nizle aynı ada sahip bir paket oluşturan aşağıdaki komutu çalıştırın.

gsutil mb gs://${PROJECT_ID}

Uygulamayı Çalıştırma

python main.py

Uygulama başladıktan sonra Cloud Shell araç çubuğundaki Web Önizlemesi simgesini tıklayın ve "8080 numaralı bağlantı noktasında önizle"yi seçin.

Tarayıcınızdaki bir sekme açılır ve yeni başlattığınız sunucuya bağlanır. Aşağıdakine benzer bir tablo görürsünüz:

Ekran Görüntüsü, 23.02.2017 19:22.50.png

İnsan yüzü içeren bir fotoğraf yüklemeyi deneyin. Dosya Seç düğmesini tıklayın, bilgisayarınızdan bir resim seçin ve ardından Gönder'i tıklayın.

Bir fotoğraf yükledikten sonra, aşağıdakine benzer bir ekran görürsünüz:

Ekran Görüntüsü, 23.02.2017 19:32.08.png

Örnek Kod Düzeni

Örnek aşağıdaki düzene sahiptir:

templates/
  homepage.html   /* HTML template that uses Jinja2 */
app.yaml          /* App Engine application configuration file */
main.py           /* Python Flask web application */
requirements.txt  /* List of dependencies for the project */

main.py

Bu Python dosyası, bir Flask web uygulamasıdır. Uygulama, kullanıcıların Cloud Storage'da depolanan ve Cloud Vision API'nin yüz algılama özelliği kullanılarak analiz edilen fotoğrafları (tercihen yüzler) göndermesine olanak sağlar. Her fotoğrafla ilgili önemli bilgiler Google Cloud Platform'un Datastore veritabanı olan Datastore'da depolanır. Burada, kullanıcının web sitesini her ziyaret ettiğinde erişilebilir.

Bu uygulama Storage, Datastore ve Vision için Google Cloud Platform istemci kitaplıklarını kullanır. Bu istemci kitaplıkları, en sevdiğiniz programlama dillerinde Cloud API'lerine erişimi kolaylaştırır.

Şimdi kodun temel snippet'lerinden bazılarına göz atalım.

En üstteki içe aktarmalar bölümü, kodumuz için gerekli olan çeşitli paketleri içe aktardığımız yerdir. Datastore, Storage ve Vision için Google Cloud istemci kitaplıklarımızı aşağıdaki şekilde içe aktarırız:

from google.cloud import datastore
from google.cloud import storage
from google.cloud import vision

Aşağıda, bir kullanıcı web sitesinin kök URL'sini ziyaret ettiğinde ne olacağına ilişkin kod verilmiştir. Datastore istemci kitaplığına erişmek için kullanılan bir Datastore istemci nesnesi oluştururuz. Ardından, Yüzler türünde öğeler için Datastore'da bir sorgu çalıştırırız. Son olarak, HTML şablonumuzu, Datastore'dan çıkardığımız image_entities öğesini değişken olarak ileterek oluştururuz.

@app.route('/')
def homepage():
    # Create a Cloud Datastore client.
    datastore_client = datastore.Client()

    # Use the Cloud Datastore client to fetch information from Datastore about
    # each photo.
    query = datastore_client.query(kind='Faces')
    image_entities = list(query.fetch())

    # Return a Jinja2 HTML template and pass in image_entities as a parameter.
    return render_template('homepage.html', image_entities=image_entities)

Varlıkların Datastore'a nasıl kaydedildiğine göz atalım. Datastore, Google Cloud'un {9/} veritabanı veritabanı çözümüdür. Veriler, varlıklar adı verilen nesnelerde depolanır. Her varlığa benzersiz bir anahtar atanır. Bu anahtar, tür ve anahtar adı dizesi kullanılarak oluşturulabilir. Tür, hangi varlık türüne sahip olan kuruluş grubudur. Örneğin Fotoğraflar, Kişiler ve Hayvanlar için tür oluşturabiliriz.

Her varlık, tam sayı, kayan nokta, dize, tarih veya ikili veri dahil olmak üzere çeşitli türlerde değerlere sahip olabilecek, geliştirici tarafından tanımlanmış birden fazla mülke sahip olabilir.

    # Create a Cloud Datastore client.
    datastore_client = datastore.Client()

    # Fetch the current date / time.
    current_datetime = datetime.now()

    # The kind for the new entity.
    kind = 'Faces'

    # The name/ID for the new entity.
    name = blob.name

    # Create the Cloud Datastore key for the new entity.
    key = datastore_client.key(kind, name)

    # Construct the new entity using the key. Set dictionary values for entity
    # keys blob_name, storage_public_url, timestamp, and joy.
    entity = datastore.Entity(key)
    entity['blob_name'] = blob.name
    entity['image_public_url'] = blob.public_url
    entity['timestamp'] = current_datetime
    entity['joy'] = face_joy

    # Save the new entity to Datastore.
    datastore_client.put(entity)

Storage ve Vision istemci kitaplıklarına, Datastore'a benzer şekilde programatik olarak erişilebilir. main.py dosyasını, tüm örnek kodu incelemek için vim, emacs veya nano kullanarak kendiniz açabilirsiniz.

http://flask.pocoo.org/ adresinden Flask hakkında daha fazla bilgi edinebilirsiniz.

İstemci Kitaplıkları hakkında daha fazla bilgi edinmek için https://googlecloudplatform.github.io/google-cloud-python/ adresini ziyaret edin.

anasayfa.html

Flask web çerçevesi, şablon motoru olarak Jinja2'den yararlanıyor. Bu sayede, main.py değişkenlerini ve ifadelerini sayfa oluşturulduktan sonra homepage.html ile değiştirebiliriz. Bu değerler, değerlerle değiştirilir.

Jinja2 hakkında daha fazla bilgi edinmek için http://jinja.pocoo.org/docs/2.9/templates/ sayfasına bakın.

Bu Jinja2 HTML şablonu, kullanıcıların veritabanına fotoğraf gönderebilecekleri bir form gösterir. Dosya adı, yükleme tarihi/saati ve Vision API tarafından algılanan yüzün mutlu olma olasılığıyla birlikte daha önce gönderilen her resmi de gösterir.

homepage.html

<h1>Google Cloud Platform - Face Detection Sample</h1>

<p>This Python Flask application demonstrates App Engine Flexible, Google Cloud
Storage, Datastore, and the Cloud Vision API.</p>

<br>

<html>
  <body>
    <form action="upload_photo" method="POST" enctype="multipart/form-data">
      Upload File: <input type="file" name="file"><br>
      <input type="submit" name="submit" value="Submit">
    </form>
    
  </body>
</html>

App Engine Esnek, bir uygulamanın dağıtım yapılandırmasını açıklamak için app.yaml adlı bir dosya kullanır. Bu dosya yoksa App Engine, dağıtım yapılandırmasını tahmin etmeye çalışır. Ancak bu dosyayı sağlamanız önerilir.

Ardından, app.yaml dosyasını istediğiniz vim, nano veya emacs düzenleyicisini kullanarak değiştirirsiniz. nano düzenleyiciyi kullanacağız:

nano app.yaml

uygulama.yaml

runtime: python
env: flex
entrypoint: gunicorn -b :$PORT main:app

runtime_config:
    python_version: 3

env_variables:
    CLOUD_STORAGE_BUCKET: <your-cloud-storage-bucket>

Bu, Python 3 App Engine Flex uygulamasını dağıtmak için gereken temel yapılandırmadır. App Engine'i yapılandırma hakkında daha fazla bilgiyi burada bulabilirsiniz.

app.yaml açıldıktan sonra < your-cloud-storage-bucket > kısmını Cloud Storage paketinizin adıyla değiştirin. (Cloud Storage paketinizin adını unuttuysanız GCP Proje Kimliğini Qwiklabs'den kopyalayın. env_variables bölümü, uygulama dağıtıldıktan sonra main.py içinde kullanılacak ortam değişkenlerini oluşturur.

Artık nano içinde kaydı kapatabilir ve dosyayı kapatabilirsiniz (Ctrl + x tuşlarına basarak):

Ekran Görüntüsü, 27.02.2017 16:47.12.png

Aşağıdaki istemdeki dosya adını onaylamak için bir harf y yazın ve ENTER tuşuna bir kez daha basın:

Ekran Görüntüsü, 24.02.2017 16:18.23.png

gcloud kullanarak uygulamanızı App Engine'de dağıtın:

gcloud app deploy

Uygulama dağıtıldıktan sonra, web tarayıcınızda https://< PROJECT_ID >.appspot.com URL'sini açarak uygulamayı ziyaret edebilirsiniz.

Özet

Bu adımda bir Python web uygulaması oluşturup App Engine Esnek ortamına dağıttınız.

İlk App Engine Esnek web uygulamanızı nasıl yazacağınızı ve dağıtacağınızı öğrendiniz.

Temizleme

Bu hızlı başlangıçta kullanılan kaynaklar için Google Cloud Platform hesabınızın ücretlendirmesini önlemek amacıyla:

  • Cloud Platform Console'a gidin.
  • Kapatmak istediğiniz projeyi seçin, ardından üst tarafta "Sil"i tıklayın. Bu işlem, projenin silinmesi için planlama yapar.

Daha Fazla Bilgi

Lisans

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