Mengonfigurasi layanan Cloud Run untuk mengakses layanan Cloud Run internal dan Internet publik

Mengonfigurasi layanan Cloud Run untuk mengakses layanan Cloud Run internal dan Internet publik

Tentang codelab ini

subjectTerakhir diperbarui Feb 14, 2024
account_circleDitulis oleh Googler

1. Pengantar

Ringkasan

Guna mengamankan traffic jaringan untuk layanan dan aplikasi mereka, banyak organisasi menggunakan jaringan Virtual Private Cloud (VCP) di Google Cloud dengan kontrol perimeter untuk mencegah pemindahan data yang tidak sah. Jaringan VPC adalah versi virtual dari jaringan fisik yang diterapkan dalam jaringan produksi Google. Jaringan VPC menyediakan konektivitas untuk instance virtual machine (VM) Compute Engine Anda, menawarkan Load Balancer Jaringan passthrough internal native, dan sistem proxy untuk Load Balancer Aplikasi internal, terhubung ke jaringan lokal menggunakan tunnel Cloud VPN dan lampiran VLAN untuk Cloud Interconnect, serta mendistribusikan traffic dari load balancer eksternal Google Cloud ke backend.

Tidak seperti VM, layanan Cloud Run tidak dikaitkan dengan jaringan VPC tertentu secara default. Codelab ini menunjukkan cara mengubah setelan masuk (koneksi masuk) sehingga hanya traffic yang berasal dari VPC yang dapat mengakses layanan Cloud Run (misalnya layanan backend). Selain itu, codelab ini menunjukkan cara agar layanan kedua (misalnya layanan frontend) mengakses layanan Cloud Run backend melalui VPC dan juga agar terus memiliki akses Internet publik.

Dalam contoh ini, layanan Cloud Run backend menampilkan halo dunia. Layanan Cloud Run frontend menyediakan kolom input di UI untuk mengumpulkan URL. Kemudian layanan frontend membuat permintaan GET ke URL tersebut (misalnya, layanan backend), sehingga menjadikannya permintaan layanan ke layanan (bukan permintaan browser ke layanan). Saat layanan frontend berhasil menjangkau backend, pesan halo dunia akan ditampilkan di browser. Kemudian, Anda akan melihat cara melakukan panggilan ke https://curlmyip.org untuk mengambil alamat IP layanan frontend.

Yang akan Anda pelajari

  • Cara mengizinkan hanya traffic dari VPC ke layanan Cloud Run Anda
  • Cara mengonfigurasi traffic keluar di layanan Cloud Run (misalnya, frontend) untuk berkomunikasi dengan layanan Cloud Run khusus masuk internal (misalnya, backend), sambil mempertahankan akses Internet publik untuk layanan frontend.

2. Penyiapan dan Persyaratan

Prasyarat

Mengaktifkan Cloud Shell

  1. Dari Cloud Console, klik Aktifkan Cloud Shell d1264ca30785e435.png.

cb81e7c8e34bc8d.png

Jika ini pertama kalinya Anda memulai Cloud Shell, Anda akan melihat layar perantara yang menjelaskan apa itu Cloud Shell. Jika Anda melihat layar perantara, klik Lanjutkan.

d95252b003979716.png

Perlu waktu beberapa saat untuk penyediaan dan terhubung ke Cloud Shell.

7833d5e1c5d18f54.pngS

Mesin virtual ini dimuat dengan semua alat pengembangan yang diperlukan. Layanan ini menawarkan direktori beranda tetap sebesar 5 GB dan beroperasi di Google Cloud, sehingga sangat meningkatkan performa dan autentikasi jaringan. Sebagian besar pekerjaan Anda dalam codelab ini dapat dilakukan dengan browser.

Setelah terhubung ke Cloud Shell, Anda akan melihat bahwa Anda telah diautentikasi dan project sudah ditetapkan ke project ID Anda.

  1. Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa Anda telah diautentikasi:
gcloud auth list

Output perintah

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa perintah gcloud mengetahui project Anda:
gcloud config list project

Output perintah

[core]
project = <PROJECT_ID>

Jika tidak, Anda dapat menyetelnya dengan perintah ini:

gcloud config set project <PROJECT_ID>

Output perintah

Updated property [core/project].

3. Membuat layanan Cloud Run

Menyiapkan variabel lingkungan

Anda dapat menetapkan variabel lingkungan yang akan digunakan di seluruh codelab ini.

PROJECT_ID=<YOUR_PROJECT_ID>
REGION=<YOUR_REGION, e.g. us-central1>
FRONTEND=frontend-with-internet
BACKEND=backend
SUBNET_NAME=default

Membuat layanan Cloud Run backend

Pertama, buat direktori untuk kode sumber dan {i>cd<i} ke direktori tersebut.

mkdir -p egress-private-codelab/frontend-w-internet egress-private-codelab/backend && cd egress-private-codelab/backend

Kemudian, buat file `package.json`` dengan isi berikut:

{
    "name": "backend-service",
    "version": "1.0.0",
    "description": "",
    "scripts": {
        "start": "node index.js"
    },
    "dependencies": {
        "express": "^4.18.1"
    }
}

Selanjutnya, buat file sumber index.js dengan konten di bawah ini. File ini berisi titik entri untuk layanan dan berisi logika utama untuk aplikasi.

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}`);
});

Terakhir, deploy layanan Cloud Run yang menjalankan perintah berikut.

gcloud run deploy $BACKEND --source . --allow-unauthenticated --region $REGION

Membuat layanan Cloud Run frontend

Buka direktori frontend

cd ../frontend-w-internet

Lalu, buat file package.json dengan konten berikut:

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

Selanjutnya, buat file sumber index.js dengan konten di bawah ini. File ini berisi titik entri untuk layanan dan berisi logika utama untuk aplikasi.

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}`);
});

Membuat direktori publik untuk file index.html

mkdir public
touch public/index.html

Dan perbarui index.html agar berisi hal berikut:

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

Terakhir, deploy layanan Cloud Run yang menjalankan perintah berikut.

gcloud run deploy $FRONTEND --source . --allow-unauthenticated --region $REGION

Memanggil Layanan Backend

Di bagian ini, Anda akan memverifikasi bahwa Anda telah berhasil men-deploy dua layanan Cloud Run.

Buka URL layanan frontend di browser web Anda, misalnya https://frontend-your-hash-uc.a.run.app/

Di kotak teks, masukkan URL untuk layanan backend. Perhatikan bahwa permintaan ini dirutekan dari instance Cloud Run frontend ke layanan Cloud Run backend, bukan dari browser Anda.

Anda akan melihat "halo dunia"

4. Menyetel Layanan Backend hanya untuk traffic masuk internal

Anda dapat menjalankan perintah gcloud berikut untuk menggabungkan layanan Cloud Run ke jaringan pribadi Anda.

gcloud run services update $BACKEND --ingress internal --region $REGION

Jika Anda mencoba memanggil layanan backend dari layanan frontend, Anda akan menerima error 404. Koneksi keluar (atau traffic keluar) layanan Cloud Run frontend akan terhubung ke internet terlebih dahulu, sehingga Google Cloud tidak dapat mengetahui asal permintaan.

5. Mengonfigurasi Layanan Frontend untuk mengakses VPC

Di bagian ini, Anda akan mengonfigurasi layanan Cloud Run frontend untuk berkomunikasi dengan layanan backend melalui VPC.

Untuk melakukannya, Anda perlu menambahkan traffic keluar VPC langsung ke layanan Cloud Run frontend untuk memastikan layanan tersebut dapat menjangkau alamat IP internal di jaringan VPC. Kemudian, Anda akan mengonfigurasi traffic keluar sedemikian rupa sehingga hanya permintaan ke IP pribadi yang akan dirutekan ke VPC. Konfigurasi ini akan memungkinkan frontend Anda untuk tetap menjangkau Internet publik. Anda dapat mempelajari lebih lanjut dalam dokumentasi tentang cara menerima permintaan dari layanan Cloud Run lainnya.

Mengonfigurasi traffic keluar VPC langsung

Pertama, jalankan perintah ini untuk menggunakan traffic keluar VPC langsung di layanan frontend:

gcloud beta run services update $FRONTEND \
--network=$SUBNET_NAME \
--subnet=$SUBNET_NAME  \
--vpc-egress=private-ranges-only \
--region=$REGION

Sekarang Anda dapat mengonfirmasi bahwa layanan frontend Anda memiliki akses ke VPC:

gcloud beta run services describe $FRONTEND \
--region=$REGION

Anda akan melihat output mirip dengan

VPC access:
    Network:        default
    Subnet:          default
    Egress:          private-ranges-only

Mengaktifkan Akses Google Pribadi

Selanjutnya, Anda akan mengaktifkan Akses Google Pribadi di subnet dengan menjalankan perintah berikut:

gcloud compute networks subnets update $SUBNET_NAME \
--region=$REGION \
--enable-private-ip-google-access

Anda dapat memverifikasi bahwa Akses Google Pribadi telah diaktifkan dengan menjalankan perintah ini:

gcloud compute networks subnets describe $SUBNET_NAME \
--region=$REGION \
--format="get(privateIpGoogleAccess)"

Membuat zona Cloud DNS untuk URL run.app

Terakhir, buat zona Cloud DNS untuk URL run.app sehingga Google Cloud dapat memperlakukannya sebagai alamat IP internal.

Di langkah sebelumnya, saat Anda mengonfigurasi traffic keluar VPC langsung ke khusus rentang pribadi. Artinya, koneksi keluar dari layanan frontend Anda hanya akan menuju ke jaringan VPC jika tujuannya adalah IP internal. Namun, layanan backend Anda menggunakan URL run.app yang me-resolve ke IP publik.

Pada langkah ini, Anda akan membuat zona Cloud DNS untuk URL run.app untuk di-resolve ke rentang alamat IP private.googleapis.com, yang dikenali sebagai alamat IP internal. Sekarang, semua permintaan ke rentang ini akan dirutekan melalui jaringan VPC Anda.

Anda dapat melakukannya dengan: 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"

Sekarang, saat Anda mencoba menjangkau layanan backend untuk situs, Anda akan melihat "hello world" dikembalikan.

Dan saat Anda mencoba menjangkau internet menggunakan https://curlmyip.org/, Anda akan melihat alamat IP Anda.

6. Pemecahan masalah

Berikut adalah beberapa kemungkinan pesan error yang mungkin Anda temui jika setelan tidak dikonfigurasi dengan benar.

  • Jika Anda mendapatkan pesan error getaddrinfo ENOTFOUND backend-your-hash-uc.a.run.app pastikan Anda tidak menambahkan "https://" ke data A DNS
  • Jika Anda menerima error 404 saat mencoba mengakses backend setelah mengonfigurasi zona, Anda dapat menunggu hingga cache di data run.app global berakhir masa berlakunya (misalnya 6 jam) atau Anda dapat membuat revisi baru (sehingga menghapus cache) dengan menjalankan perintah berikut: gcloud beta run services update $FRONTEND --network=$SUBNET_NAME --subnet=$SUBNET_NAME --vpc-egress=private-ranges-only --region=$REGION

7. Selamat!

Selamat, Anda telah menyelesaikan codelab!

Sebaiknya tinjau dokumentasi tentang Jaringan Pribadi di Cloud Run.

Yang telah kita bahas

  • Cara mengizinkan hanya traffic dari VPC ke layanan Cloud Run Anda
  • Cara mengonfigurasi traffic keluar di layanan Cloud Run (misalnya, frontend) untuk berkomunikasi dengan layanan Cloud Run khusus masuk internal (misalnya, backend), sambil mempertahankan akses Internet publik untuk layanan frontend.

8. Pembersihan

Untuk menghindari tagihan yang tidak disengaja, (misalnya, jika layanan Cloud Run ini secara tidak sengaja dipanggil lebih sering daripada alokasi pemanggilan Cloud Run bulanan Anda dalam paket gratis), Anda dapat menghapus layanan Cloud Run atau menghapus project yang Anda buat di Langkah 2.

Untuk menghapus layanan Cloud Run, buka Konsol Cloud Cloud Run di https://console.cloud.google.com/functions/ dan hapus layanan $FRONTEND dan $BACKEND yang Anda buat di codelab ini.

Jika memilih untuk menghapus seluruh project, Anda dapat membuka https://console.cloud.google.com/cloud-resource-manager, pilih project yang dibuat pada Langkah 2, lalu pilih Hapus. Jika project dihapus, Anda harus mengubah project di Cloud SDK. Anda dapat melihat daftar semua project yang tersedia dengan menjalankan gcloud projects list.