1. Giriş
Genel Bakış
Birçok kuruluş, hizmetleri ve uygulamaları için ağ trafiğinin güvenliğini sağlamak amacıyla Google Cloud'da veri hırsızlığını önlemek için çevre kontrolleri içeren bir sanal özel bulut (VPC) ağı kullanır. VPC ağı, Google'ın üretim ağında uygulanan fiziksel bir ağın sanal sürümüdür. VPC ağı, Compute Engine sanal makine (VM) örnekleriniz için bağlantı sağlar, dahili Application Load Balancer'lar için yerel dahili doğrudan 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 Google Cloud harici yük dengeleyicilerden gelen trafiği arka uçlara dağıtır.
Sanal makinelerin aksine, Cloud Run hizmetleri varsayılan olarak belirli bir VPC ağıyla ilişkilendirilmez. Bu codelab'de, giriş (gelen bağlantılar) ayarlarının yalnızca bir VPC'den gelen trafiğin Cloud Run hizmetine (ör. arka uç hizmeti) erişebileceği şekilde nasıl değiştirileceği gösterilmektedir. Ayrıca bu codelab, ikinci bir hizmetin (ör. ön uç hizmeti) hem VPC üzerinden arka uç Cloud Run hizmetine erişmesini hem de herkese açık internet erişimini sürdürmesini nasıl sağlayacağınızı gösterir.
Bu örnekte, arka uç Cloud Run hizmeti "hello world" değerini döndürür. Ön uç Cloud Run hizmeti, kullanıcı arayüzünde URL toplamak için bir giriş alanı sağlar. Ardından, ön uç hizmeti bu URL'ye (ör.arka uç hizmeti) bir GET isteği gönderir. Bu nedenle, bu istek tarayıcıdan hizmete isteği yerine hizmetten hizmete isteği olur. Ön uç hizmeti arka uca başarıyla ulaştığında 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 gelen trafiğe izin verme
- Ön uç hizmeti için herkese açık internet erişimini korurken, yalnızca dahili girişli bir Cloud Run hizmetiyle (ör. arka uç) iletişim kurmak üzere bir Cloud Run hizmetinde (ör. ön uç) çıkışı yapılandırma.
2. Kurulum ve Gereksinimler
Ön koşullar
- Cloud Console'a giriş yapmış olmanız gerekir.
- Daha önce 2. nesil bir işlev dağıtmış olmanız gerekir. Örneğin, başlamak için 2. nesil Cloud Functions işlevini dağıtma hızlı başlangıç kılavuzunu inceleyebilirsiniz.
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 ekran gösterildiyse Devam'ı tıklayın.

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

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.
- 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`
- 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. Cloud Run hizmetlerini oluşturma
Ortam değişkenlerini ayarlama
Bu codelab boyunca 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
Öncelikle kaynak kodu için bir dizin oluşturun ve bu dizine gidin.
mkdir -p egress-private-codelab/frontend-w-internet egress-private-codelab/backend && cd egress-private-codelab/backend
Ardından, aşağıdaki içeriğe sahip bir `package.json`` dosyası oluşturun:
{
"name": "backend-service",
"version": "1.0.0",
"description": "",
"scripts": {
"start": "node index.js"
},
"dependencies": {
"express": "^4.18.1"
}
}
Ardından, aşağıdaki içeriğe sahip 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"
}
}
Ardından, aşağıdaki içeriğe sahip 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
Ayrıca index.html dosyasını aşağıdaki bilgileri 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ç hizmetini çağırma
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, ön uç Cloud Run örneğinden arka uç Cloud Run hizmetine yönlendirildiğini unutmayın.
"hello world" ifadesini görürsünüz.
4. Arka uç hizmetini yalnızca dahili giriş için ayarlama
Cloud Run hizmetini özel ağınıza dahil etmek 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 hizmeti giden bağlantısı (veya çıkışı) önce internete gider. Bu nedenle Google Cloud, isteğin kaynağını bilmez.
5. Ön uç hizmetini VPC'ye erişecek şekilde 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 ulaşabilir. Ardından, yalnızca özel IP'lere yönelik isteklerin VPC'ye yönlendirileceği şekilde çıkış trafiğini yapılandıracaksınız. Bu yapılandırma, ön ucunuzun genel internete erişmeye devam etmesini sağlar. 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 doğrulayabilirsiniz:
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şimi'ni etkinleştirme
Ardından, aşağıdaki komutu çalıştırarak alt ağda Özel Google Erişimi'ni etkinleştirirsiniz:
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 bölgesi oluşturma
Son olarak, Google Cloud'un bunları dahili IP adresleri olarak değerlendirebilmesi için run.app URL'leri için bir Cloud DNS bölgesi oluşturun.
Önceki bir adımda, doğrudan VPC çıkışını yalnızca özel aralıklar için yapılandırdığınızda. Bu, hedef bir dahili IP ise ön uç hizmetinizden giden bağlantıların yalnızca VPC ağına gideceği anlamına gelir. Ancak arka uç hizmetiniz, herkese açık bir IP'ye çözümlenen bir run.app URL'si kullanıyor.
Bu adımda, run.app URL'lerinin dahili IP adresleri olarak tanınan private.googleapis.com IP adresi aralıklarına çözümlenmesi için bir Cloud DNS 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 adresten 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"
Artık web sitenizin arka uç hizmetine ulaşmaya çalıştığınızda "hello world" yanıtını görürsünüz.
Ayrıca, 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 şekilde yapılandırılmadıysa karşılaşabileceğiniz bazı hata mesajları aşağıda verilmiştir.
- Hata alırsanız
getaddrinfo ENOTFOUND backend-your-hash-uc.a.run.appDNS A kaydına "https://" eklemediğinizden emin olun. - Bölgeyi yapılandırdıktan sonra arka uca erişmeye çalışırken 404 hatası alırsanız global run.app kaydındaki önbelleğin süresinin dolmasını (ör. 6 saat) bekleyebilir veya aşağıdaki komutu çalıştırarak yeni bir düzeltme oluşturabilirsiniz (böylece önbellek temizlenir):
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ğ ile ilgili dokümanları incelemenizi öneririz.
İşlediğimiz konular
- Cloud Run hizmetinize yalnızca bir VPC'den gelen trafiğe izin verme
- Ön uç hizmeti için herkese açık internet erişimini korurken, yalnızca dahili girişli bir Cloud Run hizmetiyle (ör. arka uç) iletişim kurmak üzere bir Cloud Run hizmetinde (ör. ön uç) çıkışı yapılandırma.
8. Temizleme
Yanlışlıkla ücretlendirilmemek için (örneğin, bu Cloud Run hizmeti ücretsiz katmandaki aylık Cloud Run çağırma tahsisinizden daha fazla sayıda yanlışlıkla çağrılırsa) 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 gidin ve 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 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.