1. บทนำ
โค้ดแล็บนี้จะแนะนำวิธีรับรายละเอียดเหตุการณ์จากหัวข้อ Google Cloud Pub/Sub โดยใช้ ABAP SDK สําหรับ Google Cloud เราจะใช้ประโยชน์จากบริการ Google Cloud ต่อไปนี้
- Cloud Pub/Sub
- Cloud Shell
ข้อกำหนดเบื้องต้น
- ตรวจสอบว่าคุณมีสิทธิ์เข้าถึงระบบ SAP ที่ติดตั้ง ABAP SDK สําหรับ Google Cloud แล้ว
- คุณสามารถดู Codelab "ติดตั้งช่วงทดลองใช้แพลตฟอร์ม ABAP ใน Google Cloud Platform และติดตั้ง ABAP SDK" เพื่อตั้งค่าระบบใหม่
- คุณได้สร้างหัวข้อ
PUBSUB_DEMO_TOPIC
เป็นส่วนหนึ่งของ Codelab "ส่งเหตุการณ์จาก SAP ไปยัง Pub/Sub โดยใช้ ABAP SDK" ในโปรเจ็กต์ Google Cloud หากยังไม่ได้สร้าง ให้ใช้คําสั่งด้านล่างเพื่อสร้าง
gcloud pubsub topics create PUBSUB_DEMO_TOPIC
สิ่งที่คุณจะสร้าง
คุณจะต้องสร้างสิ่งต่อไปนี้
- บัญชีบริการที่มีสิทธิ์ "ผู้ใช้บริการ" สําหรับการโต้ตอบกับ Pub/Sub API
- โปรแกรม ABAP เพื่อรับและรับทราบข้อความจากหัวข้อ Pub/Sub
2. ข้อกำหนด
- เบราว์เซอร์ เช่น Chrome หรือ Firefox
- โปรเจ็กต์ Google Cloud ที่เปิดใช้การเรียกเก็บเงินหรือสร้างบัญชีทดลองใช้ฟรี 90 วันสำหรับ Google Cloud Platform
- SAP GUI (Windows หรือ Java) ที่ติดตั้งในระบบ หากติดตั้ง SAP GUI ในแล็ปท็อปอยู่แล้ว ให้เชื่อมต่อกับ SAP โดยใช้ที่อยู่ IP ภายนอกของ VM เป็น IP ของเซิร์ฟเวอร์แอปพลิเคชัน หากใช้ Mac คุณสามารถติดตั้ง SAP GUI for Java ซึ่งมีอยู่ในลิงก์นี้ได้ด้วย
3. ก่อนเริ่มต้น
- ในคอนโซล Google Cloud ให้เลือกหรือสร้างโปรเจ็กต์ Google Cloud ในหน้าตัวเลือกโปรเจ็กต์ (เช่น
abap-sdk-poc
) - ตรวจสอบว่าเปิดใช้การเรียกเก็บเงินสำหรับโปรเจ็กต์ Cloud แล้ว ดูวิธีตรวจสอบว่าเปิดใช้การเรียกเก็บเงินในโปรเจ็กต์หรือไม่ โปรดข้ามขั้นตอนนี้หากคุณใช้บัญชีทดลองใช้ฟรี 90 วัน
- คุณจะใช้ Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานใน Google Cloud จากคอนโซลระบบคลาวด์ ให้คลิกเปิดใช้งาน Cloud Shell ที่มุมขวาบน
- เรียกใช้คําสั่งต่อไปนี้เพื่อตรวจสอบสิทธิ์สําหรับบัญชีและตั้งค่าโปรเจ็กต์เริ่มต้นเป็น
abap-sdk-poc
โซนus-west4-b
ใช้เพื่อเป็นตัวอย่าง หากจําเป็น โปรดเปลี่ยนโปรเจ็กต์และโซนในคําสั่งต่อไปนี้ตามความต้องการของคุณ
gcloud auth login
gcloud config set project abap-sdk-poc
gcloud config set compute/zone us-west4-b
- ในโค้ดแล็บ "ส่งเหตุการณ์ไปยัง Pub/Sub" ก่อนหน้านี้ คุณต้องเปิดใช้ Pub/Sub API, สร้างหัวข้อ และเผยแพร่ข้อความไปยัง Pub/Sub แล้ว
4. สร้างบัญชีบริการสำหรับการเข้าถึง Pub/Sub
การใช้บัญชีบริการที่มีบทบาท Subscriber
เป็นวิธีที่ปลอดภัยที่สุดสำหรับโปรแกรม ABAP ในการรับข้อความจาก Pub/Sub บทบาทนี้จะจํากัดสิทธิ์ไว้ที่การดึงข้อมูลข้อความเท่านั้น เพื่อป้องกันการเกิดช่องโหว่ด้านความปลอดภัยที่อาจเกิดขึ้น
สร้างบัญชีบริการ
หากต้องการสร้างบัญชีบริการที่มีบทบาทที่จําเป็น ให้ทําตามขั้นตอนต่อไปนี้
- เรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัล Cloud Shell
gcloud iam service-accounts \
create abap-sdk-pubsub-subscriber \
--display-name="Service Account for Pub/Sub Subscriber"
- ตอนนี้ให้เพิ่มบทบาทที่จำเป็นลงในบัญชีบริการที่สร้างในขั้นตอนข้างต้น
gcloud projects add-iam-policy-binding abap-sdk-poc \
--member='serviceAccount:abap-sdk-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com' \
--role='roles/pubsub.subscriber'
คำสั่งข้างต้นใช้ abap-sdk-poc
เป็นตัวยึดตําแหน่งสำหรับโปรเจ็กต์ Google Cloud แทนที่ abap-sdk-poc
ด้วยรหัสโปรเจ็กต์
- ไปที่หน้า IAM เพื่อยืนยันว่าได้เพิ่มบทบาทแล้ว บัญชีบริการที่คุณสร้างขึ้นควรแสดงพร้อมกับบทบาทที่กำหนดไว้
5. ทำความเข้าใจการสมัครใช้บริการแบบพุล
สําหรับการสมัครใช้บริการแบบดึงข้อมูล ระบบ SAP จะทําหน้าที่เป็นไคลเอ็นต์ผู้สมัครใช้บริการและเริ่มคําขอไปยังเซิร์ฟเวอร์ Pub/Sub เพื่อดึงข้อมูลข้อความ ไคลเอ็นต์ผู้สมัครใช้บริการใช้ REST Pull API
เมธอด API หลัก
Google Cloud Pub/Sub API
- pull: เริ่มคําขอดึงข้อมูลข้อความ
- acknowledge: ส่งสัญญาณให้ Pub/Sub ทราบว่าประมวลผลข้อความเรียบร้อยแล้ว
ABAP SDK สำหรับรายการเทียบเท่าของ Google Cloud
- /GOOG/CL_PUBSUB_V1 -> PULL_SUBSCRIPTIONS
- /GOOG/CL_PUBSUB_V1 -> ACKNOWLEDGE_SUBSCRIPTIONS
ขั้นตอนการส่งข้อความสำหรับการสมัครใช้บริการแบบดึง
รูปภาพต่อไปนี้แสดงเวิร์กโฟลว์ระหว่างไคลเอ็นต์ผู้สมัครใช้บริการกับการสมัครใช้บริการแบบพุล
- คำขอดึงข้อมูล: ระบบ SAP (ผู้สมัครใช้บริการ) ใช้เมธอดการดึงข้อมูลเพื่อขอข้อความจากเซิร์ฟเวอร์ Pub/Sub
- การตอบกลับการดึงข้อมูล: เซิร์ฟเวอร์ Pub/Sub ตอบกลับด้วยข้อความและรหัสการตอบกลับตั้งแต่ 0 รายการขึ้นไป การตอบกลับที่ไม่มีข้อความหรือมีข้อผิดพลาดไม่ได้หมายความว่าไม่มีข้อความที่พร้อมให้รับ การตอบกลับนี้คือ PullResponse ตามที่แสดงในรูปภาพ
- การตอบกลับ: หลังจากประมวลผลข้อความแล้ว ระบบ SAP จะใช้วิธีการตอบกลับพร้อมกับรหัสการตอบกลับที่ได้รับ ซึ่งจะป้องกันไม่ให้ Pub/Sub ส่งข้อความอีกครั้ง
6. การตั้งค่าการสมัครใช้บริการและการส่งข้อความ
สร้างการสมัครใช้บริการแบบดึง
- เรียกใช้คำสั่ง gcloud นี้เพื่อสร้างการสมัครใช้บริการแบบดึงชื่อ
PUBSUB_DEMO_SUBSCRIPTION
ที่จะรับข้อความจากPUBSUB_DEMO_TOPIC
gcloud pubsub subscriptions create PUBSUB_DEMO_SUBSCRIPTION \
--topic=PUBSUB_DEMO_TOPIC
เผยแพร่ข้อความ
เลือกวิธีใดวิธีหนึ่งต่อไปนี้เพื่อส่งข้อความถึง PUBSUB_DEMO_TOPIC
- นําโปรแกรมมาใช้ซ้ำ: หากมีโปรแกรมจากโค้ดแล็บก่อนหน้า สําหรับเผยแพร่ ให้ใช้โปรแกรมนั้น
- การเผยแพร่โดยตรง: สำหรับการทดสอบอย่างรวดเร็ว ให้ลองใช้ตัวเลือกใดตัวเลือกหนึ่งต่อไปนี้
- Cloud Console: เผยแพร่ภายใน Google Cloud Console โดยตรง ดูรายละเอียดเพิ่มเติมได้ที่เอกสารประกอบของ Pub/Sub
- คำสั่ง gcloud: เรียกใช้คำสั่งต่อไปนี้
gcloud pubsub topics publish PUBSUB_DEMO_TOPIC \
--message='{"eventType":"SalesOrderChanged","source":"SAPDEV100","eventTime":"20240207183048","SalesOrder":1000924}'
7. สร้างการกำหนดค่าคีย์ไคลเอ็นต์
ตอนนี้คุณได้ตั้งค่าข้อกําหนดเบื้องต้นในฝั่ง Google Cloud แล้ว เราจึงดําเนินการกําหนดค่าในฝั่ง SAP ต่อได้
สําหรับการกําหนดค่าที่เกี่ยวข้องกับการตรวจสอบสิทธิ์และการเชื่อมต่อ ABAP SDK สําหรับ Google Cloud จะใช้ตาราง /GOOG/CLIENT_KEY
และ /GOOG/SERVIC_MAP.
หากต้องการดูแลรักษาการกําหนดค่าในตาราง /GOOG/CLIENT_KEY
ให้ทําตามขั้นตอนต่อไปนี้
- ใน SAP GUI ให้ป้อนรหัสธุรกรรม SPRO
- คลิก SAP Reference IMG
- คลิก ABAP SDK สําหรับ Google Cloud > การตั้งค่าพื้นฐาน > กําหนดค่าคีย์ไคลเอ็นต์
- คงค่าต่อไปนี้ในช่อง เว้นช่องอื่นว่างไว้
ฟิลด์ | ค่า |
ชื่อคีย์ Google Cloud | PUBSUB_SUBSCRIBER |
ชื่อบัญชีบริการ Google Cloud | abap-sdk-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com |
ขอบเขต Google Cloud | https://www.googleapis.com/auth/cloud-platform |
รหัสโปรเจ็กต์ | abap-sdk-poc |
คลาสการให้สิทธิ์ | /GOOG/CL_AUTH_GOOGLE |
8. สร้างรายงาน ABAP เพื่อรับข้อความจาก Google Cloud Pub/Sub
- เข้าสู่ระบบระบบ SAP
- ไปที่รหัสธุรกรรม
SE38
และสร้างโปรแกรมรายงานชื่อZDEMO_RECEIVE_CPS_EVENTS.
- ในป๊อปอัปที่เปิดขึ้น ให้ระบุรายละเอียดตามที่แสดงด้านล่าง แล้วคลิกบันทึก
- ในป๊อปอัปถัดไป ให้เลือกออบเจ็กต์ในเครื่องหรือระบุชื่อแพ็กเกจตามความเหมาะสม
- ในตัวแก้ไข ABAP ให้เพิ่มโค้ดต่อไปนี้
REPORT zdemo_receive_cps_events. TYPES: BEGIN OF ty_event_message, event_time TYPE timestamp, event_type TYPE char30, source TYPE char30, sales_order TYPE vbeln, END OF ty_event_message. DATA: ls_input TYPE /goog/cl_pubsub_v1=>ty_026, ls_input_ack TYPE /goog/cl_pubsub_v1=>ty_001, ls_event_msg TYPE ty_event_message. TRY. "Open HTTP Connection DATA(lo_client) = NEW /goog/cl_pubsub_v1( iv_key_name = 'PUBSUB_SUBSCRIBER' ). "Populate relevant parameters " Derive project id from the client object DATA(lv_p_projects_id) = CONV string( lo_client->gv_project_id ). " Name of the subscription from where we want to pull data DATA(lv_p_subscriptions_id) = CONV string( 'PUBSUB_DEMO_SUBSCRIPTION' ). " Max number of messages that will be received in 1 API call ls_input-max_messages = 1. "Call API method: pubsub.projects.subscriptions.pull lo_client->pull_subscriptions( EXPORTING iv_p_projects_id = lv_p_projects_id iv_p_subscriptions_id = lv_p_subscriptions_id is_input = ls_input IMPORTING es_output = DATA(ls_output) ev_ret_code = DATA(lv_ret_code) ev_err_text = DATA(lv_err_text) es_err_resp = DATA(ls_err_resp) ). IF lo_client->is_success( lv_ret_code ). DATA(ls_received_msg) = VALUE #( ls_output-received_messages[ 1 ] OPTIONAL ). IF ls_received_msg IS NOT INITIAL. "Messages published to Pub/Sub should be base-64 encoded, hence in order to get the exact message, we need to decode the data field. "However, attributes published to Pub/Sub should be accessible as data references. DATA(lv_msg) = |{ cl_http_utility=>decode_base64( encoded = ls_received_msg-message-data ) }|. /ui2/cl_json=>deserialize( EXPORTING json = lv_msg pretty_name = /ui2/cl_json=>pretty_mode-extended CHANGING data = ls_event_msg ). cl_demo_output=>new( )->begin_section( |Receive Events from Cloud Pubsub using ABAP SDK for Google Cloud| )->write_text( |The below event was successfully received with message ID { ls_received_msg-message-MESSAGE_ID }| )->write_data( ls_event_msg )->end_section( )->display( ). ls_input_ack-ack_ids = VALUE #( ( ls_received_msg-ack_id ) ). "Call API method: pubsub.projects.subscriptions.acknowledge "Acknowledge the messages so it is not pulled again. lo_client->acknowledge_subscriptions( EXPORTING iv_p_projects_id = lv_p_projects_id iv_p_subscriptions_id = lv_p_subscriptions_id is_input = ls_input_ack IMPORTING es_output = DATA(ls_output_ack) ev_ret_code = lv_ret_code ev_err_text = lv_err_text es_err_resp = ls_err_resp ). IF lo_client->is_success( lv_ret_code ). MESSAGE lv_msg TYPE 'S'. ELSE. MESSAGE lv_err_text TYPE 'E'. ENDIF. ELSE. MESSAGE 'No Messages were received!' TYPE 'S'. ENDIF. ELSE. MESSAGE lv_err_text TYPE 'E'. ENDIF. "Close HTTP Connection lo_client->close( ). CATCH /goog/cx_sdk INTO DATA(lo_exception). MESSAGE lo_exception->get_text( ) TYPE 'E'. ENDTRY.
- บันทึกและเปิดใช้งานรายงาน
- เรียกใช้รายงาน (F8)
เมื่อดำเนินการเสร็จเรียบร้อยแล้ว คุณควรเห็นเอาต์พุตรายงานดังที่แสดงด้านล่าง
9. คําอธิบายโค้ดผู้สมัครใช้บริการ Pub/Sub ของ ABAP
โดยพื้นฐานแล้ว โปรแกรม ABAP นี้จะผสานรวมกับ Google Cloud Pub/Sub ในฐานะผู้สมัครรับข้อความ โดยจะตรวจสอบการสมัครใช้บริการที่ระบุเพื่อหาข้อความใหม่ตามคําขอ ประมวลผลข้อความ แล้วรับทราบการรับข้อความเพื่อป้องกันการนำส่งซ้ำในอนาคต
โปรแกรมจะทํากิจกรรมต่อไปนี้
รายละเอียดทีละขั้นตอน
สร้างการเชื่อมต่อ:
- โดยจะสร้างการเชื่อมต่อ HTTP กับบริการ Google Cloud Pub/Sub โดยใช้คลาส
/GOOG/CL_PUBSUB_V1
ตั้งค่าพารามิเตอร์:
- รหัสโปรเจ็กต์: ดึงข้อมูลรหัสโปรเจ็กต์ที่เกี่ยวข้องซึ่งมีการสมัครใช้บริการ Pub/Sub
- ชื่อการสมัครใช้บริการ: ระบุชื่อการสมัครใช้บริการที่จะดึงข้อความ (
PUBSUB_DEMO_SUBSCRIPTION
) - ขีดจํากัดข้อความ: กําหนดจํานวนข้อความสูงสุดที่จะดึงข้อมูลในการเรียก API ครั้งเดียว (ในกรณีนี้คือ 1)
ดึงข้อมูลข้อความ:
- เรียกใช้เมธอด
pull_subscriptions
เพื่อดึงข้อความจากการสมัครใช้บริการที่ระบุ
ประมวลผลข้อความที่ได้รับ:
- หากมีข้อความ โปรแกรมจะถอดรหัสข้อมูล บันทึกเนื้อหา และส่งการตอบกลับ
รับทราบข้อความ:
- เรียกใช้เมธอด
acknowledge_subscriptions
เพื่อส่งการตอบกลับไปยัง Pub/Sub ซึ่งระบุว่าได้รับข้อความเรียบร้อยแล้ว ซึ่งจะป้องกันไม่ให้ระบบแสดงโฆษณาเหล่านั้นอีกครั้ง
จัดการความสําเร็จ/ข้อผิดพลาด:
- แสดงข้อความแจ้งความสำเร็จหากได้รับข้อความและรับทราบ และแสดงข้อความแสดงข้อผิดพลาดสำหรับสถานการณ์ต่างๆ ที่ดำเนินการไม่สำเร็จ (ไม่ได้รับข้อความ ข้อผิดพลาดเกี่ยวกับ API ฯลฯ)
ปิดการเชื่อมต่อ:
- ปิดการเชื่อมต่อ HTTP กับบริการ Pub/Sub
10. ขอแสดงความยินดี
คุณยอดเยี่ยมมากที่ทํา Codelab "รับเหตุการณ์จาก Cloud Pub/Sub โดยใช้ ABAP SDK สําหรับ Google Cloud" จนเสร็จสมบูรณ์
คุณสร้างบริดจ์ระหว่าง ABAP กับ Google Cloud Pub/Sub เรียบร้อยแล้ว การทํา Codelab จนเสร็จสมบูรณ์แสดงให้เห็นว่าคุณเข้าใจการรับส่งข้อความที่ทํางานตามเหตุการณ์และวิธีใช้ ABAP SDK สําหรับ Google Cloud เพื่อผสานรวมกับบริการ Google Cloud เป็นอย่างดี เยี่ยมมาก!
คุณปลดล็อกการผสานรวมระดับใหม่ระหว่าง ABAP กับบริการของ Google Cloud แล้ว ขยายขอบเขตของคุณด้วยตัวเลือกที่น่าตื่นเต้นเหล่านี้
- การใช้ Translation API กับ ABAP SDK สําหรับ Google Cloud
- อัปโหลดออบเจ็กต์ขนาดใหญ่ไปยังที่เก็บข้อมูล Cloud Storage โดยใช้การแบ่งกลุ่ม
- การดึงข้อมูลเข้าสู่ระบบ/ข้อมูลลับจาก Secret Manager ด้วย ABAP SDK สําหรับ Google Cloud
- เรียกใช้ Vertex AI test-bison จาก ABAP
- เรียกใช้ BigQuery ML จาก ABAP
11. ล้างข้อมูล
หากไม่ต้องการทำ Codelab เพิ่มเติมที่เกี่ยวข้องกับ ABAP SDK สำหรับ Google Cloud โปรดดำเนินการล้างข้อมูล
ลบโปรเจ็กต์
- ลบโปรเจ็กต์ Google Cloud
gcloud projects delete abap-sdk-poc
ลบทรัพยากรแต่ละรายการ
- ลบอินสแตนซ์การประมวลผลโดยทำดังนี้
gcloud compute instances delete abap-trial-docker
- ลบกฎไฟร์วอลล์โดยทำดังนี้
gcloud compute firewall-rules delete sapmachine
- ลบบัญชีบริการ
gcloud iam service-accounts delete \
abap-sdk-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com