Memanggil endpoint pribadi yang sesuai dengan Kontrol Layanan VPC

Anda dapat menargetkan endpoint pribadi untuk panggilan HTTP dari eksekusi alur kerja menggunakan registry layanan Direktori Layanan dengan Workflows. Dengan membuat endpoint pribadi dalam jaringan Virtual Private Cloud (VPC), endpoint tersebut dapat mematuhi Kontrol Layanan VPC.

Kontrol Layanan VPC memberikan lapisan pertahanan keamanan tambahan yang tidak bergantung pada Identity and Access Management (IAM). Meskipun IAM memungkinkan kontrol akses berbasis identitas yang terperinci, Kontrol Layanan VPC memungkinkan keamanan perimeter berbasis konteks yang lebih luas, termasuk mengontrol traffic keluar data di seluruh perimeter.

  • Direktori Layanan adalah registry layanan yang menyimpan informasi tentang layanan jaringan terdaftar, termasuk nama, lokasi, dan atributnya. Terlepas dari infrastrukturnya, Anda dapat mendaftarkan layanan secara otomatis dan mengambil detailnya. Hal ini memungkinkan Anda menemukan, memublikasikan, dan menghubungkan layanan dalam skala besar untuk semua endpoint layanan Anda.

  • Jaringan VPC menyediakan konektivitas untuk instance virtual machine (VM) dan memungkinkan Anda membuat endpoint pribadi dalam jaringan VPC menggunakan alamat IP internal. Panggilan HTTP ke resource jaringan VPC dikirim melalui jaringan pribadi sekaligus menerapkan IAM dan Kontrol Layanan VPC.

  • Kontrol Layanan VPC adalah fitur Google Cloud yang dapat Anda gunakan untuk menyiapkan perimeter layanan dan membuat batas transfer data. Anda dapat menggunakan Kontrol Layanan VPC dengan Alur kerja untuk membantu melindungi layanan Anda, dan untuk mengurangi risiko pemindahan data yang tidak sah.

Dokumen ini menunjukkan cara mendaftarkan VM di jaringan VPC sebagai endpoint Direktori Layanan. Dengan begitu, Anda dapat memasukkan nama layanan Direktori Layanan untuk alur kerja Anda. Eksekusi alur kerja Anda menggunakan informasi yang diambil dari registry layanan untuk mengirim permintaan HTTP yang sesuai, tanpa perlu keluar ke jaringan publik.

Diagram ini memberikan ringkasan:

Mengirim permintaan HTTP ke nomor port pada instance VM menggunakan informasi dari Direktori Layanan

Pada level tinggi, Anda harus melakukan hal berikut:

  1. Memberikan izin ke agen layanan Cloud Workflows sehingga agen layanan dapat melihat resource Direktori Layanan dan mengakses jaringan VPC menggunakan Direktori Layanan.
  2. Buat jaringan VPC untuk menyediakan fungsionalitas jaringan.
  3. Buat aturan firewall VPC agar Anda dapat mengizinkan atau menolak traffic ke atau dari instance VM di jaringan VPC Anda.
  4. Membuat instance VM di jaringan VPC. Instance VM Compute Engine adalah virtual machine yang dihosting di infrastruktur Google. Istilah instance Compute Engine, instance VM, dan VM serupa dan digunakan secara bergantian.
  5. Men-deploy aplikasi di VM. Anda dapat menjalankan aplikasi pada instance VM dan memastikan bahwa traffic dilayani seperti yang diharapkan.
  6. Konfigurasikan Direktori Layanan sehingga eksekusi alur kerja Anda dapat memanggil endpoint Direktori Layanan.
  7. Buat dan deploy alur kerja Anda. Nilai private_service_name dalam alur kerja Anda menentukan endpoint Direktori Layanan yang Anda daftarkan di langkah sebelumnya.

Memberikan izin ke agen layanan Cloud Workflows

Beberapa layanan Google Cloud memiliki akun layanan yang dikelola Google yang memungkinkan layanan tersebut mengakses resource Anda. Akun layanan ini dikenal sebagai agen layanan. Jika API memerlukan agen layanan, Google akan membuat agen layanan setelah Anda mengaktifkan dan menggunakan API.

  1. Saat Anda pertama kali men-deploy alur kerja, agen layanan Cloud Workflows akan otomatis dibuat dengan format berikut:

    service-PROJECT_NUMBER@gcp-sa-workflows.iam.gserviceaccount.com

    Anda dapat membuat akun layanan secara manual di project tanpa alur kerja apa pun dengan perintah berikut:

    gcloud beta services identity create \
        --service=workflows.googleapis.com \
        --project=PROJECT_ID

    Ganti PROJECT_ID dengan project ID Google Cloud Anda.

  2. Untuk melihat resource Direktori Layanan, berikan peran Service Directory Viewer (servicedirectory.viewer) pada project kepada agen layanan Workflows:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-workflows.iam.gserviceaccount.com \
        --role=roles/servicedirectory.viewer

    Ganti PROJECT_NUMBER dengan nomor project Google Cloud Anda. Anda dapat menemukan nomor project di halaman Welcome pada Google Cloud Console atau dengan menjalankan perintah berikut:

    gcloud projects describe PROJECT_ID --format='value(projectNumber)'
  3. Untuk mengakses jaringan VPC menggunakan Direktori Layanan, berikan peran Layanan yang Diizinkan Private Service Connect (roles/servicedirectory.pscAuthorizedService) pada project ke agen layanan alur kerja:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-workflows.iam.gserviceaccount.com \
        --role=roles/servicedirectory.pscAuthorizedService

Membuat jaringan VPC

Jaringan VPC adalah versi virtual dari jaringan fisik yang diimplementasikan di dalam jaringan produksi Google. Solusi ini menyediakan konektivitas untuk instance VM Compute Engine Anda.

Anda dapat membuat jaringan VPC mode otomatis atau mode kustom. Setiap jaringan baru yang Anda buat harus memiliki nama unik dalam project yang sama.

Misalnya, perintah berikut akan membuat jaringan VPC mode otomatis:

gcloud compute networks create NETWORK_NAME \
    --subnet-mode=auto

Ganti NETWORK_NAME dengan nama untuk jaringan VPC.

Untuk informasi selengkapnya, lihat Membuat dan mengelola jaringan VPC.

Membuat aturan firewall VPC

Dengan aturan firewall VPC, Anda dapat mengizinkan atau menolak traffic ke atau dari instance VM di jaringan VPC berdasarkan nomor port, tag, atau protokol.

Aturan firewall VPC ditentukan pada level jaringan, dan hanya berlaku untuk jaringan tempat aturan tersebut dibuat. Namun, nama yang Anda pilih untuk aturan harus unik untuk project.

Misalnya, perintah berikut membuat aturan firewall untuk jaringan VPC yang ditentukan dan memungkinkan traffic masuk dari alamat IPv4 mana pun, 0.0.0.0/0. Nilai flag --rules dari all membuat aturan berlaku untuk semua protokol dan semua port tujuan.

gcloud compute firewall-rules create RULE_NAME \
    --network=projects/PROJECT_ID/global/networks/NETWORK_NAME \
    --direction=INGRESS \
    --action=ALLOW \
    --source-ranges=0.0.0.0/0 \
    --rules=all

Ganti RULE_NAME dengan nama untuk aturan firewall.

Untuk mengetahui informasi lebih lanjut, lihat Menggunakan aturan firewall VPC.

Membuat instance VM di jaringan VPC

Instance VM mencakup cluster Google Kubernetes Engine (GKE), instance lingkungan fleksibel App Engine, dan produk Google Cloud lainnya yang dibangun di VM Compute Engine. Untuk mendukung akses jaringan pribadi, resource jaringan VPC dapat berupa instance VM, alamat IP Cloud Interconnect, atau load balancer internal Lapisan 4.

Instance Compute Engine dapat menjalankan image publik untuk Linux dan Windows Server yang disediakan Google, serta image kustom pribadi yang dapat dibuat atau diimpor dari sistem yang ada. Anda juga dapat men-deploy container Docker.

Anda dapat memilih properti mesin instance, seperti jumlah CPU virtual dan jumlah memori, menggunakan serangkaian jenis mesin yang telah ditetapkan atau dengan membuat jenis mesin kustom sendiri.

Misalnya, perintah berikut membuat instance VM Linux dari image publik dengan antarmuka jaringan yang terpasang ke jaringan VPC yang Anda buat sebelumnya.

  1. Buat dan mulai instance VM:

    gcloud compute instances create VM_NAME \
        --image-family=debian-11 \
        --image-project=debian-cloud \
        --machine-type=e2-micro \
        --network-interface network=projects/PROJECT_ID/global/networks/NETWORK_NAME

    Ganti VM_NAME dengan nama untuk VM.

  2. Jika Anda diminta untuk mengonfirmasi zona untuk instance, ketik y.

    Setelah Anda membuat instance VM, catat alamat INTERNAL_IP yang ditampilkan.

  3. Di konsol Google Cloud, buka halaman Instance VM.

    Buka instance VM

  4. Di kolom Name, klik nama instance VM yang sesuai.

  5. Jika VM berjalan, klik Stop untuk menghentikan VM.

  6. Untuk mengedit VM, klik Edit.

  7. Di bagian Networking > Firewalls, untuk mengizinkan traffic HTTP atau HTTPS ke VM, pilih Allow HTTP traffic atau Allow HTTPS traffic.

    Untuk contoh ini, centang kotak Izinkan traffic HTTP.

    Compute Engine menambahkan tag jaringan ke VM Anda yang mengaitkan aturan firewall dengan VM. Kemudian, sistem akan membuat aturan firewall masuk yang sesuai yang mengizinkan semua traffic masuk di tcp:80 (HTTP) atau tcp:443 (HTTPS).

  8. Untuk menyimpan perubahan, klik Save.

  9. Untuk memulai ulang VM, klik Mulai/Lanjutkan.

Untuk mengetahui informasi lebih lanjut, baca bagian Membuat dan memulai instance VM.

Men-deploy aplikasi di VM

Untuk menguji konfigurasi jaringan dan mengonfirmasi bahwa traffic disajikan seperti yang diharapkan, Anda dapat men-deploy aplikasi sederhana di VM yang memantau port.

Misalnya, perintah berikut membuat layanan web Node.js yang memantau port 3000.

  1. Buat koneksi SSH ke instance VM Anda.

  2. Perbarui repositori paket Anda:

    sudo apt update
  3. Instal NVM, Node.js, dan npm.

    Untuk mengetahui informasi selengkapnya, baca artikel Menyiapkan lingkungan pengembangan Node.js.

  4. Membuat file package.json secara interaktif:

    npm init

    Contoh:

    {
    "name": "test",
    "version": "1.0.0",
    "description": "",
    "main": "index.js",
    "scripts": {
    "test": "hello"
    },
    "author": "",
    "license": "ISC"
    }
  5. Instal Express, framework aplikasi web untuk Node.js:

    npm install express
  6. Tulis kode untuk aplikasi pengujian:

    vim app.js

    Contoh berikut akan membuat aplikasi yang merespons permintaan GET ke jalur root (/) dengan teks "Hello, world!"

    const express = require('express');
    const app = express();
    
    app.get('/', (req, res) => {
      res.status(200).send('Hello, world!').end();
    });
    
    app.listen(3000, () => {
      console.log('Sample app listening on port 3000.');
    });

    Perhatikan port tempat aplikasi mendengarkan. Nomor port yang sama harus digunakan saat mengonfigurasi endpoint untuk layanan Direktori Layanan.

  7. Pastikan aplikasi mendengarkan di port 3000:

    node app.js

Compute Engine menawarkan berbagai opsi deployment. Untuk mengetahui informasi selengkapnya, baca artikel Memilih strategi deployment Compute Engine untuk workload Anda.

Mengonfigurasi Direktori Layanan

Untuk mendukung pemanggilan endpoint pribadi dari eksekusi alur kerja, Anda harus menyiapkan namespace Direktori Layanan, mendaftarkan layanan di namespace, dan menambahkan endpoint ke layanan.

Misalnya, perintah berikut akan membuat namespace, layanan, dan endpoint yang menentukan jaringan VPC serta alamat IP internal instance VM Anda.

  1. Buat namespace

    gcloud service-directory namespaces create NAMESPACE \
        --location=REGION
    

    Ganti kode berikut:

    • NAMESPACE: ID namespace atau ID yang sepenuhnya memenuhi syarat untuk namespace.
    • REGION: region Google Cloud yang berisi namespace; misalnya, us-central1.
  2. Buat layanan:

    gcloud service-directory services create SERVICE \
        --namespace=NAMESPACE \
        --location=REGION
    

    Ganti SERVICE dengan nama layanan yang sedang Anda buat.

  3. Konfigurasikan endpoint.

    gcloud service-directory endpoints create ENDPOINT \
        --namespace=NAMESPACE \
        --service=SERVICE \
        --network=projects/PROJECT_NUMBER/locations/global/networks/NETWORK_NAME \
        --port=PORT_NUMBER \
        --address=IP_ADDRESS \
        --location=REGION
    

    Ganti kode berikut:

    • ENDPOINT: nama endpoint yang Anda buat.
    • PORT_NUMBER: port tempat endpoint dijalankan; misalnya, 3000.
    • IP_ADDRESS: alamat IPv6 atau IPv4 endpoint; ini adalah alamat IP internal yang Anda catat sebelumnya.

Untuk mengetahui informasi selengkapnya, lihat Mengonfigurasi Direktori Layanan dan Mengonfigurasi akses jaringan pribadi.

Membuat dan men-deploy alur kerja Anda

Memanggil atau memanggil endpoint pribadi dari Workflows dilakukan melalui permintaan HTTP. Metode permintaan HTTP yang paling umum memiliki pintasan panggilan (seperti http.get dan http.post), tetapi Anda dapat membuat jenis permintaan HTTP apa pun dengan menyetel kolom call ke http.request dan menentukan jenis permintaan menggunakan kolom method. Untuk mengetahui informasi selengkapnya, lihat Membuat permintaan HTTP.

  1. Buat file kode sumber untuk alur kerja Anda:

    touch call-private-endpoint.JSON_OR_YAML
    

    Ganti JSON_OR_YAML dengan yaml atau json, bergantung pada format alur kerja Anda.

  2. Di editor teks, salin alur kerja berikut (yang dalam hal ini menggunakan protokol HTTP untuk nilai url) ke file kode sumber Anda:

    YAML

    main:
      steps:
        - checkHttp:
            call: http.get
            args:
              url: http://IP_ADDRESS
              private_service_name: "projects/PROJECT_ID/locations/REGION/namespaces/NAMESPACE/services/SERVICE"
            result: res
        - ret:
            return: ${res}

    JSON

    {
      "main": {
        "steps": [
          {
            "checkHttp": {
              "call": "http.get",
              "args": {
                "url": "http://IP_ADDRESS",
                "private_service_name": "projects/PROJECT_ID/locations/REGION/namespaces/NAMESPACE/services/SERVICE"
              },
              "result": "res"
            }
          },
          {
            "ret": {
              "return": "${res}"
            }
          }
        ]
      }
    }

    Nilai private_service_name harus berupa string yang menentukan nama layanan Direktori Layanan terdaftar dengan format berikut:

    projects/PROJECT_ID/locations/LOCATION/namespaces/NAMESPACE_NAME/services/SERVICE_NAME

  3. Deploy alur kerja. Untuk tujuan pengujian, Anda dapat menambahkan akun layanan default Compute Engine ke alur kerja untuk mewakili identitasnya:

    gcloud workflows deploy call-private-endpoint \
        --source=call-private-endpoint.JSON_OR_YAML \
        --location=REGION \
        --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com
    
  4. Menjalankan alur kerja:

    gcloud workflows run call-private-endpoint \
        --location=REGION

    Anda akan melihat hasil yang mirip seperti berikut ini:

    argument: 'null'
    duration: 0.650784403s
    endTime: '2023-06-09T18:19:52.570690079Z'
    name: projects/968807934019/locations/us-central1/workflows/call-private-endpoint/executions/4aac88d3-0b54-419b-b364-b6eb973cc932
    result: '{"body":"Hello, world!","code":200,"headers":{"Connection":"keep-alive","Content-Length":"21","Content-Type":"text/html;
    charset=utf-8","Date":"Fri, 09 Jun 2023 18:19:52 GMT","Etag":"W/\"15-NFaeBgdti+9S7zm5kAdSuGJQm6Q\"","Keep-Alive":"timeout=5","X-Powered-By":"Express"}}'
    startTime: '2023-06-09T18:19:51.919905676Z'
    state: SUCCEEDED
    

Langkah selanjutnya