1. Genel Bakış
Google Cloud Functions, etkinlik odaklı bir sunucusuz işlem platformudur. Cloud Functions, kaynak sağlama veya değişen gereksinimleri karşılamak için ölçeklendirme konusunda endişelenmeden kodunuzu yazmanıza olanak tanır.
JavaScript'te yazılan Cloud Functions işlevleri, Google Cloud Platform'daki Node.js ortamında yürütülür. Taşınabilirlik ve yerel test için Cloud Functions işlevinizi herhangi bir standart Node.js çalışma zamanı ortamında çalıştırabilirsiniz.
Adım adım açıklamalı kılavuz
Bu codelab'de, belirtilen bir sıcaklığın kabul edilebilir olup olmadığını veya çok sıcak olup olmadığını bildiren bir Node.js Cloud Function oluşturacaksınız. Cloud Functions işlevinizi yerel makinenizde Visual Studio Code kullanarak oluşturacak, test edecek ve hatalarını ayıklayacaksınız. Son olarak, işlevinizi Google Cloud Platform'a dağıtacaksınız.
Neler öğreneceksiniz?
- Node.js için Functions Framework
- Yerel olarak bir HTTP Cloud Functions işlevi oluşturun ve test edin.
- Yerel makinenizden bir HTTP işlevinde hata ayıklama
- Yerel makinenizden bir HTTP işlevi dağıtın.
2. Kurulum ve Gereksinimler
Ön koşullar
- Google Cloud SDK
- Visual Studio Code
- Node.js 8.6.0 veya daha yeni bir sürüm (Node.js'yi yüklemek için nvm'yi kullanın, sürümünüzü kontrol etmek için node –version komutunu çalıştırın)
- İlk İşlevim: Node.js kılavuzunu tamamlama
Maliyet
Bu codelab'de dağıtılan bir Cloud Functions işlevinin yalnızca 1 kez çağrılması gerekse de faturalandırmanın nasıl çalıştığını anlamak için Cloud Functions API fiyatlandırma bilgilerine başvurmanız gerekir.
Birçok Google API'si ücretsiz olarak kullanılabilirken Google Cloud Platform'un (ürünleri ve API'leri) kullanımı ücretsiz değildir. Cloud Functions'ı kullanmak için etkin bir faturalandırma hesabınızın olması gerekir. Belirli Google Cloud Platform (GCP) ürünlerinde, faturalandırma için aşmanız gereken bir "Daima Ücretsiz" katmanı bulunduğunu unutmayın. Bu codelab'de, her Cloud Functions çağrısı ücretsiz katman kapsamında sayılır. Toplamda (her ay içinde) sınırları aşmadığınız sürece herhangi bir ücret alınmaz.
3. Node.js için Functions Framework'ü yükleyin
Node.js için Functions Framework, Google Cloud Functions ekibi tarafından sunulan, taşınabilir Node.js işlevleri yazmaya yönelik açık kaynaklı bir FaaS (hizmet olarak işlev) çerçevesidir.
Functions Framework, aşağıdakiler de dahil olmak üzere birçok farklı ortamda çalışan basit işlevler yazmanıza olanak tanır:
- Google Cloud Functions
- Yerel geliştirme makineniz
- Cloud Run ve GKE'de Cloud Run
- Knative tabanlı ortamlar
Yeni bir Node.js uygulaması oluşturun.
npm init
Varsayılanları kabul ederken uygulamanızın giriş noktası olarak index.js'ı kullandığınızdan emin olun.
Şimdi Node.js için Functions Framework'ü yükleyin.
npm install @google-cloud/functions-framework
package.json dosyanızı açın. Aşağıdaki örnekte gösterildiği gibi, işlevler çerçevesinin bağımlılık olarak listelendiğini doğrulayın.
"dependencies": {
"@google-cloud/functions-framework": "^1.7.1"
}
Functions Framework başarıyla yüklendi. Artık Cloud Functions işlevinizi oluşturmaya hazırsınız.
4. HTTP Cloud Functions işlevini yerel olarak oluşturma ve test etme
Yerel bir Cloud Functions işlevi oluşturma
Bu bölümde, HTTP isteklerine yanıt veren bir HTTP işlevi oluşturup test edeceksiniz.
package.json dosyanızla aynı dizinde index.js adlı yeni bir dosya oluşturun.
Aşağıdakileri ekleyin:
exports.validateTemperature = async (req, res) => {
try {
if (req.body.temp < 100) {
res.status(200).send("Temperature OK");
} else {
res.status(200).send("Too hot");
}
} catch (error) {
//return an error
console.log("got error: ", error);
res.status(500).send(error);
}
};
Artık işlevi test etmeye hazırsınız.
Visual Studio Code'da test işlevi
Bu noktadan itibaren bu codelab'de Visual Studio Code'daki entegre terminal kullanılmaktadır.
Visual Studio Code'da bir terminal penceresi açın.
Aşağıdaki komutu çalıştırın:
node node_modules/@google-cloud/functions-framework --target=validateTemperature
Bu komut, sunucu bir HTTP isteği aldığında validateTemperature işlevini çağırmaya hazır olan yerel bir sunucu başlatır.
Terminal pencerenizde aşağıdaki çıkışı görürsünüz:
Serving function... Function: validateTemperature URL: http://localhost:8080/
Terminal penceresi bölmesinde New Terminal artı simgesini tıklayarak VS Code'da ikinci bir terminal penceresi oluşturun. Bu iki terminal penceresi arasında geçiş yapacaksınız: Birincisi işlevi sunmak, ikincisi ise işlevi curl kullanarak çağırmak için.

Açılır menüyü kullanarak terminal pencereleri arasında geçiş yapabilirsiniz. Bir terminal penceresi şu anda bir işleve hizmet veriyorsa açılır liste bunu node olarak adlandırır. Aksi takdirde zsh (veya kullandığınız kabuk) olarak adlandırılır.
İkinci terminal penceresinde, validateTemperature işlevine hizmet veren yerel sunucuya 50 derecelik bir sıcaklık yükü göndermek için aşağıdaki komutu çalıştırın.
curl -X POST http://localhost:8080 -H "Content-Type:application/json" -d '{"temp":"50"}'
Bulut işlevinden aşağıdaki yanıtı alırsınız:
Temperature OK
İkinci terminal penceresinde, aşağıdaki örnekte gösterildiği gibi "çok yüksek" bir sıcaklık yükü göndererek işlevi tekrar test edin:
curl -X POST http://localhost:8080 -H "Content-Type:application/json" -d '{"temp":"120"}'
Bulut işlevinden aşağıdaki yanıtı alırsınız:
Too hot
Son olarak, işlevi eksik bir yükle çağırarak test edin.
curl -X POST http://localhost:8080
Bulut işlevinden aşağıdaki yanıtı alırsınız:
Too hot
İdeal olarak, sıcaklık sağlanmamışsa işlev "çok sıcak" değerini döndürmemelidir. Kodda bir hata keşfettiyseniz.
İşlevinize hizmet veren ilk terminal penceresinde Ctrl + C tuşuna basarak işlevinizin çalışmasını durdurduğunuzdan emin olun.
5. Yerel makinenizden bir HTTP işlevinde hata ayıklama
Visual Studio Code'da komut paletini açın. Mac kullanıyorsanız Cmd + Shift + P tuşunu kullanın. Windows kullanıyorsanız Ctrl + Shift + P. tuşunu kullanın.
Komut paletine auto attach yazın ve listedeki en üstteki öğeyi seçin.

Bu codelab için aşağıdaki resimde gösterildiği gibi Only With Flag seçeneğini belirleyin:

Şimdi, en sağ tarafta görünen uyarı simgesinin üzerine gelerek VS Code'da işlevinizi sunmak için kullandığınız terminal penceresini yeniden yükleyin.
Relaunch Terminal simgesini tıklayın.

Yeniden yüklenen terminal penceresinde, aşağıdaki komutu kullanarak işlevinizi sunmak için Functions çerçevesini yeniden çalıştırın:
node --inspect node_modules/.bin/functions-framework --target=validateTemperature
Burada --inspect işareti, Node.js'e bir hata ayıklama istemcisini dinlemesini söyler. Daha fazla bilgi için lütfen Node'da hata ayıklama ile ilgili dokümanlara bakın.
node_modules/@google-cloud/functions-framework yerine node_modules/.bin/functions-framework kullandığınızı unutmayın. İnceleme modunu kullanmak için /node_modules/.bin dizininde otomatik olarak sembolik bağlantılı yürütülebilir dosyayı kullanmanız gerekir.
Bu kez VS Code'da hata ayıklayıcının eklendiğini belirten turuncu bir durum çubuğu görmeniz gerekir.
Satır numarasının solundaki kenar boşluğunun içine tıklayarak 3. satırda bir kesme noktası ayarlayın.

Kesme noktası simgesi parlak kırmızı renkte yanmalıdır. Bu, kod satırına hata ayıklayıcı tarafından erişilebildiğini gösterir.

İkinci terminal penceresinde aşağıdaki curl komutunu çalıştırarak kesme noktasına ulaşın.
curl -X POST http://localhost:8080
3. satırın üzerinde sarı bir vurgu görünür. Bu vurgu, bu satırın hata ayıklayıcı tarafından değerlendirilen mevcut ifade olduğunu gösterir.

İstek sıcaklık yükü sağlamadığından, içeriğinin undefined olduğunu doğrulamak için geçici değişkenin üzerine gelin.

Bir sonraki ifadeyi yürütmek için adım atlama simgesini tıklayın.
Mevcut ifadenin, if ifadesinin else kısmına atladığını görürsünüz.

Bu demo için spesifikasyonun, tüm isteklerin sıcaklık okuması göndermesini gerektirdiğini varsayabilirsiniz. Sıcaklık ölçümünün sağlanmadığı nadir durumlarda işlev bir istisna oluşturmalıdır.
Hata ayıklayıcının bağlantısını kesmek için Bağlantıyı kes düğmesini tıklayın.

İlk terminal pencerenizde Ctrl + C tuşuna basarak işlevinizin çalışmasını durdurun.
Aşağıda gösterildiği gibi, sıcaklık tanımlanmamışsa hata vermek için işlevinizi güncelleyerek bir if ifadesi ekleyin:
exports.validateTemperature = async (req, res) => {
try {
// add this if statement below line #2
if (!req.body.temp) {
throw "Temperature is undefined";
}
...
Hata ayıklayıcıyı eklememek için ilk terminal pencerenizde aşağıdaki komutu –inspect işareti olmadan çalıştırarak bulut işlevinizi tekrar çalıştırmaya başlayın.
node node_modules/@google-cloud/functions-framework --target=validateTemperature
İkinci terminal pencerenizde aşağıdaki komutu çalıştırarak bir istisna oluşturulduğunu doğrulayın:
curl -X POST http://localhost:8080
İsteğinizden aşağıdaki çıkış döndürülür:
Temperature is undefined
İlk terminal pencerenizde, işleviniz tarafından kaydedilen hatayı da görürsünüz.
Serving function... Function: validateTemperature URL: http://localhost:8080/ got error: Temperature is undefined
Artık ilk terminal pencerenizde Ctrl + C tuşlarına basarak işlevinizi çalıştırmayı durdurabilirsiniz.
6. Yerel makinenizden Google Cloud'a HTTP işlevi dağıtma
Yerel makinenizde bir Cloud Functions işlevi oluşturup test ettikten ve hatalarını ayıkladıktan sonra bu işlevi Google Cloud'a dağıtmaya hazırsınız.
Aşağıdaki komutu çalıştırarak 2. adımda oluşturduğunuz projeyi yerel olarak kullandığınızı doğrulayın:
gcloud config get-value project
2. adımda belirttiğiniz proje etkin yapılandırma değilse aşağıdaki komutu çalıştırın:
gcloud config set project <project-name-created-step-2>
Herhangi bir terminal penceresinde aşağıdaki komutu çalıştırın:
gcloud functions deploy validateTemperature --trigger-http --runtime nodejs12 --allow-unauthenticated
Parametreler aşağıdaki şekilde açıklanır:
deploy validateTemperature:validateTemperatureadlı bir Cloud Function'ıvalidateTemperatureadlı bir giriş noktasıyla dağıtmak için kullanılan gcloud alt komutu--trigger-http: Tetikleyici etkinlik türü--runtime nodejs12: Bu işlevin hedeflenen çalışma zamanı--allow-unauthenticated: İşlevin herkese açık erişimle çağrılmasına izin verir.
Cloud Functions API'lerini etkinleştirmeniz istenir. API'leri etkinleştirmek için y yazın.
API [cloudfunctions.googleapis.com] not enabled on project [1057316433766]. Would you like to enable and retry (this will take a few minutes)? (y/N)? y
Dağıtım tamamlandığında çıkışta aşağıdakileri görürsünüz:
Deploying function (may take a while - up to 2 minutes)...done. availableMemoryMb: 256 buildId: <your-build-id> entryPoint: validateTemperature httpsTrigger: url: https://<your-region-and-project>.cloudfunctions.net/validateTemperature ...
Terminal pencerenizde, bu herkese açık uç noktayı çağırmak için curl'ü kullanın.
curl -X POST https://<your-region-and-project>.cloudfunctions.net/validateTemperature -H "Content-Type:application/json" -d '{"temp":"50"}'
ve uygun yanıtı doğrulayarak Cloud Functions işlevinizin başarıyla dağıtıldığını onaylayın.
Temperature OK
7. Temizleme
Yanlışlıkla ücretlendirilmemek için (ör.bu Cloud Functions işlevi, ücretsiz katmandaki aylık Cloud Functions işlevi çağırma tahsisinizden daha fazla sayıda yanlışlıkla çağrılırsa) Cloud Functions işlevini veya 2. adımda oluşturduğunuz projeyi silebilirsiniz.
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.
6. adımda dağıttığınız validateTemperature 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 mevcut tüm projelerin listesini görüntüleyebilirsiniz.
8. Tebrikler!
Codelab'i tamamladığınız için tebrik ederiz. Cloud Functions'ın Node.js çalışma zamanını nasıl desteklediği ve Cloud Functions ile yerel hata ayıklamanın nasıl çalıştığı hakkında daha fazla bilgi edinebilirsiniz.
İşlediğimiz konular
- Node.js için Functions Framework
- Yerel olarak bir HTTP Cloud Functions işlevi oluşturun ve test edin.
- Yerel makinenizden bir HTTP işlevinde hata ayıklama
- Yerel makinenizden bir HTTP işlevi dağıtın.