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şlevlerine 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 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:
- Yerel geliştirme ve test amacıyla bir işlevi çağırmak için gcloud kimlik jetonunuzu kullanma
- Ü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
- 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ğinizin jetonunu sağlayarak yerel bir geliştirme ortamından kimliği doğrulanmış bir işlevi çağırma
- 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 Console'a giriş yaptınız
- Daha önce HTTP tetiklenmiş bir Cloud Run işlevini dağıttınız. Hızlı başlangıç örneğine bakın.
- (isteğe bağlı) Bu codelab'in 3. senaryosu için örnek olarak Node.js ve npm kullanılmıştır ancak Google Auth istemci kitaplıkları tarafından desteklenen herhangi bir çalışma zamanı 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 bir ekran görüntülendiyse Devam'ı tıklayın.
Cloud Shell'e bağlanmak ve ortam oluşturmak yalnızca birkaç dakikanızı alır.
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.
- 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`
- 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>
Aksi takdirde 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)
İşlevin 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ış bir işlev oluşturma adımları aşağıda verilmiştir. 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 bir 403 hatası aldığınızı doğrulamak için işlevi kimlik doğrulaması olmadan çağıracaksınız.
Komut satırında 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. 1. Senaryo: 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örürsünüz. Ö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)"
Ardından sonucu görürsünüz:
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, 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, çağrıyı yapan kişi bir 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ş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 ü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 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"
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, 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 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şturmak üzere Hizmet Hesabı Jeton 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)"
Ş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. 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. Google istemci kitaplıkları hakkında daha fazla bilgi edinmek için dokümanların istemci kitaplıkları açıklanıyor bölümünden yararlanabilirsiniz.
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şareti, Google Cloud API'lerine yönelik kimlik doğrulama için bir hizmet hesabının kimliğini kullanarak bu hesabı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ıyor olabilirsiniz.
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:
- Yeni dizin oluşturma
mkdir local-dev && cd $_
- Yeni bir Node.js uygulaması oluşturun
npm init -y
- Google Auth istemci kitaplığını yükleme
npm install google-auth-library
index.js
dosyası oluşturma- Cloud Run işlevinizin URL'sini alın. Bu URL'yi aşağıdaki adımda kodunuza ekleyin.
echo $FUNCTION_URL
- Aşağıdaki kodu index.js dosyasına ekleyin. targetAudience değişkenini Cloud Run işlev 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-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;
});
- Uygulamayı çalıştırın
node index.js
Sonuç olarak "Hello World!" ifadesini göreceksiniz.
Sorun giderme
"iam.serviceAccounts.getOpenIdToken" izni kaynakta reddedildi (veya mevcut olmayabilir) hatası görüyorsanız lütfen hizmet hesabı jetonu oluşturucu rolünün dağıtılması için 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!
Codelab'i tamamladığınız için tebrikler.
Cloud Run işlevlerinin güvenliğini sağlama ile ilgili dokümanları incelemenizi öneririz.
Cloud Run işlevinizi yerel geliştirici ortamınızda nasıl geliştirip test edeceğinizi öğrenmek için Cloud Run işlevleriyle yerel geliştirme hakkındaki bu blog yayınını da ö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ğinizin jetonunu sağlayarak yerel bir geliştirme ortamından kimliği doğrulanmış bir işlevi çağırma
- 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
8. Temizleme
Yanlışlıkla yapılan ücretlerin önüne geçmek için (örneğin, bu Cloud Functions işlevi yanlışlıkla ücretsiz katmandaki aylık Cloud Run işlevi çağırma hakkınızdan 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 Run işlevini silmek için https://console.cloud.google.com/functions/ adresindeki Cloud Run işlevi Cloud Console'a gidin. 2. adımda oluşturduğunuz projenin şu anda seçili olduğundan emin olun.
Daha önce dağıttığınız my-authenticated-function işlevini 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.