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 tetiklenebilecek ya da CloudEvents'e yanıt verebilecek 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şlevlerinin çağrılarını kontrol etmenin iki ana yolu vardır: kimliğe dayalı erişim güvenliği ve ağ tabanlı erişim denetimlerini kullanarak erişim güvenliği. Bu kod laboratuvarı ilk yaklaşıma odaklanır ve bir işlevi çağırmak için kimliğe dayalı erişimi güvence altına almayla ilgili 3 senaryoda size yol gösterir:

  1. Yerel geliştirme ve test amacıyla bir işlevi çağırmak için gcloud kimlik jetonunuzu kullanma
  2. Üretimdekiyle aynı kimlik bilgilerini kullanmak için yerel olarak geliştirip test ederken bir hizmet hesabının kimliğine bürünme
  3. Google Cloud API'lerinde kimlik doğrulamasını yönetmek için Google istemci kitaplıklarını kullanın (ör. bir hizmetin işlev ç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ğ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 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 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 Cloud Shell'in ne olduğunu açıklayan bir ara ekran gösterilir. Ara ekran gösterildiyse Devam'ı tıklayın.

d95252b003979716.png

Cloud Shell'e bağlanmak ve ortam oluşturmak yalnızca birkaç dakikanızı alır.

7833d5e1c5d18f54.png

Bu sanal makine, ihtiyaç duyulan tüm geliştirme araçlarını içerir. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud'da çalışır. Bu sayede ağ performansını ve kimlik doğrulamayı büyük ölçüde iyileştirir. Bu kod laboratuvarındaki çalışmanızın tamamı olmasa da büyük bir kısmı tarayıcıda yapılabilir.

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ğinizi doğrulamak 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 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>

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

Kimlik doğrulamanın zorunlu kılınması, işlevi çağıran kullanıcının Cloud Run Çağırıcısı rolüne sahip olması gerektiği anlamına gelir. Aksi takdirde işlev 403 Yasak hatası döndürür. Bu kod laboratuvarında, bir ilkeye uygun Invoker rollerinin nasıl verileceği gösterilmektedir.

Basitleştirilmiş gcloud komutları için yerel ortam değişkenleri 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.

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

İşlev için kaynak kodunu oluşturma

Bu kod laboratuvarında Node.js kullanılsa da Google Auth istemci kitaplıkları tarafından desteklenen herhangi bir çalışma zamanı kullanabilirsiniz.

Önce bir dizin oluşturun ve bu dizin için cd'yi kullanın.

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

Kimlik doğrulaması yapılmış işlevi oluşturma

Nodejs20 çalışma zamanı için kimliği doğrulanmış işlev oluşturma adımlarını aşağıda bulabilirsiniz. Ancak Google Auth istemci kitaplıkları tarafından desteklenen tüm çalışma zamanlarını kullanabilirsiniz.

FUNCTION_NAME=authenticated-function-codelab
ENTRY_POINT=helloWorld

Bir 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 bir ortam değişkeni olarak kaydedebilirsiniz.

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

2. nesil Cloud Functions olarak dağıtmayı tercih ediyorsanız 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 bir 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ğrulama

Beklenen 403 hatasını aldığınızı doğrulamak için işlevi kimlik doğrulaması olmadan çağırırsı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ğrulaması sağlayarak işlevinizi çağırabileceğiniz 3 senaryoyu incelemeye hazırsınız.

4. Senaryo 1: gcloud kimlik jetonunuzu kullanma

Geliştirici olarak işlevinizi yerel olarak geliştirirken test etme yöntemine ihtiyacınız vardır. Bu bölümde, işlevin kendi kimliğinizi kullanarak kimliğini doğruladığını doğrulamak için hızlı bir test gerçekleştireceksiniz.

Aşağıdaki komutu çalıştırarak gcloud kullanarak kimliğinizi 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`

gcloud init ve gcloud auth login ayarlarıyla ilgili 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)"

Şimdi sonucu göreceksiniz:

Hello World!

Sorun giderme

403 Yasaklandı hatası alırsanız kimliğinizin Cloud Run Invoker rolüne sahip olduğundan emin olun. Ana hesaba verilen rolleri doğrulamak için IAM konsolunu kullanabilirsiniz.

Kendi kimlik jetonunuzu kullanmak, işlevinizi geliştirme sırasında test etmenin hızlı bir yolu olsa da kimliği doğrulanmış işlevinizi çağıran kullanıcının uygun rollere sahip olması gerekir. Aksi takdirde, kullanıcı 403 Yasak hatası alır.

İşlevi çağıracak rollere sahip kimliklerin ve hizmet hesaplarının sayısını sınırlayarak en az ayrıcalık ilkesini uygulamanız gerekir. Sonraki senaryoda, yeni bir hizmet hesabı oluşturmayı ve bu hesaba işlevi çağırması için uygun rolleri atamayı öğreneceksiniz.

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

Bu senaryoda, yerel olarak geliştirip test ederken bir işlevi çağırmak için bir hizmet hesabının kimliğine bürünür (yani bu hesabın izinlerini alırsınız). 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 Function Invoker rolünü yalnızca yerel test amacıyla diğer kimliklere vermek zorunda kalmayarak en az ayrıcalık ilkesini de uygularsınız.

Bu codelab'in amaçları doğrultusunda, yalnızca bu codelab'de oluşturduğunuz işlevi çağırmaya yönelik 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 Run function Authentication codelab"

Ardından, hizmet hesabına Cloud Run çağırıcı 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 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.

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ğıdakileri 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

Kod laboratuvarının 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 Kimlik Doğrulama istemci kitaplıklarını ve Uygulama Varsayılan Kimlik Bilgileri'ni (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 nasıl çağıracağını göreceksiniz. ADC ve yerel geliştirme hakkında daha fazla bilgi için Cloud Functions'ı yerel olarak geliştirme ve test etme | Google Cloud Blog 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, kimlik bilgilerini uygulama ortamına göre otomatik olarak bulur ve Google Cloud API'lerinde kimlik doğrulaması yapmak için bu kimlik bilgilerini kullanır. –impersonate-service-account işaretçisi, Google Cloud API'lerine karşı kimlik doğrulaması yapmak için kimliğini kullanarak bir hizmet hesabının 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ında, yükleyebileceğiniz kendi Google Kimlik İstemcisi kitaplığı bulunur. Bu codelab'de, yerel olarak Node.js uygulaması oluşturma ve çalıştırma işlemi açıklanmaktadır.

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

  1. Yeni dizin oluşturun
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. Aşağıdaki adımda kodunuza ekleyeceğiniz Cloud Run işlevinizin URL'sini alın.
echo $FUNCTION_URL
  1. Aşağıdaki kodu index.js dosyasına ekleyin. targetAudience değişkenini Cloud Run işlev URL'niz olarak 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ırın
node index.js

Sonuç olarak "Hello World!" ifadesini göreceksiniz.

Sorun giderme

Kaynakta "iam.serviceAccounts.getOpenIdToken" izninin reddedildiğini (veya mevcut olmadığını) bir hata mesajıyla karşılaşırsanız 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ı aldıysanız GCE'yi kullanın veya 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!

Codelab'i tamamladığınız için tebrikler.

Cloud Run işlevlerinin güvenliğini sağlama ile ilgili dokümanları incelemenizi öneririz.

Ayrıca, Cloud Run işlevinizi yerel geliştirici ortamınızda nasıl geliştireceğinizi ve test edeceğinizi öğrenmek için Cloud Run işlevleriyle yerel geliştirme konulu bu blog yayınını da incelemenizi öneririz.

Ele aldığımız 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ğ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 uygun rolü verme
  • Yerel bir geliştirme ortamından, işlev çağırmaya uygun rollere sahip bir hizmetin kimliğine bürünme

8. Temizleme

Yanlışlıkla yapılan ödemeleri önlemek için (örneğin, bu Cloud Function yanlışlıkla ücretsiz katmandaki aylık Cloud Run işlev çağrısı tahsisatınızdan daha fazla sayıda çağrılırsa) Cloud Function'ı 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/ sayfasında Cloud Run işlevi olan Cloud Console'a 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'i tıklayın.

Projenin tamamını silmeyi seçerseniz https://console.cloud.google.com/cloud-resource-manager adresine gidip 2. adımda oluşturduğunuz projeyi seçin ve Sil'i tıklayın. 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.