Kimliği doğrulanmış Cloud Functions işlevlerini nasıl çağıracağınızı öğrenin

1. Giriş

Genel Bakış

Cloud Functions, geliştiricilerin HTTPS kullanılarak tetiklenebilecek veya bir sunucu ya da çalışma zamanı ortamını yönetmeleri gerekmeden CloudEvents'e yanıt verebilecek tek amaçlı bağımsız işlevler oluşturmasını sağlayan 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ği temel alarak erişimi güvenli hale getirme ve ağ tabanlı erişim denetimlerini kullanarak erişimi güvenli hale getirme. Bu codelab, ilk yaklaşıma odaklanmaktadır ve bir İşlevi çağırmak için kimliğe dayalı erişimi güvenli hale getirmeye yönelik 3 senaryoda size yol gösterir:

  1. Yerel geliştirme amacıyla bir İşlev çağırmak için gcloud kimlik jetonunuzu kullanın ve test amaçlı
  2. Üretimdekiyle aynı kimlik bilgilerini kullanmak için yerel olarak geliştirme ve test yaparken bir hizmet hesabının kimliğine bürünün
  3. 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ğrulamasının düzgün şekilde yapılandırıldığını doğrulama
  • gcloud kimliğiniz için jeton sağlayarak yerel geliştirme ortamından kimliği doğrulanmış bir işlev çağırın
  • Hizmet hesabı oluşturma ve bir işlevi çağırmak için bu hesaba uygun rolü verme
  • İşlev çağırmak için uygun rollere sahip yerel geliştirme ortamında bulunan bir hizmetin kimliğine bürünme

2. Kurulum ve Gereksinimler

Ön koşullar

  • Cloud Console'a giriş yaptınız
  • Daha önce HTTP tetiklenmiş 2. nesil bir Cloud Functions işlevi dağıttınız
  • (İsteğe bağlı) 3. senaryo için bu codelab'de örnek olarak Node.js ve npm kullanılır. Ancak isterseniz Google Auth istemci kitaplıkları tarafından desteklenen herhangi bir çalışma zamanını kullanabilirsiniz.

Cloud Shell'i etkinleştirme

  1. Cloud Console'da, Cloud Shell'i etkinleştir 853e55310c205094.png simgesini tıklayın.

55efc1aaa7a4d3ad.png

Cloud Shell'i ilk kez başlatıyorsanız ne olduğunu açıklayan bir ara ekran gösterilir. Ara bir ekran görüntülendiyse Devam'ı tıklayın.

9c92662c6a846a5c.png

Temel hazırlık ve Cloud Shell'e bağlanmak yalnızca birkaç dakika sürer.

9f0e51b578fecce5.png

Gereken tüm geliştirme araçları bu sanal makinede yüklüdür. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud'da çalışarak ağ performansını ve kimlik doğrulamasını büyük ölçüde iyileştirir. Bu codelab'deki çalışmalarınızın tamamı olmasa bile büyük bir kısmı tarayıcıyla yapılabilir.

Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin proje kimliğinize ayarlandığını göreceksiniz.

  1. Kimlik doğrulamanızın tamamlandığını onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud auth list

Komut çıkışı

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. gcloud komutunun projenizi bildiğini onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud config list project

Komut çıkışı

[core]
project = <PROJECT_ID>

Doğru değilse aşağıdaki 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'de, Cloud Functions için Console Hızlı Başlangıç Kılavuzu ile aynı talimatlar geçerlidir. Bunun tek bir istisnası vardır: İşleviniz, kimlik doğrulama gerektirir.

Kimlik doğrulamanın zorunlu kılınması, İşlev çağıran ilkede Cloud Functions Çağırıcısı (ve 2. nesil için Cloud Run Çağırıcısı) rollerinin olması gerektiği anlamına gelir; aksi takdirde, İşlev 403 Yasak hatası döndürür. Bu codelab'de, bir ilkeye uygun Çağırıcı rollerinin nasıl atanacağı açıklanmaktadır.

Kimliği doğrulanmış işlevi oluşturma

Cloud Console'u kullanma adımları şunlardır:

  1. Cloud Functions'a Genel Bakış sayfasına gidip İşlev Oluştur'u tıklayın
  2. Ortam seçeneğinin altından 2. nesil'i seçin.
  3. İşlevini my-authenticated-function olarak adlandırın
  4. Authentication (Kimlik Doğrulama) alanındaki varsayılan değeri require Authentication (Kimlik doğrulaması gerektir) olarak bırakın.

936eee0d5930d12b.png

  1. İleri'yi tıklayın
  2. Bu codelab için dilediğiniz dili seçebilirsiniz
  3. 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 iyileştirmek için birkaç ortam değişkeni oluşturacaksınız.

İşlevinizin bölgesini belirtmeniz gerekir. Bu örnekte us-central1 kullanılmıştır.

REGION="us-central1"

ardından İşlev URL'sini daha sonra kullanmak üzere bir 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)')"

İşlevin, anonim bir çağrıcı olarak çağırmayı deneyerek kimlik doğrulama gerektirdiğini doğrulayın

Beklenen bir 403 hatası aldığınızı doğrulamak için işlevi kimlik doğrulaması 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 İşlevinizi çağırabileceğiniz 3 senaryoyu gözden geçirmeye hazırsınız.

4. 1. Senaryo: gcloud kimlik jetonunuzu kullanma

Bir geliştirici olarak, işlevi yerel olarak geliştirirken işlevinizi test etmek için bir yönteme ihtiyacınız vardır. Bu bölümde, işlevin kimliğinin kendi kimliğiniz kullanılarak doğru şekilde 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ı doğrulayın:

gcloud auth list

Etkin kimliğinizin yanında bir yıldız işareti görmeniz gerekir. Ö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)")

Dokümanlarda, gcloud init ve gcloud authlogin ayarlarını yapma hakkında daha fazla bilgi edinin.

Ardından, işlevi çağırın ve kimlik jetonunuzu iletin.

curl $FUNCTION_URL -H "Authorization: bearer $(gcloud auth print-identity-token)"

Şimdi sonucu göreceksiniz:

Hello World!

Sorun giderme

403 Yasak hatası alırsanız kimliğinizin 2. nesil işlevler için Cloud Functions Çağırıcı rolüne veya Cloud Run Çağırıcı rolüne sahip olduğundan emin olun. Ana hesaba verilen rolleri doğrulamak için IAM konsolunu kullanabilirsiniz.

Kendi kimlik jetonunuzu kullanmak, geliştirme sırasında işlevinizi test etmenin hızlı bir yolu olsa da kimliği doğrulanmış işlevinizi çağıran kişinin uygun rollere ihtiyacı olacaktır. aksi takdirde, arayan kişiye 403 Yasak hatası gösterilir.

İşlevi çağıracak rollere sahip olan kimliklerin ve hizmet hesaplarının sayısını sınırlandırarak en az ayrıcalık ilkesini uygulayabilirsiniz.

Yeni bir hizmet hesabı oluşturup ona gerekli rolleri vermeniz gerekecek.

5. 2. Senaryo: Bir hizmet hesabının kimliğine bürünme

Bu senaryoda, yerel olarak geliştirme ve test yaparken bir işlev çağırmak için bir hizmet hesabının kimliğine bürüneceksiniz (diğer bir deyişle, izinlerini üstleneceksiniz). Bir hizmet hesabının kimliğine bürünerek işlevinizi üretimdeki kimlik bilgileriyle aynı şekilde test edebilirsiniz.

Bu sayede hem rolleri doğrularsınız hem de yalnızca yerel test amacıyla diğer kimliklere Cloud Functions işlevi çağırıcısı rolünü vermek zorunda kalmazsınız. Bu nedenle en az ayrıcalık ilkesini de uygularsınız.

Bu codelab'de yalnızca bu codelab'de oluşturduğunuz işlevi çağıracak rollere sahip yeni bir hizmet hesabı oluşturacaksınız.

Yeni hizmet hesabı oluştur

Öncelikle, gcloud komutlarında kullanılan hizmet hesaplarını temsil edecek 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"

Hizmet hesabına Cloud Functions işlevi çağırıcı rolü de verme

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ğırın

Bunun için yeni oluşturulan hizmet hesabının kimlik jetonunu alarak hesabın kimliğine bürünürsünüz.

Kimliğe bürünme için gerekli rolleri ekleyin

Bir hizmet hesabının kimliğine bürünmek için kullanıcı hesabınızın, hizmet hesabı için kimlik jetonu oluşturabilmesi amacıyla 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 kullanın

Artık hizmet hesabının kimlik jetonunu ileterek İşlevi çağırabilirsiniz.

curl $FUNCTION_URL -H "Authorization: bearer $(gcloud auth print-identity-token --impersonate-service-account $SERVICE_ACCOUNT_ADDRESS)" 

Şunları da göreceksiniz:

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. 3. Senaryo: Google istemci kitaplıklarını kullanma

Codelab'in bu son bölümünde, bir hizmet hesabı için kimlik jetonu oluşturmak üzere yerel olarak küçük bir hizmet çalıştıracak ve ardından Google Auth istemci kitaplıkları ve Uygulama Varsayılan Kimlik Bilgilerini (ADC) kullanarak işlevi programatik olarak çağıracaksınız. Dokümanların istemci kitaplıklarının açıklandığı bölümde Google istemci kitaplıkları hakkında daha fazla bilgi edinebilirsiniz.

ADC'yi kullanmak özellikle İşlevinizi yerel olarak (ör. dizüstü bilgisayarınızda, Cloud Shell'de vb.) yazıp test etmek ve diğer Google Cloud kaynaklarıyla (ör. Cloud Storage, Vision API vb.) etkileşimde bulunmak istediğinizde önemlidir. Bu örnekte, bir hizmetin kimlik doğrulama gerektiren başka bir işlevi çağırmasını nasıl sağlayacağınızı öğrenebilirsiniz. ADC ve yerel geliştirme hakkında daha fazla bilgi edinmek için şu blog yayınına bakın: Cloud Functions işlevlerini yerel olarak geliştirme ve test etme | Google Cloud Blogu

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 yönelik kimlik doğrulama için bir hizmet hesabının kimliğini kullanarak bu hizmetin kimliğine 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'de, yerel olarak Node.js uygulaması oluşturma ve çalıştırma adımları açıklanmaktadır.

Node.js için adımlar şunlardır:

  1. Yeni bir Node.js uygulaması oluşturun
npm init
  1. Google Auth istemci kitaplığını yükleme
npm install google-auth-library
  1. index.js dosyası oluşturun
  2. Cloud Functions işlevinizin URL'sini alın. Bu URL'yi aşağıdaki adımda kodunuza ekleyin.
echo $FUNCTION_URL
  1. Aşağıdaki kodu index.js dosyasına ekleyin. targetAudience değişkenini Cloud Functions işlevi 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;
});
  1. Uygulamayı çalıştırın
node index.js

Bunun ardından, "Hello World!" ifadesini

Sorun giderme

"iam.serviceAccounts.getOpenIdToken" hatasını görüyorsanız kaynakta reddedildi (veya mevcut olmayabilir). Hizmet Hesabı Jetonu Oluşturucu rolünün yayılması için lütfen birkaç dakika bekleyin.

Bu ortamda "Kimlik jetonu alınamıyor" hatasını aldıysanız ve GCE'yi kullanın ya da GOOGLE_APPLICATION_CREDENTIALS ortam değişkenini bir hizmet hesabı kimlik bilgileri JSON dosyasına ayarlayın. Komutu çalıştırmayı unutmuş olabilirsiniz.

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 Functions işlevinizi yerel geliştirici ortamınızda nasıl geliştirip test edeceğinizi öğrenmek için Cloud Functions ile yerel geliştirme hakkındaki bu blog yayınını da öneririz.

İşlediklerimiz

  • Cloud Functions işlevinde kimlik doğrulamayı yapılandırma ve kimlik doğrulamasının düzgün şekilde yapılandırıldığını doğrulama
  • gcloud kimliğiniz için jeton sağlayarak yerel geliştirme ortamından kimliği doğrulanmış bir işlev çağırın
  • Hizmet hesabı oluşturma ve bir işlevi çağırmak için bu hesaba uygun rolü verme
  • İşlev çağırmak için uygun rollere sahip yerel geliştirme ortamında bulunan bir hizmetin kimliğine bürünme

8. Temizleme

Yanlışlıkla yapılan ücretleri önlemek için (örneğin, bu Cloud Functions işlevi yanlışlıkla ücretsiz katmandaki aylık Cloud Functions işlevi çağrı tahsisinizden daha fazla kez çağrıldı) Cloud Functions işlevini silebilir 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/ adresindeki Cloud Functions İşlevi Bulut Konsolu'na gidin. 2. adımda oluşturduğunuz projenin, o anda seçili olan proje olduğundan emin olun.

Daha önce dağıttığınız my-authenticated-function'u seçin. Ardından Sil'e basın.

Projenin tamamını silmeyi tercih ederseniz https://console.cloud.google.com/cloud-resource-manager adresine gidip 2. adımda oluşturduğunuz projeyi, ardından Sil'i seçebilirsiniz. Projeyi silerseniz Cloud SDK'nızdaki projeleri değiştirmeniz gerekir. gcloud projects list komutunu çalıştırarak mevcut tüm projelerin listesini görüntüleyebilirsiniz.