รับเหตุการณ์จาก Cloud Pub/Sub ใน SAP โดยใช้ ABAP SDK สำหรับ Google Cloud

1. บทนำ

โค้ดแล็บนี้จะแนะนำวิธีรับรายละเอียดเหตุการณ์จากหัวข้อ Google Cloud Pub/Sub โดยใช้ ABAP SDK สำหรับ Google Cloud เราจะใช้ประโยชน์จากบริการ Google Cloud ต่อไปนี้

  • Cloud Pub/Sub
  • Cloud Shell

ข้อกำหนดเบื้องต้น

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. ก่อนเริ่มต้น

6757b2fb50ddcc2d.png

  • เรียกใช้คำสั่งต่อไปนี้เพื่อตรวจสอบสิทธิ์บัญชีและตั้งค่าโปรเจ็กต์เริ่มต้นเป็น abap-sdk-poc ใช้โซน us-west4-b เป็นตัวอย่าง หากจำเป็น โปรดเปลี่ยนโปรเจ็กต์และโซนในคำสั่งต่อไปนี้ตามที่คุณต้องการ
gcloud auth login
gcloud config set project abap-sdk-poc
gcloud config set compute/zone us-west4-b

4. สร้างบัญชีบริการสำหรับการเข้าถึง Pub/Sub

การใช้บัญชีบริการที่มีบทบาท Subscriber เป็นวิธีที่ปลอดภัยที่สุดสำหรับโปรแกรม ABAP ในการรับข้อความจาก Pub/Sub บทบาทนี้จำกัดสิทธิ์ให้ดึงข้อมูลข้อความเท่านั้น เพื่อป้องกันช่องโหว่ด้านความปลอดภัยที่อาจเกิดขึ้น

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

หากต้องการสร้างบัญชีบริการที่มีบทบาทที่จำเป็น ให้ทำตามขั้นตอนต่อไปนี้

  1. เรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัล Cloud Shell
gcloud iam service-accounts \
create abap-sdk-pubsub-subscriber \
--display-name="Service Account for Pub/Sub Subscriber"
  1. ตอนนี้ให้เพิ่มบทบาทที่จำเป็นลงในบัญชีบริการที่สร้างในขั้นตอนด้านบน
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 ด้วยรหัสโปรเจ็กต์

  1. หากต้องการยืนยันว่าได้เพิ่มบทบาทแล้ว ให้ไปที่หน้า 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

ขั้นตอนการส่งข้อความสำหรับการสมัครใช้บริการแบบดึงข้อมูล

รูปภาพต่อไปนี้แสดงเวิร์กโฟลว์ระหว่างไคลเอ็นต์ของผู้ติดตามกับการสมัครใช้บริการแบบดึง

f0fc44265192f348.png

  1. คำขอพุล: ระบบ SAP (ผู้ติดตาม) ใช้เมธอดพุลเพื่อขอข้อความจากเซิร์ฟเวอร์ Pub/Sub
  2. การตอบกลับแบบดึงข้อมูล: เซิร์ฟเวอร์ Pub/Sub จะตอบกลับด้วยข้อความและรหัสการรับทราบตั้งแต่ 0 รายการขึ้นไป การตอบกลับที่ไม่มีข้อความหรือมีข้อผิดพลาดไม่ได้หมายความว่าไม่มีข้อความที่พร้อมรับ การตอบกลับนี้คือ PullResponse ดังที่แสดงในรูปภาพ
  3. การรับทราบ: หลังจากประมวลผลข้อความแล้ว ระบบ 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 ให้ทำตามขั้นตอนต่อไปนี้

  1. ใน SAP GUI ให้ป้อนรหัสธุรกรรม SPRO
  2. คลิก SAP Reference IMG
  3. คลิก ABAP SDK สำหรับ Google Cloud > การตั้งค่าพื้นฐาน > กำหนดค่าคีย์ไคลเอ็นต์

25871e639293b9ee.png

  1. คงค่าต่อไปนี้ไว้กับฟิลด์ เว้นช่องอื่นว่างไว้

ฟิลด์

ค่า

ชื่อคีย์ 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

  1. เข้าสู่ระบบ SAP
  2. ไปที่รหัสธุรกรรม SE38 แล้วสร้างโปรแกรมรายงานที่มีชื่อ ZDEMO_RECEIVE_CPS_EVENTS.
  3. ในป๊อปอัปที่เปิดขึ้น ให้ระบุรายละเอียดตามที่แสดงด้านล่าง แล้วคลิกบันทึก

7c739236bedb5bf1.png

  1. ในป๊อปอัปถัดไป ให้เลือกออบเจ็กต์ในเครื่องหรือระบุชื่อแพ็กเกจตามความเหมาะสม
  2. ใน 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.
  1. บันทึกและเปิดใช้งานรายงาน
  2. เรียกใช้รายงาน (F8)

เมื่อดำเนินการสำเร็จแล้ว คุณควรเห็นเอาต์พุตของรายงานดังที่แสดงด้านล่าง

5b76e886ef79d0ba.png

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

ลบทรัพยากรแต่ละรายการ

  1. ลบอินสแตนซ์ Compute โดยทำดังนี้
gcloud compute instances delete abap-trial-docker
  1. ลบกฎไฟร์วอลล์โดยทำดังนี้
gcloud compute firewall-rules delete sapmachine
  1. ลบบัญชีบริการ
gcloud iam service-accounts delete \
    abap-sdk-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com