วิธีกำหนดค่าบริการ Cloud Run เพื่อเข้าถึงบริการ Cloud Run ภายในโดยใช้ขาออก VPC โดยตรง

1. บทนำ

ภาพรวม

องค์กรจำนวนมากใช้เครือข่าย Virtual Private Cloud (VPC) บน Google Cloud ที่มีการควบคุมขอบเขตเพื่อป้องกันการขโมยข้อมูลเพื่อรักษาการจราจรของข้อมูลในเครือข่ายสำหรับบริการและแอปพลิเคชันของตน เครือข่าย VPC คือเครือข่ายจริงเวอร์ชันเสมือนที่ใช้งานภายในเครือข่ายที่ใช้งานจริงของ Google เครือข่าย VPC มอบการเชื่อมต่อสำหรับอินสแตนซ์เครื่องเสมือน (VM) ของ Compute Engine, มอบตัวจัดสรรภาระงานของเครือข่ายแบบส่งผ่านภายในและระบบพร็อกซีสำหรับตัวจัดสรรภาระงานแอปพลิเคชันภายใน เชื่อมต่อกับเครือข่ายภายในองค์กรโดยใช้อุโมงค์ข้อมูล VPN ของ Cloud และไฟล์แนบ VLAN สำหรับ Cloud Interconnect รวมถึงกระจายการรับส่งข้อมูลจากตัวจัดสรรภาระงานภายนอกของ Google Cloud ไปยังแบ็กเอนด์

ซึ่งแตกต่างจาก VM ตรงที่บริการ Cloud Run จะไม่เชื่อมโยงกับเครือข่าย VPC ใดๆ โดยค่าเริ่มต้น Codelab นี้แสดงวิธีเปลี่ยนการตั้งค่าขาเข้า (การเชื่อมต่อขาเข้า) โดยจะมีเพียงการรับส่งข้อมูลที่มาจาก VPC เท่านั้นที่เข้าถึงบริการ Cloud Run ได้ (เช่น บริการแบ็กเอนด์) นอกจากนี้ Codelab นี้จะแสดงวิธีเข้าถึงบริการที่ 2 (เช่น บริการฟรอนท์เอนด์) เข้าถึงบริการ Cloud Run แบ็กเอนด์ผ่าน VPC ด้วย

ในตัวอย่างนี้ บริการ Cloud Run แบ็กเอนด์จะแสดง Hello World บริการ Cloud Run ฟรอนท์เอนด์มีช่องป้อนข้อมูลใน UI เพื่อรวบรวม URL จากนั้นบริการฟรอนท์เอนด์จะส่งคำขอ GET ไปยัง URL นั้น (เช่น บริการแบ็กเอนด์) จึงทําให้บริการนี้เป็นคำขอบริการ (แทนคำขอเบราว์เซอร์ไปยังบริการ) เมื่อบริการฟรอนท์เอนด์สามารถเข้าถึงแบ็กเอนด์ได้สำเร็จ ข้อความ Hello World จะปรากฏในเบราว์เซอร์

สิ่งที่คุณจะได้เรียนรู้

  • วิธีอนุญาตเฉพาะการรับส่งข้อมูลจาก VPC ไปยังบริการ Cloud Run ของคุณ
  • วิธีกำหนดค่าข้อมูลขาออกในบริการ Cloud Run เพื่อสื่อสารกับบริการ Cloud Run สำหรับขาเข้าภายในเท่านั้น

2. การตั้งค่าและข้อกำหนด

ข้อกำหนดเบื้องต้น

เปิดใช้งาน Cloud Shell

  1. คลิกเปิดใช้งาน Cloud Shell d1264ca30785e435.png จาก Cloud Console

cb81e7c8e34bc8d.png

หากเริ่มต้นใช้งาน Cloud Shell เป็นครั้งแรก คุณจะเห็นหน้าจอตรงกลางที่อธิบายว่านี่คืออะไร หากระบบแสดงหน้าจอตรงกลาง ให้คลิกต่อไป

d95252b003979716.png

การจัดสรรและเชื่อมต่อกับ Cloud Shell ใช้เวลาเพียงไม่กี่นาที

7833d5e1c5d18f54.png

เครื่องเสมือนนี้โหลดด้วยเครื่องมือการพัฒนาทั้งหมดที่จำเป็น โดยมีไดเรกทอรีหลักขนาด 5 GB ถาวรและทำงานใน Google Cloud ซึ่งช่วยเพิ่มประสิทธิภาพของเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก งานส่วนใหญ่ใน Codelab นี้สามารถทำได้โดยใช้เบราว์เซอร์

เมื่อเชื่อมต่อกับ Cloud Shell แล้ว คุณควรเห็นข้อความตรวจสอบสิทธิ์และโปรเจ็กต์ได้รับการตั้งค่าเป็นรหัสโปรเจ็กต์แล้ว

  1. เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อยืนยันว่าคุณได้รับการตรวจสอบสิทธิ์แล้ว
gcloud auth list

เอาต์พุตจากคำสั่ง

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อยืนยันว่าคำสั่ง gcloud รู้เกี่ยวกับโปรเจ็กต์ของคุณ
gcloud config list project

เอาต์พุตจากคำสั่ง

[core]
project = <PROJECT_ID>

หากไม่ใช่ ให้ตั้งคำสั่งด้วยคำสั่งนี้

gcloud config set project <PROJECT_ID>

เอาต์พุตจากคำสั่ง

Updated property [core/project].

3. สร้างบริการ Cloud Run

ตั้งค่าตัวแปรสภาพแวดล้อม

คุณกำหนดตัวแปรสภาพแวดล้อมที่จะใช้ตลอดทั้ง Codelab ได้

REGION=<YOUR_REGION, e.g. us-central1>
FRONTEND=frontend
BACKEND=backend

สร้างบริการ Cloud Run แบ็กเอนด์

ขั้นแรก ให้สร้างไดเรกทอรีสำหรับซอร์สโค้ดและ cd ลงในไดเรกทอรีนั้น

mkdir -p internal-codelab/frontend internal-codelab/backend && cd internal-codelab/backend

จากนั้นสร้างไฟล์ package.json ที่มีเนื้อหาต่อไปนี้

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

จากนั้นสร้างไฟล์ต้นฉบับ index.js ที่มีเนื้อหาด้านล่าง ไฟล์นี้ประกอบด้วยจุดแรกเข้าสำหรับบริการและประกอบด้วยตรรกะหลักสำหรับแอป

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

สุดท้าย ทำให้บริการ Cloud Run ใช้งานได้โดยเรียกใช้คำสั่งต่อไปนี้

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

สร้างบริการ Cloud Run ฟรอนท์เอนด์

ไปที่ไดเรกทอรีฟรอนท์เอนด์

cd ../frontend

จากนั้นสร้างไฟล์ package.json ที่มีเนื้อหาต่อไปนี้

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

จากนั้นสร้างไฟล์ต้นฉบับ index.js ที่มีเนื้อหาด้านล่าง ไฟล์นี้ประกอบด้วยจุดแรกเข้าสำหรับบริการและประกอบด้วยตรรกะหลักสำหรับแอป

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

สร้างไดเรกทอรีสาธารณะสำหรับไฟล์index.html

mkdir public
touch public/index.html

และอัปเดต index.html ให้มีข้อมูลต่อไปนี้

<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 Frontend service on the Internet</h1>
      <form hx-trigger="submit" hx-post="/callService" hx-target="#message">
        <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="message" style="white-space: pre-wrap"></div>
        <p></p>
      </form>
    </div>
  </body>
</html>

สุดท้าย ทำให้บริการ Cloud Run ใช้งานได้โดยเรียกใช้คำสั่งต่อไปนี้

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

โทรหาบริการแบ็กเอนด์

ยืนยันว่าคุณได้ทำให้บริการ Cloud Run ใช้งานได้ 2 บริการเรียบร้อยแล้ว

เปิด URL ของบริการฟรอนท์เอนด์ในเว็บเบราว์เซอร์

ในกล่องข้อความ ให้ป้อน URL สำหรับบริการแบ็กเอนด์ โปรดทราบว่าระบบกำหนดเส้นทางคำขอนี้จากอินสแตนซ์ Cloud Run ของฟรอนท์เอนด์ไปยังบริการ Cloud Run แบ็กเอนด์แทนการกำหนดเส้นทางจากเบราว์เซอร์

คุณจะเห็นคำว่า "สวัสดีโลก"

4. ตั้งค่าบริการแบ็กเอนด์สำหรับการรับส่งข้อมูลขาเข้าภายในเท่านั้น

เรียกใช้คำสั่ง gcloud ต่อไปนี้เพื่ออนุญาตเฉพาะการรับส่งข้อมูลจากภายในเครือข่าย VPC ในการเข้าถึงบริการแบ็กเอนด์ของคุณ

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

หากต้องการยืนยันว่าบริการแบ็กเอนด์รับการรับส่งข้อมูลจาก VPC ได้เท่านั้น ให้ลองเรียกใช้บริการแบ็กเอนด์จากบริการฟรอนท์เอนด์อีกครั้ง

ครั้งนี้คุณจะเห็นข้อความ "คำขอล้มเหลวโดยมีรหัสสถานะ 404"

คุณได้รับข้อผิดพลาดนี้เนื่องจากคำขอขาออกของบริการ Cloud Run ฟรอนท์เอนด์ (เช่น ขาออก) จะไปยังอินเทอร์เน็ตก่อน Google Cloud จึงไม่ทราบต้นทางของคำขอ

ในส่วนถัดไป คุณจะต้องกำหนดค่าบริการฟรอนท์เอนด์เพื่อเข้าถึง VPC เพื่อให้ Google Cloud ทราบว่าคำขอมาจาก VPC ซึ่งรับรู้ว่าเป็นแหล่งที่มาภายใน

5. กำหนดค่าบริการฟรอนท์เอนด์เพื่อเข้าถึง VPC

ในส่วนนี้ คุณจะได้กำหนดค่าบริการ Cloud Run ฟรอนท์เอนด์เพื่อสื่อสารกับบริการแบ็กเอนด์ผ่าน VPC

ในการดำเนินการนี้ คุณจะต้องเพิ่มข้อมูลขาออก VPC โดยตรงไปยังอินสแตนซ์ Cloud Run ฟรอนท์เอนด์เพื่อมอบ IP ภายในเพื่อใช้ภายใน VPC แก่บริการ จากนั้น กำหนดค่าข้อมูลขาออกเพื่อให้การเชื่อมต่อขาออกทั้งหมดจากบริการฟรอนท์เอนด์ไปยัง VPC

ก่อนอื่น ให้เรียกใช้คำสั่งนี้เพื่อเปิดใช้ข้อมูลขาออก VPC โดยตรง:

gcloud beta run services update $FRONTEND \
--network=default \
--subnet=default \
--vpc-egress=all-traffic \
--region=$REGION

ตอนนี้คุณจะยืนยันว่าบริการฟรอนท์เอนด์มีสิทธิ์เข้าถึง VPC ได้แล้ว โดยทำดังนี้

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

คุณควรเห็นผลลัพธ์คล้ายกับ

VPC access:
    Network:         default
    Subnet:          default
    Egress:          all-traffic

ตอนนี้ให้ลองเรียกใช้บริการแบ็กเอนด์จากบริการฟรอนท์เอนด์อีกครั้ง

คราวนี้คุณจะเห็นคำว่า "สวัสดีโลก"

หมายเหตุ: บริการฟรอนท์เอนด์จะไม่มีสิทธิ์เข้าถึงอินเทอร์เน็ตเนื่องจากมีการกำหนดเส้นทางขาออกทั้งหมดไปยัง VPC แล้ว เช่น บริการฟรอนท์เอนด์จะหมดเวลาหากพยายามเข้าถึง https://curlmyip.org/

6. ยินดีด้วย

ขอแสดงความยินดีที่เรียน Codelab จนจบ

เราขอแนะนำให้อ่านเอกสารประกอบ Cloud Run และวิธีกำหนดค่าเครือข่ายส่วนตัวสำหรับบริการ Cloud Run

หัวข้อที่ครอบคลุม

  • วิธีอนุญาตเฉพาะการรับส่งข้อมูลจาก VPC ไปยังบริการ Cloud Run ของคุณ
  • วิธีกำหนดค่าข้อมูลขาออกในบริการ Cloud Run เพื่อสื่อสารกับบริการ Cloud Run สำหรับขาเข้าภายในเท่านั้น

7. ล้างข้อมูล

เพื่อหลีกเลี่ยงการเรียกเก็บเงินที่ไม่ตั้งใจ (เช่น หากมีการเรียกใช้บริการ Cloud Run โดยไม่ได้ตั้งใจมากกว่าการจัดสรรการเรียกใช้ Cloud Run รายเดือนในรุ่นฟรี) คุณจะลบ Cloud Run หรือลบโปรเจ็กต์ที่สร้างไว้ในขั้นตอนที่ 2 ก็ได้

หากต้องการลบบริการ Cloud Run ให้ไปที่ Cloud Console ของ Cloud Run ที่ https://console.cloud.google.com/run แล้วลบบริการ $FRONTEND และ $BACKEND

หากเลือกลบทั้งโปรเจ็กต์ ให้ไปที่ https://console.cloud.google.com/cloud-resource-manager เลือกโปรเจ็กต์ที่คุณสร้างในขั้นตอนที่ 2 แล้วเลือกลบ หากลบโปรเจ็กต์ คุณจะต้องเปลี่ยนโปรเจ็กต์ใน Cloud SDK คุณสามารถดูรายการโปรเจ็กต์ที่ใช้ได้ทั้งหมดโดยเรียกใช้ gcloud projects list