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

  1. Cloud Console'da, Cloud Shell'i etkinleştir d1264ca30785e435.png simgesini 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 bir ekran görüntülendiyse Devam'ı tıklayın.

d95252b003979716.png

Temel hazırlık ve Cloud Shell'e bağlanmak yalnızca birkaç dakika sürer.

7833d5e1c5d18f54.png

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.

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