1. Giriş
Genel Bakış
Birçok kuruluş, hizmet ve uygulamalarının ağ trafiğini güvenli hale getirmek için Google Cloud'da veri hırsızlığını önleyen çevre kontrolleriyle birlikte 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'de, ikinci bir hizmetin (ör. bir ön uç hizmeti) arka uç Cloud Run hizmetine VPC üzerinden nasıl erişebileceği de gösterilmektedir.
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.
Neler öğreneceksiniz?
- Cloud Run hizmetinize yalnızca bir VPC'den gelen trafiğe izin verme
- Yalnızca dahili girişli bir Cloud Run hizmetiyle iletişim kurmak için Cloud Run hizmetinde çıkışı yapılandırma
2. Kurulum ve Gereksinimler
Ön koşullar
- Cloud Console'a giriş yapmış olmanız gerekir.
- Daha önce bir Cloud Run hizmeti dağıtmış olmanız gerekir. Örneğin, başlamak için Kaynak koddan web hizmeti 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.
REGION=<YOUR_REGION, e.g. us-central1> FRONTEND=frontend BACKEND=backend
Arka uç Cloud Run hizmetini oluşturma
Öncelikle kaynak kodu için bir dizin oluşturun ve bu dizine gidin.
mkdir -p internal-codelab/frontend internal-codelab/backend && cd internal-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
Frontend dizinine gidin.
cd ../frontend
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"
}
}
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 Frontend service on the Internet</h1>
<form hx-trigger="submit" hx-post="/callService" hx-target="#message">
<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="message" 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
İki Cloud Run hizmetini başarıyla dağıttığınızı doğrulayın.
Ön uç hizmetinin URL'sini web tarayıcınızda açın.
Metin kutusuna arka uç hizmetinin URL'sini girin. Bu isteğin tarayıcınızdan yönlendirilmek yerine ö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
Yalnızca VPC ağınızdaki trafiğin arka uç hizmetinize erişmesine izin vermek için aşağıdaki gcloud komutunu çalıştırın.
gcloud run services update $BACKEND --ingress internal --region $REGION
Arka uç hizmetinizin yalnızca VPC'nizden trafik alabileceğini doğrulamak için ön uç hizmetinizden arka uç hizmetinizi tekrar çağırmayı deneyin.
Bu kez "İstek, 404 durum koduyla başarısız oldu" mesajını görürsünüz.
Bu hatayı, ön uç Cloud Run hizmeti giden isteği (yani çıkış) önce internete gittiği için alıyorsunuz. Bu nedenle Google Cloud, isteğin kaynağını bilmiyor.
Sonraki bölümde, ön uç hizmetini VPC'ye erişecek şekilde yapılandıracaksınız. Böylece Google Cloud, isteğin dahili kaynak olarak tanınan VPC'den geldiğini bilecek.
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, hizmetinize VPC içinde kullanacağı bir dahili IP vermek üzere ön uç Cloud Run örneklerinize doğrudan VPC çıkışı eklemeniz gerekir. Ardından, çıkışı ön uç hizmetinden gelen tüm giden bağlantılar VPC'ye gidecek şekilde yapılandıracaksınız.
Öncelikle doğrudan VPC çıkışını etkinleştirmek için şu komutu çalıştırın:
gcloud beta run services update $FRONTEND \ --network=default \ --subnet=default \ --vpc-egress=all-traffic \ --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: all-traffic
Şimdi arka uç hizmetinizi ön uç hizmetinizden tekrar çağırmayı deneyin.
Bu kez "hello world" ifadesini görürsünüz.
Not: Tüm çıkış trafiği VPC'ye yönlendirildiğinden ön uç hizmetinizin internet erişimi olmaz. Örneğin, ön uç hizmetiniz https://curlmyip.org/ adresine erişmeye çalışırsa zaman aşımına uğrar.
6. Tebrikler!
Tebrikler, codelab'i tamamladınız.
Cloud Run belgelerini ve Cloud Run hizmetleri için özel ağ iletişimini nasıl yapılandıracağınızı incelemenizi öneririz.
İşlediğimiz konular
- Cloud Run hizmetinize yalnızca bir VPC'den gelen trafiğe izin verme
- Yalnızca dahili girişli bir Cloud Run hizmetiyle iletişim kurmak için Cloud Run hizmetinde çıkışı yapılandırma
7. Temizleme
Yanlışlıkla ücretlendirilmemek için (örneğin, Cloud Run hizmetleri ücretsiz katmandaki aylık Cloud Run çağırma kotanızdan daha fazla sayıda çağrılırsa) Cloud Run'ı veya 2. adımda oluşturduğunuz projeyi silebilirsiniz.
Cloud Run hizmetini silmek için https://console.cloud.google.com/run adresinden Cloud Run Cloud Console'a gidin ve $FRONTEND ile $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.