1. Genel Bakış
Bu codelab'de, Python'da Secret Manager'ı kullanmaya odaklanacaksınız.
Secret Manager, gizli anahtarları ikili blob'lar veya metin dizeleri olarak depolamanıza, yönetmenize ve bunlara erişmenize olanak tanır. Uygun izinlerle sırrın içeriğini görüntüleyebilirsiniz.
Secret Manager, bir uygulamanın çalışma zamanında ihtiyaç duyduğu veritabanı şifreleri, API anahtarları veya TLS sertifikaları gibi yapılandırma bilgilerini depolamak için uygundur.
Neler öğreneceksiniz?
- Cloud Shell'i kullanma
- Python için Secret Manager istemci kitaplığını yükleme
- Python istemci kitaplığını kullanarak gizli anahtar oluşturma ve gizli anahtarlara erişme
- Python istemci kitaplığını kullanarak Cloud Functions'taki sırlara erişme
Gerekenler
- Google Cloud projesi
- Chrome veya Firefox gibi bir tarayıcı
- Python 3'ü kullanma konusunda bilgi sahibi olma
Anket
Bu eğitimi nasıl kullanacaksınız?
Python ile ilgili deneyiminizi nasıl değerlendirirsiniz?
Google Cloud hizmetlerini kullanma deneyiminizi nasıl değerlendirirsiniz?
2. Kurulum ve Gereksinimler
Yönlendirmesiz ortam kurulumu
- 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.



- 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. Dilediğiniz zaman bunu güncelleyebilirsiniz.
- Proje kimliği, tüm Google Cloud projelerinde benzersiz olmalı 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ğine (genellikle
PROJECT_IDolarak 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ımdan 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.
- 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ırma ücreti alınmaması için kaynakları kapatmak üzere oluşturduğunuz kaynakları veya projenin tamamını silebilirsiniz. Google Cloud'un yeni 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 codelab'de, Cloud'da çalışan bir komut satırı ortamı olan Google Cloud Shell'i kullanacaksınız.
Cloud Shell'i etkinleştirme
- Cloud Console'da Cloud Shell'i etkinleştir 'i
tıklayın.

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

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

Bu sanal makine, ihtiyaç duyduğunuz tüm geliştirme araçlarını içerir. 5 GB boyutunda kalıcı bir ana dizin bulunur ve Google Cloud'da çalışır. Bu sayede ağ performansı ve kimlik doğrulama önemli ölçüde güçlenir. Bu codelab'deki çalışmalarınızın neredeyse tamamını yalnızca bir tarayıcı veya Chromebook'unuzla yapabilirsiniz.
Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin, proje kimliğinize ayarlandığını görürsünüz.
- 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`
- 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. Secret Manager API'yi etkinleştirme
Secret Manager API'yi kullanmaya başlamadan önce API'yi etkinleştirmeniz gerekir. Cloud Shell'i kullanarak API'yi aşağıdaki komutla etkinleştirebilirsiniz:
gcloud services enable secretmanager.googleapis.com
Şuna benzer bir çıkış görürsünüz:
Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.
4. Python için Secret Manager istemci kitaplığını yükleme
Secret Manager İstemci Kitaplığı'nı yükleyin:
pip3 install --user google-cloud-secret-manager==2.10.0
5. Etkileşimli Python'u başlatma
Bu eğitimin bir bölümünde, Cloud Shell'de önceden yüklenmiş olan IPython adlı etkileşimli bir Python yorumlayıcısı kullanacaksınız. Cloud Shell'de ipython komutunu çalıştırarak bir oturum başlatın:
ipython
Aşağıdakine benzer bir tablo görürsünüz:
Python 3.9.2 (default, Feb 28 2021, 17:03:44) Type 'copyright', 'credits' or 'license' for more information IPython 8.3.0 -- An enhanced Interactive Python. Type '?' for help. In [1]:
6. Gizli anahtar oluşturma
Bir gizli anahtar, bir veya daha fazla gizli anahtar sürümü içerir. Bu dosyalar gcloud komut satırı kullanılarak oluşturulabilir ancak Python kullanılarak da oluşturulabilir.
Bir gizli anahtarı kullanmak için önce gizli anahtarın adını kullanarak gizli anahtarı oluşturmanız, ardından gizli anahtarın değeri olan gizli anahtarın bir sürümünü eklemeniz gerekir.
IPython'da proje kimliğinizi ayarlayın:
PROJECT_ID = "<PROJECT_ID>"
Gizli anahtar oluşturma
Aşağıdaki kodu IPython oturumunuza kopyalayın:
from google.cloud import secretmanager
def create_secret(secret_id):
# Create the Secret Manager client.
client = secretmanager.SecretManagerServiceClient()
# Build the resource name of the parent project.
parent = f"projects/{PROJECT_ID}"
# Build a dict of settings for the secret
secret = {'replication': {'automatic': {}}}
# Create the secret
response = client.create_secret(secret_id=secret_id, parent=parent, secret=secret)
# Print the new secret name.
print(f'Created secret: {response.name}')
my_secret_value adlı yeni bir gizli anahtar oluşturmak için işlevi çağırın:
create_secret("my_secret_value")
Aşağıdaki çıkışı göreceksiniz:
Created secret: projects/<PROJECT_NUM>/secrets/my_secret_value
Gizli anahtar sürümü ekleme
Gizli anahtar oluşturulduğuna göre artık bir sürüm oluşturarak buna değer atayabilirsiniz.
Aşağıdaki kodu IPython oturumunuza kopyalayın:
def add_secret_version(secret_id, payload):
# Create the Secret Manager client.
client = secretmanager.SecretManagerServiceClient()
# Build the resource name of the parent secret.
parent = f"projects/{PROJECT_ID}/secrets/{secret_id}"
# Convert the string payload into a bytes. This step can be omitted if you
# pass in bytes instead of a str for the payload argument.
payload = payload.encode('UTF-8')
# Add the secret version.
response = client.add_secret_version(parent=parent, payload={'data': payload})
# Print the new secret version name.
print(f'Added secret version: {response.name}')
Yeni bir gizli anahtar sürümü eklemek için işlevi çağırın:
add_secret_version("my_secret_value", "Hello Secret Manager")
Aşağıdaki çıkışı göreceksiniz:
Added secret version: projects/<PROJECT_NUM>/secrets/my_secret_value/versions/1
Gizli anahtarların birden fazla sürümü olabilir. İşlevi farklı bir değerle tekrar çağırın:
add_secret_version("my_secret_value", "Hello Again, Secret Manager")
Aşağıdaki çıkışı göreceksiniz:
Added secret version: projects/<PROJECT_NUM>/secrets/my_secret_value/versions/2
Yeni gizli anahtar sürümünün orijinalinden çok daha uzun olduğuna dikkat edin. Bu özelliğe daha sonra referans verilecektir.
7. Gizli anahtarlara erişme
Gizli anahtar sürümüne erişildiğinde gizli anahtar içeriğinin yanı sıra gizli anahtar sürümüyle ilgili ek meta veriler de döndürülür. Bir gizli anahtar sürümüne erişirken belirli bir sürümü belirtebilir veya "en son"u belirterek yalnızca en son sürümü isteyebilirsiniz.
Sırlar gizli tutulmalıdır. Veritabanı kimlik bilgilerini gizli anahtar olarak saklayın ve kimlik doğrulamak için kullanın veya sertifikaları saklayıp kullanın. Ancak gizli anahtarlarınızı doğrudan yazdırmayın. Aksi takdirde, gizli tutma amacına ulaşamazsınız.
Sırlarımız üzerinde işlemler yapacak ve doğrudan yazdırmadan değerini değerlendireceksiniz. Bunun yerine, gizli anahtarın değerinin karma değerini yazdırırsınız.
Aşağıdaki kodu IPython oturumunuza kopyalayın:
def access_secret_version(secret_id, version_id="latest"):
# Create the Secret Manager client.
client = secretmanager.SecretManagerServiceClient()
# Build the resource name of the secret version.
name = f"projects/{PROJECT_ID}/secrets/{secret_id}/versions/{version_id}"
# Access the secret version.
response = client.access_secret_version(name=name)
# Return the decoded payload.
return response.payload.data.decode('UTF-8')
import hashlib
def secret_hash(secret_value):
# return the sha224 hash of the secret value
return hashlib.sha224(bytes(secret_value, "utf-8")).hexdigest()
Gizliyi değerinin karması olarak almak için işlevi çağırın:
secret_hash(access_secret_version("my_secret_value"))
Karma değerine benzeyen bir çıkış görmeniz gerekir (tam değer bu çıkışla eşleşmeyebilir):
83f8a4edb555cde4271029354395c9f4b7d79706ffa90c746e021d11
Sürüm belirtmediğiniz için en son değer alındı.
Beklenen sürüm numarasını ekleyen işlevi arayarak onaylayın:
secret_hash(access_secret_version("my_secret_value", version_id=2))
Son komutla aynı çıkışı görmeniz gerekir:
83f8a4edb555cde4271029354395c9f4b7d79706ffa90c746e021d11
İşlevi tekrar çağırın ancak bu kez ilk sürümü belirterek:
secret_hash(access_secret_version("my_secret_value", version_id=1))
Bu sefer farklı bir karma görmeniz gerekir. Bu, farklı bir çıkış olduğunu gösterir:
9a3fc8b809ddc611c82aee950c636c7557e220893560ec2c1eeeb177
8. Secret Manager'ı Cloud Functions ile kullanma
Google Cloud'un birçok bölümünde gizli anahtarlardan yararlanabilirsiniz. Bu bölümde, Google'ın etkinlik odaklı sunucusuz bilgi işlem hizmeti olan Cloud Functions'a odaklanacaksınız.
Cloud Functions'da Python kullanmak istiyorsanız HTTP Google Cloud Functions in Python Codelab'i inceleyebilirsiniz.
exit işlevini çağırarak IPython'ı kapatın:
exit
Cloud Shell'e yönlendirilirsiniz:
yourname@cloudshell:~ (<PROJECT_ID>)$
Cloud Functions API'yi kullanmaya başlamadan önce API'yi etkinleştirmeniz gerekir. Cloud Shell'i kullanarak API'yi aşağıdaki komutla etkinleştirebilirsiniz:
gcloud services enable cloudfunctions.googleapis.com cloudbuild.googleapis.com
İşlevimizi oluşturmak için yeni bir klasör oluşturun ve yazılacak boş dosyalar oluşturun:
mkdir secret-manager-api-demo cd secret-manager-api-demo touch main.py touch requirements.txt
Cloud Shell'in sağ üst tarafındaki kod düzenleyiciyi açın:

secret-manager-api-demo klasöründeki main.py dosyasına gidin. Tüm kodunuzu buraya yerleştireceksiniz.
9. Gizli anahtarlara erişmek için Cloud Function yazma
Gizli değerleri komut satırından veya IPython terminalinden depolayıp almak faydalı olsa da bu gizli bilgilere bir işlev içinde erişebilmek çok daha kullanışlıdır.
Daha önce oluşturduğunuz access_secret_version işlevini Cloud Functions işleviniz için temel olarak kullanabilirsiniz.
Aşağıdaki kodu main.py dosyasına kopyalayın:
main.py
import os
from google.cloud import secretmanager
project_id = os.environ["PROJECT_ID"]
client = secretmanager.SecretManagerServiceClient()
name = f"projects/{project_id}/secrets/my_secret_value/versions/latest"
response = client.access_secret_version(name=name)
my_secret_value = response.payload.data.decode("UTF-8")
def secret_hello(request):
if "Again" in my_secret_value:
return "We meet again!\n"
return "Hello there.\n"
İşlevinizi dağıtmadan önce ortamın kurulumunu tamamlamanız gerekir. Bunun için işlev bağımlılığınızı ayarlamanız gerekir.
requirements.txt adlı yeni bir dosya oluşturun ve google-cloud-secret-manager paketini bu dosyaya ekleyin:
requirements.txt
google-cloud-secret-manager==2.10.0
Artık yalnızca main.py ve requirements.txt içeren bir klasörünüz olmalıdır.
Gizli bilginize erişime izin verme
İşlevinizi dağıtabilmeniz için Cloud Functions'ın gizli anahtarınıza erişmesine izin vermeniz gerekir.
Terminale geri dönün:

Gizli bilgilerinize erişmek için Cloud Functions hizmet hesabına erişim izni verin:
export PROJECT_ID=$(gcloud config get-value core/project)
gcloud secrets add-iam-policy-binding my_secret_value \
--role roles/secretmanager.secretAccessor \
--member serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com
Aşağıdaki çıkışı göreceksiniz:
Updated IAM policy for secret [my_secret_value]. bindings: - members: - serviceAccount:<PROJECT_ID>@appspot.gserviceaccount.com role: roles/secretmanager.secretAccessor etag: BwWiRUt2oB4= version: 1
10. Cloud Functions işlevinizi dağıtma
Önceki bölümlerdeki kurulumunuz göz önüne alındığında, artık Cloud Functions işlevinizi dağıtabilir ve test edebilirsiniz.
Yalnızca oluşturduğunuz iki dosyayı içeren klasörde işlevi dağıtın:
gcloud functions deploy secret_hello \
--runtime python39 \
--set-env-vars PROJECT_ID=${PROJECT_ID} \
--trigger-http \
--allow-unauthenticated
Aşağıdaki çıkışı (kısaltılmış) görmeniz gerekir:
Deploying function (may take a while - up to 2 minutes)...done. ... entryPoint: secret_hello httpsTrigger: url: https://<REGION>-<PROJECT_ID>.cloudfunctions.net/secret_hello ... status: ACTIVE ...
Aşağıdaki komutla işlevinizin URL'sini (httpsTrigger.url meta verileri) alın:
FUNCTION_URL=$(gcloud functions describe secret_hello --format 'value(httpsTrigger.url)')
Şimdi işlevinizi çağırarak işlevin beklenen dönüş değeriyle erişilip erişilemediğini test edin:
curl $FUNCTION_URL
Aşağıdaki çıkışı göreceksiniz:
We meet again!
Bu işlev, gizli dizenin en son sürümüne referans veriyor. Bu sürüm, "Again" dizesini içerecek şekilde ayarlandığı için işlev beklendiği gibi çalışıyor.
11. Tebrikler!
Python kullanarak Secret Manager API'yi nasıl kullanacağınızı öğrendiniz.
Temizleme
Bu eğiticide kullanılan kaynaklar için Google Cloud hesabınızın ücretlendirilmesini istemiyorsanız:
- Cloud Console'da Kaynakları yönetin sayfasına gidin.
- Proje listesinde projenizi seçip Sil'i tıklayın.
- İletişim kutusunda proje kimliğini yazın ve projeyi silmek için Kapat'ı tıklayın.
Daha fazla bilgi
- Secret Manager: https://cloud.google.com/secret-manager/
- Google Cloud'da Python: https://cloud.google.com/python/
- Python için Cloud İstemci Kitaplıkları: https://googlecloudplatform.github.io/google-cloud-python/
Lisans
Bu çalışma, Creative Commons Attribution 2.0 Genel Amaçlı Lisans ile lisans altına alınmıştır.