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 สำหรับ Java ได้ด้วยโดยไปที่ลิงก์นี้
3. ก่อนเริ่มต้น
- ในคอนโซล Google Cloud ให้เลือกหรือสร้างโปรเจ็กต์ Google Cloud ในหน้าตัวเลือกโปรเจ็กต์ (เช่น
abap-sdk-poc
) - ตรวจสอบว่าโปรเจ็กต์ Cloud เปิดใช้การเรียกเก็บเงินแล้ว ดูวิธีตรวจสอบว่าได้เปิดใช้การเรียกเก็บเงินในโปรเจ็กต์แล้วหรือไม่ โปรดข้ามขั้นตอนนี้หากคุณใช้บัญชีทดลองใช้ฟรี 90 วัน
- คุณจะใช้ Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานใน Google Cloud จาก Cloud Console ให้คลิกเปิดใช้งาน 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
- ในส่วนของ Codelab ก่อนหน้า "ส่งเหตุการณ์ไปยัง 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: เริ่มคำขอเพื่อดึงข้อความ
- รับทราบ: ส่งสัญญาณไปยัง Pub/Sub ว่าประมวลผลข้อความเรียบร้อยแล้ว
ABAP SDK สำหรับ Google Cloud Equivalents
- /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
- ใช้โปรแกรมซ้ำ: หากมีโปรแกรมจาก codelab ก่อนหน้า สำหรับการเผยแพร่ ให้ใช้โปรแกรมนั้น
- การเผยแพร่โดยตรง: หากต้องการทดสอบอย่างรวดเร็ว ให้ลองใช้ตัวเลือกใดตัวเลือกหนึ่งต่อไปนี้
- 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 Editor ให้เพิ่มโค้ดต่อไปนี้
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
- เรียกใช้ test-bison ของ Vertex AI จาก ABAP
- เรียกใช้ BigQuery ML จาก ABAP
11. ล้างข้อมูล
หากไม่ต้องการทำ Codelab เพิ่มเติมที่เกี่ยวข้องกับ ABAP SDK สำหรับ Google Cloud ต่อ โปรดดำเนินการล้างข้อมูล
ลบโปรเจ็กต์
- ลบโปรเจ็กต์ Google Cloud โดยทำดังนี้
gcloud projects delete abap-sdk-poc
ลบทรัพยากรแต่ละรายการ
- ลบอินสแตนซ์ Compute โดยทำดังนี้
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