Hem dahili Cloud Run hizmetine hem de herkese açık internete erişmek için Cloud Run hizmetini yapılandırma

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 Shell'i etkinleştirme

  1. Cloud Console'da Cloud Shell'i etkinleştir 'i d1264ca30785e435.png tıklayın.

cb81e7c8e34bc8d.png

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.

d95252b003979716.png

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

7833d5e1c5d18f54.png

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.

  1. 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`
  1. 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.app DNS 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.