Mengonfigurasi MongoDB Atlas menggunakan peering VPC

Halaman ini menjelaskan cara mengonfigurasi database sumber MongoDB Atlas agar dapat digunakan dengan Datastream menggunakan peering Virtual Private Cloud. Perhatikan bahwa prosedur yang dijelaskan bukanlah solusi ketersediaan tinggi. Jika node MongoDB gagal dalam pengujian profil koneksi, Anda harus menjalankan skrip startup secara manual yang dirujuk lebih lanjut di halaman ini pada virtual machine (VM) terjemahan alamat jaringan (NAT).

Karena peering Virtual Private Cloud bersifat non-transitif, Anda harus mengonfigurasi gateway NAT menggunakan VM Compute Engine untuk merutekan traffic dari Datastream ke MongoDB Atlas.

Mengonfigurasi pengguna database MongoDB

Untuk menggunakan Datastream dengan instance MongoDB Atlas, Anda harus membuat pengguna database terlebih dahulu dan memberikan hak akses kepada pengguna tersebut:

  1. Di MongoDB Atlas dasbor, di bagian Security, klik Database access.
  2. Klik New database user , lalu pilih metode autentikasi sandi untuk pengguna Anda.
  3. Masukkan nama pengguna dan sandi untuk pengguna Datastream Anda.
  4. Di bagian Database user privileges, pilih Grant specific user privileges.
  5. Di bagian Specific privileges, tambahkan peran berikut:
    • readAnyDatabase
  6. Klik Add user.

Menyiapkan jaringan Virtual Private Cloud

Identifikasi jaringan Virtual Private Cloud di project Anda untuk di-peering dengan Datastream dan MongoDB Atlas. Google Cloud Halaman ini mengasumsikan bahwa Anda menggunakan VPC default dan subnetnya, misalnya subnet default di region us-central1.

  1. Pastikan jaringan yang Anda identifikasi tidak memiliki rentang alamat IP yang tumpang tindih dengan jaringan Datastream atau MongoDB Atlas Anda.
  2. Buat konfigurasi konektivitas pribadi untuk melakukan peering Datastream dengan jaringan Virtual Private Cloud Anda:
    1. Pastikan Anda memilih VPC peering dari menu drop-down Private connectivity method.
    2. Pilih jaringan VPC default Anda.
    3. Berikan rentang alamat IP yang tidak digunakan, misalnya 10.0.0.0/29, untuk digunakan oleh Datastream.
    4. Catat rentang IP yang dialokasikan untuk aturan firewall ingress Anda.
  3. Siapkan koneksi peering jaringan di MongoDB Atlas untuk melakukan peering jaringan Virtual Private Cloud Anda dengan jaringan MongoDB Atlas Anda. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan koneksi peering jaringan dalam dokumentasi MongoDB:
    1. Berikan Google Cloud project ID dan nama VPC default Anda di MongoDB Atlas.
    2. Catat project ID dan nama VPC yang diberikan MongoDB Atlas kepada Anda untuk menyelesaikan peering di sisi Google Cloud .
  4. Setelah membuat koneksi, di project MongoDB Atlas Anda, buka tab Network Access > VPC Peering dan catat blok perutean antar-domain tanpa kelas (CIDR) untuk aturan firewall egress Anda.

Membuat VM NAT

  1. Di Google Cloud Konsol, buka halaman VM instances.

    Buka instance VM

  2. Klik Create instance.

  3. Di kolom Name, masukkan nama untuk VM, misalnya mongo-nat-gateway.

  4. Di kolom Region, pilih region di dalam VPC default Anda, misalnya us-central1.

  5. Di menu navigasi, klik Networking.

  6. Di kolom Network tags, tambahkan tag, seperti mongo-nat-vm. Tag ini digunakan oleh aturan firewall.

  7. Di bagian IP forwarding, centang kotak Enable.

  8. Di bagian Network interfaces, pilih VPC default Anda dan subnetnya, misalnya default di us-central1.

  9. Di menu navigasi, klik Advanced.

  10. Di bagian Automation, tempelkan skrip berikut di kolom Startup script. Ganti PRIVATE_SRV_RECORD dengan catatan SRV pribadi cluster MongoDB Atlas Anda, misalnya my-cluster-pri.abcde.mongodb.net.

    #!/bin/bash
    
    # --- Startup script for MongoDB Atlas NAT gateway ---
    # This script has two main functions:
    # 1. Resolves the IP address of a MongoDB Atlas node from its SRV record.
    # 2. Configures iptables to forward traffic to the resolved MongoDB IP.
    # --------------------------------------------------------------------------
    
    # --- Part 1: Resolve MongoDB node IP address ---
    
    #
    # EDIT THIS LINE to match your Mongo Atlas private SRV record
    #
    export SRV_RECORD=PRIVATE_SRV_RECORD
    
    echo "Resolving SRV record for: $SRV_RECORD"
    
    # Function to install DNS utilities if needed
    install_dns_tools() {
        echo "'dig' not found. Attempting to install DNS utilities..."
        if command -v apt-get &> /dev/null; then
            # Wait for any existing apt processes to finish before trying to install packages.
            # This is common on VM startup where the system might be running automatic updates.
            echo "Checking for and waiting on existing apt-get processes..."
            while fuser /var/lib/apt/lists/lock /var/lib/dpkg/lock /var/lib/dpkg/lock-frontend >/dev/null 2>&1; do
                echo "Another apt process is running. Waiting 10 seconds..."
                sleep 10
            done
            echo "Apt lock is free. Proceeding with installation."
    
            apt-get update && apt-get install -y dnsutils
        else
            echo "Error: Could not find apt-get to install DNS utilities."
            exit 1
        fi
    
        # Verify that dig is now available
        if ! command -v dig &> /dev/null; then
            echo "Error: Failed to install DNS utilities."
            exit 1
        fi
    }
    
    # Check if 'dig' is installed. If not, install it.
    if ! command -v dig &> /dev/null; then
        install_dns_tools
    fi
    
    echo "Using 'dig' for DNS resolution."
    # The `+short` option provides a concise output.
    # We use `awk` to grab the 4th column (the hostname) and `head` to get the first one.
    NODE_HOSTNAME=$(dig +short SRV "_mongodb._tcp.${SRV_RECORD}" | awk '{print $4}' | head -n 1)
    if [ -n "$NODE_HOSTNAME" ]; then
        NODE_IP=$(dig +short A "$NODE_HOSTNAME")
    fi
    
    # Check if the SRV lookup was successful and we got a hostname.
    if [ -z "$NODE_HOSTNAME" ]; then
        echo "Error: Could not resolve SRV record. Check the hostname and your
        network connection."
        exit 1
    fi
    
    echo "Found node hostname: $NODE_HOSTNAME"
    
    # Check if the A record lookup was successful.
    if [ -z "$NODE_IP" ]; then
        echo "Error: Could not resolve the IP address for node: $NODE_HOSTNAME"
        exit 1
    fi
    
    # 3. Print the final result of the lookup.
    echo "Successfully resolved IP address of a node: $NODE_IP"
    
    # --- Part 2: Configure iptables for NAT ---
    
    # Substitute the resolved IP address into the DB_ADDR variable.
    export DB_ADDR=$NODE_IP
    export DB_PORT=27017
    
    # Enable the VM to receive packets whose destinations do
    # not match any running process local to the VM
    echo 1 > /proc/sys/net/ipv4/ip_forward
    
    # Ask the Metadata server for the IP address of the VM nic0
    # network interface:
    md_url_prefix="http://169.254.169.254/computeMetadata/v1/instance"
    vm_nic_ip="$(curl -H "Metadata-Flavor: Google" ${md_url_prefix}/network-interfaces/0/ip)"
    
    # Clear any existing iptables NAT table entries (all chains):
    iptables -t nat -F
    
    # Create a NAT table entry in the prerouting chain, matching
    # any packets with destination database port, changing the destination
    # IP address of the packet to the MongoDB instance IP address:
    iptables -t nat -A PREROUTING \
         -p tcp --dport $DB_PORT \
         -j DNAT \
         --to-destination $DB_ADDR
    
    # Create a NAT table entry in the postrouting chain, matching
    # any packets with destination database port, changing the source IP
    # address of the packet to the NAT VM's primary internal IPv4 address:
    iptables -t nat -A POSTROUTING \
         -p tcp --dport $DB_PORT \
         -j SNAT \
         --to-source $vm_nic_ip
    
    # Save iptables configuration:
    iptables-save
    
    echo "Startup script completed successfully. iptables rules are configured and saved."
  11. Klik Create untuk meluncurkan VM.

  12. Setelah VM berjalan, catat alamat IP internalnya, misalnya 10.128.0.2.

Membuat aturan firewall ingress dan egress

Anda harus membuat dua aturan firewall di jaringan VPC Anda.

  1. Buat aturan firewall ingress dengan karakteristik berikut:

    • Nama: INGRESS_RULE_NAME
    • Arah: ingress
    • Tindakan: izinkan
    • Parameter target: tag target mongo-nat-vm
    • Parameter sumber: rentang alamat IP yang digunakan oleh konfigurasi konektivitas pribadi Datastream, misalnya 10.0.0.0/29
    • Protokol: TCP
    • Port: 27017
  2. Buat aturan firewall egress dengan karakteristik berikut:

    • Nama: EGRESS_RULE_NAME
    • Arah: egress
    • Tindakan: izinkan
    • Parameter target: tag target mongo-nat-vm
    • Parameter tujuan: blok CIDR MongoDB Atlas, misalnya 192.168.240.0/21
    • Protokol: TCP
    • Port: 27017

Mengonfigurasi daftar IP yang diizinkan di MongoDB Atlas

Izinkan alamat IP internal VM NAT di setelan keamanan MongoDB Atlas Anda:

  1. Login ke akun MongoDB Atlas Anda.
  2. Di menu navigasi, klik Security, lalu klik Network access.
  3. Klik Add IP address.
  4. Di kolom Access list entry, masukkan alamat IP internal instance VM NAT yang Anda buat di jaringan VPC Anda.
  5. Klik Confirm dan tunggu hingga status berubah menjadi Active.

Membuat profil koneksi

Buat profil koneksi Datastream untuk database Anda.

  1. Buka halaman Connection profiles di Google Cloud Konsol.

    Buka halaman Profil koneksi

  2. Klik Create profile , lalu pilih MongoDB.

  3. Di kolom Hostname, masukkan alamat IP internal instance VM NAT yang Anda buat di jaringan VPC Anda.

  4. Di kolom Port, masukkan 27017.

  5. Masukkan nama pengguna dan sandi untuk pengguna database Anda.

  6. Tambahkan label tls dan tls_allow_invalid_hostnames, lalu tetapkan nilainya ke true. Untuk mengetahui informasi selengkapnya tentang cara menetapkan label, lihat Membuat profil koneksi untuk database MongoDB.

  7. Pilih Private connectivity sebagai metode konektivitas Anda.

  8. Pilih konfigurasi konektivitas pribadi yang Anda buat.

  9. Klik Create untuk menyimpan profil koneksi.

  10. Jalankan pengujian untuk memverifikasi koneksi ke database Anda.