1. Genel Bakış
Sunucusuz Taşıma İstasyonu codelab'leri serisi (kendi kendine ilerleyen, uygulamalı eğiticiler) ve ilgili videolar, Google Cloud sunucusuz geliştiricilerinin uygulamalarını bir veya daha fazla taşıma işleminde yönlendirerek uygulamalarını modernleştirmelerine yardımcı olmayı amaçlar. Bu videolar genellikle eski hizmetlerden uzaklaştırılır. Bu sayede uygulamalarınızı daha taşınabilir hale getirir, daha fazla seçenek ve esneklik elde edebilir, daha geniş bir Cloud ürünü yelpazesiyle entegrasyon ve erişim elde edebilir, ayrıca yeni dil sürümlerine kolayca geçiş yapabilirsiniz. Başlangıçta özellikle App Engine (standart ortam) geliştiricileri olmak üzere ilk Cloud kullanıcılarına odaklanan bu seri, Cloud Functions ve Cloud Run gibi diğer sunucusuz platformları veya uygun olduğu durumlarda diğer sunucusuz platformları ya da diğer platformları kapsayacak kadar geniş kapsamlıdır.
Bu codelab'in amacı, Python 2 App Engine geliştiricilerine App Engine Users API/hizmetinden Cloud Identity Platform'a (GCIP) nasıl geçiş yapılacağını göstermektir. Ayrıca App Engine NDB'den, Datastore erişimi için Cloud NDB'ye dolaylı geçiş (esas olarak Taşıma Modülü 2'de ele alınmıştır) ve Python 3'e yükseltme mevcuttur.
20. Modül'de, Users API'nin kullanımının Modül 1 örnek uygulamasına nasıl ekleneceği açıklanmaktadır. Bu modülde, tamamlanmış Modül 20 uygulamasını alıp kullanımını Cloud Identity Platform'a taşıyacaksınız.
Demoda aşağıdaki işlemleri yapmayı öğreneceksiniz:
- App Engine Kullanıcıları hizmeti kullanımını Cloud Identity Platform ile değiştirin
- App Engine NDB kullanımını Cloud NDB ile değiştirin (Modül 2'ye de bakın)
- Firebase Auth'u kullanarak farklı kimlik doğrulama kimliği sağlayıcıları oluşturma
- Proje IAM bilgilerini almak için Cloud Resource Manager API'yi kullanma
- Kullanıcı bilgilerini almak için Firebase Admin SDK'yı kullanma
- Örnek uygulamayı Python 3'e taşıma
Gerekenler
- Etkin bir GCP faturalandırma hesabına sahip bir Google Cloud Platform projesi
- Temel Python becerileri
- Yaygın Linux komutlarıyla ilgili bilgi
- App Engine uygulamalarını geliştirme ve dağıtma ile ilgili temel bilgiler
- Çalışan bir Modül 20 App Engine örnek uygulaması
Anket
Bu eğiticiden nasıl yararlanacaksınız?
Python deneyiminizi nasıl değerlendirirsiniz?
Google Cloud hizmetlerini kullanma deneyiminizi nasıl değerlendirirsiniz?
2. Arka plan
App Engine Kullanıcıları hizmeti, App Engine uygulamalarının kullanımına yönelik bir kullanıcı kimlik doğrulama sistemidir. Kimlik sağlayıcısı olarak Google ile Oturum Açma hizmetini sağlar, uygulamalarda kullanım için pratik giriş ve çıkış bağlantıları sağlar, yönetici kullanıcılar kavramını ve yalnızca yönetici işlevlerini destekler. Google Cloud, uygulama taşınabilirliğini iyileştirmek için eski App Engine paket hizmetlerinden Cloud bağımsız hizmetlerine (ör. Kullanıcılar hizmetinden Cloud Identity Platform'a) geçiş yapmanızı önerir.
Firebase Authentication'ı temel alan Identity Platform'un sunduğu çok öğeli kimlik doğrulaması, OIDC ve SAML TOA desteği, çok kiracılı yapı, %99, 95 HDS ve daha fazlası. Bu farklılıklar, Identity Platform ve Firebase Authentication ürün karşılaştırma sayfasında da vurgulanır. Her iki ürün de Kullanıcılar hizmeti tarafından sağlanan işlevlerden çok daha fazla özelliğe sahiptir.
Bu Modül 21 codelab'inde, uygulamanın kullanıcı kimlik doğrulamasının "Kullanıcılar hizmeti"nden Kimlik Platformu özelliklerine (20. Modül'de gösterilen işlevlere en uygun şekilde) değiştirilmesi gösterilmektedir. Modül 21'de, Modül 2 taşıma işleminin tekrarlandığı şekilde, Datastore erişimi için App Engine NDB'den Cloud NDB'ye taşıma işlemi de yer almaktadır.
Modül 20 kodu "reklamı yapıldı" durumundayken Kaynak, Python 2 örnek uygulaması olarak Python 2 ve 3 uyumludur. Modül 21'deki Identity Platform'a (ve Cloud NDB'ye) geçiş yaptıktan sonra bile kaynak bu şekilde kalır. Identity Platform'a geçiş isteğe bağlı olduğundan Python 3'e geçerken Kullanıcılar hizmetini kullanmaya devam edebilirsiniz. Python 3 gibi 2. nesil çalışma zamanlarına yükseltme yaparken paketlenmiş hizmetleri nasıl kullanmaya devam edeceğinizi öğrenmek için Modül 17 codelab'e ve videoya göz atın.
Bu eğitim aşağıdaki adımları içerir:
- Kurulum/Ön Çalışma
- Yapılandırmayı güncelleyin
- Uygulama kodunu değiştir
3. Kurulum/Ön Çalışma
Bu bölümde aşağıdakilerin nasıl yapılacağı açıklanmaktadır:
- Cloud projenizi oluşturun
- Temel örnek uygulamayı al
- Temel uygulamayı (yeniden) dağıtma ve doğrulama
- Yeni Google Cloud hizmetlerini/API'lerini etkinleştirme
Bu adımlar, bağımsız Cloud hizmetlerine taşınmaya hazır olan, çalışan bir kodla başlamanızı sağlar.
1. Proje oluşturun
Modül 20 codelab'ini tamamladıysanız aynı projeyi (ve kodu) yeniden kullanın. Alternatif olarak, yeni bir proje oluşturabilir veya mevcut başka bir projeyi yeniden kullanabilirsiniz. Projenin etkin bir faturalandırma hesabı ve etkin bir App Engine uygulamasının bulunduğundan emin olun. Proje kimliğinizi bulun ve bu codelab sırasında hazır bulundurun ve PROJ_ID
değişkeniyle her karşılaştığınızda kullanın.
2. Temel örnek uygulamayı al
Ön koşullardan biri, çalışan bir Modül 20 App Engine uygulamasıdır. Bu nedenle codelab'i tamamlayın (önerilendir, yukarıdaki bağlantı) veya Modül 20 kodunu depodan kopyalayın. İster kendi aracınızı ister bizimkiyi kullanın, başlangıç noktamız ("BAŞLAT"). Bu codelab'de, Module 21 depo klasöründekine ("FINISH") benzeyen bir kodla sonlandırılır ve taşıma işleminde size yol gösterilir.
- BAŞLAT: Modül 20 klasörü (Python 2)
- FINISH: Modül 21 klasörleri ( Python 2 veya Python 3)
- Deponun tamamı (ZIP dosyasını klonlamak veya indirmek için)
Module 20 depo klasörünü kopyalayın. Aşağıdaki çıkış aşağıdaki gibi görünmelidir: Modül 20 codelab'ini uyguladıysanız bir lib
klasörü olabilir:
$ ls README.md appengine_config.py templates app.yaml main.py requirements.txt
3. Temel uygulamayı (yeniden) dağıtma ve doğrulama
Modül 20 uygulamasını dağıtmak için aşağıdaki adımları uygulayın:
- Varsa
lib
klasörünü silin ve yeniden doldurmak içinpip install -t lib -r requirements.txt
komutunu çalıştırın. Cihazınızda Python 2 ve 3 yüklüysepip2
kullanmanız gerekebilir. gcloud
komut satırı aracını yükleyip başlattığınızdan ve kullanımını incelediğinizden emin olun.- Yayınlanan her
gcloud
komutuylaPROJ_ID
girmek istemiyorsanız önce Cloud projesinigcloud config set project
PROJ_ID
olarak ayarlayın. - Örnek uygulamayı
gcloud app deploy
ile dağıtın - Uygulamanın hata olmadan beklendiği gibi çalıştığını onaylayın. Modül 20 codelab'ini tamamladıysanız uygulama en son ziyaretlerle (aşağıda gösterilmiştir) kullanıcı giriş bilgilerini (kullanıcı e-postası, olası "yönetici rozeti" ve giriş/çıkış düğmesi) en üstte gösterir.
Normal bir kullanıcı olarak oturum açmak, kullanıcının e-posta adresinin ve "Giriş" düğmesinin gösterilmesine neden olur. düğmesi "Çıkış yap" olarak değişir düğme:
Yönetici kullanıcı olarak oturum açmak, kullanıcının e-posta adresinin "(yönetici)" ifadesiyle birlikte gösterilmesine neden olur tıklayın:
4. Yeni Google Cloud API'lerini/hizmetlerini etkinleştirin
Giriş
Modül 20 uygulaması, App Engine NDB ve Users API'lerini, ek kurulum gerektirmeyen ancak bağımsız Cloud hizmetleri tarafından sunulan paket halinde sunulan hizmetleri kullanır ve güncellenen uygulama hem Cloud Identity Platform'u hem de Cloud Datastore'u (Cloud NDB istemci kitaplığı aracılığıyla) kullanır. Ayrıca, App Engine yönetici kullanıcılarını belirleme ihtiyacımız için Cloud Resource Manager API'nin de kullanılması gerekir.
Maliyet
- App Engine ve Cloud Datastore, "Daima Ücretsiz" seçeneğine sahiptir tier kotaları ve bu sınırların altında kaldığınız sürece bu eğiticiyi tamamlarken ücret ödemezsiniz. Daha fazla ayrıntı için App Engine fiyatlandırma sayfasına ve Cloud Datastore fiyatlandırma sayfasına da göz atın.
- Cloud Identity Platform kullanımı, aylık etkin kullanıcı (AEKS) veya kimlik doğrulama doğrulamalarının sayısına bağlı olarak faturalandırılır; "bedava"nın bir versiyonu seçeneği bulunuyor. Daha fazla bilgi için fiyatlandırma sayfasını inceleyin. Ayrıca, App Engine ve Cloud Datastore faturalandırma gerektirse de GCIP'nin tek başına kullanımı, araçsız günlük kotalarını aşmadığınız sürece faturalandırmayı etkinleştirmeyi gerektirmez. Bu nedenle, faturalandırma gerektiren Cloud API'lerinin/hizmetlerinin bulunmadığı Cloud projeleri için bu durumu göz önünde bulundurun.
- Cloud Resource Manager API'nin kullanımı, kendi fiyatlandırma sayfasına göre çoğunlukla ücretsizdir.
Kullanıcılar, tercihinize bağlı olarak Cloud Console'dan veya komut satırından (Cloud SDK'nın bir parçası olan gcloud
komutu aracılığıyla) Cloud API'lerini etkinleştirir. Cloud Datastore ve Cloud Resource Manager API'leriyle başlayalım.
Cloud Console'dan
Cloud Console'da API Yöneticisi'nin Kitaplık sayfasına (doğru proje için) gidin ve arama çubuğunu kullanarak bir API arayın.
Şu API'leri etkinleştirin:
Her API için Etkinleştir düğmesini ayrı ayrı bulup tıklayın. Fatura bilgileri istenebilir. Örneğin, Resource Manager API'nin bulunduğu sayfayı aşağıda görebilirsiniz:
Etkinleştirildiğinde, düğme Yönet olarak değişir (genellikle birkaç saniye sonra):
Cloud Datastore'u aynı şekilde etkinleştirin:
Komut satırından
API'leri konsoldan etkinleştirmek görsel olarak bilgilendirici olsa da bazıları komut satırını tercih eder. Ek bir avantaj olarak, tek seferde istediğiniz sayıda API'yi etkinleştirebilirsiniz. Hem Cloud Datastore hem de Cloud Resource Manager API'lerini etkinleştirmek için şu komutu verin ve aşağıda gösterildiği gibi, işlemin tamamlanmasını bekleyin:
$ gcloud services enable cloudresourcemanager.googleapis.com datastore.googleapis.com Operation "operations/acat.p2-aaa-bbb-ccc-ddd-eee-ffffff" finished successfully.
Fatura bilgileriniz istenebilir.
"URL'ler" hizmet adları olarak adlandırılır ve bu adları her API'nin kitaplık sayfasının alt kısmında bulabilirsiniz. Kendi uygulamalarınız için diğer Cloud API'lerini etkinleştirmek istiyorsanız ilgili API sayfalarında bu API'lerin hizmet adlarını bulabilirsiniz. Bu komut, etkinleştirebileceğiniz API'ler için tüm hizmet adlarını listeler:
gcloud services list
--available --filter="name:googleapis.com"
.
Yukarıdaki adımları tamamladıktan sonra hem Cloud Console'da hem de komut satırında, örneğimiz bu API'lere erişebilir. Sonraki adımlar, Cloud Identity Platform'u etkinleştirmek ve gerekli kod değişikliklerini yapmaktır.
Cloud Identity Platform'u etkinleştirme ve kurma (yalnızca Cloud Console)
Cloud Identity Platform, Google Cloud dışındaki bir kaynağa (ör. Firebase Authentication) bağlandığı veya bu kaynağa bağlı olduğu için bir Marketplace hizmetidir. Şu anda Marketplace hizmetlerini yalnızca Cloud konsolundan etkinleştirebilirsiniz. Aşağıdaki adımları uygulayın:
- Cloud Marketplace'teki Cloud Identity Platform sayfasına gidin ve oradaki Etkinleştir düğmesini tıklayın. İstenirse Firebase Authentication'dan yükseltme yapın. Bunu yaptığınızda, daha önce Arka Plan bölümünde açıklananlar gibi ek özelliklerin kilidi açılır. Burada, Etkinleştir düğmesinin vurgulandığı Marketplace sayfası gösterilmektedir:
- Identity Platform etkinleştirildikten sonra otomatik olarak Identity Providers (Kimlik Sağlayıcılar) sayfasına yönlendirilirsiniz. Değilse bu pratik bağlantıyı kullanarak erişebilirsiniz.
- Google Auth sağlayıcısını etkinleştirin. Herhangi bir sağlayıcı ayarlanmamışsa Add a Provider'ı (Sağlayıcı Ekle) tıklayın ve Google'ı seçin. Bu ekrana döndüğünüzde Google girişinin etkinleşmiş olması gerekir. Google, App Engine Kullanıcıları hizmetini basit bir Google ile Oturum Açma hizmeti olarak yansıtmak için bu eğiticide kullandığımız tek kimlik doğrulama sağlayıcıdır. Kendi uygulamalarınızda ek kimlik doğrulama sağlayıcıları etkinleştirebilirsiniz.
- Google'ı ve istediğiniz diğer kimlik doğrulama sağlayıcılarını seçip ayarladığınızda, Uygulama Kurulum Ayrıntıları'nı tıklayın ve doğrulama iletişim penceresinden Web sekmesindeki
config
nesnesindekiapiKey
veauthDomain
öğelerini kopyalayıp her ikisini de güvenli bir yere kaydedin. Neden hepsini kopyalamıyorsunuz? Bu iletişim kutusundaki snippet sabit kodlu ve tarihsizdir. Bu nedenle, en önemli bitleri kaydedip kodumuzda kullanarak daha eşzamanlı Firebase Auth kullanımı sağlayabilirsiniz. Değerleri kopyalayıp güvenli bir yere kaydettikten sonra, gerekli tüm kurulumu tamamlamak için Kapat düğmesini tıklayın.
4. Yapılandırmayı güncelleyin
Yapılandırmadaki güncellemeler, hem çeşitli yapılandırma dosyalarının değiştirilmesini hem de Cloud Identity Platform ekosisteminde App Engine'in eşdeğerini oluşturmayı içerir.
appengine_config.py
- Python 3'e yükseltme yapıyorsanız
appengine_config.py
komutunu silin - Identity Platform'u modernleştirmeyi planlıyor ancak Python 2'de kalıyorsanız dosyayı silmeyin. Bunun yerine, bunu daha sonra Python 2 geri bağlantısı sırasında güncelleyeceğiz.
requirements.txt
20. Modül'ün requirements.txt
dosyası yalnızca Flask'i listelemiştir. Modül 21 için aşağıdaki paketleri ekleyin:
requirements.txt
içeriği artık aşağıdaki gibi görünecektir:
flask
google-auth
google-cloud-ndb
google-cloud-resource-manager
firebase-admin
app.yaml
- Python 3'e yükseltmek,
app.yaml
dosyasını basitleştirmek anlamına gelir. Çalışma zamanı yönergesi dışındaki her şeyi kaldırın ve bunu şu anda desteklenen bir Python 3 sürümüne ayarlayın. Örnekte şu anda 3.10 sürümü kullanılmaktadır. - Python 2 kullanmaya devam ediyorsanız henüz burada herhangi bir işlem yapmanız gerekmez.
ÖNCE:
runtime: python27
threadsafe: yes
api_version: 1
handlers:
- url: /.*
script: main.app
Modül 20 örnek uygulamasında statik dosya işleyiciler yoktur. Uygulamalarınız kullanılıyorsa bu uygulamalar olduğu gibi bırakın. İsterseniz tüm komut dosyası işleyicilerinizi kaldırabilir veya app.yaml
taşıma rehberinde açıklandığı şekilde herkese açık kullanıcı adlarını auto
olarak değiştirdiğiniz sürece bunları referans olarak kullanabilirsiniz. Bu değişikliklerle birlikte Python 3 için güncellenmiş app.yaml
, şu şekilde basitleştirildi:
SONRA:
runtime: python310
Diğer yapılandırma güncellemeleri
İster Python 2'de kalsın ister Python 3'e bağlanıyor olun, lib
klasörünüz varsa bunu silin.
5. Uygulama kodunu değiştir
Bu bölümde, main.py
ana uygulama dosyasıyla ilgili güncellemeler yer almaktadır. Bu güncellemeler, App Engine Kullanıcıları hizmetinin kullanımını Cloud Identity Platform ile değiştirmektedir. Ana uygulamayı güncelledikten sonra templates/index.html
web şablonunu güncelleyeceksiniz.
İçe aktarma işlemlerini ve başlatmayı güncelleme
İçe aktarma işlemlerini güncellemek ve uygulama kaynaklarını başlatmak için aşağıdaki adımları uygulayın:
- İçe aktarma işlemleri için App Engine NDB'yi Cloud NDB ile değiştirin.
- Cloud NDB ile birlikte Cloud Resource Manager'ı da içe aktarın.
- Identity Platform, Firebase Auth'u temel aldığından Firebase Admin SDK'yı içe aktarın.
- Cloud API'leri için bir API istemcisinin kullanılması gerekir. Bu nedenle, Flask'i başlatmanın hemen altında bu istemciyi Cloud NDB için başlatın.
Cloud Resource Manager paketi buraya içe aktarılsa da paketi uygulama başlatma işleminin sonraki bir aşamasında kullanırız. Aşağıda Modül 20'den yapılan içe aktarma ve başlatma işlemlerinin ardından yukarıdaki değişikliklerin uygulanmasından sonra bölümlerin nasıl olması gerektiği belirtilmektedir:
ÖNCE:
from flask import Flask, render_template, request
from google.appengine.api import users
from google.appengine.ext import ndb
app = Flask(__name__)
SONRA:
from flask import Flask, render_template, request
from google.auth import default
from google.cloud import ndb, resourcemanager
from firebase_admin import auth, initialize_app
# initialize Flask and Cloud NDB API client
app = Flask(__name__)
ds_client = ndb.Client()
App Engine Yönetici kullanıcıları için destek
Yönetici kullanıcıların tanınmasını destekleyen uygulamaya eklenecek iki bileşen vardır:
_get_gae_admins()
— yönetici kullanıcılar grubunu bir araya getirir; bir kez çağrıldı ve kaydedildiis_admin()
— Oturum açan kullanıcının yönetici kullanıcı olup olmadığını kontrol eder; herhangi bir kullanıcı girişinde çağrılıyor
_get_gae_admins()
yardımcı program işlevi, mevcut Cloud IAM allow-policy öğesini getirmek için Resource Manager API'yi çağırır. İzin Ver politikası, hangi ana hesaplara (gerçek kullanıcılar, hizmet hesapları vb.) verileceğini tanımlar ve uygular. Kurulumda şunlar bulunur:
- Cloud projesi kimliği (
PROJ_ID
) getiriliyor - Resource Manager API istemcisi oluşturma (
rm_client
) - App Engine Yönetici rolleri grubu (salt okunur) oluşturma (
_TARGETS
)
Resource Manager için Cloud projesi kimliği gerekir. Bu nedenle, proje kimliğini almak için google.auth.default()
öğesini içe aktarın ve bu işlevi çağırın. Bu çağrı, URL'ye benzer ancak OAuth2 izin kapsamı olan bir parametre içerir. Uygulamaları bulutta çalıştırırken (örneğin, bir Compute Engine sanal makinesi veya App Engine uygulamasında) geniş ayrıcalıklara sahip bir varsayılan hizmet hesabı sağlanır. En az ayrıcalık ilkesini göz önünde bulundurarak, kendi kullanıcı tarafından yönetilen hizmet hesaplarınızı oluşturmanızı öneririz.
API çağrılarında, uygulamalarınızın kapsamını, düzgün çalışması için gereken minimum düzeye daha da düşürmeniz önerilir. get_iam_policy()
olarak yapacağımız Resource Manager API çağrısının çalışması için aşağıdaki kapsamlardan biri gerekir:
https://www.googleapis.com/auth/cloud-platform
https://www.googleapis.com/auth/cloud-platform.read-only
https://www.googleapis.com/auth/cloudplatformprojects
https://www.googleapis.com/auth/cloudplatformprojects.readonly
Örnek uygulamanın allow-policy için yalnızca okuma erişimine ihtiyacı vardır. Politikada değişiklik yapmaz veya tüm projeye erişmesi gerekmez. Yani uygulama, ilk üç izinden hiçbirine ihtiyaç duymaz. Sonuncusu, yapılması gereken tek şeydir ve örnek uygulama için de bunu uyguluyoruz.
İşlevin ana gövdesi, boş bir yönetici kullanıcılar grubu (admins
) oluşturur, get_iam_policy()
aracılığıyla allow_policy
öğesini getirir ve özellikle App Engine Yöneticisi rollerini aramak için tüm bağlamaları döngüye alır:
roles/viewer
roles/editor
roles/owner
roles/appengine.appAdmin
Bulunan her hedef rol için söz konusu role ait kullanıcıları derleyerek bu kullanıcıları genel yönetici kullanıcılar grubuna ekler. Bu işlem, bulunan ve önbelleğe alınan tüm yönetici kullanıcıların, bu App Engine örneğinin ömrü boyunca sabit değer (_ADMINS
) olarak döndürülmesiyle sona erer. Görüşmemiz kısa süre içinde yapılacak.
Aşağıdaki _get_gae_admins()
işlevi tanımını, Cloud NDB API istemcisini (ds_client
) örneklendirmenin hemen altına main.py
öğesine ekleyin:
def _get_gae_admins():
'return set of App Engine admins'
# setup constants for calling Cloud Resource Manager API
_, PROJ_ID = default( # Application Default Credentials and project ID
['https://www.googleapis.com/auth/cloudplatformprojects.readonly'])
rm_client = resourcemanager.ProjectsClient()
_TARGETS = frozenset(( # App Engine admin roles
'roles/viewer',
'roles/editor',
'roles/owner',
'roles/appengine.appAdmin',
))
# collate users who are members of at least one GAE admin role (_TARGETS)
admins = set() # set of all App Engine admins
allow_policy = rm_client.get_iam_policy(resource='projects/%s' % PROJ_ID)
for b in allow_policy.bindings: # bindings in IAM allow-policy
if b.role in _TARGETS: # only look at GAE admin roles
admins.update(user.split(':', 1).pop() for user in b.members)
return admins
Kullanıcılar uygulamaya giriş yaptığında aşağıdakiler gerçekleşir:
- Kullanıcı Firebase'de oturum açtıktan sonra web şablonu üzerinden hızlı bir kontrol yapılır.
- Şablonda kimlik doğrulama durumu değiştiğinde, işleyicisi sonraki işlev olan
is_admin()
olan/is_admin
öğesine Ajax stili birfetch()
çağrısı yapılır. - Firebase Kimlik Jetonu, POST gövdesinde
is_admin()
adlı kullanıcıya iletilir. Jetonu başlıklardan alır ve doğrulaması için Firebase Admin SDK'yı çağırır. Geçerli bir kullanıcıysa e-posta adresini çıkartın ve kullanıcının yönetici kullanıcı olup olmadığını kontrol edin. - Boole sonucu, daha sonra başarılı bir 200 değeri olarak şablona döndürülür.
main.py
öğesine _get_gae_admins()
tarihinden hemen sonra is_admin()
ekleyin:
@app.route('/is_admin', methods=['POST'])
def is_admin():
'check if user (via their Firebase ID token) is GAE admin (POST) handler'
id_token = request.headers.get('Authorization')
email = auth.verify_id_token(id_token).get('email')
return {'admin': email in _ADMINS}, 200
Kullanıcılar hizmetinden kullanılabilen işlevleri, özellikle de is_current_user_admin()
işlevini kopyalamak için her iki işlevdeki tüm kodların kullanılması gerekir. Değişim çözümünü uyguladığımız Modül 21'in aksine, Modül 20'deki bu işlev çağrısı tüm ağır işleri üstlendi. Ancak iyi bir haberimiz var. Uygulama artık yalnızca App Engine'e yönelik bir hizmete bağlı değildir. Böylece uygulamalarınızı Cloud Run veya diğer hizmetlere taşıyabilirsiniz. Ayrıca, "yönetici kullanıcı" tanımını da değiştirebilirsiniz yalnızca _TARGETS
ürününde istediğiniz rollere geçiş yaparak kendi uygulamalarınıza uygulayabilirsiniz. Kullanıcılar hizmeti ise App Engine yönetici rollerinin koduna gömülüdür.
Firebase Auth'u başlatma ve App Engine yönetici kullanıcılarını önbelleğe alma
Firebase Auth'u, Flask uygulamasının ilk kullanıma hazırlandığı ve Cloud NDB API istemcisinin oluşturulduğu aynı noktaya yakın bir noktada başlatabilirdik. Ancak yönetici kodunun tamamı tanımlanıp tanımlanacak olana kadar buna gerek kalmadı. Benzer şekilde, _get_gae_admins()
tanımlandığına göre yönetici kullanıcıların listesini önbelleğe almak için bu komutu çağırın.
Aşağıdaki satırları, is_admin()
işlevinin işlev gövdesinin hemen altına ekleyin:
# initialize Firebase and fetch set of App Engine admins
initialize_app()
_ADMINS = _get_gae_admins()
Ziyaret verileri modeli güncellemeleri
Visit
veri modeli değişmez. Datastore erişimi, Cloud NDB API istemci bağlam yöneticisinin (ds_client.context()
) açık kullanımını gerektirir. Kodda bu, Datastore çağrılarını Python with
bloklarının içinde hem store_visit()
hem de fetch_visits()
içinde sarmalayacağı anlamına gelir. Bu güncelleme 2. Modül ile aynıdır. Değişiklikleri aşağıdaki gibi yapın:
ÖNCE:
class Visit(ndb.Model):
'Visit entity registers visitor IP address & timestamp'
visitor = ndb.StringProperty()
timestamp = ndb.DateTimeProperty(auto_now_add=True)
def store_visit(remote_addr, user_agent):
'create new Visit entity in Datastore'
Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()
def fetch_visits(limit):
'get most recent visits'
return Visit.query().order(-Visit.timestamp).fetch(limit)
SONRA:
class Visit(ndb.Model):
'Visit entity registers visitor IP address & timestamp'
visitor = ndb.StringProperty()
timestamp = ndb.DateTimeProperty(auto_now_add=True)
def store_visit(remote_addr, user_agent):
'create new Visit entity in Datastore'
with ds_client.context():
Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()
def fetch_visits(limit):
'get most recent visits'
with ds_client.context():
return Visit.query().order(-Visit.timestamp).fetch(limit)
Kullanıcı girişi mantığını web şablonuna taşı
App Engine Kullanıcıları hizmeti sunucu tarafında, Firebase Auth ve Cloud Identity Platform ise ağırlıklı olarak istemci tarafındadır. Bunun sonucunda, Modül 20 uygulamasındaki kullanıcı yönetimi kodunun büyük bir kısmı Modül 21 web şablonuna taşınmıştır.
main.py
ürününde web bağlamı şablona beş temel veri iletir; listelenen ilk dört veri kullanıcı yönetimine bağlıdır ve kullanıcının oturum açmış olup olmadığına bağlı olarak değişiklik gösterir:
who
- oturum açmışsa kullanıcının e-posta adresi veya oturum açmışsa kullanıcıadmin
— Oturum açmış kullanıcı bir yöneticiyse (yönetici) rozetisign
— Giriş yap veya Çıkış yap düğmesini gösterlink
— Düğme tıklandığında oturum açma veya oturum kapatma bağlantılarıvisits
— en son ziyaretler
ÖNCE:
@app.route('/')
def root():
'main application (GET) handler'
store_visit(request.remote_addr, request.user_agent)
visits = fetch_visits(10)
# put together users context for web template
user = users.get_current_user()
context = { # logged in
'who': user.nickname(),
'admin': '(admin)' if users.is_current_user_admin() else '',
'sign': 'Logout',
'link': '/_ah/logout?continue=%s://%s/' % (
request.environ['wsgi.url_scheme'],
request.environ['HTTP_HOST'],
), # alternative to users.create_logout_url()
} if user else { # not logged in
'who': 'user',
'admin': '',
'sign': 'Login',
'link': users.create_login_url('/'),
}
# add visits to context and render template
context['visits'] = visits # display whether logged in or not
return render_template('index.html', **context)
Tüm kullanıcı yönetimi işlemleri web şablonuna taşınıyor. Bu yüzden geride yalnızca ziyaretler bulunuyor. Ana işleyici, Modül 1 uygulamasında olan en son haline geri dönüyor:
SONRA:
@app.route('/')
def root():
'main application (GET) handler'
store_visit(request.remote_addr, request.user_agent)
visits = fetch_visits(10)
return render_template('index.html', visits=visits)
Web şablonunu güncelle
Önceki bölümde yer alan güncellemelerin tümü şablonda nasıl görünüyor? Esas olarak, kullanıcı yönetimini uygulamadan, şablonda çalışan Firebase Auth'a ve JavaScript'e taşıdığımız tüm kodların bir kısmını içeren bir bağlantı noktasına taşıdık. main.py
'nin bir hayli azaldığını gördük. templates/index.html
için de benzer bir büyüme beklenebilir.
ÖNCE:
<!doctype html>
<html>
<head>
<title>VisitMe Example</title>
</head>
<body>
<p>
Welcome, {{ who }} <code>{{ admin }}</code>
<button id="logbtn">{{ sign }}</button>
</p><hr>
<h1>VisitMe example</h1>
<h3>Last 10 visits</h3>
<ul>
{% for visit in visits %}
<li>{{ visit.timestamp.ctime() }} from {{ visit.visitor }}</li>
{% endfor %}
</ul>
<script>
document.getElementById("logbtn").onclick = () => {
window.location.href = '{{ link }}';
};
</script>
</body>
</html>
Web şablonunun tamamını aşağıdaki içeriklerle değiştirin:
SONRA:
<!doctype html>
<html>
<head>
<title>VisitMe Example</title>
<script type="module">
// import Firebase module attributes
import {
initializeApp
} from "https://www.gstatic.com/firebasejs/9.10.0/firebase-app.js";
import {
GoogleAuthProvider,
getAuth,
onAuthStateChanged,
signInWithPopup,
signOut
} from "https://www.gstatic.com/firebasejs/9.10.0/firebase-auth.js";
// Firebase config:
// 1a. Go to: console.cloud.google.com/customer-identity/providers
// 1b. May be prompted to enable GCIP and upgrade from Firebase
// 2. Click: "Application Setup Details" button
// 3. Copy: 'apiKey' and 'authDomain' from 'config' variable
var firebaseConfig = {
apiKey: "YOUR_API_KEY",
authDomain: "YOUR_AUTH_DOMAIN",
};
// initialize Firebase app & auth components
initializeApp(firebaseConfig);
var auth = getAuth();
var provider = new GoogleAuthProvider();
//provider.setCustomParameters({prompt: 'select_account'});
// define login and logout button functions
function login() {
signInWithPopup(auth, provider);
};
function logout() {
signOut(auth);
};
// check if admin & switch to logout button on login; reset everything on logout
onAuthStateChanged(auth, async (user) => {
if (user && user != null) {
var email = user.email;
who.innerHTML = email;
logbtn.onclick = logout;
logbtn.innerHTML = "Logout";
var idToken = await user.getIdToken();
var rsp = await fetch("/is_admin", {
method: "POST",
headers: {Authorization: idToken}
});
var data = await rsp.json();
if (data.admin) {
admin.style.display = "inline";
}
} else {
who.innerHTML = "user";
admin.style.display = "none";
logbtn.onclick = login;
logbtn.innerHTML = "Login";
}
});
</script>
</head>
<body>
<p>
Welcome, <span id="who"></span> <span id="admin"><code>(admin)</code></span>
<button id="logbtn"></button>
</p><hr>
<h1>VisitMe example</h1>
<h3>Last 10 visits</h3>
<ul>
{% for visit in visits %}
<li>{{ visit.timestamp.ctime() }} from {{ visit.visitor }}</li>
{% endfor %}
</ul>
<script>
var who = document.getElementById("who");
var admin = document.getElementById("admin");
var logbtn = document.getElementById("logbtn");
</script>
</body>
</html>
Bu HTML gövdesinde birçok bileşen bulunduğundan, bunları tek tek ele alalım.
Firebase içe aktarmaları
HTML belgesinin başlığındayken, sayfa başlığını geçtikten sonra gerekli Firebase bileşenlerini içe aktarın. Firebase bileşenleri, verimlilik için artık birden fazla modüle ayrılıyor. Firebase'i başlatma kodu, ana Firebase uygulama modülünden içe aktarılırken Firebase kimlik doğrulamasını, kimlik doğrulama sağlayıcı olarak Google'ı yöneten, oturum açma ve kapatma, kimlik doğrulama durumu "geri çağırma" işlemini yöneten işlevler. tümü Firebase Auth modülünden içe aktarılır:
<!doctype html>
<html>
<head>
<title>VisitMe Example</title>
<script type="module">
// import Firebase module attributes
import {
initializeApp
} from "https://www.gstatic.com/firebasejs/9.10.0/firebase-app.js";
import {
GoogleAuthProvider,
getAuth,
onAuthStateChanged,
signInWithPopup,
signOut
} from "https://www.gstatic.com/firebasejs/9.10.0/firebase-auth.js";
Firebase yapılandırması
Bu eğiticinin Identity Platform kurulum bölümünün başlarında Uygulama Kurulumu Ayrıntıları iletişim kutusundan apiKey
ve authDomain
bilgilerini kaydetmiştiniz. Söz konusu değerleri, sonraki bölümde yer alan firebaseConfig
değişkenine ekleyin. Daha ayrıntılı talimatlar için yorumlarda bir bağlantı verilmiştir:
// Firebase config:
// 1a. Go to: console.cloud.google.com/customer-identity/providers
// 1b. May be prompted to enable GCIP and upgrade from Firebase
// 2. Click: "Application Setup Details" button
// 3. Copy: 'apiKey' and 'authDomain' from 'config' variable
var firebaseConfig = {
apiKey: "YOUR_API_KEY",
authDomain: "YOUR_AUTH_DOMAIN",
};
Firebase'i başlatma
Bir sonraki bölümde Firebase bu yapılandırma bilgileriyle başlatılır.
// initialize Firebase app & auth components
initializeApp(firebaseConfig);
var auth = getAuth();
var provider = new GoogleAuthProvider();
//provider.setCustomParameters({prompt: 'select_account'});
Bu, Google'ı kimlik doğrulama sağlayıcı olarak kullanma olanağını sağlar ve tarayıcı oturumunuzda yalnızca tek bir Google hesabı kayıtlı olsa bile hesap seçiciyi göstermek için açıklama metni seçeneği sunar. Diğer bir deyişle, birden fazla hesabınız olduğunda karşınıza bu "hesap seçici" çıkar beklendiği gibi: Ancak, oturumda yalnızca bir kullanıcı varsa giriş işlemi herhangi bir kullanıcı etkileşimi olmadan otomatik olarak tamamlanır. (Pop-up daha sonra kaybolur.) Özel parametre satırının açıklamasını kaldırarak hesap seçici iletişim kutusunu bir kullanıcı için görüntülenmeye zorlayabilirsiniz (uygulamaya hemen giriş yapmak yerine). Etkinleştirilirse tek kullanıcı girişlerinde bile hesap seçici görünür:
Giriş ve çıkış işlevleri
Sonraki kod satırları, giriş veya çıkış düğmesi tıklamalarına ilişkin işlevleri oluşturur:
// define login and logout button functions
function login() {
signInWithPopup(auth, provider);
};
function logout() {
signOut(auth);
};
Oturum açma ve oturumu kapatma işlemleri
Bu <script>
blokundaki son ana bölüm, her kimlik doğrulama değişikliği (oturum açma veya oturumu kapatma) için çağrılan işlevdir.
// check if admin & switch to logout button on login; reset everything on logout
onAuthStateChanged(auth, async (user) => {
if (user && user != null) {
var email = user.email;
who.innerHTML = email;
logbtn.onclick = logout;
logbtn.innerHTML = "Logout";
var idToken = await user.getIdToken();
var rsp = await fetch("/is_admin", {
method: "POST",
headers: {Authorization: idToken}
});
var data = await rsp.json();
if (data.admin) {
admin.style.display = "inline";
}
} else {
who.innerHTML = "user";
admin.style.display = "none";
logbtn.onclick = login;
logbtn.innerHTML = "Login";
}
});
</script>
</head>
"Giriş yapan kullanıcı"nın gönderilip gönderilmeyeceğini belirleyen Modül 20'deki kod şablon bağlamı ile "kullanıcı çıkış yapmış" karşılaştırması bağlamın geçişi burada yapılır. Üstteki koşul, kullanıcı başarıyla giriş yaparak aşağıdaki işlemleri tetiklerse true
ile sonuçlanır:
- Kullanıcının e-posta adresi gösterilecek şekilde ayarlanmıştır.
- Giriş yap düğmesi, Çıkış yap olarak değişir.
(admin)
yönetici kullanıcı rozetinin gösterilip gösterilmeyeceğini belirlemek için/is_admin
adresine Ajax tarzı bir çağrı yapılır.
Kullanıcı çıkış yaptığında else
tümcesi yürütülür ve tüm kullanıcı bilgileri sıfırlanır:
- Kullanıcı adı user olarak ayarlandı
- Kaldırılan tüm yönetici rozetleri
- Çıkış düğmesi tekrar Giriş olarak değiştirildi
Şablon değişkenleri
Üstbilgi bölümü sona erdikten sonra ana gövde, gerektiğinde değişen HTML öğeleriyle değiştirilen şablon değişkenleriyle başlar:
- Gösterilen kullanıcı adı
(admin)
yönetici rozeti (varsa)- Giriş yap veya Çıkış yap düğmesi
<body>
<p>
Welcome, <span id="who"></span> <span id="admin"><code>(admin)</code></span>
<button id="logbtn"></button>
</p><hr>
En son ziyaretler ve HTML öğesi değişkenleri
En son ziyaret kodu değişmez ve son <script>
bloğu, hemen yukarıda listelenen oturum açma ve oturum kapatma işlemi için değişen HTML öğelerine ilişkin değişkenleri ayarlar:
<h1>VisitMe example</h1>
<h3>Last 10 visits</h3>
<ul>
{% for visit in visits %}
<li>{{ visit.timestamp.ctime() }} from {{ visit.visitor }}</li>
{% endfor %}
</ul>
<script>
var who = document.getElementById("who");
var admin = document.getElementById("admin");
var logbtn = document.getElementById("logbtn");
</script>
</body>
</html>
Bu sayede, App Engine NDB ve Kullanıcı API'lerinden Cloud NDB ve Identity Platform'a geçiş ile Python 3'e geçiş için uygulamada ve web şablonunda gerekli değişiklikler yapılmıştır. Yeni Modül 21 örnek uygulamanıza ulaştığınız için tebrikler! Sürümümüz, Modül 21b depo klasöründe incelenebilir.
Codelab'in sonraki bölümü isteğe bağlıdır (*) ve yalnızca uygulamaları Python 2'de kalması gereken kullanıcılara yöneliktir. Bu bölüm, çalışan bir Python 2 Modül 21 uygulamasına ulaşmak için gerekli adımları açıklar.
6. *Python 2 geri bağlantı noktası
İsteğe bağlı bu bölüm, Identity Platform taşıma işlemi gerçekleştiren ancak Python 2 çalışma zamanında çalışmaya devam etmesi gereken geliştiricilere yöneliktir. Bu sizin için sorun değilse bu bölümü atlayın.
Module 21 uygulamasının çalışan bir Python 2 sürümünü oluşturmak için aşağıdakilere ihtiyacınız vardır:
- Çalışma zamanı gereksinimleri: Python 2'yi destekleyen yapılandırma dosyaları ve Python 3 uyumsuzluklarını önlemek için ana uygulamada yapılması gereken değişiklikler
- Küçük kitaplık değişikliği: Bazı gerekli özellikler Resource Manager istemci kitaplığına eklenmeden önce Python 2 desteği sonlandırılmıştır. Sonuç olarak, eksik olan işleve erişmek için alternatif bir yönteme ihtiyacınız var.
Şimdi, yapılandırmayla başlayarak bu adımları uygulayalım.
appengine_config.py geri yükle
Bu eğiticinin başlarında, Python 3 App Engine çalışma zamanı tarafından kullanılmadığı için appengine_config.py
öğesini silmeniz istendi. Python 2 için hem korunması hem de Modül 20'nin (appengine_config.py
) grpcio
ve setuptools
adlı yerleşik üçüncü taraf kitaplıkların kullanımını destekleyecek şekilde güncellenmesi gerekir. Bu paketler, App Engine uygulamanız Cloud NDB ve Cloud Resource Manager gibi Cloud istemci kitaplıkları kullandığında gereklidir.
Bu paketleri kısa bir süre içinde app.yaml
hizmetine ekleyeceksiniz ancak uygulamanızın bunlara erişebilmesi için setuptools
öğesinden pkg_resources.working_set.add_entry()
işlevi çağrılmalıdır. Bu işlem, lib
klasörüne yüklenen kopyalanmış (kendi kendine gruplanmış veya tedarikçi firma) üçüncü taraf kitaplıkların yerleşik kitaplıklarla iletişim kurabilmesine olanak tanır.
Bu değişiklikleri uygulamak için appengine_config.py
dosyanızda aşağıdaki güncellemeleri uygulayın:
ÖNCE:
from google.appengine.ext import vendor
# Set PATH to your libraries folder.
PATH = 'lib'
# Add libraries installed in the PATH folder.
vendor.add(PATH)
Bu kod, setuptools
ve grpcio
kullanımını desteklemek için tek başına yeterli değildir. Birkaç satır daha gerekiyor. appengine_config.py
uzantısını aşağıdaki gibi güncelleyin:
SONRA:
import pkg_resources
from google.appengine.ext import vendor
# Set PATH to your libraries folder.
PATH = 'lib'
# Add libraries installed in the PATH folder.
vendor.add(PATH)
# Add libraries to pkg_resources working set to find the distribution.
pkg_resources.working_set.add_entry(PATH)
Cloud istemci kitaplıklarını desteklemek için gereken değişiklikler hakkında daha fazla bilgiyi, paket halinde sunulan hizmetleri taşıma belgelerinde bulabilirsiniz.
app.yaml
appengine_config.py
dosyasına benzer şekilde, app.yaml
dosyası da Python 2'yi destekleyen bir dosyaya geri döndürülmelidir. Orijinal Modül 20 ile başlayalım: app.yaml
:
ÖNCE:
runtime: python27
threadsafe: yes
api_version: 1
handlers:
- url: /.*
script: main.app
Daha önce belirtildiği gibi setuptools
ve grpcio
'a ek olarak, Cloud Storage istemci kitaplığının kullanılmasını gerektiren (Identity Platform'a geçişle açıkça ilgili olmayan) ve başka bir yerleşik üçüncü taraf paketi (ssl
) gerektiren bir bağımlılık vardır. Üçünü de yeni libraries
bölümüne ekleyerek "en son"u seçin bu paketlerin mevcut sürümlerini app.yaml
adlı kullanıcıya göndermek için:
SONRA:
runtime: python27
threadsafe: yes
api_version: 1
handlers:
- url: /.*
script: main.app
libraries:
- name: grpcio
version: latest
- name: setuptools
version: latest
- name: ssl
version: latest
requirements.txt
Modül 21 için Python 3 requirements.txt
'e Google Auth, Cloud NDB, Cloud Resource Manager ve Firebase Admin SDK'yı ekledik. Python 2'de durum daha karmaşıktır:
- Resource Manager API, örnek uygulama için gereken izin politikası işlevini sağlar. Maalesef Cloud Resource Manager istemci kitaplığının son Python 2 sürümünde bu destek henüz sunulmamıştı. (Yalnızca Python 3 sürümünde kullanılabilir.)
- Bu nedenle, bu özelliğe API'den erişmek için alternatif bir yöntem gerekiyor. Çözüm, API ile iletişim kurmak için alt düzey Google API'leri istemci kitaplığını kullanmaktır. Bu istemci kitaplığına geçiş yapmak için
google-cloud-resource-manager
öğesini alt düzeygoogle-api-python-client
paketiyle değiştirin. - Python 2 kullanımdan kaldırıldığından, Modül 21'i destekleyen bağımlılık grafiğinde belirli paketlerin belirli sürümlere kilitlenmesi gerekir. Bazı paketler, Python 3
app.yaml
içinde belirtilmemiş olsa bile çağrılmalıdır.
ÖNCE:
flask
Modül 20'den (requirements.txt
) başlayarak, çalışan bir Modül 21 uygulaması için bunu aşağıdaki şekilde güncelleyin:
SONRA:
grpcio==1.0.0
protobuf<3.18.0
six>=1.13.0
flask
google-gax<0.13.0
google-api-core==1.31.1
google-api-python-client<=1.11.0
google-auth<2.0dev
google-cloud-datastore==1.15.3
google-cloud-firestore==1.9.0
google-cloud-ndb
google-cloud-pubsub==1.7.0
firebase-admin
Bağımlılıklar değiştikçe depoda paket ve sürüm numaraları güncellenir ancak bu app.yaml
, bu yazı yazıldığı sırada çalışan bir uygulama için yeterlidir.
Diğer yapılandırma güncellemeleri
Bu codelab'in önceki bölümlerinden lib
klasörünü silmediyseniz hemen silin. Yeni güncellenen requirements.txt
ile lib
ürününe bu gereksinimleri yüklemek için şu komutu verin:
pip install -t lib -r requirements.txt # or pip2
Geliştirme sisteminizde hem Python 2 hem de 3 yüklüyse pip
yerine pip2
kullanmanız gerekebilir.
Uygulama kodunu değiştir
Neyse ki, gerekli değişikliklerin çoğu yapılandırma dosyalarındadır. Uygulama kodunda gereken tek değişiklik, API'ye erişmek için Resource Manager istemci kitaplığı yerine alt düzey Google API istemci kitaplığının kullanılması amacıyla yapılan küçük bir güncellemedir. templates/index.html
web şablonunda güncelleme yapılmasına gerek yoktur.
İçe aktarma işlemlerini ve başlatma işlemini güncelleme
Resource Manager istemci kitaplığını (google.cloud.resourcemanager
) aşağıda gösterildiği gibi Google API'leri istemci kitaplığıyla (googleapiclient.discovery
) değiştirin:
ÖNCE:
from flask import Flask, render_template, request
from google.auth import default
from google.cloud import ndb, resourcemanager
from firebase_admin import auth, initialize_app
SONRA:
from flask import Flask, render_template, request
from google.auth import default
from google.cloud import ndb
from googleapiclient import discovery
from firebase_admin import auth, initialize_app
App Engine Yönetici kullanıcıları için destek
Alt düzey istemci kitaplığının kullanımını desteklemek için _get_gae_admins()
ürününde birkaç değişiklik yapılması gerekiyor. Önce nelerin değiştiğini tartışalım, sonra güncellenecek tüm kodu size verelim.
Python 2 kodu, google.auth.default()
öğesinden döndürülen kimlik bilgilerinin ve proje kimliğinin kullanılmasını gerektirir. Kimlik bilgileri Python 3'te kullanılmadığı için genel bir alt çizgi ( _
) temsil değişkenine atandı. Python 2 sürümü için gerekli olduğundan alt çizgiyi CREDS
olarak değiştirin. Ayrıca, Resource Manager API istemcisi oluşturmak yerine, API istemcisine benzer şekilde, API hizmet uç noktası oluşturmanız gerekir. Böylece aynı değişken adını (rm_client
) koruyoruz. Bir fark, hizmet uç noktası örneklendirmek için kimlik bilgileri (CREDS
) gerektirmesidir.
Bu değişiklikler aşağıdaki koda yansıtılmıştır:
ÖNCE:
_, PROJ_ID = default( # Application Default Credentials and project ID
['https://www.googleapis.com/auth/cloudplatformprojects.readonly'])
rm_client = resourcemanager.ProjectsClient()
SONRA:
CREDS, PROJ_ID = default( # Application Default Credentials and project ID
['https://www.googleapis.com/auth/cloud-platform'])
rm_client = discovery.build('cloudresourcemanager', 'v1', credentials=CREDS)
Diğer fark ise Resource Manager istemci kitaplığının noktalı özellik gösterimi kullanan allow-policy nesnelerini döndürmesidir. Alt düzey istemci kitaplığının ise köşeli parantez ( [ ]
) kullanıldığı Python sözlükleri döndürmesidir. Örneğin, Resource Manager istemci kitaplığı için binding.role
, alt düzey kitaplık için binding['role']
kullanılmalıdır. İlk satır öğesi ayrıca "underscore_ herkese açık" değerini de kullanır "CamelCased" ifadesini tercih eden alt düzey kütüphaneye kıyasla ve API parametrelerini geçirmek için biraz farklı bir yöntem sunar.
Bu kullanım farklılıkları aşağıda gösterilmiştir:
ÖNCE:
allow_policy = rm_client.get_iam_policy(resource='projects/%s' % PROJ_ID)
for b in allow_policy.bindings: # bindings in IAM allow-policy
if b.role in _TARGETS: # only look at GAE admin roles
admins.update(user.split(':', 1).pop() for user in b.members)
SONRA:
allow_policy = rm_client.projects().getIamPolicy(resource=PROJ_ID).execute()
for b in allow_policy['bindings']: # bindings in IAM allow-policy
if b['role'] in _TARGETS: # only look at GAE admin roles
admins.update(user.split(':', 1).pop() for user in b['members'])
Tüm bu değişiklikleri bir araya getirdiğimizde, Python 3 _get_gae_admins()
kodunu şu eşdeğer Python 2 sürümüyle değiştirin:
def _get_gae_admins():
'return set of App Engine admins'
# setup constants for calling Cloud Resource Manager API
CREDS, PROJ_ID = default( # Application Default Credentials and project ID
['https://www.googleapis.com/auth/cloud-platform'])
rm_client = discovery.build('cloudresourcemanager', 'v1', credentials=CREDS)
_TARGETS = frozenset(( # App Engine admin roles
'roles/viewer',
'roles/editor',
'roles/owner',
'roles/appengine.appAdmin',
))
# collate users who are members of at least one GAE admin role (_TARGETS)
admins = set() # set of all App Engine admins
allow_policy = rm_client.projects().getIamPolicy(resource=PROJ_ID).execute()
for b in allow_policy['bindings']: # bindings in IAM allow-policy
if b['role'] in _TARGETS: # only look at GAE admin roles
admins.update(user.split(':', 1).pop() for user in b['members'])
return admins
is_admin()
işlevi, zaten güncellenmiş olan _get_gae_admins()
öğesini temel aldığı için güncelleme gerektirmez.
Bu e-postada, Python 3 Module 21 uygulamasını Python 2'ye geri taşımak için gereken değişiklikler tamamlanmıştır. Güncellenmiş Modül 21 örnek uygulamanıza ulaştığınız için tebrikler! Kodun tamamını Module 21a depo klasöründe bulabilirsiniz.
7. Özet/Temizlik
Codelab'in son adımları, bu uygulamayı çalıştıran ana hesapların (kullanıcılar veya hizmet hesapları) bunun için uygun izinlere sahip olduğundan emin olmaktır. Ardından uygulamanızı, beklendiği gibi çalıştığını ve değişikliklerin çıkışa yansıtıldığını onaylamak için dağıtın.
IAM izin politikasını okuma yetkisi
Daha önce App Engine yönetici kullanıcısı olarak tanınmak için gereken dört rolü size tanıtmıştık. Ancak şimdi öğrenmeniz gereken beş rol var:
roles/viewer
roles/editor
roles/owner
roles/appengine.appAdmin
roles/resourcemanager.projectIamAdmin
(IAM izin verme politikasına erişen ana hesaplar için)
roles/resourcemanager.projectIamAdmin
rolü, ana hesapların son kullanıcının App Engine yönetici rollerinden herhangi birinin üyesi olup olmadığını belirlemesini sağlar. roles/resourcemanager.projectIamAdmin
üyeliği olmadan, izin politikasını almak için Cloud Resource Manager API'ye yapılan çağrılar başarısız olur.
Uygulamanız, otomatik olarak bu role üyelik verilen App Engine'in varsayılan hizmet hesabı altında çalışacağından burada açıkça herhangi bir işlem yapmanız gerekmez. Geliştirme aşamasında varsayılan hizmet hesabını kullansanız bile, uygulamanızın düzgün çalışması için gereken minimum izinlere sahip bir kullanıcı tarafından yönetilen hizmet hesabı oluşturup kullanmanızı önemle tavsiye ederiz. Bu tür bir hizmet hesabına üyelik vermek için aşağıdaki komutu çalıştırın:
$ gcloud projects add-iam-policy-binding PROJ_ID --member="serviceAccount:USR_MGD_SVC_ACCT@PROJ_ID.iam.gserviceaccount.com" --role=roles/resourcemanager.projectIamAdmin
PROJ_ID
Cloud projesinin kimliğidir. USR_MGD_SVC_ACCT@PROJ_ID.iam.gserviceaccount.com
ise uygulamanız için oluşturduğunuz, kullanıcı tarafından yönetilen hizmet hesabıdır. Bu komut, projeniz için güncellenmiş IAM politikasını üretir. Burada, hizmet hesabının roles/resourcemanager.projectIamAdmin
kapsamında üye olduğunu onaylayabilirsiniz. Daha fazla bilgi için referans belgelerini inceleyin. Tekrar belirtelim, bu komutu bu codelab'de vermeniz gerekmez ancak kendi uygulamalarınızı modernleştirmek için referans olarak kaydedin.
Uygulamayı dağıtma ve doğrulama
Standart gcloud app deploy
komutuyla uygulamanızı buluta yükleyin. Dağıtımdan sonra, App Engine Kullanıcıları hizmetini kullanıcı yönetimi için Cloud Identity Platform (ve Firebase Auth) ile başarılı bir şekilde değiştirmiş olmanız dışında Modül 20 uygulamasıyla neredeyse aynı işlevi görürsünüz:
Modül 20'ye kıyasla göreceğiniz bir farklılık, Giriş'i tıklamanın yönlendirme yerine bir pop-up ile sonuçlanmasıdır. Bu bilgiler aşağıdaki ekran görüntülerinde görülebilir. Ancak 20. Modül'de olduğu gibi bu davranış, tarayıcıya kaç Google hesabının kaydedildiğine bağlı olarak biraz farklılık gösterir.
Tarayıcıda kayıtlı bir kullanıcı yoksa veya henüz oturum açmamış tek bir kullanıcı yoksa genel bir Google ile Oturum Açma pop-up'ı görüntülenir:
Tek bir kullanıcı tarayıcınızda kayıtlı olmasına rağmen başka bir yerde oturum açtıysa herhangi bir iletişim kutusu görünmez (veya açılıp hemen kapanırsa) ve uygulama, oturum açılmış duruma geçer (kullanıcı e-posta adresini ve Çıkış yap düğmesini gösterir).
Bazı geliştiriciler, tek bir kullanıcı için bile bir hesap seçici sağlamak isteyebilir:
Bunu uygulamak için daha önce açıklandığı gibi web şablonunda provider.setCustomParameters({prompt: 'select_account'});
satırının açıklamasını kaldırın.
Birden fazla kullanıcı varsa hesap seçici iletişim kutusu açılır (aşağıya bakın). Henüz oturum açmamışsa kullanıcıdan istenir. Oturumunuz zaten açıksa pop-up kaybolur ve uygulama, oturum açık durumuna geçer.
Modül 21'in oturum açma durumu, Modül 20'nin kullanıcı arayüzüyle aynı görünür:
Aynı durum, bir yönetici kullanıcı oturum açtığında da geçerlidir:
Modül 21'in aksine, Modül 20 her zaman web şablonu içeriğinin mantığına (sunucu tarafı kodu) erişir. Modül 20'deki bir kusur, bir ziyaretin son kullanıcı uygulamaya ilk kez dokunduğunda, bir ziyaretin ise kullanıcı oturum açtığında kaydedilmesidir.
Modül 21'de giriş mantığı yalnızca web şablonunda (istemci tarafı kodu) gerçekleşir. Hangi içeriğin gösterileceğini belirlemek için sunucu tarafında işlem yapılmasına gerek yoktur. Sunucuya yapılan tek çağrı, son kullanıcı oturum açtıktan sonra yönetici kullanıcıların kontrolüdür. Bu, giriş ve çıkış işlemlerinin ek ziyaret kaydetmediği ve bu nedenle, kullanıcı yönetimi işlemleri için en son ziyaretler listesi sabit kalır. Yukarıdaki ekran görüntülerinin, birden çok kullanıcı girişinde aynı dört ziyaret grubunu gösterdiğine dikkat edin.
20. Modül'ün ekran görüntülerinde "çift ziyaret hatası" gösterilmektedir bu codelab'in başında yer almalısınız. Her oturum açma veya oturumu kapatma işlemi için ayrı ziyaret günlükleri görüntülenir. Kronolojik sıralamayı gösteren her ekran görüntüsü için en son ziyaretin zaman damgalarını kontrol edin.
Temizleme
Genel
Şimdilik işiniz bittiyse faturalandırılma olmaması için App Engine uygulamanızı devre dışı bırakmanızı öneririz. Bununla birlikte, daha fazla test veya deneme yapmak isterseniz App Engine platformunun ücretsiz bir kotası vardır ve bu kullanım katmanını aşmadığınız sürece sizden ücret alınmaz. Burası işlem içindir, ancak ilgili App Engine hizmetleri için de ücret alınabilir. Daha fazla bilgi için fiyatlandırma sayfasına göz atın. Bu taşıma işlemi başka Cloud hizmetlerini içeriyorsa bunlar ayrı olarak faturalandırılır. Her iki durumda da (geçerliyse) "Bu codelab'e özel" bölümünü inceleyin bölümüne bakın.
Ayrıntılı açıklama için, App Engine gibi Google Cloud sunucusuz bilgi işlem platformuna dağıtım yapmak küçük derleme ve depolama maliyetleri gerektirir. Cloud Build'in ve Cloud Storage'ın kendi ücretsiz kotası vardır. Söz konusu resmin depolanması bu kotanın bir kısmını kullanır. Ancak, bu kadar ücretsiz katmanın olmadığı bir bölgede yaşıyor olabilirsiniz. Bu nedenle, olası maliyetleri en aza indirmek için depolama alanı kullanımınız konusunda dikkatli olun. Belirli Cloud Storage "klasörleri" şunları incelemeniz gerekir:
console.cloud.google.com/storage/browser/LOC.artifacts.PROJECT_ID.appspot.com/containers/images
console.cloud.google.com/storage/browser/staging.PROJECT_ID.appspot.com
- Yukarıdaki depolama alanı bağlantıları
PROJECT_ID
veLOC
ayarlarınıza (ör. "us
") bağlıdır Uygulamanız ABD'de barındırılıyorsa.
Öte yandan, bu uygulamayı veya diğer ilgili taşıma codelab'lerini kullanmayacak ve her şeyi tamamen silmek istiyorsanız projenizi kapatın.
Bu codelab'e özel
Aşağıda listelenen hizmetler bu codelab'e özeldir. Daha fazla bilgi için her ürünün belgelerine bakın:
- App Engine Datastore hizmeti, aynı zamanda ücretsiz bir katmana sahip olan Cloud Datastore (Data Store modunda Cloud Firestore) tarafından sağlanır; Daha fazla bilgi için fiyatlandırma sayfasını inceleyin.
- Cloud Identity Platform'un kullanımı, belirli bir düzeyde "ücretsiz", veya kullandığınız hizmetlere bağlı olarak değişebilir. Daha fazla bilgi için fiyatlandırma sayfasını inceleyin.
- Cloud Resource Manager API'nin kullanımı, kendi fiyatlandırma sayfasına göre çoğunlukla ücretsizdir.
Sonraki adımlar
Bu eğiticinin yanı sıra, eski paket servislerin kullanımdan kaldırılmasına odaklanan diğer taşıma modüllerini de göz önünde bulundurun:
- Modül 2: App Engine
ndb
'den Cloud NDB'ye geçiş - Modüller 7-9: App Engine Görev Sırası'ndan (push görevleri) Cloud Tasks'a geçiş
- Modüller 12-13: App Engine Memcache'den Cloud Memorystore'a taşıma
- Modüller 15-16: App Engine Blobstore'dan Cloud Storage'a taşıma
- Modül 18-19: App Engine Görev Sırası'ndan (görev alma) Cloud Pub/Sub'a geçiş
App Engine artık Google Cloud'daki tek sunucusuz platform değil. Küçük bir App Engine uygulamanız varsa veya sınırlı işlevselliğe sahip bir uygulamanız varsa ve bunu bağımsız bir mikro hizmete dönüştürmek ya da monolitik bir uygulamayı yeniden kullanılabilir birden fazla bileşene ayırmak istiyorsanız Cloud Functions'a geçmek için iyi nedenler olabilir. Container mimarisine alma işlemi, uygulama geliştirme iş akışınızın bir parçası haline geldiyse, özellikle de bir CI/CD (sürekli entegrasyon/sürekli teslim veya dağıtım) ardışık düzeninden oluşuyorsa Cloud Run'a geçiş yapmayı düşünün. Bu senaryolar aşağıdaki modüllerde ele alınmıştır:
- App Engine'den Cloud Functions'a geçiş: Modül 11'e bakın
- App Engine'den Cloud Run'a taşıma: Uygulamanızı Docker ile container mimarisine almak için Modül 4'e, bu işlemi container'lar, Docker bilgileri ya da
Dockerfile
olmadan yapmak için Modül 5'e bakın.
Başka bir sunucusuz platforma geçmek isteğe bağlıdır. Bu nedenle, herhangi bir değişiklik yapmadan önce uygulamalarınız ve kullanım alanlarınız için en iyi seçenekleri değerlendirmenizi öneririz.
Bir sonraki taşıma modülünden bağımsız olarak tüm Sunucusuz Taşıma İstasyonu içeriklerine (codelab'ler, videolar, kaynak kodu [kullanılabilir olduğunda]) açık kaynak deposundan erişebilirsiniz. Deponun README
özelliği, hangi taşıma işlemlerinin göz önünde bulundurulacağı ve ilgili "siparişler" hakkında da bilgi sağlar. göz atmanızı öneririm.
8. Ek kaynaklar
Aşağıda, bu veya ilgili taşıma modüllerini daha ayrıntılı bir şekilde inceleyen geliştiricilere yönelik ek kaynaklar listelenmiştir. Aşağıda bu içerikle ilgili geri bildirimde bulunabilir, kodun bağlantılarını ve yararlı bulabileceğiniz çeşitli belgeleri inceleyebilirsiniz.
Codelab sorunları/geri bildirimi
Bu codelab'de herhangi bir sorun bulursanız lütfen göndermeden önce sorununuzu arayın. Arama ve yeni sayı oluşturma bağlantıları:
Taşıma kaynakları
Modül 20 (START) ve Modül 21 (FINISH) için depo klasörlerinin bağlantılarını aşağıdaki tabloda bulabilirsiniz.
Codelab | Python 2 | Python 3 |
(Yok) | ||
Modül 21 (bu codelab) |
Online referanslar
Aşağıda bu eğitimle alakalı kaynaklar verilmiştir:
Cloud Identity Platform ve Cloud Marketplace
- Identity Platform ürün sayfası
- Firebase Kimlik Doğrulaması
- Identity Platform ve Firebase Auth ürün karşılaştırma sayfası
- Identity Platform fiyatlandırma bilgileri
- Identity Platform Kotaları (ve araçsız kullanım)
- Kimlik Platformu sağlayıcıları kurulumu
- Cloud Marketplace ürün sayfası
- Marketplace'teki Identity Platform sayfası
Cloud Resource Manager, Cloud IAM, Firebase Admin SDK'sı
- Resource Manager ürün sayfası
- Resource Manager fiyatlandırma bilgileri
- Resource Manager istemci kitaplığı
- Cloud IAM'ye genel bakış (roller, izin verme politikası vb.)
- Firebase Yönetici SDK'sı (Python)
App Engine Kullanıcıları, App Engine NDB, Cloud NDB, Cloud Datastore
- App Engine Kullanıcılarına genel bakış
- App Engine NDB belgeleri
- App Engine NDB deposu
- Cloud NDB istemci kitaplığı
- Cloud NDB deposu
- Cloud Datastore ürün sayfası
- Cloud Datastore fiyatlandırma bilgileri
Diğer Taşıma Modülü referansları
- Taşıma Modülüne giriş
- Tüm "Sunucusuz Taşıma İstasyonu" kaynaklar
- Python 3'e geçiş belgeleri
- Taşıma Modülü 17 "Paketlenmiş hizmetleri 2. nesil çalışma zamanlarında kullanma" codelab
- 20. Taşıma Modülü "Flask uygulamalarına App Engine Kullanıcıları hizmetini ekleme" codelab
App Engine taşıma
- Python 2 uygulamalarında üçüncü taraf kitaplıkları kullanma
- 2. nesil çalışma zamanlarında
app.yaml
üzerinde yapılan değişiklikler (Python 3) - Cloud NDB taşıma rehberi
- Cloud NDB taşıma içeriği
App Engine platformu
- App Engine belgeleri
- Python 2 App Engine (standart ortam) çalışma zamanı
- Python 2 App Engine'de App Engine yerleşik kitaplıklarını kullanma
- Python 3 App Engine (standart ortam) çalışma zamanı
- Python 2 ile Python 2 arasındaki farklar 3 App Engine (standart ortam) çalışma zamanı
- Python 2'den 3'e App Engine (standart ortam) taşıma kılavuzu
- App Engine fiyatlandırması ve kota bilgileri
- İkinci nesil App Engine platformunun kullanıma sunulması (2018)
- Birinci ve ikinci nesil platformlar
- Eski çalışma zamanları için uzun süreli destek
- Belge taşıma örnekleri
- Topluluğun katkıda bulunduğu taşıma örnekleri
Google Cloud SDK
- Google Cloud SDK'sı
- Google Cloud SDK
gcloud
komut satırı aracı - Google API'lerini etkinleştirme (ve devre dışı bırakma)
- Cloud Console API yöneticisi (API'leri etkinleştirme/devre dışı bırakma)
gcloud
ile Google API'lerini etkinleştirmegcloud
ile Google API'lerini listeleme
Diğer Cloud bilgileri
- Google Cloud'da Python
- Python istemci kitaplıkları belgeleri
- Python istemci kitaplıkları depoları
- "Daima Ücretsiz" katman
- Google Cloud SDK
- Google Cloud SDK
gcloud
komut satırı aracı - Tüm Google Cloud belgeleri
Videolar
- Sunucusuz Taşıma İstasyonu
- Sunucusuz Keşif Seferleri
- Google Cloud Teknolojisi'ne abone olun
- Google Developers'a abone olun
Lisans
Bu çalışma, Creative Commons Attribution 2.0 Genel Amaçlı Lisans ile lisans altına alınmıştır.