ทริกเกอร์บริการ Kubernetes ด้วยเหตุการณ์ Eventarc

1. บทนำ

cb762f29e9183a3f.png

Eventarc ช่วยให้เชื่อมต่อบริการต่างๆ (Cloud Run, Kubernetes, Workflows) กับเหตุการณ์จากแหล่งที่มาต่างๆ ได้อย่างง่ายดาย ซึ่งช่วยให้คุณสร้างสถาปัตยกรรมที่ขับเคลื่อนด้วยเหตุการณ์ซึ่งมีการเชื่อมต่อและกระจาย Microservice แบบหลวมๆ นอกจากนี้ยังดูแลการส่งผ่านข้อมูลของเหตุการณ์ การนำส่ง การรักษาความปลอดภัย การให้สิทธิ์ และการจัดการข้อผิดพลาดให้คุณด้วย ซึ่งจะช่วยเพิ่มความคล่องตัวให้กับนักพัฒนาซอฟต์แวร์และความยืดหยุ่นของแอปพลิเคชัน ดูทริกเกอร์ Cloud Run ด้วยเหตุการณ์จาก Eventarc codelab เพื่อดูข้อมูลเบื้องต้นเกี่ยวกับ Eventarc

ใน Codelab นี้ คุณจะต้องใช้ Eventarc เพื่ออ่านเหตุการณ์จาก Pub/Sub, Cloud Storage และบันทึก Cloud Audit และส่งต่อไปยังบริการ Kubernetes ที่ทำงานบน Google Kubernetes Engine (GKE)

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

  • สร้างคลัสเตอร์ GKE
  • สร้างบริการ GKE เป็นซิงก์เหตุการณ์
  • สร้างทริกเกอร์ Pub/Sub
  • สร้างทริกเกอร์ Cloud Storage
  • สร้างทริกเกอร์บันทึกการตรวจสอบระบบคลาวด์

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

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

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

เริ่มต้น Cloud Shell

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

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

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

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

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

ตรวจสอบใน Cloud Shell ว่าได้ตั้งค่ารหัสโปรเจ็กต์แล้ว ดังนี้

PROJECT_ID=your-project-id
gcloud config set project $PROJECT_ID

3. สร้างคลัสเตอร์ GKE

ก่อนอื่น ให้เปิดใช้บริการที่จำเป็นสำหรับ GKE ด้วยคำสั่งต่อไปนี้

gcloud services enable container.googleapis.com

สร้างคลัสเตอร์ Autopilot GKE ด้วยคำสั่งต่อไปนี้

CLUSTER_NAME=eventarc-cluster
REGION=us-central1

gcloud container clusters create-auto $CLUSTER_NAME --region $REGION

โปรดตรวจสอบว่าการสร้างคลัสเตอร์เสร็จสมบูรณ์ก่อนไปยังขั้นตอนถัดไป

4. ทำให้บริการ GKE ใช้งานได้

ก่อนทำให้บริการใช้งานได้ โปรดรับข้อมูลเข้าสู่ระบบการตรวจสอบสิทธิ์เพื่อโต้ตอบกับคลัสเตอร์ด้วย kubectl:

gcloud container clusters get-credentials $CLUSTER_NAME \
    --region $REGION

จากนั้นทำให้ Hello Container ของ Cloud Run เป็นการติดตั้งใช้งาน Kubernetes บน GKE ได้ บันทึกบริการนี้ได้รับคำขอ HTTP และ CloudEvents:

SERVICE_NAME=hello-gke

kubectl create deployment $SERVICE_NAME \
    --image=gcr.io/cloudrun/hello

แสดงการทำให้ใช้งานได้เป็นบริการ Kubernetes ภายใน การดำเนินการนี้จะสร้างบริการที่มี IP แบบคงที่ที่เข้าถึงได้ภายในคลัสเตอร์ ดังนี้

kubectl expose deployment $SERVICE_NAME \
  --type ClusterIP --port 80 --target-port 8080

ก่อนไปยังขั้นตอนถัดไป ตรวจสอบว่าพ็อดทำงานอยู่

kubectl get pods

NAME                        READY   STATUS
hello-gke-df6469d4b-5vv22   1/1     Running

นอกจากนี้ คุณยังดูบริการต่อไปนี้ได้

kubectl get svc

NAME         TYPE           CLUSTER-IP    EXTERNAL-IP
hello-gke    LoadBalancer   10.51.1.26    <none>

5. ตั้งค่า Eventarc

ในขั้นตอนนี้ คุณจะได้เรียกใช้ขั้นตอนในการตั้งค่า Eventarc และเริ่มต้นปลายทาง Eventarc GKE

ก่อนอื่น ให้เปิดใช้บริการที่จำเป็นสำหรับปลายทาง GKE ของ Eventarc และ Eventarc ดังนี้

gcloud services enable eventarc.googleapis.com \
  cloudresourcemanager.googleapis.com

ถัดไป ให้เปิดใช้ Eventarc เพื่อจัดการคลัสเตอร์ GKE โดยทำดังนี้

gcloud eventarc gke-destinations init

Eventarc สร้างพ็อด Event Forwarder แยกต่างหากสำหรับทริกเกอร์แต่ละรายการที่กำหนดเป้าหมายบริการ GKE และต้องมีสิทธิ์อย่างชัดแจ้งในการเปลี่ยนแปลงคลัสเตอร์ โดยการให้สิทธิ์แก่บัญชีบริการพิเศษเพื่อจัดการทรัพยากรในคลัสเตอร์ คุณต้องดำเนินการนี้ 1 ครั้งต่อโปรเจ็กต์ Google Cloud 1 โปรเจ็กต์

6. การค้นหาเหตุการณ์

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

คุณดูเหตุการณ์ต่างๆ ที่ Eventarc รองรับได้ในหน้าเอกสารประกอบ และยังสำรวจเหตุการณ์ต่างๆ โดยใช้ gcloud ได้ด้วย

วิธีดูรายการเหตุการณ์ประเภทต่างๆ

gcloud beta eventarc attributes types list

NAME                                           DESCRIPTION
google.cloud.audit.log.v1.written              Cloud Audit Log written
google.cloud.pubsub.topic.v1.messagePublished  Cloud Pub/Sub message published
google.cloud.storage.object.v1.archived         Cloud Storage: Sent when a live version of an (object versioned) object is archived or deleted.
google.cloud.storage.object.v1.deleted          Cloud Storage: Sent when an object has been permanently deleted.
google.cloud.storage.object.v1.finalized        Cloud Storage: Sent when a new object (or a new generation of an existing object).
google.cloud.storage.object.v1.metadataUpdated  Cloud Storage: Sent when the metadata of an existing object changes.

วิธีดูข้อมูลเพิ่มเติมเกี่ยวกับกิจกรรมแต่ละประเภท

gcloud beta eventarc attributes types describe google.cloud.audit.log.v1.written

attributes: type,serviceName,methodName,resourceName
description: 'Cloud Audit Log: Sent when a log is written.'
name: google.cloud.audit.log.v1.written

วิธีดูรายการบริการที่เผยแพร่เหตุการณ์บางประเภท

gcloud beta eventarc attributes service-names list --type=google.cloud.audit.log.v1.written

SERVICE_NAME                                DISPLAY_NAME
accessapproval.googleapis.com               Access Approval
accesscontextmanager.googleapis.com         Access Context Manager
admin.googleapis.com                        Google Workspace Admin
aiplatform.googleapis.com                   AI Platform (under Vertex AI)
apigee.googleapis.com                       Apigee
apigeeconnect.googleapis.com                Apigee Connect
...
workflows.googleapis.com                    Workflows

วิธีดูรายการชื่อเมธอด (เหตุการณ์ย่อย) ที่แต่ละบริการปล่อยออกมาได้

gcloud beta eventarc attributes method-names list --type=google.cloud.audit.log.v1.written --service-name=workflows.googleapis.com

METHOD_NAME
google.cloud.workflows.v1.Workflows.CreateWorkflow
google.cloud.workflows.v1.Workflows.DeleteWorkflow
google.cloud.workflows.v1.Workflows.GetWorkflow
google.cloud.workflows.v1.Workflows.ListWorkflows
google.cloud.workflows.v1.Workflows.UpdateWorkflow
google.cloud.workflows.v1beta.Workflows.CreateWorkflow
google.cloud.workflows.v1beta.Workflows.DeleteWorkflow
google.cloud.workflows.v1beta.Workflows.GetWorkflow
google.cloud.workflows.v1beta.Workflows.ListWorkflows
google.cloud.workflows.v1beta.Workflows.UpdateWorkflow

7. สร้างทริกเกอร์ Pub/Sub

วิธีหนึ่งในการรับเหตุการณ์คือผ่านทาง Pub/Sub แอปพลิเคชันทุกชนิดสามารถเผยแพร่ข้อความไปยัง Pub/Sub ได้และสามารถส่งข้อความเหล่านี้ไปยังบริการต่างๆ ผ่าน Eventarc

ตั้งค่า

ก่อนสร้างทริกเกอร์ คุณต้องมีบัญชีบริการที่ทริกเกอร์ใช้

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

SERVICE_ACCOUNT=eventarc-gke-trigger-sa

gcloud iam service-accounts create $SERVICE_ACCOUNT

บัญชีบริการต้องได้รับบทบาทต่อไปนี้สำหรับทริกเกอร์ที่มีปลายทาง GKE

  • roles/pubsub.subscriber
  • roles/monitoring.metricWriter
  • roles/eventarc.eventReceiver (สำหรับทริกเกอร์ AuditLog เท่านั้น เราจะเพิ่มข้อมูลนี้ในขั้นตอนถัดไป)

มอบบทบาท:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com \
  --role roles/pubsub.subscriber

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com \
  --role roles/monitoring.metricWriter

สร้าง

สร้างทริกเกอร์เพื่อกำหนดเส้นทางข้อความ Pub/Sub ไปยังบริการของคุณดังนี้

TRIGGER_NAME=trigger-pubsub-gke

gcloud eventarc triggers create $TRIGGER_NAME \
  --destination-gke-cluster=$CLUSTER_NAME \
  --destination-gke-location=$REGION \
  --destination-gke-namespace=default \
  --destination-gke-service=$SERVICE_NAME \
  --destination-gke-path=/ \
  --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
  --location=$REGION \
  --service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

ทดสอบ

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

gcloud eventarc triggers list

ทริกเกอร์ Pub/Sub จะสร้างหัวข้อ Pub/Sub ภายใต้หน้าปก ลองหาตัวแปรและกำหนดตัวแปรดังนี้

TOPIC_ID=$(gcloud eventarc triggers describe $TRIGGER_NAME --location $REGION --format='value(transport.pubsub.topic)')

ใช้ gcloud เพื่อเผยแพร่ข้อความไปยังหัวข้อ

gcloud pubsub topics publish $TOPIC_ID --message="Hello World"

หากต้องการตรวจสอบว่าได้รับเหตุการณ์หรือไม่ ให้ค้นหาชื่อพ็อดก่อน โดยทำดังนี้

kubectl get pods

NAME                        READY   STATUS
hello-gke-df6469d4b-5vv22   1/1     Running

แล้วจัดเก็บไว้ในตัวแปร ดังนี้

POD_NAME=hello-gke-df6469d4b-5vv22 

ตรวจสอบบันทึกของพ็อดเพื่อยืนยันเหตุการณ์ที่ได้รับ ดังนี้

kubectl logs $POD_NAME

{
  "severity": "INFO",
  "eventType": "google.cloud.pubsub.topic.v1.messagePublished",
  "message": "Received event of type google.cloud.pubsub.topic.v1.messagePublished. Event data: Hello World",
  "event": {
    "data": {
      "subscription": "projects/atamel-eventarc-gke/subscriptions/eventarc-us-central1-trigger-pubsub-gke-sub-270",
      "message": {
        "data": "SGVsbG8gV29ybGQ=",
        "messageId": "6031025573654834",
        "publishTime": "2022-10-19T14:13:07.990Z"
      }
    },
    "datacontenttype": "application/json",
    "id": "6031025573654834",
    "source": "//pubsub.googleapis.com/projects/atamel-eventarc-gke/topics/eventarc-us-central1-trigger-pubsub-gke-729",
    "specversion": "1.0",
    "time": "2022-10-19T14:13:07.99Z",
    "type": "google.cloud.pubsub.topic.v1.messagePublished"
  }
}

8. สร้างทริกเกอร์ Cloud Storage

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

ตั้งค่า

ก่อนสร้างทริกเกอร์ Cloud Storage ให้สร้างที่เก็บข้อมูลเพื่อรับเหตุการณ์จากแหล่งที่มาต่อไปนี้

BUCKET_NAME=eventarc-gcs-$PROJECT_ID
gsutil mb -l $REGION gs://$BUCKET_NAME

คุณต้องเพิ่มบทบาท pubsub.publisher ไปยังบัญชีบริการ Cloud Storage สำหรับทริกเกอร์ Cloud Storage ด้วย

SERVICE_ACCOUNT_STORAGE=$(gsutil kms serviceaccount -p $PROJECT_ID)
gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member serviceAccount:$SERVICE_ACCOUNT_STORAGE \
    --role roles/pubsub.publisher

สร้าง

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

TRIGGER_NAME=trigger-storage-gke

gcloud eventarc triggers create $TRIGGER_NAME \
  --destination-gke-cluster=$CLUSTER_NAME \
  --destination-gke-location=$REGION \
  --destination-gke-namespace=default \
  --destination-gke-service=$SERVICE_NAME \
  --destination-gke-path=/ \
  --event-filters="type=google.cloud.storage.object.v1.finalized" \
  --event-filters="bucket=$BUCKET_NAME" \
  --location=$REGION \
  --service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

ทดสอบ

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

gcloud eventarc triggers list

สร้างไฟล์และใช้ gsutil เพื่ออัปโหลดไฟล์ไปยังที่เก็บข้อมูล

echo "Hello World" > random.txt
gsutil cp random.txt gs://$BUCKET_NAME/random.txt

ตรวจสอบบันทึกของพ็อดเพื่อยืนยันเหตุการณ์ที่ได้รับ ดังนี้

kubectl logs $POD_NAME

{
  "severity": "INFO",
  "eventType": "google.cloud.storage.object.v1.finalized",
  "message": "Received event of type google.cloud.storage.object.v1.finalized. Event data: {\n  \"kind\": \"storage#object\",\n  \"id\": \"eventarc-gcs-atamel-eventarc-gke/random.txt/1666190425669022\",\n  \"selfLink\": \"https://www.googleapis.com/storage/v1/b/eventarc-gcs-atamel-eventarc-gke/o/random.txt\",\n  \"name\": \"random.txt\",\n  \"bucket\": \"eventarc-gcs-atamel-eventarc-gke\",\n  \"generation\": \"1666190425669022\",\n  \"metageneration\": \"1\",\n  \"contentType\": \"text/plain\",\n  \"timeCreated\": \"2022-10-19T14:40:25.678Z\",\n  \"updated\": \"2022-10-19T14:40:25.678Z\",\n  \"storageClass\": \"STANDARD\",\n  \"timeStorageClassUpdated\": \"2022-10-19T14:40:25.678Z\",\n  \"size\": \"12\",\n  \"md5Hash\": \"5Z/5eUEET4XfUpfhwwLSYA==\",\n  \"mediaLink\": \"https://storage.googleapis.com/download/storage/v1/b/eventarc-gcs-atamel-eventarc-gke/o/random.txt?generation=1666190425669022\u0026alt=media\",\n  \"contentLanguage\": \"en\",\n  \"crc32c\": \"R1jUOQ==\",\n  \"etag\": \"CJ77zIPD7PoCEAE=\"\n}\n",
  "event": {
    "bucket": "eventarc-gcs-atamel-eventarc-gke",
    "data": {
      "kind": "storage#object",
      "id": "eventarc-gcs-atamel-eventarc-gke/random.txt/1666190425669022",
      "selfLink": "https://www.googleapis.com/storage/v1/b/eventarc-gcs-atamel-eventarc-gke/o/random.txt",
      "name": "random.txt",
      "bucket": "eventarc-gcs-atamel-eventarc-gke",
      "generation": "1666190425669022",
      "metageneration": "1",
      "contentType": "text/plain",
      "timeCreated": "2022-10-19T14:40:25.678Z",
      "updated": "2022-10-19T14:40:25.678Z",
      "storageClass": "STANDARD",
      "timeStorageClassUpdated": "2022-10-19T14:40:25.678Z",
      "size": "12",
      "md5Hash": "5Z/5eUEET4XfUpfhwwLSYA==",
      "mediaLink": "https://storage.googleapis.com/download/storage/v1/b/eventarc-gcs-atamel-eventarc-gke/o/random.txt?generation=1666190425669022\u0026alt=media",
      "contentLanguage": "en",
      "crc32c": "R1jUOQ==",
      "etag": "CJ77zIPD7PoCEAE="
    },
    "datacontenttype": "application/json",
    "id": "6031255652220627",
    "source": "//storage.googleapis.com/projects/_/buckets/eventarc-gcs-atamel-eventarc-gke",
    "specversion": "1.0",
    "subject": "objects/random.txt",
    "time": "2022-10-19T14:40:25.678152Z",
    "type": "google.cloud.storage.object.v1.finalized"
  }
}

9. สร้างทริกเกอร์บันทึกการตรวจสอบระบบคลาวด์

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

ตั้งค่า

หากต้องการรับเหตุการณ์จากบริการ คุณต้องเปิดใช้บันทึกการตรวจสอบ จาก Google Cloud Console ให้เลือก IAM & Admin และ Audit Logs จากเมนูด้านซ้ายบน ในรายการบริการ ให้ตรวจสอบ Google Cloud Storage ดังนี้

91d1bcef8f953fe3.png

ที่ด้านขวามือ ตรวจดูว่าได้เลือก Admin, Read และ Write แล้ว จากนั้นคลิก Save

ccb31db1e55fd2e3.png

คุณต้องเพิ่มบทบาท eventarc.eventReceiver ไปยังบัญชีบริการของทริกเกอร์สำหรับทริกเกอร์บันทึกการตรวจสอบ Cloud ด้วยดังนี้

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com \
  --role roles/eventarc.eventReceiver

สร้าง

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

TRIGGER_NAME=trigger-auditlog-storage-gke

gcloud eventarc triggers create $TRIGGER_NAME \
  --destination-gke-cluster=$CLUSTER_NAME \
  --destination-gke-location=$REGION \
  --destination-gke-namespace=default \
  --destination-gke-service=$SERVICE_NAME \
  --destination-gke-path=/ \
  --event-filters="type=google.cloud.audit.log.v1.written" \
  --event-filters="serviceName=storage.googleapis.com" \
  --event-filters="methodName=storage.objects.create" \
  --event-filters-path-pattern="resourceName=/projects/_/buckets/$BUCKET_NAME/objects/*" \
  --location=$REGION \
  --service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

ทดสอบ

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

gcloud eventarc triggers list

คุณควรจะเห็นว่าฟิลด์ Active คือ Yes:

NAME                          TYPE                                           DESTINATION     ACTIVE
trigger-auditlog-storage-gke  google.cloud.audit.log.v1.written              GKE: hello-gke  Yes

สร้างไฟล์และใช้ gsutil เพื่ออัปโหลดไฟล์ไปยังที่เก็บข้อมูล

echo "Hello World" > random.txt
gsutil cp random.txt gs://$BUCKET_NAME/random.txt

ตรวจสอบบันทึกของพ็อดเพื่อยืนยันเหตุการณ์ที่ได้รับ ดังนี้

kubectl logs $POD_NAME

{
  "severity": "INFO",
  "eventType": "google.cloud.audit.log.v1.written",
  "message": "Received event of type google.cloud.audit.log.v1.written. Event data: {\"protoPayload\":{\"status\":{},\"authenticationInfo\":{\"principalEmail\":\"atameldev@gmail.com\"},\"requestMetadata\":{\"callerIp\":\"149.71.143.227\",\"callerSuppliedUserAgent\":\"apitools Python/3.10.4 gsutil/5.14 (darwin) analytics/disabled interactive/True command/cp google-cloud-sdk/405.0.1,gzip(gfe)\",\"requestAttributes\":{\"time\":\"2022-10-19T15:05:54.144615670Z\",\"auth\":{}},\"destinationAttributes\":{}},\"serviceName\":\"storage.googleapis.com\",\"methodName\":\"storage.objects.create\",\"authorizationInfo\":[{\"resource\":\"projects/_/buckets/eventarc-gcs-atamel-eventarc-gke/objects/random.txt\",\"permission\":\"storage.objects.delete\",\"granted\":true,\"resourceAttributes\":{}},{\"resource\":\"projects/_/buckets/eventarc-gcs-atamel-eventarc-gke/objects/random.txt\",\"permission\":\"storage.objects.create\",\"granted\":true,\"resourceAttributes\":{}}],\"resourceName\":\"projects/_/buckets/eventarc-gcs-atamel-eventarc-gke/objects/random.txt\",\"serviceData\":{\"@type\":\"type.googleapis.com/google.iam.v1.logging.AuditData\",\"policyDelta\":{\"bindingDeltas\":[{\"action\":\"ADD\",\"role\":\"roles/storage.legacyObjectOwner\",\"member\":\"projectOwner:atamel-eventarc-gke\"},{\"action\":\"ADD\",\"role\":\"roles/storage.legacyObjectOwner\",\"member\":\"projectEditor:atamel-eventarc-gke\"},{\"action\":\"ADD\",\"role\":\"roles/storage.legacyObjectOwner\",\"member\":\"user:atameldev@gmail.com\"},{\"action\":\"ADD\",\"role\":\"roles/storage.legacyObjectReader\",\"member\":\"projectViewer:atamel-eventarc-gke\"}]}},\"resourceLocation\":{\"currentLocations\":[\"us-central1\"]}},\"insertId\":\"-8vmrbve7pol2\",\"resource\":{\"type\":\"gcs_bucket\",\"labels\":{\"project_id\":\"atamel-eventarc-gke\",\"bucket_name\":\"eventarc-gcs-atamel-eventarc-gke\",\"location\":\"us-central1\"}},\"timestamp\":\"2022-10-19T15:05:54.138732321Z\",\"severity\":\"INFO\",\"logName\":\"projects/atamel-eventarc-gke/logs/cloudaudit.googleapis.com%2Fdata_access\",\"receiveTimestamp\":\"2022-10-19T15:05:54.839604461Z\"}",
  "event": {
    "data": {
      "protoPayload": {
        "status": {
        },
        "authenticationInfo": {
          "principalEmail": "atameldev@gmail.com"
        },
        "requestMetadata": {
          "callerIp": "149.71.143.227",
          "callerSuppliedUserAgent": "apitools Python/3.10.4 gsutil/5.14 (darwin) analytics/disabled interactive/True command/cp google-cloud-sdk/405.0.1,gzip(gfe)",
          "requestAttributes": {
            "time": "2022-10-19T15:05:54.144615670Z",
            "auth": {
            }
          },
          "destinationAttributes": {
          }
        },
        "serviceName": "storage.googleapis.com",
        "methodName": "storage.objects.create",
        "authorizationInfo": [
          {
            "resource": "projects/_/buckets/eventarc-gcs-atamel-eventarc-gke/objects/random.txt",
            "permission": "storage.objects.delete",
            "granted": true,
            "resourceAttributes": {
            }
          },
          {
            "resource": "projects/_/buckets/eventarc-gcs-atamel-eventarc-gke/objects/random.txt",
            "permission": "storage.objects.create",
            "granted": true,
            "resourceAttributes": {
            }
          }
        ],
        "resourceName": "projects/_/buckets/eventarc-gcs-atamel-eventarc-gke/objects/random.txt",
        "serviceData": {
          "@type": "type.googleapis.com/google.iam.v1.logging.AuditData",
          "policyDelta": {
            "bindingDeltas": [
              {
                "action": "ADD",
                "role": "roles/storage.legacyObjectOwner",
                "member": "projectOwner:atamel-eventarc-gke"
              },
              {
                "action": "ADD",
                "role": "roles/storage.legacyObjectOwner",
                "member": "projectEditor:atamel-eventarc-gke"
              },
              {
                "action": "ADD",
                "role": "roles/storage.legacyObjectOwner",
                "member": "user:atameldev@gmail.com"
              },
              {
                "action": "ADD",
                "role": "roles/storage.legacyObjectReader",
                "member": "projectViewer:atamel-eventarc-gke"
              }
            ]
          }
        },
        "resourceLocation": {
          "currentLocations": [
            "us-central1"
          ]
        }
      },
      "insertId": "-8vmrbve7pol2",
      "resource": {
        "type": "gcs_bucket",
        "labels": {
          "project_id": "atamel-eventarc-gke",
          "bucket_name": "eventarc-gcs-atamel-eventarc-gke",
          "location": "us-central1"
        }
      },
      "timestamp": "2022-10-19T15:05:54.138732321Z",
      "severity": "INFO",
      "logName": "projects/atamel-eventarc-gke/logs/cloudaudit.googleapis.com%2Fdata_access",
      "receiveTimestamp": "2022-10-19T15:05:54.839604461Z"
    },
    "datacontenttype": "application/json; charset=utf-8",
    "dataschema": "https://googleapis.github.io/google-cloudevents/jsonschema/google/events/cloud/audit/v1/LogEntryData.json",
    "id": "projects/atamel-eventarc-gke/logs/cloudaudit.googleapis.com%2Fdata_access-8vmrbve7pol21666191954138732",
    "methodname": "storage.objects.create",
    "recordedtime": "2022-10-19T15:05:54.138732321Z",
    "resourcename": "projects/_/buckets/eventarc-gcs-atamel-eventarc-gke/objects/random.txt",
    "servicename": "storage.googleapis.com",
    "source": "//cloudaudit.googleapis.com/projects/atamel-eventarc-gke/logs/data_access",
    "specversion": "1.0",
    "subject": "storage.googleapis.com/projects/_/buckets/eventarc-gcs-atamel-eventarc-gke/objects/random.txt",
    "time": "2022-10-19T15:05:54.839604461Z",
    "type": "google.cloud.audit.log.v1.written"
  }
}

10. ยินดีด้วย

ขอแสดงความยินดีที่เรียน Codelab จนจบ

สรุปประเด็นที่ได้พูดถึง

  • สร้างคลัสเตอร์ GKE
  • สร้างบริการ GKE เป็นซิงก์เหตุการณ์
  • สร้างทริกเกอร์ Pub/Sub
  • สร้างทริกเกอร์ Cloud Storage
  • สร้างทริกเกอร์บันทึกการตรวจสอบระบบคลาวด์