1. บทนำ
ภาพรวม
หลายองค์กรใช้เครือข่าย Virtual Private Cloud (VPC) ใน Google Cloud ที่มีการควบคุมขอบเขตเพื่อป้องกันการขโมยข้อมูล เพื่อรักษาความปลอดภัยให้กับการจราจรของข้อมูลในเครือข่ายสำหรับบริการและแอปพลิเคชันของตน เครือข่าย VPC คือเครือข่ายเสมือนที่จำลองมาจากเครือข่ายจริงซึ่งติดตั้งใช้งานภายในเครือข่ายที่ใช้งานจริงของ Google เครือข่าย VPC ช่วยให้การเชื่อมต่อสำหรับอินสแตนซ์เครื่องเสมือน (VM) ของ Compute Engine, มีตัวจัดสรรภาระงานเครือข่ายแบบส่งผ่านภายในดั้งเดิมและระบบพร็อกซีสำหรับตัวจัดสรรภาระงานแอปพลิเคชันภายใน, เชื่อมต่อกับเครือข่ายในองค์กรโดยใช้การแนบอุโมงค์ Cloud VPN และ VLAN สำหรับ Cloud Interconnect และกระจายการรับส่งข้อมูลจากตัวจัดสรรภาระงานภายนอกของ Google Cloud ไปยังแบ็กเอนด์
บริการ Cloud Run จะไม่เชื่อมโยงกับเครือข่าย VPC ใดๆ โดยค่าเริ่มต้น ซึ่งต่างจาก VM 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 ที่มี Ingress ภายในเท่านั้น
2. การตั้งค่าและข้อกำหนด
ข้อกำหนดเบื้องต้น
- คุณเข้าสู่ระบบ Cloud Console แล้ว
- คุณเคยทำให้บริการ Cloud Run ใช้งานได้แล้ว เช่น คุณสามารถทำตามคู่มือเริ่มใช้งานฉบับย่อการทำให้ใช้งานได้บริการเว็บจากซอร์สโค้ดเพื่อเริ่มต้นใช้งาน
เปิดใช้งาน Cloud Shell
- จาก Cloud Console ให้คลิกเปิดใช้งาน Cloud Shell


หากคุณเริ่มใช้ Cloud Shell เป็นครั้งแรก คุณจะเห็นหน้าจอระดับกลางที่อธิบายว่า 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
ตั้งค่าตัวแปรสภาพแวดล้อม
คุณตั้งค่าตัวแปรสภาพแวดล้อมที่จะใช้ตลอดทั้งโค้ดแล็บนี้ได้
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 แบ็กเอนด์ แทนที่จะกำหนดเส้นทางจากเบราว์เซอร์
คุณจะเห็นข้อความ "hello world"
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
ตอนนี้ให้ลองโทรหาบริการแบ็กเอนด์จากบริการฟรอนต์เอนด์อีกครั้ง
คราวนี้คุณจะเห็นข้อความ "hello world"
หมายเหตุ: บริการส่วนหน้าจะไม่มีสิทธิ์เข้าถึงอินเทอร์เน็ตเนื่องจากระบบกำหนดเส้นทางการรับส่งข้อมูลขาออกทั้งหมดไปยัง VPC เช่น บริการส่วนหน้าจะหมดเวลาหากพยายามเข้าถึง https://curlmyip.org/
6. ยินดีด้วย
ขอแสดงความยินดีที่ทำ Codelab นี้เสร็จสมบูรณ์
เราขอแนะนำให้ดูเอกสารประกอบ Cloud Run และวิธีกำหนดค่าเครือข่ายส่วนตัวสำหรับบริการ Cloud Run
สิ่งที่เราได้พูดถึง
- วิธีอนุญาตเฉพาะการรับส่งข้อมูลจาก VPC ไปยังบริการ Cloud Run
- วิธีกำหนดค่าขาออกจากบริการ Cloud Run เพื่อสื่อสารกับบริการ Cloud Run ที่มี Ingress ภายในเท่านั้น
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