รับเหตุการณ์จาก 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 for 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: เริ่มคําขอดึงข้อมูลข้อความ
  • acknowledge: ส่งสัญญาณให้ Pub/Sub ทราบว่าประมวลผลข้อความเรียบร้อยแล้ว

ABAP SDK สำหรับรายการเทียบเท่าของ Google Cloud

  • /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

  • นําโปรแกรมมาใช้ซ้ำ: หากมีโปรแกรมจากโค้ดแล็บก่อนหน้า สําหรับเผยแพร่ ให้ใช้โปรแกรมนั้น
  • การเผยแพร่โดยตรง: สำหรับการทดสอบอย่างรวดเร็ว ให้ลองใช้ตัวเลือกใดตัวเลือกหนึ่งต่อไปนี้
  • 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 ให้เพิ่มโค้ดต่อไปนี้
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
  • เรียกใช้ Vertex AI test-bison จาก ABAP
  • เรียกใช้ BigQuery ML จาก ABAP

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

หากไม่ต้องการทำ Codelab เพิ่มเติมที่เกี่ยวข้องกับ ABAP SDK สำหรับ Google Cloud โปรดดำเนินการล้างข้อมูล

ลบโปรเจ็กต์

  • ลบโปรเจ็กต์ Google Cloud
gcloud projects delete abap-sdk-poc

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

  1. ลบอินสแตนซ์การประมวลผลโดยทำดังนี้
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