รูปภาพรายวัน: ห้องปฏิบัติการ 5 - การล้างข้อมูลหลังการลบรูปภาพ

1. ภาพรวม

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

d93345bfc235f81e.png

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

  • Cloud Run
  • Cloud Storage
  • Cloud Firestore
  • Eventarc

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

การตั้งค่าสภาพแวดล้อมตามเวลาที่สะดวก

  1. ลงชื่อเข้าใช้ Google Cloud Console และสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

  • ชื่อโครงการคือชื่อที่แสดงของผู้เข้าร่วมโปรเจ็กต์นี้ เป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้และคุณอัปเดตได้ทุกเมื่อ
  • รหัสโปรเจ็กต์ต้องไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมดและจะเปลี่ยนแปลงไม่ได้ (เปลี่ยนแปลงไม่ได้หลังจากตั้งค่าแล้ว) Cloud Console จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ปกติแล้วคุณไม่สนว่าอะไรเป็นอะไร ใน Codelab ส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (ซึ่งปกติระบุไว้ว่าเป็น PROJECT_ID) ดังนั้นหากไม่ชอบ ให้สร้างรหัสแบบสุ่มขึ้นมาอีกรหัสหนึ่ง หรือคุณจะลองใช้รหัสโปรเจ็กต์ของคุณเองแล้วดูว่ารหัสโปรเจ็กต์พร้อมใช้งานหรือไม่ แล้วก็ "แช่แข็ง" หลังจากสร้างโปรเจ็กต์แล้ว
  • มีค่าที่ 3 คือหมายเลขโปรเจ็กต์ที่ API บางตัวใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 ค่าเหล่านี้ในเอกสารประกอบ
  1. ถัดไป คุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของระบบคลาวด์ การใช้งาน Codelab นี้น่าจะไม่มีค่าใช้จ่ายใดๆ หากมี หากต้องการปิดทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ ให้ทำตาม "การล้าง" ดูได้ที่ตอนท้ายของ Codelab ผู้ใช้ใหม่ของ Google Cloud จะมีสิทธิ์เข้าร่วมโปรแกรมทดลองใช้ฟรี$300 USD

เริ่มต้น Cloud Shell

แม้ว่าคุณจะดำเนินการ Google Cloud จากระยะไกลได้จากแล็ปท็อป แต่คุณจะใช้ Google Cloud Shell ซึ่งเป็นสภาพแวดล้อมแบบบรรทัดคำสั่งที่ทำงานในระบบคลาวด์ใน Codelab นี้

จากคอนโซล GCP ให้คลิกไอคอน Cloud Shell บนแถบเครื่องมือด้านขวาบนดังนี้

bce75f34b2c53987.png

การจัดสรรและเชื่อมต่อกับสภาพแวดล้อมนี้ควรใช้เวลาเพียงครู่เดียว เมื่อเสร็จแล้ว คุณจะเห็นข้อมูลต่อไปนี้

f6ef2b5f13479f3a.png

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

3. ข้อมูลเบื้องต้นเกี่ยวกับ Eventarc

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

776ed63706ca9683.png

คุณดึงเหตุการณ์จากซอร์สของ Google Cloud และแอปพลิเคชันที่กําหนดเองซึ่งเผยแพร่ไปยัง Cloud Pub/Sub และส่งเหตุการณ์เหล่านั้นไปยังซิงก์ Google Cloud Run ได้

ระบบจะส่งเหตุการณ์จากต้นทางของ Google Cloud ที่หลากหลายโดยใช้บันทึก Cloud Audit เวลาในการตอบสนองและความพร้อมใช้งานของการนำส่งเหตุการณ์จากแหล่งที่มาเหล่านี้จะเชื่อมโยงกับบันทึกของ Cloud Audit เมื่อใดก็ตามที่เหตุการณ์จากแหล่งที่มาของ Google Cloud เริ่มทำงาน ระบบจะสร้างรายการบันทึกการตรวจสอบระบบคลาวด์ที่สอดคล้องกัน

แอปพลิเคชันที่กำหนดเองซึ่งเผยแพร่ไปยัง Cloud Pub/Sub จะเผยแพร่ข้อความไปยังหัวข้อ Pub/Sub ที่ระบุในรูปแบบใดก็ได้

ทริกเกอร์เหตุการณ์เป็นกลไกการกรองในการระบุเหตุการณ์ที่จะนำส่งไปยังซิงก์ใด

ระบบจะส่งเหตุการณ์ทั้งหมดในรูปแบบ CloudEvents v1.0 เพื่อความสามารถในการทำงานร่วมกันระหว่างบริการ

4. ก่อนเริ่มต้น

เปิดใช้ API

คุณต้องใช้บริการ Eventarc เพื่อทริกเกอร์บริการ Cloud Run ตรวจสอบว่าได้เปิดใช้แล้ว โดยทำดังนี้

gcloud services enable eventarc.googleapis.com

คุณควรเห็นการดำเนินการที่เสร็จสิ้นเรียบร้อยแล้ว

Operation "operations/acf.5c5ef4f6-f734-455d-b2f0-ee70b5a17322" finished successfully.

กำหนดค่าบัญชีบริการ

ระบบจะใช้บัญชีบริการประมวลผลเริ่มต้นในทริกเกอร์ มอบบทบาท eventarc.eventReceiver ให้กับบัญชีบริการประมวลผลเริ่มต้น

PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format='value(projectNumber)')

gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
    --member serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com \
    --role roles/eventarc.eventReceiver

มอบบทบาท pubsub.publisher ให้กับบัญชีบริการ Cloud Storage จําเป็นสําหรับทริกเกอร์ Eventarc Cloud Storage

SERVICE_ACCOUNT=$(gsutil kms serviceaccount -p $PROJECT_NUMBER)

gcloud projects add-iam-policy-binding $PROJECT_NUMBER \
    --member serviceAccount:$SERVICE_ACCOUNT \
    --role roles/pubsub.publisher

หากเปิดใช้บัญชีบริการ Pub/Sub ในวันที่ 8 เมษายน 2021 หรือก่อนหน้านั้น โปรดมอบบทบาท iam.serviceAccountTokenCreator ให้กับบัญชีบริการ Pub/Sub ดังนี้

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
  --role roles/iam.serviceAccountTokenCreator

5. โคลนโค้ด

โคลนโค้ดหากยังไม่ได้ทำใน Code Lab ก่อนหน้านี้:

git clone https://github.com/GoogleCloudPlatform/serverless-photosharing-workshop

จากนั้นคุณจะไปที่ไดเรกทอรีที่มีบริการได้โดยทำดังนี้

cd serverless-photosharing-workshop/services/garbage-collector/nodejs

คุณจะมีการจัดวางไฟล์ดังต่อไปนี้สำหรับบริการ:

services
 |
 ├── garbage-collector
      |
      ├── nodejs
           |
           ├── index.js
           ├── package.json

ภายในโฟลเดอร์จะมี 3 ไฟล์ดังนี้

  • index.js มีโค้ด Node.js
  • package.json กำหนดทรัพยากร Dependency ของไลบรารี

6. สำรวจโค้ด

การขึ้นต่อกัน

ไฟล์ package.json จะกำหนดทรัพยากร Dependency ของไลบรารีที่ต้องการดังนี้

{
  "name": "garbage_collector_service",
  "version": "0.0.1",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "dependencies": {
    "cloudevents": "^4.0.1",
    "express": "^4.17.1",
    "@google/events": "^3.1.0",
    "@google-cloud/firestore": "^4.9.9",
    "@google-cloud/storage": "^5.8.3"
  }
}

เราอาศัยไลบรารี Cloud Storage ในการลบอิมเมจภายใน Cloud Storage เราประกาศการพึ่งพา Cloud Firestore เพื่อลบข้อมูลเมตาของรูปภาพที่จัดเก็บไว้ก่อนหน้านี้ด้วย นอกจากนี้ เรายังใช้ CloudEvents SDK และไลบรารี Google Events เพื่ออ่าน CloudEvents ที่ส่งโดย Eventarc Express เป็นเฟรมเวิร์กเว็บ JavaScript / โหนด Bluebird ใช้สำหรับการจัดการสัญญา

index.js

มาดูรายละเอียดเกี่ยวกับโค้ด index.js กัน

const express = require('express');
const {Storage} = require('@google-cloud/storage');
const Firestore = require('@google-cloud/firestore');
const { HTTP } = require("cloudevents");
const {toStorageObjectData} = require('@google/events/cloud/storage/v1/StorageObjectData');

เรากำหนดให้ใช้ทรัพยากร Dependency ต่างๆ ที่จำเป็นสำหรับโปรแกรม ดังนี้ Express คือเฟรมเวิร์กเว็บของโหนดที่เราจะใช้งาน Bluebird เป็นไลบรารีสำหรับจัดการคำขอของ JavaScript, พื้นที่เก็บข้อมูลและ Firestore ใช้สำหรับทำงานร่วมกับ Google Cloud Storage (ที่เก็บข้อมูลรูปภาพ) และที่เก็บข้อมูล Cloud Firestore ตามลำดับ นอกจากนี้ เราต้องการให้ CloudEvent อ่าน CloudEvent ที่ส่งโดย Eventarc StoreObjectData จากไลบรารีเหตุการณ์ของ Google เพื่ออ่านเนื้อหาเหตุการณ์ Cloud Storage ของ CloudEvent

const app = express();
app.use(express.json());

app.post('/', async (req, res) => {
    try {
        const cloudEvent = HTTP.toEvent({ headers: req.headers, body: req.body });
        console.log(cloudEvent);


        /* ... */

    } catch (err) {
        console.log(`Error: ${err}`);
        res.status(500).send(err);
    }
});

ด้านบนเรามีโครงสร้างของเครื่องจัดการโหนด โดยแอปของเราจะตอบสนองต่อคำขอ HTTP POST โดยจะอ่าน CloudEvent จากคำขอ HTTP และเรากำลังจัดการข้อผิดพลาดเล็กน้อยหากเกิดข้อผิดพลาด มาดูกันว่าในโครงสร้างนี้มีอะไรบ้าง

ขั้นตอนถัดไปคือการดึงข้อมูลและแยกวิเคราะห์เนื้อหาของ CloudEvent และเรียกข้อมูลชื่อออบเจ็กต์

const storageObjectData = toStorageObjectData(cloudEvent.data);
console.log(storageObjectData);

const objectName = storageObjectData.name;

เมื่อทราบชื่อรูปภาพแล้ว เราสามารถลบรูปภาพนั้นออกจากที่เก็บข้อมูลภาพขนาดย่อได้ โดยทำดังนี้

try {
    await storage.bucket(bucketThumbnails).file(objectName).delete();
    console.log(`Deleted '${objectName}' from bucket '${bucketThumbnails}'.`);
}
catch(err) {
    console.log(`Failed to delete '${objectName}' from bucket '${bucketThumbnails}': ${err}.`);
}

ในขั้นตอนสุดท้าย ให้ลบข้อมูลเมตาของภาพออกจากคอลเล็กชัน Firestore ด้วย

try {
    const pictureStore = new Firestore().collection('pictures');
    const docRef = pictureStore.doc(objectName);
    await docRef.delete();

    console.log(`Deleted '${objectName}' from Firestore collection 'pictures'`);
}
catch(err) {
    console.log(`Failed to delete '${objectName}' from Firestore: ${err}.`);
}

res.status(200).send(`Processed '${objectName}'.`);

ตอนนี้ถึงเวลาทำให้สคริปต์โหนดของเรารับฟังคำขอที่เข้ามาแล้ว นอกจากนี้ ให้ตรวจสอบด้วยว่ามีการตั้งค่าตัวแปรสภาพแวดล้อมที่จำเป็นแล้ว ดังนี้

app.listen(PORT, () => {
    if (!bucketThumbnails) throw new Error("BUCKET_THUMBNAILS not set");
    console.log(`Started service on port ${PORT}`);
});

7. ทดสอบในเครื่อง

ทดสอบโค้ดภายในเครื่องเพื่อให้แน่ใจว่าโค้ดใช้งานได้ก่อนทำให้ใช้งานได้บนระบบคลาวด์

ภายในโฟลเดอร์ garbage-collector/nodejs ให้ติดตั้งการอ้างอิง npm และเริ่มต้นเซิร์ฟเวอร์:

export BUCKET_THUMBNAILS=thumbnails-$GOOGLE_CLOUD_PROJECT

npm install; npm start

หากทุกอย่างเป็นไปอย่างถูกต้อง เซิร์ฟเวอร์ควรเริ่มที่พอร์ต 8080:

Started service on port 8080

ใช้ CTRL-C เพื่อออก

8. สร้างและทำให้ใช้งานได้กับ Cloud Run

ก่อนทำให้ใช้งานได้กับ Cloud Run ให้ตั้งค่าภูมิภาค Cloud Run เป็นภูมิภาคและแพลตฟอร์มที่รองรับเป็น managed ดังนี้

REGION=europe-west1
gcloud config set run/region $REGION
gcloud config set run/platform managed

คุณจะตรวจสอบได้ว่ามีการกำหนดค่าโดยทำดังนี้

gcloud config list

...
[run]
platform = managed
region = europe-west1

แทนที่จะสร้างและเผยแพร่อิมเมจคอนเทนเนอร์โดยใช้ Cloud Build ด้วยตนเอง คุณยังใช้ Cloud Run สร้างอิมเมจคอนเทนเนอร์ให้คุณโดยใช้ Google Cloud Buildpack ได้ด้วย

เรียกใช้คำสั่งต่อไปนี้เพื่อสร้างอิมเมจคอนเทนเนอร์โดยใช้ Google Cloud Buildpack จากนั้นทำให้อิมเมจคอนเทนเนอร์ใช้งานได้ใน Cloud Run

SERVICE_NAME=garbage-collector-service

gcloud run deploy $SERVICE_NAME \
    --source . \
    --no-allow-unauthenticated \
    --update-env-vars BUCKET_THUMBNAILS=$BUCKET_THUMBNAILS

จดบันทึก –-source การดำเนินการนี้จะตั้งค่าสถานะ Cloud Run ให้ใช้ Google Cloud Buildpack เพื่อสร้างอิมเมจคอนเทนเนอร์โดยไม่มี Dockerfile. Flag --no-allow-unauthenticated ทำให้บริการ Cloud Run เป็นบริการภายในที่จะทริกเกอร์โดยบัญชีบริการที่ระบุเท่านั้น คุณจะสร้างทริกเกอร์ด้วยบัญชีบริการประมวลผลเริ่มต้นที่มีบทบาทrun.invokerสำหรับเรียกใช้บริการ Cloud Run ภายในในภายหลัง

9. สร้างทริกเกอร์

ใน Eventarc ทริกเกอร์จะกำหนดว่าบริการใดควรได้รับเหตุการณ์ประเภทใด ในกรณีนี้ คุณต้องการให้บริการได้รับเหตุการณ์เมื่อมีการลบไฟล์ในที่เก็บข้อมูล

ตั้งค่าตำแหน่งของทริกเกอร์ในภูมิภาคเดียวกับที่เก็บข้อมูลรูปภาพที่อัปโหลด

gcloud config set eventarc/location eu

สร้างทริกเกอร์ AuditLog เพื่อกรองเหตุการณ์ storage.objects.delete และส่งไปยังบริการ Cloud Run ดังนี้

BUCKET_IMAGES=uploaded-pictures-$GOOGLE_CLOUD_PROJECT

gcloud eventarc triggers create trigger-$SERVICE_NAME \
  --destination-run-service=$SERVICE_NAME \
  --destination-run-region=$REGION \
  --event-filters="type=google.cloud.storage.object.v1.deleted" \
  --event-filters="bucket=$BUCKET_IMAGES" \
  --service-account=$PROJECT_NUMBER-compute@developer.gserviceaccount.com

คุณตรวจสอบอีกครั้งว่าสร้างทริกเกอร์ได้ด้วยคำสั่งนี้

gcloud eventarc triggers list

10. ทดสอบบริการ

หากต้องการทดสอบว่าบริการทำงานได้ไหม ให้ไปที่ที่เก็บข้อมูล uploaded-pictures แล้วลบรูปภาพใดรูปหนึ่ง คุณควรเห็นในบันทึกของบริการว่าบริการได้ลบภาพที่เกี่ยวข้องในที่เก็บข้อมูล thumbnails และยังลบเอกสารออกจากคอลเล็กชัน pictures Firestore ด้วย

519abf90e7ea4d12.png

11. ล้างข้อมูล (ไม่บังคับ)

หากไม่ต้องการใช้ห้องทดลองอื่นๆ ในชุดนี้ต่อ คุณสามารถล้างทรัพยากรเพื่อประหยัดต้นทุนและเป็นพลเมืองระบบคลาวด์ที่ดีโดยรวม คุณสามารถล้างทรัพยากรแต่ละรายการได้ดังนี้

ลบบริการ

gcloud run services delete $SERVICE_NAME -q

ลบทริกเกอร์ Eventarc ดังนี้

gcloud eventarc triggers delete trigger-$SERVICE_NAME -q

หรือจะลบทั้งโปรเจ็กต์ก็ได้ โดยทำดังนี้

gcloud projects delete $GOOGLE_CLOUD_PROJECT

12. ยินดีด้วย

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

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

  • Cloud Run
  • Cloud Storage
  • Cloud Firestore
  • Eventarc