1. Giriş
Genel Bakış
Cloud Functions, bir sunucu veya çalışma zamanı ortamını yönetme gereği duymadan HTTPS kullanılarak tetiklenebilen veya CloudEvents'e yanıt veren tek amaçlı bağımsız işlevler oluşturmak için geliştiriciler tarafından kullanılabilecek hafif bir bilgi işlem çözümüdür.
Cloud Functions'a yapılan çağrıları kontrol etmek için iki temel yaklaşım vardır: Kimliğe dayalı erişimi güvenli hale getirme ve ağ tabanlı erişim denetimlerini kullanarak erişimi güvenli hale getirme. Bu codelab, birinci yaklaşıma odaklanır ve kimliğe dayalı erişimi güvenli hale getirmek için 3 senaryo üzerinden Function'ı çağırma adımlarını açıklar:
- Yerel geliştirme ve test amacıyla bir işlevi çağırmak için gcloud kimlik jetonunuzu kullanma
- Üretimdeki kimlik bilgilerini kullanmak için yerel olarak geliştirme ve test yaparken hizmet hesabının kimliğine bürünme
- Google Cloud API'lerinde kimlik doğrulamayı işlemek için Google istemci kitaplıklarını kullanın (ör.bir hizmetin bir İşlevi çağırması gerektiğinde).
Neler öğreneceksiniz?
- Cloud Functions işlevinde kimlik doğrulamayı yapılandırma ve kimlik doğrulamanın düzgün şekilde yapılandırıldığını doğrulama
- gcloud kimliğinizin jetonunu sağlayarak yerel bir geliştirme ortamından kimliği doğrulanmış bir işlevi çağırma
- Hizmet hesabı oluşturma ve işlevi çağırmak için uygun rolü verme
- Bir işlevi çağırmak için uygun rollere sahip yerel bir geliştirme ortamından bir hizmetin kimliğine bürünme
2. Kurulum ve Gereksinimler
Ön koşullar
- Cloud Console'a giriş yapmış olmanız gerekir.
- Daha önce HTTP tetiklemeli 2. nesil bir Cloud Functions işlevi dağıtmış olmanız gerekir.
- (isteğe bağlı) Bu codelab, 3. senaryo için örnek olarak Node.js ve npm'yi kullanır ancak Google Auth istemci kitaplıkları tarafından desteklenen herhangi bir çalışma zamanını kullanabilirsiniz.
Cloud Shell'i etkinleştirme
- Cloud Console'da Cloud Shell'i etkinleştir 'i
tıklayın.

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.

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

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.
- 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. Kimliği doğrulanmış bir Cloud Functions işlevi oluşturma ve test etme
Bu codelab, Cloud Functions için Konsol Hızlı Başlangıç Kılavuzu ile aynı talimatları izler. Ancak önemli bir fark vardır: İşlevinizin kimlik doğrulaması gerekecektir.
Kimlik doğrulama gerektirmek, işlevi çağıran asıl kullanıcının Cloud Functions Invoker (ve 2. nesil için Cloud Run Invoker) rollerine sahip olması gerektiği anlamına gelir. Aksi takdirde, işlev 403 Yasak hatası döndürür. Bu codelab'de, bir asıl üyeye uygun Invoker rollerinin nasıl verileceği gösterilmektedir.
Kimliği doğrulanmış işlevi oluşturma
Cloud Console'u kullanmayla ilgili adımları aşağıda bulabilirsiniz:
- Cloud Functions Overview (Cloud Functions'a Genel Bakış) sayfasına gidip İşlev Oluştur'u tıklayın.
- Ortam seçeneği altında 2. nesil'i seçin.
- İşlevi my-authenticated-function olarak adlandırın.
- Kimlik doğrulama alanında varsayılan değeri Kimlik doğrulama gerektir olarak bırakın.

- İleri'yi tıklayın.
- Bu codelab için istediğiniz dili seçebilirsiniz.
- Ardından Dağıt'ı tıklayın.
İşlevinizin dağıtılması yaklaşık 1 dakika sürer.
Basitleştirilmiş gcloud komutları için yerel ortam değişkenlerini ayarlama
Öncelikle, bu codelab'de kullanılan gcloud komutlarının okunabilirliğini artırmak için birkaç ortam değişkeni oluşturacaksınız.
İşlevinizin bölgesini belirtmeniz gerekir. Bu örnekte us-central1 kullanılmaktadır.
REGION="us-central1"
Ardından, işlev URL'sini daha sonra kullanmak üzere ortam değişkeni olarak kaydedebilirsiniz.
PROJECT_ID=$(gcloud config get-value project) FUNCTION_URL="$(gcloud functions describe my-authenticated-function --gen2 --region us-central1 --format='get(serviceConfig.uri)')"
Anonim bir arayan olarak çağırmayı deneyerek işlevin kimlik doğrulama gerektirdiğini doğrulayın.
Beklenen 403 hatasını aldığınızı doğrulamak için işlevi kimlik doğrulama olmadan çağıracaksınız.
Bir komut satırından aşağıdaki curl komutunu çalıştırın:
curl $FUNCTION_URL
Aşağıdaki sonucu görürsünüz:
<html><head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <title>403 Forbidden</title> </head> <body text=#000000 bgcolor=#ffffff> <h1>Error: Forbidden</h1> <h2>Your client does not have permission to get URL <code>/</code> from this server.</h2> <h2></h2> </body></html>
Artık kimlik doğrulama sağlayarak işlevinizi çağırabileceğiniz 3 senaryoyu incelemeye hazırsınız.
4. 1. senaryo: gcloud kimlik jetonunuzu kullanma
Geliştirici olarak, işlevinizi yerel olarak geliştirirken test etmek istersiniz. Bu bölümde, işlevin kendi kimliğiniz kullanılarak düzgün şekilde kimliğinin doğrulandığını doğrulamak için hızlı bir test yapacaksınız.
Aşağıdaki komutu çalıştırarak gcloud ile kimliğinizin doğrulandığını onaylayın:
gcloud auth list
Etkin kimliğinizin yanında yıldız işareti görünür. Örneğin:
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
Doğru kimliği kullandığınızı doğruladıktan sonra hesap e-postasını bir ortam değişkenine kaydedersiniz.
ACCOUNT_EMAIL=$(gcloud auth list --filter=status:ACTIVE --format="value(account)")
gcloud init'i ayarlama ve gcloud auth login hakkında daha fazla bilgiyi dokümanlarda bulabilirsiniz.
Ardından, işlevi çağırın ve kimlik jetonunuzu iletin.
curl $FUNCTION_URL -H "Authorization: bearer $(gcloud auth print-identity-token)"
Sonucu göreceksiniz:
Hello World!
Sorun giderme
403 Forbidden hatası alırsanız kimliğinizin Cloud Functions Invoker rolüne veya 2. nesil işlevler için Cloud Run Invoker rolüne sahip olduğundan emin olun. Bir ana hesaba verilen rolleri doğrulamak için IAM konsolunu kullanabilirsiniz.
Geliştirme sırasında işlevinizi test etmek için kendi kimlik jetonunuzu kullanmak hızlı bir yöntem olsa da kimliği doğrulanmış işlevinizin arayanının uygun rollere sahip olması gerekir. Aksi takdirde, arayan 403 Forbidden hatası alır.
İşlevi çağırma rolleri olan kimliklerin ve hizmet hesaplarının sayısını sınırlayarak en az ayrıcalık ilkesine uymanız gerekir.
Yeni bir hizmet hesabı oluşturup gerekli rolleri verme.
5. 2. senaryo: Bir hizmet hesabının kimliğine bürünme
Bu senaryoda, yerel olarak geliştirme ve test etme sırasında bir işlevi çağırmak için bir hizmet hesabının kimliğine bürünürsünüz (yani izinlerini üstlenirsiniz). Bir hizmet hesabının kimliğine bürünerek işlevinizi üretimdekiyle aynı kimlik bilgileriyle test edebilirsiniz.
Bunu yaparak yalnızca rolleri doğrulamakla kalmaz, aynı zamanda Cloud Functions Invoker rolünü yalnızca yerel test amacıyla diğer kimliklere vermeniz gerekmediğinden en az ayrıcalık ilkesine de uymuş olursunuz.
Bu codelab'de, yalnızca bu codelab'de oluşturduğunuz işlevi çağırma rollerine sahip yeni bir hizmet hesabı oluşturacaksınız.
Yeni hizmet hesabı oluştur
Öncelikle, gcloud komutlarında kullanılan hizmet hesaplarını temsil etmek için birkaç ek ortam değişkeni oluşturacaksınız.
SERVICE_ACCOUNT_NAME="invoke-functions-codelab" SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com
Ardından hizmet hesabını oluşturun.
gcloud iam service-accounts create $SERVICE_ACCOUNT_NAME \ --display-name="Cloud Function Authentication codelab"
Ayrıca hizmet hesabına Cloud Functions Invoker rolünü verin.
gcloud functions add-iam-policy-binding my-authenticated-function \ --region=us-central1 --gen2 \ --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \ --role='roles/cloudfunctions.invoker'
Hizmet hesabının kimliğine bürünerek işlevi çağırma
Bunun için, kimlik jetonunu alarak yeni oluşturulan hizmet hesabının kimliğine bürünürsünüz.
Kimliğe bürünme için gerekli rolleri ekleme
Bir hizmet hesabına bürünmek için kullanıcı hesabınızın, hizmet hesabı için kimlik jetonu oluşturmak üzere Hizmet Hesabı Jetonu Oluşturucu (roles/iam.serviceAccountTokenCreator) rolüne sahip olması gerekir.
gcloud iam service-accounts add-iam-policy-binding $SERVICE_ACCOUNT_ADDRESS \ --member user:$ACCOUNT_EMAIL \ --role='roles/iam.serviceAccountTokenCreator'
Hizmet hesabının kimlik jetonunu kullanma
Artık hizmet hesabının kimlik jetonunu ileterek işlevi çağırabilirsiniz.
curl $FUNCTION_URL -H "Authorization: bearer $(gcloud auth print-identity-token --impersonate-service-account $SERVICE_ACCOUNT_ADDRESS)"
Aşağıdaki bilgileri görürsünüz:
WARNING: This command is using service account impersonation. All API calls will be executed as [invoke-functions-codelab@<project-id>.iam.gserviceaccount.com]. Hello World!
6. Senaryo 3: Google istemci kitaplıklarını kullanma
Bu kod laboratuvarının son bölümünde, hizmet hesabı için kimlik jetonu oluşturmak üzere küçük bir hizmeti yerel olarak çalıştıracak, ardından Google Auth istemci kitaplıklarını ve Uygulama Varsayılan Kimlik Bilgilerini (ADC) kullanarak işlevi programatik olarak çağıracaksınız. Google istemci kitaplıkları hakkında daha fazla bilgiyi dokümanların istemci kitaplıkları açıklaması bölümünde bulabilirsiniz.
ADC'yi kullanmak, özellikle diğer Google Cloud kaynaklarıyla (ör. Cloud Storage, Vision API vb.) etkileşimde bulunurken işlevinizi yerel olarak (ör. dizüstü bilgisayarınızda, Cloud Shell'de vb.) yazıp test etmek istediğinizde önemlidir. Bu örnekte, bir hizmetin kimlik doğrulama gerektiren başka bir işlevi nasıl çağırdığını göreceksiniz. ADC ve yerel geliştirme hakkında daha fazla bilgi için How to develop and test your Cloud Functions locally | Google Cloud Blog (Cloud Functions'larınızı yerel olarak geliştirme ve test etme | Google Cloud Blogu) başlıklı blog yayınını inceleyin.
Bir hizmet hesabının kimliğine bürünmek için gcloud komutunu çalıştırma
ADC, uygulama ortamına göre kimlik bilgilerini otomatik olarak bulur ve Google Cloud API'lerinde kimlik doğrulaması yapmak için bu kimlik bilgilerini kullanır. –impersonate-service-account işareti, Google Cloud API'lerine karşı kimlik doğrulama için kimliğini kullanarak bir hizmet hesabına bürünmenize olanak tanır.
Bir hizmet hesabının kimliğine bürünmek için aşağıdaki komutu çalıştırabilirsiniz:
gcloud auth application-default login --impersonate-service-account=$SERVICE_ACCOUNT_ADDRESS
Artık gcloud komutlarını kimliğiniz yerine bu hizmet hesabı olarak çalıştırıyorsunuz.
Kimliği doğrulanmış bir işlevi çağırmak için hizmet oluşturma ve çalıştırma
Her çalışma zamanının, yükleyebileceğiniz kendi Google Auth istemci kitaplığı vardır. Bu codelab, yerel olarak Node.js uygulaması oluşturma ve çalıştırma konusunda size yol gösterir.
Node.js için adımlar şunlardır:
- Yeni bir Node.js uygulaması oluşturma
npm init
- Google Auth istemci kitaplığını yükleme
npm install google-auth-library
index.jsdosyası oluşturma- Cloud Functions işlevinizin URL'sini alın. Bu URL'yi bir sonraki adımda kodunuza ekleyeceksiniz.
echo $FUNCTION_URL
- Aşağıdaki kodu index.js dosyasına ekleyin. targetAudience değişkenini Cloud Functions URL'nizle değiştirdiğinizden emin olun.
index.js
// Cloud Functions uses your function's url as the `targetAudience` value
const targetAudience = '<YOUR-CLOUD-FUNCTION-URL>';
// For Cloud Functions, endpoint(`url`) and `targetAudience` should be equal
const url = targetAudience;
const { GoogleAuth } = require('google-auth-library');
const auth = new GoogleAuth();
async function request() {
console.info(`request ${url} with target audience ${targetAudience}`);
// this call retrieves the ID token for the impersonated service account
const client = await auth.getIdTokenClient(targetAudience);
const res = await client.request({ url });
console.info(res.data);
}
request().catch(err => {
console.error(err.message);
process.exitCode = 1;
});
- Uygulamayı çalıştırma
node index.js
Sonuç olarak "Hello World!"
Sorun giderme
Kaynakta "iam.serviceAccounts.getOpenIdToken" izni reddedildi (veya mevcut olmayabilir) hatasını görürseniz lütfen Hizmet Hesabı Jetonu Oluşturucu rolünün yayılması için birkaç dakika bekleyin.
Bu ortamda kimlik jetonu alınamıyor hatası aldıysanız GCE'yi kullanın veya GOOGLE_APPLICATION_CREDENTIALS ortam değişkenini bir hizmet hesabı kimlik bilgileri JSON dosyası olarak ayarlayın. Bu durumda,
gcloud auth application-default login --impersonate-service-account=$SERVICE_ACCOUNT_ADDRESS
7. Tebrikler!
Tebrikler, codelab'i tamamladınız.
Cloud Functions'ın güvenliğini sağlama ile ilgili dokümanları incelemenizi öneririz.
Cloud Function'ınızı yerel geliştirme ortamınızda nasıl geliştireceğinizi ve test edeceğinizi öğrenmek için Cloud Functions ile yerel geliştirme başlıklı blog yayınını da incelemenizi öneririz.
İşlediğimiz konular
- Cloud Functions işlevinde kimlik doğrulamayı yapılandırma ve kimlik doğrulamanın düzgün şekilde yapılandırıldığını doğrulama
- gcloud kimliğinizin jetonunu sağlayarak yerel bir geliştirme ortamından kimliği doğrulanmış bir işlevi çağırma
- Hizmet hesabı oluşturma ve işlevi çağırmak için uygun rolü verme
- Bir işlevi çağırmak için uygun rollere sahip yerel bir geliştirme ortamından bir hizmetin kimliğine bürünme
8. Temizleme
Yanlışlıkla ücretlendirilmemek için (örneğin, bu Cloud Functions işlevi ücretsiz katmandaki aylık Cloud Functions işlevi çağırma tahsisinizden daha fazla sayıda çağrılırsa) Cloud Functions işlevini veya 2. adımda oluşturduğunuz projeyi silebilirsiniz.
Hizmet hesabının kimliğine bürünmeyi durdurmak için kimliğinizi kullanarak yeniden giriş yapabilirsiniz:
gcloud auth application-default login
Cloud Functions işlevini silmek için https://console.cloud.google.com/functions/ adresinden Cloud Functions Cloud Console'a gidin. 2. adımda oluşturduğunuz projenin şu anda seçili proje olduğundan emin olun.
Daha önce dağıttığınız my-authenticated-function işlevini seçin. Ardından Sil'e basın.
Projenin tamamını silmeyi tercih ederseniz https://console.cloud.google.com/cloud-resource-manager adresine gidebilir, 2. adımda oluşturduğunuz projeyi seçip Sil'i tıklayabilirsiniz. Projeyi silerseniz Cloud SDK'nızda projeleri değiştirmeniz gerekir. gcloud projects list komutunu çalıştırarak kullanılabilir tüm projelerin listesini görüntüleyebilirsiniz.