1. Giriş
Genel Bakış
Birçok kuruluş, hizmet ve uygulamalarında ağ trafiğini güvenli hale getirmek için Google Cloud üzerinde, veri hırsızlığını önlemek amacıyla çevre denetimlerine sahip bir Sanal Özel Bulut (VCP) ağı kullanır. VPC ağı, bir fiziksel ağın Google'ın üretim ağının içinde uygulanan sanal bir sürümüdür. VPC ağı, Compute Engine sanal makine örnekleriniz için bağlantı sağlar, dahili Uygulama Yük Dengeleyicileri için yerel dahili geçişli Ağ Yük Dengeleyicileri ve proxy sistemleri sunar, Cloud Interconnect için Cloud VPN tünellerini ve VLAN eklerini kullanarak şirket içi ağlara bağlanır ve trafiği Google Cloud harici yük dengeleyicilerden arka uçlara dağıtır.
Sanal makinelerin aksine Cloud Run hizmetleri varsayılan olarak belirli bir VPC ağıyla ilişkili değildir. Bu codelab'de, yalnızca VPC'den gelen trafiğin Cloud Run hizmetine (ör. arka uç hizmeti) erişebileceği şekilde giriş (gelen bağlantılar) ayarlarının nasıl değiştirileceği gösterilmiştir. Ayrıca bu codelab'de, ikinci bir hizmetin (ör. ön uç hizmeti) hem VPC üzerinden arka uç Cloud Run hizmetine nasıl erişilebileceği ve genel internet erişimine nasıl devam edilebileceği gösterilmektedir.
Bu örnekte, arka uç Cloud Run hizmeti "hello world" değerini döndürüyor. Ön uç Cloud Run hizmeti, URL'yi toplamak için kullanıcı arayüzünde bir giriş alanı sağlar. Daha sonra ön uç hizmeti bu URL'ye (ör.arka uç hizmeti) bir GET isteği gönderir. Böylece, hizmet isteği yerine tarayıcıdan hizmet isteği kullanılır. Ön uç hizmeti arka uca başarıyla erişebildiğinde tarayıcıda "hello world" mesajı gösterilir. Ardından ön uç hizmetinizin IP adresini almak için https://curlmyip.org adresine nasıl çağrı yapabileceğinizi göreceksiniz.
Neler öğreneceksiniz?
- Cloud Run hizmetinize yalnızca bir VPC'den trafiğe izin verme
- Ön uç hizmeti için herkese açık internet erişimini korurken yalnızca dahili girişli Cloud Run hizmetiyle (ör. arka uç) iletişim kurmak amacıyla Cloud Run hizmetinde (ör. ön uç) çıkış yapılandırma.
2. Kurulum ve Gereksinimler
Ön koşullar
- Cloud Console'a giriş yaptınız.
- Daha önce 2. nesil işlevi dağıttınız. Örneğin, hizmeti kullanmaya başlamak için 2. nesil Cloud Functions işlevi hızlı başlangıç kılavuzunu dağıtma işlemini uygulayabilirsiniz.
Cloud Shell'i etkinleştirme
- Cloud Console'da, Cloud Shell'i etkinleştir
simgesini 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.
Temel hazırlık ve Cloud Shell'e bağlanmak yalnızca birkaç dakika sürer.
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.
- 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`
- 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. Cloud Run hizmetlerini oluşturma
Ortam değişkenlerini ayarlama
Bu codelab'de kullanılacak ortam değişkenlerini ayarlayabilirsiniz.
PROJECT_ID=<YOUR_PROJECT_ID> REGION=<YOUR_REGION, e.g. us-central1> FRONTEND=frontend-with-internet BACKEND=backend SUBNET_NAME=default
Arka uç Cloud Run hizmetini oluşturma
İlk olarak, kaynak kodu için bir dizin oluşturun ve bu dizin için cd'yi kullanın.
mkdir -p egress-private-codelab/frontend-w-internet egress-private-codelab/backend && cd egress-private-codelab/backend
Ardından, aşağıdaki içerikle bir "package.json" dosyası oluşturun:
{ "name": "backend-service", "version": "1.0.0", "description": "", "scripts": { "start": "node index.js" }, "dependencies": { "express": "^4.18.1" } }
Sonra, aşağıdaki içerikle bir index.js
kaynak dosyası oluşturun. Bu dosya, hizmetin giriş noktasını ve uygulamanın ana mantığını içerir.
const express = require('express'); const app = express(); app.use(express.urlencoded({ extended: true })); app.get('/', function (req, res) { res.send("hello world"); }); const port = parseInt(process.env.PORT) || 8080; app.listen(port, () => { console.log(`helloworld: listening on port ${port}`); });
Son olarak, aşağıdaki komutu çalıştırarak Cloud Run hizmetini dağıtın.
gcloud run deploy $BACKEND --source . --allow-unauthenticated --region $REGION
Ön uç Cloud Run hizmetini oluşturma
Ön uç dizinine gidin
cd ../frontend-w-internet
Ardından, aşağıdaki içeriğe sahip bir package.json
dosyası oluşturun:
{ "name": "frontend", "version": "1.0.0", "description": "", "scripts": { "start": "node index.js" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "axios": "^1.6.6", "express": "^4.18.2", "htmx.org": "^1.9.10" } }
Sonra, aşağıdaki içerikle bir index.js
kaynak dosyası oluşturun. Bu dosya, hizmetin giriş noktasını ve uygulamanın ana mantığını içerir.
const express = require("express"); const app = express(); const port = 8080; const path = require('path'); const axios = require('axios'); // serve static content (index.html) using // built-in middleware function in Express app.use(express.static('public')); app.use(express.urlencoded({ extended: true })); // this endpoint receives a URL in the post body // and then makes a get request to that URL // results are sent back to the caller app.post('/callService', async (req, res) => { const url = req.body.url; let message = ""; try { console.log("url: ", url); const response = await axios.get(url); message = response.data; } catch (error) { message = error.message; console.error(error.message); } res.send(` ${message} <p> </p> `); }); app.listen(port, () => { console.log(`Example app listening on port ${port}`); });
index.html dosyası için herkese açık bir dizin oluşturun
mkdir public touch public/index.html
index.html
öğesini aşağıdakileri içerecek şekilde güncelleyin:
<html> <script src="https://unpkg.com/htmx.org@1.9.10" integrity="sha384-D1Kt99CQMDuVetoL1lrYwg5t+9QdHe7NLX/SoJYkXDFfX37iInKRy5xLSi8nO7UC" crossorigin="anonymous" ></script> <body> <div style="margin-top: 100px; margin-left: 100px"> <h1>I'm the Request Tester service on the Internet</h1> <form hx-trigger="submit" hx-post="/callService" hx-target="#zen"> <label for="url"> URL:</label> <input style="width: 308px" type="text" id="url" name="url" placeholder="The backend service URL" required /> <button hx-indicator="#loading" type="submit">Submit</button> <p></p> <span class="htmx-indicator" id="loading"> Loading... </span> <div id="zen" style="white-space: pre-wrap"></div> <p></p> </form> </div> </body> </html>
Son olarak, aşağıdaki komutu çalıştırarak Cloud Run hizmetini dağıtın.
gcloud run deploy $FRONTEND --source . --allow-unauthenticated --region $REGION
Arka Uç Hizmeti'ni arayın
Bu bölümde, iki Cloud Run hizmetini başarıyla dağıttığınızı doğrulayacaksınız.
Ön uç hizmetinin URL'sini web tarayıcınızda açın (ör. https://frontend-your-hash-uc.a.run.app/
.
Metin kutusuna arka uç hizmetinin URL'sini girin. Bu isteğin tarayıcınızdan değil, kullanıcı arabirimi Cloud Run örneğinden arka uç Cloud Run hizmetine yönlendirildiğini unutmayın.
"Merhaba dünya" ifadesini göreceksiniz
4. Arka Uç Hizmeti'ni yalnızca dahili giriş için ayarlama
Özel ağınıza bir Cloud Run hizmeti eklemek için aşağıdaki gcloud komutunu çalıştırabilirsiniz.
gcloud run services update $BACKEND --ingress internal --region $REGION
Arka uç hizmetini ön uç hizmetinden çağırmaya çalışırsanız 404 hatası alırsınız. Ön uç Cloud Run hizmetinin giden bağlantısı (veya çıkışı) önce internete gider. Bu nedenle Google Cloud, isteğin kaynağını bilmez.
5. VPC'ye erişmek için Ön Uç Hizmeti'ni yapılandırma
Bu bölümde, ön uç Cloud Run hizmetinizi bir VPC üzerinden arka uç hizmetinizle iletişim kuracak şekilde yapılandıracaksınız.
Bunu yapmak için ön uç Cloud Run hizmetinize doğrudan VPC çıkışı eklemeniz gerekir. Böylece, VPC ağındaki dahili IP adreslerine erişebildiğinden emin olabilirsiniz. Ardından, yalnızca özel IP'lere yapılan istekler VPC'ye yönlendirilecek şekilde çıkış yapılandıracaksınız. Bu yapılandırma, ön ucunuzun herkese açık internete erişmeye devam etmesine olanak tanır. Diğer Cloud Run hizmetlerinden istek alma ile ilgili belgelerden daha fazla bilgi edinebilirsiniz.
Doğrudan VPC çıkışını yapılandırma
Öncelikle ön uç hizmetinizde doğrudan VPC çıkışını kullanmak için şu komutu çalıştırın:
gcloud beta run services update $FRONTEND \ --network=$SUBNET_NAME \ --subnet=$SUBNET_NAME \ --vpc-egress=private-ranges-only \ --region=$REGION
Artık ön uç hizmetinizin VPC'ye erişimi olduğunu onaylayabilirsiniz:
gcloud beta run services describe $FRONTEND \ --region=$REGION
Şuna benzer bir çıkış alırsınız:
VPC access: Network: default Subnet: default Egress: private-ranges-only
Özel Google Erişimini Etkinleştir
Ardından, aşağıdaki komutu çalıştırarak alt ağda Özel Google Erişimi'ni etkinleştirin:
gcloud compute networks subnets update $SUBNET_NAME \ --region=$REGION \ --enable-private-ip-google-access
Şu komutu çalıştırarak Özel Google Erişimi'nin etkinleştirildiğini doğrulayabilirsiniz:
gcloud compute networks subnets describe $SUBNET_NAME \ --region=$REGION \ --format="get(privateIpGoogleAccess)"
Run.app URL'leri için Cloud DNS alt bölgesi oluşturma
Son olarak, Google Cloud'un bunları dahili IP adresleri olarak işleyebilmesi için Run.app URL'leri için bir Cloud DNS alt bölgesi oluşturun.
Önceki bir adımda, doğrudan VPC çıkışını yalnızca özel aralıklara yapılandırdığınızda. Yani ön uç hizmetinizden giden bağlantılar, yalnızca hedef dahili bir IP ise VPC ağına gider. Ancak arka uç hizmetiniz, herkese açık IP'ye çözümlenen bir run.app URL'si kullanıyor.
Bu adımda, dahili IP adresleri olarak tanınan private.googleapis.com IP adresi aralıklarına çözümlemek üzere run.app URL'leri için bir Cloud DNS alt bölgesi oluşturacaksınız. Artık bu aralıklara yapılan tüm istekler VPC ağınız üzerinden yönlendirilecektir.
Bu işlemi şu şekilde yapabilirsiniz: https://cloud.google.com/run/docs/securing/private-networking#from-other-services
# do not include the https:// in your DNS Name # for example: backend-<hash>-uc.a.run.app DNS_NAME=<your backend service URL without the https://> gcloud dns --project=$PROJECT_ID managed-zones create codelab-backend-service \ --description="" \ --dns-name="a.run.app." \ --visibility="private" \ --networks=$SUBNET_NAME gcloud dns --project=$PROJECT_ID record-sets create $DNS_NAME. \ --zone="codelab-backend-service" \ --type="A" \ --ttl="60" \ --rrdatas="199.36.153.8,199.36.153.9,199.36.153.10,199.36.153.11"
Web sitenizin arka uç hizmetine ulaşmaya çalıştığınızda "hello world" mesajını görürsünüz. geri döndü.
https://curlmyip.org/ adresini kullanarak internete erişmeye çalıştığınızda IP adresinizi görürsünüz.
6. Sorun giderme
Ayarlar düzgün yapılandırılmadıysa karşılaşabileceğiniz bazı olası hata mesajları aşağıda verilmiştir.
getaddrinfo ENOTFOUND backend-your-hash-uc.a.run.app
hatası alırsanız "https://" kısmını eklemediğinizden emin olun. DNS A kaydına- Alt bölgeyi yapılandırdıktan sonra arka uca erişmeye çalışırken 404 hatası alırsanız genel run.app kaydındaki önbelleğin süresinin dolmasını (ör. 6 saat) bekleyebilir veya şu komutu çalıştırarak yeni bir düzeltme oluşturabilir (dolayısıyla önbelleği temizleyebilirsiniz):
gcloud beta run services update $FRONTEND --network=$SUBNET_NAME --subnet=$SUBNET_NAME --vpc-egress=private-ranges-only --region=$REGION
7. Tebrikler!
Tebrikler, codelab'i tamamladınız.
Cloud Run'da Özel Ağ İletişimi ile ilgili belgeleri incelemenizi öneririz.
İşlediklerimiz
- Cloud Run hizmetinize yalnızca bir VPC'den trafiğe izin verme
- Ön uç hizmeti için herkese açık internet erişimini korurken yalnızca dahili girişli Cloud Run hizmetiyle (ör. arka uç) iletişim kurmak amacıyla Cloud Run hizmetinde (ör. ön uç) çıkış yapılandırma.
8. Temizleme
Yanlışlıkla yapılan ücretleri önlemek için (örneğin, bu Cloud Run hizmeti yanlışlıkla ücretsiz katmandaki aylık Cloud Run çağırma hizmetinden daha fazla kez çağrıldıysa) Cloud Run hizmetini veya 2. adımda oluşturduğunuz projeyi silebilirsiniz.
Cloud Run hizmetlerini silmek için https://console.cloud.google.com/functions/ adresinden Cloud Run Cloud Console'a gidip bu codelab'de oluşturduğunuz $FRONTEND ve $BACKEND hizmetlerini silin.
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.