Mengonfigurasi traffic keluar VPC Langsung untuk fungsi generasi ke-2

Traffic keluar VPC Langsung memungkinkan Anda merutekan traffic dari fungsi Cloud Run Functions (generasi ke-2) langsung ke jaringan VPC.

Batasan

Sebelum memulai

  • Aktifkan Cloud Functions API.
  • Instal Google Cloud CLI, lalu lakukan inisialisasi dengan menjalankan gcloud init.
  • Update komponen gcloud ke versi 558.0.0 atau yang lebih baru:

    gcloud components update
    

  • Buat jaringan VPC di project Anda jika belum memilikinya, buat satu.

  • Opsional: Jika fungsi Anda perlu mengakses Google API dan layanan menggunakan alamat IP internalnya, aktifkan Akses Google Pribadi di subnet yang Anda gunakan untuk traffic keluar VPC Langsung.

Menyiapkan izin IAM

Untuk mengotorisasi traffic keluar VPC Langsung, minta administrator untuk memberikan peran Cloud Run Invoker (roles/run.invoker) ke akun layanan fungsi Anda.

Pastikan Cloud Run memiliki akses ke jaringan VPC menggunakan salah satu metode berikut:

  • Peran Agen Layanan Cloud Run: Secara default, agen layananCloud Run memiliki peran Agen Layanan Cloud Run (roles/run.serviceAgent) yang berisi izin yang diperlukan.

  • Izin kustom: Untuk kontrol yang lebih terperinci, berikan izin tambahan berikut kepada agen layanan Cloud Run di project:

    • compute.networks.get
    • compute.subnetworks.get
    • compute.subnetworks.use di project atau subnet tertentu
    • compute.addresses.get
    • compute.addresses.list
    • compute.addresses.create (hanya diperlukan untuk subnet stack ganda dengan IPv6 eksternal)
    • compute.addresses.delete (hanya diperlukan untuk subnet stack ganda dengan IPv6 eksternal)
    • compute.addresses.createInternal
    • compute.addresses.deleteInternal
    • compute.regionOperations.get
  • Peran Pengguna Jaringan Compute: Jika Anda tidak menggunakan peran Agen Layanan Cloud Run default atau izin kustom, berikan peran Pengguna Jaringan Compute (roles/compute.networkUser) di akun layanan Agen Layanan Cloud Run. Subnet dengan IPv6 eksternal juga memerlukan peran Admin IP Publik Compute (roles/compute.publicIpAdmin).

    Misalnya, untuk memberikan peran Pengguna Jaringan Compute, jalankan perintah berikut:

    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member "serviceAccount:service-PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com" \
    --role "roles/compute.networkUser"

    Ganti kode berikut:

    • PROJECT_ID: ID project Anda.
    • PROJECT_NUMBER: nomor project tempat Anda men-deploy fungsi Cloud Run.

Mengonfigurasi traffic keluar VPC Langsung

Konfigurasi traffic keluar VPC Langsung untuk fungsi generasi ke-2 yang baru atau yang sudah ada.

gcloud

  1. Untuk mengonfigurasi traffic keluar VPC Langsung saat Anda men-deploy fungsi, gunakan perintah gcloud functions deploy dengan flag untuk setelan jaringan Anda.

    gcloud functions deploy FUNCTION_NAME \
        --source . \
        --runtime RUNTIME \
        --trigger-http \
        --region REGION \
        --network=NETWORK \
        --subnet=SUBNET \
        --network-tags=NETWORK_TAG_NAMES \
        --direct-vpc-egress=EGRESS_SETTING
    

    Ganti kode berikut:

    • FUNCTION_NAME: nama fungsi Anda.
    • RUNTIME: runtime untuk fungsi Anda, misalnya, nodejs20.
    • REGION: region tempat Anda men-deploy fungsi.
    • Opsional: NETWORK dengan nama jaringan VPC Anda. Tentukan jaringan VPC atau subnet, atau keduanya. Jika Anda hanya menentukan jaringan, subnet akan menggunakan nama yang sama dengan jaringan.
    • Opsional: SUBNET dengan nama subnet Anda. Tentukan jaringan VPC atau subnet, atau keduanya. Jika Anda hanya menentukan jaringan, subnet akan menggunakan nama yang sama dengan jaringan. Anda dapat men-deploy atau menjalankan beberapa fungsi di subnet yang sama.
    • Opsional: NETWORK_TAG_NAMES dengan nama yang dipisahkan koma dari tag jaringan yang ingin Anda kaitkan dengan fungsi. Setiap fungsi dapat memiliki tag jaringan yang berbeda, seperti network-tag-2.
    • EGRESS_SETTING dengan nilai setelan traffic keluar:
      • all: Default. Mengirim semua traffic keluar melalui jaringan VPC.
      • private-ranges-only: Hanya mengirim traffic ke alamat internal melalui jaringan VPC.
  2. Opsional: Untuk menghapus semua setelan traffic keluar VPC Langsung dari fungsi, deploy ulang fungsi dengan flag --clear-network dan --clear-network-tags.

Terraform

Untuk mempelajari cara menerapkan atau menghapus konfigurasi Terraform, lihat Perintah dasar Terraform.

Fitur ini (dukungan untuk menggunakan traffic keluar VPC Langsung dengan fungsi Cloud Run Functions generasi ke-2) menambahkan kolom direct_vpc_network_interface.network dan direct_vpc_egress.

Untuk menggunakan fitur ini, ikuti panduan berikut:

  • Anda harus menggunakan Terraform versi 7.21.0 atau yang lebih baru.
  • Jika Anda men-deploy ulang fungsi yang memiliki VPC Langsung, Anda kini harus menetapkan nilai secara eksplisit dalam konfigurasi.

Dengan menggunakan contoh traffic keluar VPC Langsung Cloud Run Functions (generasi ke-2) sebagai titik awal, perbarui kolom berikut:

  • service_config.direct_vpc_network_interface.network: nama jaringan VPC Anda.
  • service_config.direct_vpc_network_interface.subnetwork: nama subnetwork VPC Anda.
  • service_config.direct_vpc_egress: traffic mana yang akan dikirim ke jaringan VPC. VPC_EGRESS_ALL_TRAFFIC mengirim semua traffic keluar melalui jaringan VPC. VPC_EGRESS_PRIVATE_RANGES_ONLY hanya mengirim traffic ke rentang alamat IP pribadi ke jaringan VPC.

Contoh: Memanggil layanan internal dari fungsi

Contoh ini menunjukkan cara membuat layanan Cloud Run internal, lalu memanggilnya dari fungsi Cloud Run Functions (generasi ke-2) yang menggunakan traffic keluar VPC Langsung.

Membuat layanan backend internal

  1. Buat direktori baru untuk layanan backend dan ubah ke direktori tersebut:

    mkdir backend-service
    cd backend-service
    
  2. Buat file package.json dengan konten berikut:

    {
        "name": "backend-service",
        "version": "1.0.0",
        "description": "",
        "scripts": {
            "start": "node index.js"
        },
        "dependencies": {
            "express": "^4.18.1"
        }
    }
    
  3. Buat file index.js dengan konten berikut:

    const express = require('express');
    const app = express();
    
    app.get('/', (req, res) => {
        res.send("hello world");
    });
    
    const port = parseInt(process.env.PORT) || 8080;
    app.listen(port, () => {
        console.log(`helloworld: listening on port ${port}`);
    });
    
  4. Deploy layanan ke Cloud Run dengan ingress internal:

    gcloud run deploy backend \
        --source . \
        --no-allow-unauthenticated \
        --region=REGION \
        --ingress internal
    

    Ganti REGION dengan region Anda, misalnya, us-west1.

  5. Simpan URL layanan baru. Anda akan memerlukannya di bagian berikutnya.

Membuat dan men-deploy fungsi

  1. Buat direktori baru untuk fungsi dan ubah ke direktori tersebut:

    cd ..
    mkdir dvpc-function
    cd dvpc-function
    
  2. Buat file package.json dengan konten berikut:

    {
      "name": "sample-http",
      "version": "0.0.1",
      "dependencies": {
        "axios": "0.21.1",
        "@google-cloud/functions-framework": "^3.0.0"
      }
    }
    
  3. Buat file index.js dengan konten berikut. Kode ini membuat permintaan yang diautentikasi ke layanan backend internal.

    const axios = require('axios');
    const functions = require('@google-cloud/functions-framework');
    
    const callVPCService = async (req, res) => {
      const backendUrl = process.env.BACKEND_URL;
    
      if (!backendUrl) {
        console.error('BACKEND_URL environment variable not set.');
        res.status(500).send('BACKEND_URL not configured.');
        return;
      }
    
      try {
        const metadataServerURL = 'http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=';
        const tokenUrl = metadataServerURL + backendUrl;
    
        const tokenResponse = await axios.get(tokenUrl, {
          headers: {
            'Metadata-Flavor': 'Google',
          },
        });
        const token = tokenResponse.data;
    
        const response = await axios.get(backendUrl, {
          headers: {
            Authorization: `bearer ${token}`,
          },
    });
    
    res.status(200).send(`Response from backend: ${response.data}`);
      } catch (error) {
        console.error(`Error calling backend service: ${error.message}`);
        res.status(500).send(`Error calling backend: ${error.message}`);
      }
    };
    
    functions.http('callVPCService', callVPCService);
    
  4. Deploy fungsi dengan traffic keluar VPC Langsung yang dikonfigurasi untuk merutekan semua traffic ke jaringan VPC default Anda:

    gcloud functions deploy my-2ndgen-function \
      --source . \
      --runtime nodejs20 \
      --trigger-http \
      --entry-point callVPCService \
      --network=default \
      --subnet=default \
      --direct-vpc-egress=all \
      --region=REGION \
      --allow-unauthenticated \
      --set-env-vars BACKEND_URL=BACKEND_URL
    

    Ganti kode berikut:

    • REGION: region tempat Anda men-deploy layanan backend.
    • BACKEND_URL: URL layanan backend yang Anda buat.
  5. Setelah fungsi di-deploy, panggil dengan membuka URL-nya. Fungsi ini memanggil layanan backend internal dan menampilkan responsnya.

Langkah berikutnya