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

1. Giriş

Bu codelab, 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 için "Abone" izinlerine sahip bir hizmet hesabı.
  • Pub/Sub konunuzdan mesaj almak ve bu mesajları 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 yüklü SAP GUI (Windows veya Java) SAP GUI dizüstü bilgisayarınıza zaten yüklüyse Uygulama Sunucusu IP'si olarak VM'nin harici IP adresini kullanarak SAP'ye 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 komutlarda 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 alma ile sınırlar ve 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. Şimdi 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 atanmış rolle birlikte listelenmelidir.

5. Pull aboneliklerini anlama

Çekme aboneliğinde SAP sisteminiz abone istemcisi olarak hareket eder ve mesajları almak için Pub/Sub sunucusuna istek gönderir. Abone istemcisi, REST Pull API'yi kullanır.

Temel API yöntemleri

Google Cloud Pub/Sub API

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

Google Cloud Equivalents için ABAP SDK'sı

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

Çekme aboneliği için ileti akışı

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

f0fc44265192f348.png

  1. Çekme isteği: SAP sisteminiz (abone), Pub/Sub sunucusundan mesaj istemek için çekme 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. Sıfır mesaj içeren veya hata veren bir yanıt, alınabilecek mesaj olmadığı anlamına gelmez. Bu yanıt, resimde gösterildiği gibi PullResponse'tur.
  3. Onay: SAP sisteminiz, bir iletiyi işledikten sonra alınan onay kimliğiyle birlikte onay yöntemini kullanır. Bu, Pub/Sub'ın iletiyi yeniden teslim etmesini engeller.

6. Aboneliğinizi ayarlama ve mesaj gönderme

Çekme aboneliği oluşturma

  • PUBSUB_DEMO_SUBSCRIPTION adlı bir çekme aboneliği oluşturmak için bu gcloud komutunu yürütün. Bu abonelik, PUBSUB_DEMO_TOPIC konusundan mesaj alır:
gcloud pubsub subscriptions create PUBSUB_DEMO_SUBSCRIPTION \
--topic=PUBSUB_DEMO_TOPIC

Mesajları yayınlama

PUBSUB_DEMO_TOPIC adresine 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 onu 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 bakı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ında ön koşulları ayarladığınıza göre, SAP tarafındaki yapılandırmaya geçebiliriz.

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

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

  1. SAP GUI'de SPRO işlem kodunu girin.
  2. SAP Reference IMG'yi (SAP Referans IMG) 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. Alanlara göre 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 bir ABAP raporu oluşturma

  1. SAP sisteminize giriş yapın.
  2. İşlem koduna SE38 gidin ve ZDEMO_RECEIVE_CPS_EVENTS. adında bir Rapor Programı oluşturun.
  3. Açılan pop-up'ta aşağıdaki gibi ayrıntıları girin ve Kaydet'i tıklayın.

7c739236bedb5bf1.png

  1. Sonraki pop-up pencerede Yerel Nesne'yi seçin veya uygun bir paket adı girin.
  2. ABAP düzenleyicide 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ütmenin ardından rapor çıkışını aşağıdaki gibi görmeniz gerekir:

5b76e886ef79d0ba.png

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

Bu ABAP programı, Google Cloud Pub/Sub ile mesaj abonesi olarak entegre olur. Belirtilen abonelikteki yeni iletileri isteğe bağlı olarak kontrol eder, işler ve gelecekte yeniden teslim edilmelerini önlemek için alındıklarını onaylar.

Program aşağıdaki etkinlikleri gerçekleştirir:

Adım adım açıklamalı kılavuz

Bağlantı Kurma:

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

Parametreleri ayarlama:

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

İletileri Getir:

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

Alınan İletileri İşleme:

  • İleti varsa program verileri çözer, içeriği günlüğe kaydeder ve onay gönderir.

İletileri Onaylama:

  • İletilerin başarıyla alındığını belirten bir onay Pub/Sub'a göndermek için acknowledge_subscriptions yöntemini çağırır. Bu, iletilerin yeniden teslim edilmesini engeller.

Başarıları/Hataları İşleme:

  • İletiler alındığında ve onaylandığında başarı mesajları gösterir. Çeşitli hata senaryoları (ileti alınmaması, API hataları vb.) için hata mesajları gösterir.

Bağlantıyı Kapatma:

  • Pub/Sub hizmetiyle 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 köprü oluşturdunuz. Bu codelab'i tamamlamanız, etkinliğe dayalı mesajlaşma ve Google Cloud hizmetleriyle entegrasyon için Google Cloud'a yönelik ABAP SDK'sının nasıl kullanılacağı konusunda sağlam bir anlayışa sahip olduğunuzu gösterir. Tebrikler!

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

  • Google Cloud için ABAP SDK ile Translation API'yi kullanma
  • Parçalama kullanarak Cloud Storage paketine büyük bir nesne yükleme
  • Google Cloud için ABAP SDK ile Secret Manager'dan kimlik bilgileri/gizli anahtarlar alma
  • ABAP'tan Vertex AI test-bison'u çağırma
  • ABAP'tan BigQuery ML'yi çağırma

11. Temizleme

Google Cloud için ABAP SDK ile ilgili ek codelab'lere devam etmek istemiyorsanız lütfen temizleme işlemine geçin.

Projeyi silme

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

Belirli kaynakları silme

  1. Compute ö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