הגדרת MongoDB Atlas באמצעות קישור בין רשתות VPC שכנות (peering)

בדף הזה מוסבר איך להגדיר מסד נתונים של MongoDB Atlas כמקור ל-Datastream באמצעות שילוב של ענן וירטואלי פרטי (VPC). שימו לב שההליך שמתואר כאן לא מהווה פתרון לזמינות גבוהה. אם צומת MongoDB לא עובר את הבדיקה של פרופיל החיבור, צריך להריץ באופן ידני את סקריפט לטעינה בזמן ההפעלה שמפורט בהמשך הדף הזה במכונה וירטואלית (VM) של תרגום כתובות רשת (NAT).

הקישור בין רשתות שכנות בענן וירטואלי פרטי הוא לא טרנזיטיבי, ולכן צריך להגדיר שער NAT באמצעות מכונה וירטואלית ב-Compute Engine כדי לנתב תנועה מ-Datastream אל MongoDB Atlas.

הגדרת משתמש במסד נתונים של MongoDB

כדי להשתמש ב-Datastream עם מופע של MongoDB Atlas, צריך קודם ליצור משתמש במסד הנתונים ולהעניק לו הרשאות גישה:

  1. בלוח הבקרה של MongoDB Atlas, בקטע Security (אבטחה), לוחצים על Database access (גישה למסד הנתונים).
  2. לוחצים על New database user (משתמש חדש במסד הנתונים) ובוחרים את שיטת אימות הסיסמה עבור המשתמש.
  3. מזינים את שם המשתמש והסיסמה של המשתמש ב-Datastream.
  4. בקטע Database user privileges (הרשאות משתמש במסד הנתונים), בוחרים באפשרות Grant specific user privileges (הענקת הרשאות ספציפיות למשתמש).
  5. בקטע הרשאות ספציפיות, מוסיפים את התפקיד הבא:
    • readAnyDatabase
  6. לוחצים על הוספת משתמש.

הגדרת רשת ענן וירטואלי פרטי (VPC)

מזהים את רשת הענן הווירטואלי הפרטי (VPC) בפרויקט Google Cloud כדי ליצור שכנות עם Datastream ועם MongoDB Atlas. בדף הזה אנחנו מניחים שאתם משתמשים ב-VPC שמוגדר כברירת מחדל ובתת-הרשת שלו, למשל תת-הרשת שמוגדרת כברירת מחדל באזור us-central1.

  1. מוודאים שלרשת שזיהיתם אין טווחי כתובות IP חופפים עם הרשתות של Datastream או MongoDB Atlas.
  2. יוצרים הגדרת קישוריות פרטית כדי ליצור שותפות בין Datastream לבין רשת הענן הווירטואלי הפרטי (VPC):
    1. חשוב לוודא שבתפריט הנפתח שיטת הקישוריות הפרטית בחרתם באפשרות VPC peering.
    2. בוחרים את רשת ה-VPC‏ default.
    3. צריך לספק טווח כתובות IP שלא נמצאות בשימוש, למשל 10.0.0.0/29, כדי ש-Datastream יוכל להשתמש בהן.
    4. חשוב לשים לב לטווח כתובות ה-IP שהוקצה לכלל חומת האש של התעבורה הנכנסת.
  3. מגדירים חיבור של קישור בין רשתות שכנות ב-MongoDB Atlas כדי לקשר בין רשת הענן הווירטואלי הפרטי (VPC) לבין רשת MongoDB Atlas. למידע נוסף, אפשר לעיין במאמר הגדרת חיבור של שיתוף פעולה בין רשתות במסמכי MongoDB:
    1. מזינים את Google Cloud מזהה הפרויקט ואת שם ה-VPC שמוגדר כברירת מחדל ב-MongoDB Atlas.
    2. חשוב לשים לב למזהה הפרויקט ולשם ה-VPC ש-MongoDB Atlas מספק לכם כדי להשלים את הפירינג בצד של Google Cloud .
  4. אחרי שיוצרים את החיבור, בפרויקט MongoDB Atlas, עוברים לכרטיסייה Network Access (גישה לרשת) > VPC Peering (חיבור בין רשתות VPC) ורושמים את בלוק ה-CIDR (ניתוב בין דומיינים ללא מחלקה) של כלל חומת האש ליציאה.

יצירת מכונה וירטואלית של NAT

  1. נכנסים לדף VM instances במסוף Google Cloud .

    כניסה לדף VM instances

  2. לוחצים על Create instance.

  3. בשדה Name (שם), מזינים שם למכונה הווירטואלית, למשל mongo-nat-gateway.

  4. בשדה Region (אזור), בוחרים אזור בתוך ה-VPC שמוגדר כברירת מחדל, למשל us-central1.

  5. בתפריט הניווט, לוחצים על Networking (רשת).

  6. בשדה Network tags מוסיפים תג, כמו mongo-nat-vm. התג הזה משמש את כללי חומת האש.

  7. בקטע העברת כתובות IP, מסמנים את תיבת הסימון הפעלה.

  8. בקטע Network interfaces, בוחרים את ה-VPC שמוגדר כברירת מחדל ואת רשת המשנה שלו, לדוגמה default ב-us-central1.

  9. בתפריט הניווט, לוחצים על מתקדם.

  10. בקטע Automation, מדביקים את הסקריפט הבא בשדה סקריפט לטעינה בזמן ההפעלה. מחליפים את PRIVATE_SRV_RECORD ברשומת ה-SRV הפרטית של אשכול MongoDB Atlas, לדוגמה 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. לוחצים על Create כדי להפעיל את המכונה הווירטואלית.

  12. אחרי שהמכונה הווירטואלית פועלת, מציינים את כתובת ה-IP הפנימית שלה, לדוגמה 10.128.0.2.

יצירת כללים לחומת האש לתעבורת נתונים נכנסת ויוצאת

צריך ליצור שני כללים לחומת אש ברשת ה-VPC.

  1. יוצרים כלל לחומת האש לתעבורת נתונים נכנסת (ingress) עם המאפיינים הבאים:

    • שם: INGRESS_RULE_NAME
    • כיוון: כניסה
    • פעולה: אישור
    • פרמטר יעד: תג היעד mongo-nat-vm
    • פרמטר המקור: טווח כתובות ה-IP שמשמש את הגדרת הקישוריות הפרטית של Datastream, לדוגמה 10.0.0.0/29
    • פרוטוקול: TCP
    • יציאה: 27017
  2. יוצרים כלל לחומת אש לתעבורת נתונים יוצאת (egress) עם המאפיינים הבאים:

    • שם: EGRESS_RULE_NAME
    • כיוון: תעבורת נתונים יוצאת (egress)
    • פעולה: אישור
    • פרמטר יעד: תג היעד mongo-nat-vm
    • פרמטר היעד: בלוק ה-CIDR של MongoDB Atlas, לדוגמה 192.168.240.0/21
    • פרוטוקול: TCP
    • יציאה: 27017

הגדרה של רשימות היתרים של כתובות IP ב-MongoDB Atlas

צריך לאפשר את כתובת ה-IP הפנימית של המכונה הווירטואלית של NAT בהגדרות האבטחה של MongoDB Atlas:

  1. נכנסים לחשבון MongoDB Atlas.
  2. בתפריט הניווט, לוחצים על אבטחה ואז על גישה לרשת.
  3. לוחצים על הוספת כתובת IP.
  4. בשדה Access list entry (רשומה ברשימת הגישה), מזינים את כתובת ה-IP הפנימית של המכונה הווירטואלית של NAT שיצרתם ברשת ה-VPC.
  5. לוחצים על אישור ומחכים שהסטטוס ישתנה לפעיל.

יצירת פרופיל הקישור

יוצרים פרופיל חיבור ל-Datastream עבור מסד הנתונים.

  1. עוברים לדף Connection profiles (פרופילים של חיבורים) ב Google Cloud Console.

    מעבר לדף Connection profiles

  2. לוחצים על יצירת פרופיל ובוחרים באפשרות MongoDB.

  3. בשדה שם המארח, מזינים את כתובת ה-IP הפנימית של מכונת ה-NAT שיצרתם ברשת ה-VPC.

  4. בשדה יציאה, מזינים 27017.

  5. מזינים את שם המשתמש והסיסמה של משתמש מסד הנתונים.

  6. מוסיפים את התוויות tls ו-tls_allow_invalid_hostnames ומגדירים את הערכים שלהן ל-true. מידע נוסף על הגדרת תוויות זמין במאמר יצירת פרופיל חיבור למסד נתונים של MongoDB.

  7. בוחרים באפשרות קישוריות פרטית כשיטת הקישוריות.

  8. בוחרים את הגדרת הקישוריות הפרטית שיצרתם.

  9. לוחצים על יצירה כדי לשמור את פרופיל הקישור.

  10. מריצים בדיקה כדי לוודא שיש חיבור למסד הנתונים.