Menerima peristiwa dari Cloud Pub/Sub di SAP menggunakan ABAP SDK untuk Google Cloud

1. Pengantar

Codelab ini memandu Anda menerima detail peristiwa dari topik Google Cloud Pub/Sub menggunakan ABAP SDK untuk Google Cloud. Kita akan memanfaatkan layanan Google Cloud berikut:

  • Cloud Pub/Sub
  • Cloud Shell

Prasyarat

gcloud pubsub topics create PUBSUB_DEMO_TOPIC

Yang akan Anda build

Anda akan membuat hal berikut:

  • Akun layanan dengan izin 'Subscriber' untuk berinteraksi dengan Pub/Sub API.
  • Program ABAP untuk menerima dan mengonfirmasi pesan dari topik Pub/Sub Anda.

2. Persyaratan

  • Browser, seperti Chrome atau Firefox.
  • Project Google Cloud dengan penagihan diaktifkan atau Buat akun Uji Coba Gratis 90 Hari untuk Google Cloud Platform.
  • SAP GUI (Windows atau Java) yang diinstal di sistem Anda. Jika SAP GUI sudah diinstal di laptop, hubungkan ke SAP menggunakan alamat IP eksternal VM sebagai IP Server Aplikasi. Jika menggunakan Mac, Anda juga dapat menginstal SAP GUI untuk Java yang tersedia di link ini.

3. Sebelum memulai

6757b2fb50ddcc2d.png

  • Jalankan perintah berikut untuk melakukan autentikasi untuk akun Anda dan menetapkan project default ke abap-sdk-poc. Zona us-west4-b digunakan sebagai contoh. Jika diperlukan, ubah project dan zona dalam perintah berikut berdasarkan preferensi Anda.
gcloud auth login
gcloud config set project abap-sdk-poc
gcloud config set compute/zone us-west4-b

4. Membuat akun layanan untuk akses Pub/Sub

Menggunakan akun layanan dengan peran Subscriber adalah cara paling aman bagi program ABAP Anda untuk menerima pesan dari Pub/Sub. Peran ini membatasi izin hanya untuk pengambilan pesan, sehingga mencegah potensi kerentanan keamanan.

Membuat Akun Layanan

Untuk membuat akun layanan dengan peran yang diperlukan, lakukan langkah-langkah berikut:

  1. Jalankan perintah berikut di terminal Cloud Shell:
gcloud iam service-accounts \
create abap-sdk-pubsub-subscriber \
--display-name="Service Account for Pub/Sub Subscriber"
  1. Sekarang, tambahkan peran yang diperlukan ke akun layanan yang dibuat pada langkah di atas:
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'

Perintah di atas menggunakan abap-sdk-poc sebagai placeholder untuk Project Google Cloud. Ganti abap-sdk-poc dengan project ID Anda.

  1. Untuk memverifikasi bahwa peran telah ditambahkan, buka halaman IAM. Akun layanan yang Anda buat akan tercantum beserta peran yang telah ditetapkan.

5. Memahami langganan pull

Untuk langganan pull, sistem SAP Anda bertindak sebagai klien pelanggan dan memulai permintaan ke server Pub/Sub untuk mengambil pesan. Klien pelanggan menggunakan REST Pull API.

Metode API utama

Google Cloud Pub/Sub API

  • pull: Memulai permintaan untuk mengambil pesan.
  • acknowledge: Memberi sinyal ke Pub/Sub bahwa pesan telah berhasil diproses.

ABAP SDK untuk Google Cloud Equivalents

  • /GOOG/CL_PUBSUB_V1 -> PULL_SUBSCRIPTIONS
  • /GOOG/CL_PUBSUB_V1 -> ACKNOWLEDGE_SUBSCRIPTIONS

Alur pesan untuk langganan pull

Gambar berikut menunjukkan alur kerja antara klien pelanggan dan langganan pull.

f0fc44265192f348.png

  1. Permintaan Pull: Sistem SAP Anda (pelanggan) menggunakan metode pull untuk meminta pesan dari server Pub/Sub.
  2. Respons Pull: Server Pub/Sub merespons dengan nol atau beberapa pesan dan ID konfirmasi. Respons dengan nol pesan atau dengan error tidak selalu menunjukkan bahwa tidak ada pesan yang tersedia untuk diterima. Respons ini adalah PullResponse seperti yang ditunjukkan pada gambar.
  3. Konfirmasi: Setelah memproses pesan, sistem SAP Anda akan menggunakan metode konfirmasi beserta ID konfirmasi yang diterima. Tindakan ini mencegah Pub/Sub mengirim ulang pesan.

6. Menyiapkan langganan dan mengirim pesan

Membuat Langganan Pull

  • Jalankan perintah gcloud ini untuk membuat langganan pull bernama PUBSUB_DEMO_SUBSCRIPTION yang akan menerima pesan dari PUBSUB_DEMO_TOPIC:
gcloud pubsub subscriptions create PUBSUB_DEMO_SUBSCRIPTION \
--topic=PUBSUB_DEMO_TOPIC

Memublikasikan Pesan

Pilih salah satu metode berikut untuk mengirim pesan ke PUBSUB_DEMO_TOPIC:

  • Gunakan kembali program Anda: Jika Anda memiliki program dari codelab sebelumnya untuk dipublikasikan, gunakan program tersebut.
  • Publikasi Langsung: Untuk pengujian cepat, coba salah satu opsi berikut:
  • Cloud Console: Memublikasikan langsung di dalam Google Cloud Console. Untuk mengetahui detail selengkapnya, lihat dokumentasi Pub/Sub.
  • Perintah gcloud: Jalankan perintah berikut:
gcloud pubsub topics publish PUBSUB_DEMO_TOPIC \
--message='{"eventType":"SalesOrderChanged","source":"SAPDEV100","eventTime":"20240207183048","SalesOrder":1000924}'

7. Membuat konfigurasi kunci klien

Setelah Anda menyiapkan prasyarat di sisi Google Cloud, kita dapat melanjutkan konfigurasi di sisi SAP.

Untuk konfigurasi terkait autentikasi dan konektivitas, ABAP SDK untuk Google Cloud menggunakan tabel /GOOG/CLIENT_KEY dan /GOOG/SERVIC_MAP.

Untuk mempertahankan konfigurasi di tabel /GOOG/CLIENT_KEY, lakukan langkah-langkah berikut:

  1. Di SAP GUI, masukkan kode transaksi SPRO.
  2. Klik IMG Referensi SAP.
  3. Klik ABAP SDK for Google Cloud > Basic Settings > Configure Client Key.

25871e639293b9ee.png

  1. Pertahankan nilai berikut terhadap kolom. Biarkan kolom lain kosong.

Kolom

Nilai

Google Cloud Key Name

PUBSUB_SUBSCRIBER

Nama Akun Layanan Google Cloud

abap-sdk-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com

Google Cloud Scope

https://www.googleapis.com/auth/cloud-platform

ID Project

abap-sdk-poc

Class Otorisasi

/GOOG/CL_AUTH_GOOGLE

8. Membuat laporan ABAP untuk menerima pesan dari Google Cloud Pub/Sub

  1. Login ke sistem SAP Anda.
  2. Buka kode transaksi SE38 dan buat Program Laporan dengan nama ZDEMO_RECEIVE_CPS_EVENTS.
  3. Di pop-up yang terbuka, berikan detail seperti yang ditunjukkan di bawah, lalu klik Simpan.

7c739236bedb5bf1.png

  1. Di pop-up berikutnya, pilih Local Object atau berikan nama paket yang sesuai.
  2. Di ABAP Editor, tambahkan kode berikut:
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. Simpan dan aktifkan Laporan.
  2. Jalankan laporan (F8).

Jika berhasil dieksekusi, Anda akan melihat output laporan seperti yang ditunjukkan di bawah ini:

5b76e886ef79d0ba.png

9. Penjelasan kode pelanggan Pub/Sub ABAP

Pada dasarnya, program ABAP ini terintegrasi dengan Google Cloud Pub/Sub sebagai pelanggan pesan. Fungsi ini memeriksa langganan yang ditentukan untuk pesan baru sesuai permintaan, memprosesnya, lalu mengonfirmasi penerimaannya untuk mencegah pengiriman ulang di masa mendatang.

Program ini akan melakukan aktivitas berikut:

Perincian langkah demi langkah

Buat Koneksi:

  • Fungsi ini membuat koneksi HTTP ke layanan Google Cloud Pub/Sub menggunakan class /GOOG/CL_PUBSUB_V1.

Tetapkan Parameter:

  • Project ID: Mengekstrak Project ID yang relevan tempat langganan Pub/Sub berada.
  • Nama Langganan: Menentukan nama Langganan tempat pesan akan diambil (PUBSUB_DEMO_SUBSCRIPTION).
  • Batas Pesan: Menetapkan jumlah maksimum pesan yang akan diambil dalam satu panggilan API (dalam hal ini, 1).

Mengambil Pesan:

  • Memanggil metode pull_subscriptions untuk mengambil pesan dari langganan yang ditentukan.

Proses Pesan yang Diterima:

  • Jika ada pesan, program akan mendekode data, mencatat konten ke dalam log, dan mengirim konfirmasi.

Mengonfirmasi Pesan:

  • Memanggil metode acknowledge_subscriptions untuk mengirim konfirmasi ke Pub/Sub yang menunjukkan keberhasilan penerimaan pesan. Hal ini mencegah pesan tersebut dikirim ulang.

Menangani Keberhasilan/Error:

  • Memberikan pesan berhasil jika pesan diterima dan diakui serta menampilkan pesan error untuk berbagai skenario kegagalan (tidak ada pesan yang diterima, error API, dll.).

Tutup Koneksi:

  • Menutup koneksi HTTP ke layanan Pub/Sub.

10. Selamat

Anda telah menyelesaikan Codelab "Menerima peristiwa dari Cloud Pub/Sub menggunakan ABAP SDK untuk Google Cloud" dengan sangat baik.

Anda telah berhasil membuat jembatan antara ABAP dan Google Cloud Pub/Sub. Penyelesaian codelab Anda menunjukkan pemahaman yang kuat tentang pesan berbasis peristiwa dan cara menggunakan ABAP SDK untuk Google Cloud guna berintegrasi dengan layanan Google Cloud. Bagus!

Anda telah membuka tingkat integrasi baru antara ABAP dan Layanan Google Cloud. Perluas wawasan Anda dengan opsi menarik berikut:

  • Menggunakan Translation API dengan ABAP SDK untuk Google Cloud
  • Mengupload objek besar ke bucket Cloud Storage menggunakan chunking
  • Mengambil Kredensial/Rahasia dari Secret Manager dengan ABAP SDK untuk Google Cloud
  • Memanggil Vertex AI test-bison dari ABAP
  • Memanggil BigQuery ML dari ABAP

11. Pembersihan

Jika Anda tidak ingin melanjutkan codelab tambahan yang terkait dengan ABAP SDK untuk Google Cloud, lanjutkan pembersihan.

Menghapus project

  • Hapus project Google Cloud:
gcloud projects delete abap-sdk-poc

Menghapus resource satu per satu

  1. Hapus instance komputasi:
gcloud compute instances delete abap-trial-docker
  1. Hapus aturan Firewall:
gcloud compute firewall-rules delete sapmachine
  1. Hapus akun layanan:
gcloud iam service-accounts delete \
    abap-sdk-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com