1. ภาพรวม
ใน Code Lab นี้ คุณสามารถสร้างการทดลองจากเดิมและเพิ่มบริการภาพขนาดย่อ บริการภาพขนาดย่อคือคอนเทนเนอร์เว็บที่ถ่ายภาพขนาดใหญ่และสร้างภาพขนาดย่อจากภาพดังกล่าว
เมื่อมีการอัปโหลดรูปภาพไปยัง Cloud Storage ระบบจะส่งการแจ้งเตือนไปยังคอนเทนเนอร์เว็บ Cloud Run ผ่าน Cloud Pub/Sub ซึ่งจะปรับขนาดรูปภาพและบันทึกกลับเข้าไปในที่เก็บข้อมูลอื่นใน Cloud Storage
สิ่งที่คุณจะได้เรียนรู้
- Cloud Run
- Cloud Storage
- Cloud Pub/Sub
2. การตั้งค่าและข้อกำหนด
การตั้งค่าสภาพแวดล้อมตามเวลาที่สะดวก
- ลงชื่อเข้าใช้ Google Cloud Console และสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี
- ชื่อโครงการคือชื่อที่แสดงของผู้เข้าร่วมโปรเจ็กต์นี้ เป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้และคุณอัปเดตได้ทุกเมื่อ
- รหัสโปรเจ็กต์ต้องไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมดและจะเปลี่ยนแปลงไม่ได้ (เปลี่ยนแปลงไม่ได้หลังจากตั้งค่าแล้ว) Cloud Console จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ คือคุณไม่สนว่าอะไรเป็นอะไร ใน Codelab ส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (ซึ่งปกติระบุไว้ว่าเป็น
PROJECT_ID
) ดังนั้นหากไม่ชอบ ให้สร้างรหัสแบบสุ่มขึ้นมาอีกรหัสหนึ่ง หรือคุณจะลองใช้รหัสโปรเจ็กต์ของคุณเองแล้วดูว่ารหัสโปรเจ็กต์พร้อมใช้งานหรือไม่ แล้วก็ "แช่แข็ง" หลังจากสร้างโปรเจ็กต์แล้ว - มีค่าที่ 3 คือหมายเลขโปรเจ็กต์ที่ API บางตัวใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 ค่าเหล่านี้ในเอกสารประกอบ
- ถัดไป คุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของระบบคลาวด์ การใช้งาน Codelab นี้น่าจะไม่มีค่าใช้จ่ายใดๆ หากมี หากต้องการปิดทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ ให้ทำตาม "การล้าง" ดูได้ที่ตอนท้ายของ Codelab ผู้ใช้ใหม่ของ Google Cloud จะมีสิทธิ์เข้าร่วมโปรแกรมทดลองใช้ฟรี$300 USD
เริ่มต้น Cloud Shell
แม้ว่าคุณจะดำเนินการ Google Cloud จากระยะไกลได้จากแล็ปท็อป แต่คุณจะใช้ Google Cloud Shell ซึ่งเป็นสภาพแวดล้อมแบบบรรทัดคำสั่งที่ทำงานในระบบคลาวด์ใน Codelab นี้
จากคอนโซล GCP ให้คลิกไอคอน Cloud Shell บนแถบเครื่องมือด้านขวาบนดังนี้
การจัดสรรและเชื่อมต่อกับสภาพแวดล้อมนี้ควรใช้เวลาเพียงครู่เดียว เมื่อเสร็จแล้ว คุณจะเห็นข้อมูลต่อไปนี้
เครื่องเสมือนนี้เต็มไปด้วยเครื่องมือการพัฒนาทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักขนาด 5 GB ที่ใช้งานได้ต่อเนื่องและทำงานบน Google Cloud ซึ่งช่วยเพิ่มประสิทธิภาพของเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก งานทั้งหมดใน Lab นี้สามารถทำได้โดยใช้เบราว์เซอร์
3. เปิดใช้ API
ในห้องทดลองนี้ คุณจะต้องใช้ Cloud Build เพื่อสร้างอิมเมจคอนเทนเนอร์และ Cloud Run เพื่อทำให้คอนเทนเนอร์ใช้งานได้
เปิดใช้ API ทั้ง 2 รายการจาก Cloud Shell:
gcloud services enable cloudbuild.googleapis.com \ run.googleapis.com
คุณควรเห็นการดำเนินการที่เสร็จสิ้นเรียบร้อยแล้ว
Operation "operations/acf.5c5ef4f6-f734-455d-b2f0-ee70b5a17322" finished successfully.
4. สร้างที่เก็บข้อมูลอื่น
คุณจะจัดเก็บภาพขนาดย่อของรูปภาพที่อัปโหลดไว้ในที่เก็บข้อมูลอื่น ลองใช้ gsutil
เพื่อสร้างที่เก็บข้อมูลที่ 2
ใน Cloud Shell ให้ตั้งตัวแปรสำหรับชื่อที่เก็บข้อมูลที่ไม่ซ้ำกัน Cloud Shell มี GOOGLE_CLOUD_PROJECT
ที่ตั้งค่าเป็นรหัสโปรเจ็กต์ที่ไม่ซ้ำกันอยู่แล้ว คุณจะเพิ่มค่านั้นต่อท้ายชื่อที่เก็บข้อมูลได้ จากนั้นสร้างที่เก็บข้อมูลหลายภูมิภาคแบบสาธารณะในยุโรปโดยมีสิทธิ์เข้าถึงระดับแบบเดียวกัน
BUCKET_THUMBNAILS=thumbnails-$GOOGLE_CLOUD_PROJECT gsutil mb -l EU gs://$BUCKET_THUMBNAILS gsutil uniformbucketlevelaccess set on gs://$BUCKET_THUMBNAILS gsutil iam ch allUsers:objectViewer gs://$BUCKET_THUMBNAILS
ในท้ายที่สุด คุณควรมีที่เก็บข้อมูลสาธารณะใหม่
5. โคลนโค้ด
โคลนโค้ดและไปที่ไดเรกทอรีที่มีบริการ:
git clone https://github.com/GoogleCloudPlatform/serverless-photosharing-workshop cd serverless-photosharing-workshop/services/thumbnails/nodejs
คุณจะมีการจัดวางไฟล์ดังต่อไปนี้สำหรับบริการ:
services | ├── thumbnails | ├── nodejs | ├── Dockerfile ├── index.js ├── package.json
คุณมีไฟล์ 3 ไฟล์ภายในโฟลเดอร์ thumbnails/nodejs
ดังนี้
index.js
มีโค้ด Node.jspackage.json
กำหนดทรัพยากร Dependency ของไลบรารีDockerfile
กำหนดอิมเมจคอนเทนเนอร์
6. สำรวจโค้ด
คุณใช้เครื่องมือแก้ไขข้อความในตัวเพื่อสำรวจโค้ดได้ โดยคลิกที่ปุ่ม Open Editor
ที่ด้านบนของหน้าต่าง Cloud Shell
คุณยังสามารถเปิดเครื่องมือแก้ไขในหน้าต่างเบราว์เซอร์เฉพาะ เพื่อให้พื้นที่หน้าจอมากขึ้นได้อีกด้วย
การขึ้นต่อกัน
ไฟล์ package.json
จะกำหนดทรัพยากร Dependency ของไลบรารีที่ต้องการดังนี้
{
"name": "thumbnail_service",
"version": "0.0.1",
"main": "index.js",
"scripts": {
"start": "node index.js"
},
"dependencies": {
"bluebird": "^3.7.2",
"express": "^4.17.1",
"imagemagick": "^0.1.3",
"@google-cloud/firestore": "^4.9.9",
"@google-cloud/storage": "^5.8.3"
}
}
ไลบรารีของ Cloud Storage ใช้สำหรับอ่านและบันทึกไฟล์ภาพภายใน Cloud Storage Firestore เพื่ออัปเดตข้อมูลเมตาของรูปภาพ Express เป็นเฟรมเวิร์กเว็บ JavaScript / โหนด โมดูลโปรแกรมแยกวิเคราะห์เนื้อหาใช้เพื่อแยกวิเคราะห์คำขอที่เข้ามาใหม่ได้อย่างง่ายดาย Bluebird ใช้ในการจัดการคำสัญญา ส่วน Imagemagick เป็นไลบรารีสำหรับการควบคุมรูปภาพ
Dockerfile
Dockerfile
กำหนดอิมเมจคอนเทนเนอร์สำหรับแอปพลิเคชัน:
FROM node:14-slim
# installing Imagemagick
RUN set -ex; \
apt-get -y update; \
apt-get -y install imagemagick; \
rm -rf /var/lib/apt/lists/*; \
mkdir /tmp/original; \
mkdir /tmp/thumbnail;
WORKDIR /picadaily/services/thumbnails
COPY package*.json ./
RUN npm install --production
COPY . .
CMD [ "npm", "start" ]
อิมเมจฐานคือโหนด 14 และใช้ไลบรารี Imagemagick สำหรับการปรับแต่งรูปภาพ ระบบจะสร้างไดเรกทอรีชั่วคราวบางรายการเพื่อเก็บไฟล์ต้นฉบับและรูปภาพขนาดย่อ จากนั้นจะติดตั้งโมดูล NPM ที่โค้ดของเราจำเป็นต้องใช้ก่อนที่จะเริ่มโค้ดด้วย npm start
index.js
มาดูโค้ดเป็นส่วนๆ เพื่อให้เข้าใจมากขึ้นว่าโปรแกรมนี้กำลังทำอะไรอยู่
const express = require('express');
const imageMagick = require('imagemagick');
const Promise = require("bluebird");
const path = require('path');
const {Storage} = require('@google-cloud/storage');
const Firestore = require('@google-cloud/firestore');
const app = express();
app.use(express.json());
ก่อนอื่นเราจะต้องใช้ทรัพยากร Dependency ที่จำเป็นและสร้างเว็บแอปพลิเคชัน Express รวมถึงระบุว่าเราต้องการใช้โปรแกรมแยกวิเคราะห์เนื้อหา JSON เนื่องจากคำขอขาเข้าเป็นเพียงเพย์โหลด JSON ที่ส่งผ่านคำขอ POST ไปยังแอปพลิเคชันของเรา
app.post('/', async (req, res) => {
try {
// ...
} catch (err) {
console.log(`Error: creating the thumbnail: ${err}`);
console.error(err);
res.status(500).send(err);
}
});
เราได้รับเพย์โหลดขาเข้าบน URL / ฐาน และกำลังรวมโค้ดของเราด้วยการจัดการตรรกะข้อผิดพลาด เพื่อให้มีข้อมูลที่ดียิ่งขึ้นเกี่ยวกับสาเหตุที่มีบางอย่างล้มเหลวในโค้ดของเรา โดยดูบันทึกที่จะแสดงจากอินเทอร์เฟซ Stackdriver Logging ในเว็บคอนโซลของ Google Cloud
const pubSubMessage = req.body;
console.log(`PubSub message: ${JSON.stringify(pubSubMessage)}`);
const fileEvent = JSON.parse(Buffer.from(pubSubMessage.message.data, 'base64').toString().trim());
console.log(`Received thumbnail request for file ${fileEvent.name} from bucket ${fileEvent.bucket}`);
บนแพลตฟอร์ม Cloud Run ข้อความ Pub/Sub จะส่งผ่านคำขอ HTTP POST เป็นเพย์โหลด JSON ของแบบฟอร์ม
{
"message": {
"attributes": {
"bucketId": "uploaded-pictures",
"eventTime": "2020-02-27T09:22:43.255225Z",
"eventType": "OBJECT_FINALIZE",
"notificationConfig": "projects/_/buckets/uploaded-pictures/notificationConfigs/28",
"objectGeneration": "1582795363255481",
"objectId": "IMG_20200213_181159.jpg",
"payloadFormat": "JSON_API_V1"
},
"data": "ewogICJraW5kIjogInN0b3JhZ2Ujb2JqZWN...FQUU9Igp9Cg==",
"messageId": "1014308302773399",
"message_id": "1014308302773399",
"publishTime": "2020-02-27T09:22:43.973Z",
"publish_time": "2020-02-27T09:22:43.973Z"
},
"subscription": "projects/serverless-picadaily/subscriptions/gcs-events-subscription"
}
แต่สิ่งที่น่าสนใจในเอกสาร JSON นี้คือสิ่งที่อยู่ในแอตทริบิวต์ message.data
ซึ่งเป็นเพียงสตริง แต่เข้ารหัสเพย์โหลดจริงลงใน Base 64 นั่นคือเหตุผลที่โค้ดด้านบนของเราถอดรหัสเนื้อหา Base 64 ของแอตทริบิวต์นี้ เมื่อถอดรหัสแล้ว แอตทริบิวต์ data
ดังกล่าวจะมีเอกสาร JSON อีกฉบับที่แสดงรายละเอียดเหตุการณ์ Cloud Storage ที่ระบุชื่อไฟล์และชื่อที่เก็บข้อมูล รวมถึงข้อมูลเมตาอื่นๆ
{
"kind": "storage#object",
"id": "uploaded-pictures/IMG_20200213_181159.jpg/1582795363255481",
"selfLink": "https://www.googleapis.com/storage/v1/b/uploaded-pictures/o/IMG_20200213_181159.jpg",
"name": "IMG_20200213_181159.jpg",
"bucket": "uploaded-pictures",
"generation": "1582795363255481",
"metageneration": "1",
"contentType": "image/jpeg",
"timeCreated": "2020-02-27T09:22:43.255Z",
"updated": "2020-02-27T09:22:43.255Z",
"storageClass": "STANDARD",
"timeStorageClassUpdated": "2020-02-27T09:22:43.255Z",
"size": "4944335",
"md5Hash": "QzBIoPJBV2EvqB1EVk1riw==",
"mediaLink": "https://www.googleapis.com/download/storage/v1/b/uploaded-pictures/o/IMG_20200213_181159.jpg?generation=1582795363255481&alt=media",
"crc32c": "hQ3uHg==",
"etag": "CLmJhJu08ecCEAE="
}
เราสนใจรูปภาพและชื่อที่เก็บข้อมูล เนื่องจากโค้ดของเราจะดึงภาพนั้นจากที่เก็บข้อมูลเพื่อจัดการกับภาพขนาดย่อ
const bucket = storage.bucket(fileEvent.bucket);
const thumbBucket = storage.bucket(process.env.BUCKET_THUMBNAILS);
const originalFile = path.resolve('/tmp/original', fileEvent.name);
const thumbFile = path.resolve('/tmp/thumbnail', fileEvent.name);
await bucket.file(fileEvent.name).download({
destination: originalFile
});
console.log(`Downloaded picture into ${originalFile}`);
เรากำลังดึงข้อมูลชื่อของที่เก็บข้อมูลของพื้นที่เก็บข้อมูลเอาต์พุตจากตัวแปรสภาพแวดล้อม
เรามีที่เก็บข้อมูลต้นทางที่การสร้างไฟล์ทริกเกอร์บริการ Cloud Run และที่เก็บข้อมูลปลายทางที่เราจะเก็บอิมเมจที่ได้ เราใช้ API ในตัวของ path
เพื่อจัดการไฟล์ในเครื่อง เนื่องจากไลบรารี imagemagick จะสร้างภาพขนาดย่อไว้ในไดเรกทอรีชั่วคราวของ /tmp
เราawait
เพื่อโทรไม่พร้อมกันเพื่อดาวน์โหลดไฟล์ภาพที่อัปโหลด
const resizeCrop = Promise.promisify(im.crop);
await resizeCrop({
srcPath: originalFile,
dstPath: thumbFile,
width: 400,
height: 400
});
console.log(`Created local thumbnail in ${thumbFile}`);
โมดูล Imagemagick ไม่เหมาะกับพื้นที่ async
/ await
มากนัก เราจึงสรุปโมดูลนี้ไว้ในรูปแบบ JavaScript (ที่ได้จากโมดูล Bluebird) จากนั้นเราจะเรียกฟังก์ชันการปรับขนาด / ครอบตัดแบบไม่พร้อมกันที่เราสร้างขึ้นด้วยพารามิเตอร์สำหรับไฟล์ต้นทางและปลายทาง รวมถึงขนาดของภาพขนาดย่อที่เราต้องการสร้าง
await thumbBucket.upload(thumbFile);
console.log(`Uploaded thumbnail to Cloud Storage bucket ${process.env.BUCKET_THUMBNAILS}`);
เมื่ออัปโหลดไฟล์ภาพขนาดย่อไปยัง Cloud Storage แล้ว เราจะอัปเดตข้อมูลเมตาใน Cloud Firestore เพื่อเพิ่มแฟล็กบูลีนที่ระบุว่าระบบสร้างภาพขนาดย่อสำหรับรูปภาพนี้ขึ้นจริงๆ ด้วย
const pictureStore = new Firestore().collection('pictures');
const doc = pictureStore.doc(fileEvent.name);
await doc.set({
thumbnail: true
}, {merge: true});
console.log(`Updated Firestore about thumbnail creation for ${fileEvent.name}`);
res.status(204).send(`${fileEvent.name} processed`);
เมื่อคำขอสิ้นสุดลง เราจะตอบกลับคำขอ HTTP POST ว่าไฟล์ได้รับการประมวลผลอย่างถูกต้อง
const PORT = process.env.PORT || 8080;
app.listen(PORT, () => {
console.log(`Started thumbnail generator on port ${PORT}`);
});
ในตอนท้ายของไฟล์ต้นฉบับ เรามีคำแนะนำเพื่อให้ Express เริ่มต้นเว็บแอปพลิเคชันของเราบนพอร์ตเริ่มต้น 8080
7. ทดสอบในเครื่อง
ทดสอบโค้ดภายในเครื่องเพื่อให้แน่ใจว่าโค้ดใช้งานได้ก่อนทำให้ใช้งานได้บนระบบคลาวด์
ภายในโฟลเดอร์ thumbnails/nodejs
ให้ติดตั้งการอ้างอิง npm และเริ่มต้นเซิร์ฟเวอร์:
npm install; npm start
หากทุกอย่างเป็นไปอย่างถูกต้อง เซิร์ฟเวอร์ควรเริ่มที่พอร์ต 8080:
Started thumbnail generator on port 8080
ใช้ CTRL-C
เพื่อออก
8. สร้างและนำอิมเมจคอนเทนเนอร์ไปใช้จริง
Cloud Run เรียกใช้คอนเทนเนอร์ แต่คุณต้องสร้างอิมเมจคอนเทนเนอร์ก่อน (ตามที่กำหนดไว้ใน Dockerfile
) คุณใช้ Google Cloud Build เพื่อสร้างอิมเมจคอนเทนเนอร์แล้วโฮสต์กับ Google Container Registry ได้
ภายในโฟลเดอร์ thumbnails/nodejs
ที่มี Dockerfile
อยู่ ให้ส่งคำสั่งต่อไปนี้เพื่อสร้างอิมเมจคอนเทนเนอร์
gcloud builds submit --tag gcr.io/$GOOGLE_CLOUD_PROJECT/thumbnail-service
หลังผ่านไป 1-2 นาที บิลด์ควรสำเร็จ:
"ประวัติ" ของ Cloud Build ควรแสดงบิลด์ที่สำเร็จด้วย
คลิกที่รหัสบิลด์เพื่อดูมุมมองรายละเอียดใน "อาร์ติแฟกต์ของบิลด์" คุณจะเห็นว่าอิมเมจคอนเทนเนอร์อัปโหลดไปยัง Cloud Registry (GCR) แล้ว
หากต้องการ ให้ตรวจสอบอีกครั้งว่าอิมเมจคอนเทนเนอร์ทำงานภายใน Cloud Shell หรือไม่ โดยทำดังนี้
docker run -p 8080:8080 gcr.io/$GOOGLE_CLOUD_PROJECT/thumbnail-service
เซิร์ฟเวอร์ควรเริ่มที่พอร์ต 8080 ในคอนเทนเนอร์ ดังนี้
Started thumbnail generator on port 8080
ใช้ CTRL-C
เพื่อออก
9. ทำให้ใช้งานได้กับ Cloud Run
ก่อนทำให้ใช้งานได้กับ Cloud Run ให้ตั้งค่าภูมิภาค Cloud Run เป็นภูมิภาคและแพลตฟอร์มที่รองรับเป็น managed
ดังนี้
gcloud config set run/region europe-west1 gcloud config set run/platform managed
คุณจะตรวจสอบได้ว่ามีการกำหนดค่าโดยทำดังนี้
gcloud config list ... [run] platform = managed region = europe-west1
เรียกใช้คำสั่งต่อไปนี้เพื่อทำให้อิมเมจคอนเทนเนอร์ใช้งานได้บน Cloud Run
SERVICE_NAME=thumbnail-service gcloud run deploy $SERVICE_NAME \ --image gcr.io/$GOOGLE_CLOUD_PROJECT/thumbnail-service \ --no-allow-unauthenticated \ --update-env-vars BUCKET_THUMBNAILS=$BUCKET_THUMBNAILS
จดบันทึก --no-allow-unauthenticated
การตั้งค่านี้จะทำให้บริการ Cloud Run เป็นบริการภายในที่เฉพาะบัญชีบริการบางรายการเท่านั้นที่จะทริกเกอร์
หากการติดตั้งใช้งานสำเร็จ คุณควรเห็นผลลัพธ์ต่อไปนี้
หากไปที่ UI ของ Cloud Console คุณควรจะเห็นว่าบริการใช้งานได้เรียบร้อยแล้วด้วย
10. เหตุการณ์ Cloud Storage ไปยัง Cloud Run ผ่าน Pub/Sub
บริการพร้อมใช้งานแล้ว แต่คุณยังต้องสร้างเหตุการณ์ Cloud Storage ในบริการ Cloud Run ที่สร้างขึ้นใหม่ Cloud Storage สามารถส่งเหตุการณ์การสร้างไฟล์ผ่าน Cloud Pub/Sub ได้ แต่มี 2-3 ขั้นตอนเพื่อให้การดำเนินการนี้มีผล
สร้างหัวข้อ Pub/Sub เป็นไปป์ไลน์การสื่อสาร
TOPIC_NAME=cloudstorage-cloudrun-topic gcloud pubsub topics create $TOPIC_NAME
สร้างการแจ้งเตือน Pub/Sub เมื่อเก็บไฟล์ในที่เก็บข้อมูล:
BUCKET_PICTURES=uploaded-pictures-$GOOGLE_CLOUD_PROJECT gsutil notification create -t $TOPIC_NAME -f json gs://$BUCKET_PICTURES
สร้างบัญชีบริการสำหรับการสมัครใช้บริการ Pub/Sub ที่เราจะสร้างในภายหลัง
SERVICE_ACCOUNT=$TOPIC_NAME-sa gcloud iam service-accounts create $SERVICE_ACCOUNT \ --display-name "Cloud Run Pub/Sub Invoker"
ให้สิทธิ์บัญชีบริการเพื่อเรียกใช้บริการ Cloud Run ดังนี้
SERVICE_NAME=thumbnail-service gcloud run services add-iam-policy-binding $SERVICE_NAME \ --member=serviceAccount:$SERVICE_ACCOUNT@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com \ --role=roles/run.invoker
หากเปิดใช้บัญชีบริการ Pub/Sub ในวันที่ 8 เมษายน 2021 หรือก่อนหน้านั้น โปรดมอบบทบาท iam.serviceAccountTokenCreator
ให้กับบัญชีบริการ Pub/Sub ดังนี้
PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format='value(projectNumber)') gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \ --member=serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \ --role=roles/iam.serviceAccountTokenCreator
การเปลี่ยนแปลง IAM อาจใช้เวลา 2-3 นาทีจึงจะมีผล
สุดท้าย สร้างการสมัครใช้บริการ Pub/Sub ด้วยบัญชีบริการ
SERVICE_URL=$(gcloud run services describe $SERVICE_NAME --format 'value(status.url)') gcloud pubsub subscriptions create $TOPIC_NAME-subscription --topic $TOPIC_NAME \ --push-endpoint=$SERVICE_URL \ --push-auth-service-account=$SERVICE_ACCOUNT@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com
คุณตรวจสอบได้ว่าสร้างการสมัครใช้บริการแล้วหรือไม่ ไปที่ Pub/Sub ในคอนโซล เลือกหัวข้อ gcs-events
และคุณควรเห็นการสมัครใช้บริการที่ด้านล่าง
11. ทดสอบบริการ
หากต้องการทดสอบว่าการตั้งค่าใช้งานได้หรือไม่ ให้อัปโหลดรูปภาพใหม่ไปยังที่เก็บข้อมูล uploaded-pictures
และตรวจสอบในที่เก็บข้อมูล thumbnails
ว่ารูปภาพที่ปรับขนาดใหม่ปรากฏตามที่คาดไว้
นอกจากนี้คุณยังตรวจสอบบันทึกอีกครั้งได้เพื่อดูว่าข้อความการบันทึกปรากฏขึ้นหรือไม่ เนื่องจากบริการ Cloud Run กำลังดำเนินการตามขั้นตอนต่างๆ ดังนี้
12. ล้างข้อมูล (ไม่บังคับ)
หากไม่ต้องการใช้ห้องทดลองอื่นๆ ในชุดนี้ต่อ คุณสามารถล้างทรัพยากรเพื่อประหยัดต้นทุนและเป็นพลเมืองระบบคลาวด์ที่ดีโดยรวม คุณสามารถล้างทรัพยากรแต่ละรายการได้ดังนี้
ลบที่เก็บข้อมูล
gsutil rb gs://$BUCKET_THUMBNAILS
ลบบริการ
gcloud run services delete $SERVICE_NAME -q
ลบหัวข้อ Pub/Sub
gcloud pubsub topics delete $TOPIC_NAME
หรือจะลบทั้งโปรเจ็กต์ก็ได้ โดยทำดังนี้
gcloud projects delete $GOOGLE_CLOUD_PROJECT
13. ยินดีด้วย
ตอนนี้ทุกอย่างพร้อมแล้ว
- สร้างการแจ้งเตือนใน Cloud Storage ที่ส่งข้อความ Pub/Sub เกี่ยวกับหัวข้อแล้วเมื่อมีการอัปโหลดรูปภาพใหม่
- กำหนดการเชื่อมโยง IAM และบัญชีที่จำเป็นแล้ว (ต่างจาก Cloud Functions ที่การดำเนินการนี้เป็นแบบอัตโนมัติทั้งหมด เพราะมีการกำหนดค่าด้วยตนเองที่นี่)
- สร้างการสมัครใช้บริการเพื่อให้บริการ Cloud Run ได้รับข้อความ Pub/Sub
- เมื่อใดก็ตามที่มีการอัปโหลดรูปภาพใหม่ไปยังที่เก็บข้อมูล ภาพจะถูกปรับขนาดด้วยบริการ Cloud Run ใหม่
หัวข้อที่ครอบคลุม
- Cloud Run
- Cloud Storage
- Cloud Pub/Sub