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 Console แล้ว
- คุณได้ทำให้บริการ Cloud Run ใช้งานได้ก่อนหน้านี้ ตัวอย่างเช่น คุณทำตามวิธีทำให้บริการเว็บใช้งานได้จากการเริ่มต้นอย่างรวดเร็วสำหรับซอร์สโค้ดเพื่อเริ่มต้นใช้งาน
เปิดใช้งาน Cloud Shell
- คลิกเปิดใช้งาน Cloud Shell
จาก Cloud Console
หากเริ่มต้นใช้งาน Cloud Shell เป็นครั้งแรก คุณจะเห็นหน้าจอตรงกลางที่อธิบายว่านี่คืออะไร หากระบบแสดงหน้าจอตรงกลาง ให้คลิกต่อไป
การจัดสรรและเชื่อมต่อกับ Cloud Shell ใช้เวลาเพียงไม่กี่นาที
เครื่องเสมือนนี้โหลดด้วยเครื่องมือการพัฒนาทั้งหมดที่จำเป็น โดยมีไดเรกทอรีหลักขนาด 5 GB ถาวรและทำงานใน Google Cloud ซึ่งช่วยเพิ่มประสิทธิภาพของเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก งานส่วนใหญ่ใน Codelab นี้สามารถทำได้โดยใช้เบราว์เซอร์
เมื่อเชื่อมต่อกับ Cloud Shell แล้ว คุณควรเห็นข้อความตรวจสอบสิทธิ์และโปรเจ็กต์ได้รับการตั้งค่าเป็นรหัสโปรเจ็กต์แล้ว
- เรียกใช้คำสั่งต่อไปนี้ใน 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`
- เรียกใช้คำสั่งต่อไปนี้ใน 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