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

1. Giriş

Genel Bakış

Cloud Run işlevleri, bir sunucu veya çalışma zamanı ortamını yönetme gereği duymadan HTTPS kullanılarak tetiklenebilen ya da 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 Run işlevleri hakkında daha fazla bilgiyi blog yayınımızda bulabilirsiniz.

Cloud Run işlevlerine 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 kontrollerini kullanarak erişimi güvenli hale getirme. Bu codelab, ilk yaklaşıma odaklanır ve kimliğe dayalı erişimi güvenli hale getirmek için 3 senaryo üzerinden bir işlevi çağırma adımlarını açıklar:

  1. Yerel geliştirme ve test amacıyla bir işlevi çağırmak için gcloud kimlik jetonunuzu kullanma
  2. Üretimdeki kimlik bilgilerini kullanmak için yerel olarak geliştirme ve test yaparken hizmet hesabının kimliğine bürünme
  3. Google Cloud API'lerinde kimlik doğrulamayı işlemek için Google istemci kitaplıklarını kullanın (ör.bir hizmetin bir işlevi çağırması gerektiğinde).

Neler öğreneceksiniz?

  • Cloud Run 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 Shell'i etkinleştirme

  1. Cloud Console'da Cloud Shell'i etkinleştir 'i d1264ca30785e435.png tıklayın.

84688aa223b1c3a2.png

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.

d95252b003979716.png

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

7833d5e1c5d18f54.png

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.

  1. 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`
  1. 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 Run işlevi oluşturma ve test etme

Kimlik doğrulama gerektirmek, işlevi çağıran asıl kullanıcının Cloud Run Invoker rolüne sahip olması gerektiği anlamına gelir. Aksi takdirde işlev, 403 Forbidden hatası döndürür. Bu codelab'de, bir asıl üyeye uygun Invoker rollerinin nasıl verileceği gösterilmektedir.

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.

REGION=us-central1
PROJECT_ID=$(gcloud config get-value project)

İşlevin kaynak kodunu oluşturma

Bu codelab'de Node.js kullanılsa da Google Auth istemci kitaplıkları tarafından desteklenen herhangi bir çalışma zamanını kullanabilirsiniz.

Öncelikle bir dizin oluşturun ve bu dizine gidin.

mkdir auth-function-codelab && cd $_

Ardından package.json dosyasını oluşturun.

touch package.json

echo '{
  "dependencies": {
    "@google-cloud/functions-framework": "^3.0.0"
  }
}
' > package.json

Ardından, index.js kaynak dosyasını oluşturun.

touch index.js

echo 'const functions = require("@google-cloud/functions-framework");

functions.http("helloWorld", (req, res) => {
 res.send(`Hello ${req.query.name || req.body.name || "World"}!`);
});' > index.js

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

nodejs20 çalışma zamanı için kimliği doğrulanmış bir işlev oluşturma adımları aşağıda verilmiştir. Ancak Google Auth istemci kitaplıkları tarafından desteklenen herhangi bir çalışma zamanını kullanabilirsiniz.

FUNCTION_NAME=authenticated-function-codelab
ENTRY_POINT=helloWorld

Cloud Run işlevini doğrudan Cloud Run'a dağıtmak için aşağıdaki komutu çalıştırın:

gcloud beta run deploy $FUNCTION_NAME \
      --source . \
      --function helloWorld \
      --region $REGION \
      --no-allow-unauthenticated

Ardından, işlev URL'sini daha sonra kullanmak üzere ortam değişkeni olarak kaydedebilirsiniz.

FUNCTION_URL="$(gcloud run services describe $FUNCTION_NAME --region $REGION --format 'value(status.url)')"

Cloud Functions 2. nesil olarak dağıtmayı tercih ederseniz aşağıdaki komutu kullanın:

gcloud functions deploy nodejs-http-function \
  --gen2 \
  --runtime=nodejs20 \
  --region=$REGION \
  --source=. \
  --entry-point=helloWorld \
  --trigger-http \
  --no-allow-unauthenticated

Ardından, işlev URL'sini daha sonra kullanmak üzere ortam değişkeni olarak kaydedebilirsiniz.

FUNCTION_URL="$(gcloud functions describe $FUNCTION_NAME --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 -i $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`

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 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. Bir sonraki senaryoda, yeni bir hizmet hesabı oluşturmayı ve işlevi çağırmak için bu hesaba uygun rolleri vermeyi öğreneceksiniz.

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 Run function Authentication codelab"

Ayrıca hizmet hesabına Cloud Run invoker rolünü verin:

gcloud run services add-iam-policy-binding $FUNCTION_NAME \
  --region=us-central1  \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role='roles/run.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.

Etkin kullanıcı hesabınıza bu rolü vermek için aşağıdaki komutları çalıştırabilirsiniz:

ACCOUNT_EMAIL=$(gcloud auth list --filter=status:ACTIVE --format="value(account)")

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

İzinlerin uygulanması için birkaç dakika bekleyin. 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:

  1. Yeni bir dizin oluşturma
mkdir local-dev && cd $_
  1. Yeni bir Node.js uygulaması oluşturma
npm init -y
  1. Google Auth istemci kitaplığını yükleme
npm install google-auth-library
  1. index.js dosyası oluşturma
  2. Cloud Run işlevinizin URL'sini alın. Bu URL'yi sonraki adımda kodunuza ekleyeceksiniz.
echo $FUNCTION_URL
  1. Aşağıdaki kodu index.js dosyasına ekleyin. targetAudience değişkenini Cloud Run işlevinizin URL'siyle değiştirdiğinizden emin olun.

index.js

// Cloud Functions uses your function's url as the `targetAudience` value

const targetAudience = '<YOUR-CLOUD-RUN-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ı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 Run işlevlerinin güvenliğini sağlama ile ilgili dokümanları incelemenizi öneririz.

Cloud Run işlevinizi yerel geliştirme ortamınızda nasıl geliştireceğinizi ve test edeceğinizi öğrenmek için Cloud Run işlevleriyle yerel geliştirme başlıklı blog yayınını da incelemenizi öneririz.

İşlediğimiz konular

  • Cloud Run 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 Run 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 Run işlevini silmek için https://console.cloud.google.com/functions/ adresinden Cloud Run işlevi 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.