Google Cloud için ABAP SDK'sını kullanarak SAP'de Cloud Pub/Sub'dan etkinlik alın

1. Giriş

Bu kod laboratuvarı, Google Cloud için ABAP SDK'sını kullanarak bir Google Cloud Pub/Sub konusundan etkinlik ayrıntılarını alma konusunda size yol gösterir. Aşağıdaki Google Cloud hizmetlerinden yararlanacağız:

  • Cloud Pub/Sub
  • Cloud Shell

Ön koşullar

gcloud pubsub topics create PUBSUB_DEMO_TOPIC

Ne oluşturacaksınız?

Aşağıdakileri oluşturursunuz:

  • Pub/Sub API ile etkileşim kurmak için "Abone" izinlerine sahip bir hizmet hesabı.
  • Pub/Sub konunuzdan mesajları alıp onaylamak için bir ABAP programı.

2. Şartlar

  • Chrome veya Firefox gibi tarayıcılar
  • Faturalandırmanın etkin olduğu bir Google Cloud projesi veya Google Cloud Platform için 90 Günlük Ücretsiz Deneme hesabı oluşturun.
  • Sisteminizde SAP GUI (Windows veya Java) yüklü olmalıdır. SAP GUI dizüstü bilgisayarınızda zaten yüklüyse uygulama sunucusu IP'si olarak sanal makinenin harici IP adresini kullanarak SAP'e bağlanın. Mac kullanıyorsanız bu bağlantıda bulunan Java için SAP GUI'yi de yükleyebilirsiniz.

3. Başlamadan önce

6757b2fb50ddcc2d.png

  • Hesabınızın kimliğini doğrulamak ve varsayılan projeyi abap-sdk-poc olarak ayarlamak için aşağıdaki komutları çalıştırın. Örnek olarak us-west4-b bölgesi kullanılmıştır. Gerekirse lütfen aşağıdaki komutlardaki projeyi ve bölgeyi tercihinize göre değiştirin.
gcloud auth login
gcloud config set project abap-sdk-poc
gcloud config set compute/zone us-west4-b

4. Pub/Sub erişimi için hizmet hesabı oluşturma

Subscriber rolüne sahip bir hizmet hesabı kullanmak, ABAP programınızın Pub/Sub'dan mesaj almasının en güvenli yoludur. Bu rol, izinleri yalnızca ileti almayla sınırlayarak olası güvenlik açıklarını önler.

Hizmet hesabını oluşturma

Gerekli role sahip bir hizmet hesabı oluşturmak için aşağıdaki adımları uygulayın:

  1. Cloud Shell terminalinde aşağıdaki komutu çalıştırın:
gcloud iam service-accounts \
create abap-sdk-pubsub-subscriber \
--display-name="Service Account for Pub/Sub Subscriber"
  1. Ardından, yukarıdaki adımda oluşturulan hizmet hesabına gerekli rolleri ekleyin:
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'

Yukarıdaki komutta, Google Cloud projesi için yer tutucu olarak abap-sdk-poc kullanılır. abap-sdk-poc yerine proje kimliğinizi yazın.

  1. Rolün eklendiğini doğrulamak için IAM sayfasına gidin. Oluşturduğunuz hizmet hesabı, kendisine atanan rolle birlikte listelenir.

5. Pull aboneliklerini anlama

Alma aboneliğinde SAP sisteminiz abone istemcisi gibi davranır ve mesajları almak için bir Pub/Sub sunucusuna istek gönderir. Abone istemcisi, REST Pull API'yi kullanır.

Temel API yöntemleri

Google Cloud Pub/Sub API

  • pull: Mesaj getirme isteği başlatır.
  • acknowledge: Pub/Sub'a bir mesajın başarıyla işlendiğini bildirir.

Google Cloud Eşdeğerlerine Yönelik ABAP SDK'sı

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

Alma aboneliği için mesaj akışı

Aşağıdaki resimde, abone istemcisi ile alma aboneliği arasındaki iş akışı gösterilmektedir.

f0fc44265192f348.png

  1. Alma İsteği: SAP sisteminiz (abone), Pub/Sub sunucusundan mesaj istemek için alma yöntemini kullanır.
  2. Çekme Yanıtı: Pub/Sub sunucusu sıfır veya daha fazla mesaj ve onay kimliğiyle yanıt verir. Mesaj içermeyen veya hata içeren bir yanıt, alınabilecek mesaj olmadığı anlamına gelmez. Bu yanıt, resimde gösterilen PullResponse'dir.
  3. Onay: SAP sisteminiz, bir ileti işlendikten sonra alınan onay kimliğiyle birlikte onay yöntemini kullanır. Bu, Pub/Sub'ın iletiyi yeniden yayınlamasını engeller.

6. Aboneliğinizi ayarlama ve mesaj gönderme

Alma aboneliği oluşturma

  • PUBSUB_DEMO_TOPIC adlı bir alma aboneliği oluşturmak için aşağıdaki gcloud komutunu çalıştırın. Bu abonelik, PUBSUB_DEMO_TOPIC kaynağından mesaj alır:PUBSUB_DEMO_SUBSCRIPTION
gcloud pubsub subscriptions create PUBSUB_DEMO_SUBSCRIPTION \
--topic=PUBSUB_DEMO_TOPIC

Mesaj yayınlama

PUBSUB_DEMO_TOPIC'e mesaj göndermek için aşağıdaki yöntemlerden birini seçin:

  • Programınızı yeniden kullanın: Yayınlamak için önceki bir codelab 'den programınız varsa bunu kullanın.
  • Doğrudan Yayınlama: Hızlı bir test için aşağıdaki seçeneklerden birini deneyin:
  • Cloud Console: Doğrudan Google Cloud Console'da yayınlayın. Daha fazla bilgi için Pub/Sub dokümanlarına göz atın.
  • gcloud komutu: Aşağıdaki komutu çalıştırın:
gcloud pubsub topics publish PUBSUB_DEMO_TOPIC \
--message='{"eventType":"SalesOrderChanged","source":"SAPDEV100","eventTime":"20240207183048","SalesOrder":1000924}'

7. İstemci anahtar yapılandırması oluşturma

Google Cloud tarafındaki ön koşulları ayarladığınıza göre SAP tarafında yapılandırma işlemine geçebiliriz.

Google Cloud için ABAP SDK'sı, kimlik doğrulama ve bağlantıyla ilgili yapılandırma için /GOOG/CLIENT_KEY ve /GOOG/SERVIC_MAP. tablolarını kullanır.

/GOOG/CLIENT_KEY tablosundaki yapılandırmayı korumak için aşağıdaki adımları uygulayın:

  1. SAP GUI'ye SPRO işlem kodunu girin.
  2. SAP Reference IMG'yi (SAP Referans IMG'si) tıklayın.
  3. Google Cloud için ABAP SDK'sı > Temel Ayarlar > İstemci Anahtarını Yapılandır'ı tıklayın.

25871e639293b9ee.png

  1. Alanlarda aşağıdaki değerleri koruyun. Diğer tüm alanları boş bırakın.

Alan

Değer

Google Cloud Anahtar Adı

PUBSUB_SUBSCRIBER

Google Cloud Hizmet Hesabı Adı

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

Google Cloud Kapsamı

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

Proje kimliği

abap-sdk-poc

Yetkilendirme Sınıfı

/GOOG/CL_AUTH_GOOGLE

8. Google Cloud Pub/Sub'dan mesaj almak için ABAP raporu oluşturma

  1. SAP sisteminize giriş yapın.
  2. SE38 işlem koduna gidin ve ZDEMO_RECEIVE_CPS_EVENTS. adlı bir rapor programı oluşturun
  3. Açılan pop-up'ta aşağıda gösterildiği gibi ayrıntıları girin ve Kaydet'i tıklayın.

7c739236bedb5bf1.png

  1. Sonraki pop-up'ta Yerel Nesne'yi seçin veya uygun bir paket adı girin.
  2. ABAP Düzenleyici'ye aşağıdaki kodu ekleyin:
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. Raporu kaydedip etkinleştirin.
  2. Raporu çalıştırın (F8).

Başarılı bir yürütme işleminde, rapor çıkışını aşağıdaki gibi görürsünüz:

5b76e886ef79d0ba.png

9. ABAP Pub/Sub abone kodu açıklaması

Özünde bu ABAP programı, mesaj abonesi olarak Google Cloud Pub/Sub ile entegre olur. Belirtilen bir abonelikte yeni mesaj olup olmadığını kontrol eder, bunları işler ve daha sonra gelecekte yeniden teslim edilmesini önlemek için alındığını onaylar.

Program aşağıdaki işlemleri gerçekleştirir:

Adım adım döküm

Bağlantı kurma:

  • /GOOG/CL_PUBSUB_V1 sınıfını kullanarak Google Cloud Pub/Sub hizmetine HTTP bağlantısı oluşturur.

Parametreleri ayarlama:

  • Proje kimliği: Pub/Sub aboneliğinin bulunduğu ilgili proje kimliğini ayıklayın.
  • Abonelik Adı: İletilerin alınacağı aboneliğin adını belirtir (PUBSUB_DEMO_SUBSCRIPTION).
  • Mesaj Sınırı: Tek bir API çağrısında alınabilecek maksimum mesaj sayısını (bu durumda 1) belirler.

Mesajları Getir:

  • Belirtilen abonelikten mesaj almak için pull_subscriptions yöntemini çağırır.

Alınan Mesajları İşleme:

  • Mesaj varsa program verilerin kodunu çözer, içeriği günlüğe kaydeder ve bir onay gönderir.

Mesajları Onaylama:

  • Mesajların başarıyla alındığını belirten bir onay mesajı göndermek için acknowledge_subscriptions yöntemini çağırır. Bu, bunların yeniden yayınlanmasını engeller.

Başarılı/hatalı işlemleri işleme:

  • İletiler alınıp onaylanırsa başarı mesajları sağlar ve çeşitli başarısızlık senaryoları (ileti alınmadı, API hataları vb.) için hata mesajları gösterir.

Bağlantıyı Kapat:

  • Pub/Sub hizmetine yönelik HTTP bağlantısını kapatır.

10. Tebrikler

"Google Cloud için ABAP SDK'sını kullanarak Cloud Pub/Sub'dan etkinlik alma" Codelab'ini tamamladığınız için tebrikler.

ABAP ile Google Cloud Pub/Sub arasında başarıyla bir köprü oluşturdunuz. Codelab'i tamamlamanız, etkinlik odaklı mesajlaşmayı ve Google Cloud hizmetlerine entegre etmek için Google Cloud için ABAP SDK'sının nasıl kullanılacağını iyi anladığınızı gösterir. Tebrikler!

ABAP ile Google Cloud Hizmetleri arasında yeni bir entegrasyon düzeyine ulaştınız. Bu heyecan verici seçeneklerle ufkunuzu genişletin:

  • Google Cloud için ABAP SDK'sı ile Translation API'yi kullanma
  • Parçalara ayırma özelliğini kullanarak büyük bir nesneyi Cloud Storage paketine yükleme
  • Google Cloud için ABAP SDK'sı ile Secret Manager'dan Kimlik Bilgileri/Gizli Anahtarlar Alma
  • ABAP'den Vertex AI test-bison'u çağırma
  • ABAP'den BigQuery ML'yi çağırma

11. Temizleme

Google Cloud için ABAP SDK'sıyla ilgili ek kod laboratuvarlarına devam etmek istemiyorsanız lütfen temizleme işlemine devam edin.

Projeyi silme

  • Google Cloud projesini silin:
gcloud projects delete abap-sdk-poc

Kaynakları tek tek silme

  1. Hesaplama örneğini silin:
gcloud compute instances delete abap-trial-docker
  1. Güvenlik duvarı kurallarını silin:
gcloud compute firewall-rules delete sapmachine
  1. Hizmet hesabını silin:
gcloud iam service-accounts delete \
    abap-sdk-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com