Doğrudan VPC çıkışı kullanarak dahili Cloud Run hizmetine erişmek için Cloud Run hizmetini yapılandırma

1. Giriş

Genel Bakış

Birçok kuruluş, hizmetleri ve uygulamaları için ağ trafiğini güvenli hale getirmek amacıyla, veri hırsızlığını önlemek amacıyla Google Cloud üzerinde çevre denetimleriyle birlikte bir Sanal Özel Bulut (VPC) 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) VPC üzerinden arka uç Cloud Run hizmetine nasıl erişebileceğ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.

Neler öğreneceksiniz?

  • Cloud Run hizmetinize yalnızca bir VPC'den trafiğe izin verme
  • Yalnızca dahili girişli 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ş yaptınız.
  • Daha önce bir Cloud Run hizmeti dağıttınız. Örneğin, başlamak için kaynak kodundan web hizmeti dağıtma başlıklı makaledeki adımları uygulayabilirsiniz.

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.

REGION=<YOUR_REGION, e.g. us-central1>
FRONTEND=frontend
BACKEND=backend

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 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"
    }
}

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

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"
  }
}

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

Ve index.html dosyasını 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 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ç Hizmeti'ni arayın

İki Cloud Run hizmetini başarıyla dağıttığınızı doğrulayın.

Web tarayıcınızda ön uç hizmetinin URL'sini açın.

Metin kutusuna arka uç hizmetinin URL'sini girin. Bu isteğin, tarayıcınızdan yönlendirilmek yerine 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

Yalnızca VPC ağınızdan gelen 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 onaylamak 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 hata, ilk olarak ön uç Cloud Run hizmeti giden isteği (ör. çıkış) internete çıktığı için Google Cloud isteğin kaynağını bilmediği için gönderilmiştir.

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 kabul edilen VPC'den geldiğini bilir.

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 örneklerinize doğrudan VPC çıkışı eklemeniz ve hizmetinize VPC içinde kullanılacak dahili bir IP sağlaması 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 onaylayabilirsiniz:

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 ön uç hizmetinizden arka uç hizmetinizi tekrar çağırmayı deneyin.

Bu sefer "hello world" ifadesini göreceksiniz.

Not: Tüm çıkışlar VPC'ye yönlendirildiğinden ön uç hizmetinizin internet erişimi olmayacak. Ö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ğ yapılandırmalarını gözden geçirmenizi öneririz.

İşlediklerimiz

  • Cloud Run hizmetinize yalnızca bir VPC'den trafiğe izin verme
  • Yalnızca dahili girişli Cloud Run hizmetiyle iletişim kurmak için Cloud Run hizmetinde çıkış yapılandırma

7. Temizleme

Yanlışlıkla yapılan ücretleri önlemek için (örneğin, Cloud Run hizmetleri yanlışlıkla ücretsiz katmandaki aylık Cloud Run çağırma tahsisinizden daha fazla kez çağrıldıysa) Cloud Run'ı silebilir 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 gidip $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.