เริ่มต้นใช้งานฟังก์ชัน Cloud Run ที่ทำงานตามเหตุการณ์

1. บทนำ

ภาพรวม

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

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

ในส่วนนี้ คุณจะได้เรียนรู้วิธีทำให้ฟังก์ชันที่ทำงานตามเหตุการณ์ใช้งานได้ใน Node คุณจะทําให้ฟังก์ชันทริกเกอร์เมื่อใดก็ตามที่มีการสร้างออบเจ็กต์ในที่เก็บข้อมูล Google Cloud Storage

Codelab นี้ใช้ตัวอย่าง nodejs ในตัวอย่างด้านล่าง อย่างไรก็ตาม คุณสามารถใช้ตัวอย่างโค้ดของ Cloud Functions รุ่นที่ 2 ในภาษาที่ต้องการได้ ดังนี้

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

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

2. ตั้งค่าตัวแปรสภาพแวดล้อมและเปิดใช้ API

อัปเดต gcloud CLI

โค้ดแล็บนี้กำหนดให้ต้องติดตั้ง gcloud CLI เวอร์ชันล่าสุด คุณอัปเดต CLI ได้โดยเรียกใช้

gcloud components update

เปิดใช้ API

คุณต้องเปิดใช้ API หลายรายการก่อนจึงจะเริ่มใช้ Codelab นี้ได้ โค้ดแล็บนี้ต้องใช้ API ต่อไปนี้ คุณเปิดใช้ API เหล่านั้นได้โดยเรียกใช้คําสั่งต่อไปนี้

gcloud services enable run.googleapis.com \
    cloudbuild.googleapis.com \
    storage.googleapis.com \
    artifactregistry.googleapis.com

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

คุณสามารถตั้งค่าตัวแปรสภาพแวดล้อมที่จะใช้ในโค้ดแล็บนี้

PROJECT_ID=<YOUR_PROJECT_ID>
REGION=<YOUR_REGION, e.g. us-central1>

gcloud config set project $PROJECT_ID
SERVICE_NAME=crf-event-codelab
BUCKET_NAME=$PROJECT_ID-$SERVICE_NAME
TRIGGER_NAME=$SERVICE_NAME-trigger

3. สร้างที่เก็บข้อมูลและบัญชีบริการ

สร้างที่เก็บข้อมูล

คุณสร้างที่เก็บข้อมูล Cloud Storage ได้โดยเรียกใช้คำสั่งต่อไปนี้

gsutil mb -l us-central1 gs://$BUCKET_NAME

สร้างบัญชีบริการ

ในตัวอย่างนี้ คุณจะต้องสร้างบัญชีบริการที่มีสิทธิ์ EventArc ที่จำเป็นและบทบาทผู้เรียกใช้ Cloud Run เพื่อรับเหตุการณ์จาก Cloud Storage และเรียกใช้ฟังก์ชัน Cloud Run

ขั้นแรก ให้สร้างบัญชีบริการ

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

SERVICE_ACCOUNT="cloud-run-functions"
SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

gcloud iam service-accounts create $SERVICE_ACCOUNT \
  --display-name="Cloud Run functions Eventarc service account"

จากนั้นให้บทบาทผู้รับเหตุการณ์ Eventarc (roles/eventarc.eventReceiver) ในโปรเจ็กต์แก่บัญชีบริการที่เชื่อมโยงกับทริกเกอร์ Eventarc เพื่อให้ทริกเกอร์รับเหตุการณ์จากผู้ให้บริการเหตุการณ์ได้

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/eventarc.eventReceiver

จากนั้นให้สิทธิ์บัญชีบริการเป็นบทบาทผู้เรียกใช้ Cloud Run เพื่อให้เรียกใช้ฟังก์ชันได้

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/run.invoker

4. สร้างและทำให้ฟังก์ชันใช้งานได้

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

mkdir ../$SERVICE_NAME && cd $_

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

{
    "dependencies": {
        "@google-cloud/functions-framework": "^3.0.0"
    }
}

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

const functions = require("@google-cloud/functions-framework");

// Register a CloudEvent callback with the Functions Framework that will
// be triggered by Cloud Storage.
functions.cloudEvent("helloGCS", (cloudEvent) => {
    console.log(`Event ID: ${cloudEvent.id}`);
    console.log(`Event Type: ${cloudEvent.type}`);

    const file = cloudEvent.data;
    console.log(`Bucket: ${file.bucket}`);
    console.log(`File: ${file.name}`);
    console.log(`Metageneration: ${file.metageneration}`);
    console.log(`Created: ${file.timeCreated}`);
    console.log(`Updated: ${file.updated}`);
});

ตอนนี้คุณทำให้ฟังก์ชัน Cloud Run ใช้งานได้แล้วโดยเรียกใช้คําสั่งต่อไปนี้

gcloud beta run deploy $SERVICE_NAME \
 --source . \
      --function helloGCS \
      --region $REGION \
      --no-allow-unauthenticated

โปรดทราบว่า

  • Flag –source ใช้เพื่อบอก Cloud Run ให้สร้างฟังก์ชันเป็นบริการแบบคอนเทนเนอร์ที่เรียกใช้ได้
  • Flag –function (ใหม่) ใช้เพื่อตั้งค่าจุดแรกเข้าของบริการใหม่ให้เป็นลายเซ็นฟังก์ชันที่คุณต้องการเรียกใช้
  • (ไม่บังคับ) –no-allow-unauthenticated เพื่อไม่ให้เรียกใช้ฟังก์ชันแบบสาธารณะได้

คุณสามารถดูบริการใหม่ crf-nodejs-event ได้โดยเรียกใช้คําสั่งต่อไปนี้

gcloud beta run services describe $SERVICE_NAME

5. สร้างเหตุการณ์

เราสามารถสร้างทริกเกอร์ Eventarc เพื่อส่งข้อความไปยังฟังก์ชันทุกครั้งที่มีการสร้างออบเจ็กต์ใน Google Cloud Storage เสร็จสมบูรณ์ ดังนี้

BUCKET_REGION=$REGION

gcloud eventarc triggers create $TRIGGER_NAME \
     --location=$REGION \
     --destination-run-service=crf-nodejs-event \
  --destination-run-region=$BUCKET_REGION \
     --event-filters="type=google.cloud.storage.object.v1.finalized" \
     --event-filters="bucket=$BUCKET_NAME" \
     --service-account=$SERVICE_ACCOUNT_ADDRESS

โปรดทราบว่า

  • gcs-function-trigger คือชื่อของทริกเกอร์
  • crf-nodejs-event คือชื่อบริการ Cloud Run ที่ทําให้ฟังก์ชันใช้งานได้
  • สําหรับ Flag –event-filters อย่าใช้คํานําหน้า gs:// ในชื่อที่เก็บข้อมูล

ดูบทแนะนำโดยละเอียดเกี่ยวกับการตั้งค่าบริการทริกเกอร์จาก Cloud Storage โดยใช้ Eventarc ได้ในเอกสารประกอบของ Cloud Run ที่ https://cloud.google.com/run/docs/tutorials/eventarc

6. ทดสอบฟังก์ชัน

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

# get the Service URL
SERVICE_URL="$(gcloud run services describe crf-nodejs-event --region us-central1 --format 'value(status.url)')"

# invoke the service
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

เมื่อทําให้การทํางานของฟังก์ชันและสร้างทริกเกอร์แล้ว เราพร้อมที่จะเรียกใช้ฟังก์ชันแล้ว

สร้างไฟล์และอัปโหลดไปยังที่เก็บข้อมูล Cloud Storage ซึ่งทำได้ผ่านเว็บอินเทอร์เฟซของ Cloud Console หรือใช้เครื่องมือ CLI ของ gsutil เช่น

echo "hello world" > test.txt
gsutil cp test gs://$BUCKET_NAME

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

gcloud logging read "resource.labels.service_name=crf-nodejs-event AND textPayload: File" --format=json 

และคุณควรเห็นเอาต์พุตต่อไปนี้

"textPayload": "File: test.txt"

7. ยินดีด้วย

ยินดีด้วยที่ทํา Codelab จนเสร็จสมบูรณ์

เราขอแนะนําให้อ่านเอกสารประกอบเกี่ยวกับฟังก์ชัน Cloud Run

สิ่งที่เราได้พูดถึง

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

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

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

หากต้องการลบบริการ Cloud Run ให้ไปที่คอนโซล Cloud Run ที่ https://console.cloud.google.com/run/ แล้วลบบริการ crf-event-codelab ที่คุณสร้างในโค้ดแล็บนี้

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