Google Cloud용 ABAP SDK를 사용하여 SAP의 Cloud Pub/Sub에서 이벤트 수신

1. 소개

이 Codelab에서는 ABAP SDK for Google Cloud를 사용하여 Google Cloud Pub/Sub 주제에서 이벤트 세부정보를 수신하는 방법을 안내합니다. 다음 Google Cloud 서비스를 활용합니다.

  • Cloud Pub/Sub
  • Cloud Shell

기본 요건

gcloud pubsub topics create PUBSUB_DEMO_TOPIC

빌드할 항목

다음을 만듭니다.

  • Pub/Sub API와 상호작용할 수 있는 '구독자' 권한이 있는 서비스 계정
  • Pub/Sub 주제에서 메시지를 수신하고 확인하는 ABAP 프로그램입니다.

2. 요구사항

  • 브라우저(Chrome, Firefox 등)
  • 결제가 사용 설정된 Google Cloud 프로젝트 또는 Google Cloud Platform용 90일 무료 체험판 계정 만들기
  • 시스템에 설치된 SAP GUI (Windows 또는 Java) 노트북에 SAP GUI가 이미 설치되어 있는 경우 VM 외부 IP 주소를 애플리케이션 서버 IP로 사용하여 SAP에 연결합니다. Mac을 사용하는 경우 링크에서 Java용 SAP GUI를 설치할 수도 있습니다.

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를 프로젝트 ID로 바꿉니다.

  1. 역할이 추가되었는지 확인하려면 IAM 페이지로 이동합니다. 만든 서비스 계정이 할당된 역할과 함께 표시됩니다.

5. 가져오기 구독 이해하기

풀 구독의 경우 SAP 시스템이 구독자 클라이언트 역할을 하며 Pub/Sub 서버에 메시지 검색을 요청하기 시작합니다. 구독자 클라이언트는 REST Pull API를 사용합니다.

주요 API 메서드

Google Cloud Pub/Sub API

  • 가져오기: 메시지 가져오기 요청을 시작합니다.
  • acknowledge: 메시지가 성공적으로 처리되었음을 Pub/Sub에 알립니다.

ABAP SDK for Google Cloud 등가 항목

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

pull 구독의 메시지 흐름

다음 이미지는 구독자 클라이언트와 pull 구독 간의 워크플로를 보여줍니다.

f0fc44265192f348.png

  1. 가져오기 요청: SAP 시스템 (구독자)이 가져오기 메서드를 사용하여 Pub/Sub 서버에서 메시지를 요청합니다.
  2. 풀 응답: Pub/Sub 서버는 0개 이상의 메시지와 확인 ID로 응답합니다. 메시지가 0개이거나 오류가 있는 응답이 반드시 수신 가능한 메시지가 없음을 나타내는 것은 아닙니다. 이 응답은 이미지에 표시된 PullResponse입니다.
  3. 확인: 메시지를 처리한 후 SAP 시스템은 수신된 확인 ID와 함께 확인 메서드를 사용합니다. 이렇게 하면 Pub/Sub가 메시지를 다시 전송하지 않습니다.

6. 구독 설정 및 메시지 전송

pull 구독 만들기

  • 다음 gcloud 명령어를 실행하여 PUBSUB_DEMO_TOPIC에서 메시지를 수신할 PUBSUB_DEMO_SUBSCRIPTION라는 풀 구독을 만듭니다.
gcloud pubsub subscriptions create PUBSUB_DEMO_SUBSCRIPTION \
--topic=PUBSUB_DEMO_TOPIC

메시지 게시

다음 방법 중 하나를 선택하여 PUBSUB_DEMO_TOPIC에 메시지를 보냅니다.

  • 프로그램 재사용: 게시할 이전 Codelab 의 프로그램이 있는 경우 해당 프로그램을 사용합니다.
  • 직접 게시: 빠르게 테스트하려면 다음 옵션 중 하나를 사용해 보세요.
  • Cloud 콘솔: Google Cloud 콘솔 내에서 직접 게시합니다. 자세한 내용은 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 for Google Cloud는 /GOOG/CLIENT_KEY/GOOG/SERVIC_MAP. 테이블을 사용합니다.

/GOOG/CLIENT_KEY 테이블의 구성을 유지하려면 다음 단계를 따르세요.

  1. SAP GUI에서 트랜잭션 코드 SPRO를 입력합니다.
  2. SAP 참조 IMG를 클릭합니다.
  3. ABAP SDK for 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

프로젝트 ID

abap-sdk-poc

승인 클래스

/GOOG/CL_AUTH_GOOGLE

8. Google Cloud Pub/Sub에서 메시지를 수신하는 ABAP 보고서 빌드

  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. ABAP Pub/Sub 구독자 코드 설명

본질적으로 이 ABAP 프로그램은 메시지 구독자로 Google Cloud Pub/Sub와 통합됩니다. 요청 시 지정된 구독에서 새 메시지를 확인하고 처리한 후 수신을 확인하여 향후 재전송을 방지합니다.

이 프로그램은 다음 작업을 실행합니다.

단계별 분석

연결 설정:

  • /GOOG/CL_PUBSUB_V1 클래스를 사용하여 Google Cloud Pub/Sub 서비스에 HTTP 연결을 설정합니다.

매개변수 설정:

  • 프로젝트 ID: Pub/Sub 구독이 있는 관련 프로젝트 ID를 추출합니다.
  • 구독 이름: 메시지를 가져올 구독의 이름을 지정합니다 (PUBSUB_DEMO_SUBSCRIPTION).
  • 메시지 한도: 단일 API 호출에서 가져올 최대 메시지 수를 설정합니다 (이 경우 1).

메시지 가져오기:

  • pull_subscriptions 메서드를 호출하여 지정된 정기 결제에서 메시지를 검색합니다.

수신된 메시지 처리:

  • 메시지가 있으면 프로그램은 데이터를 디코딩하고 콘텐츠를 로깅한 후 확인을 전송합니다.

메시지 확인:

  • acknowledge_subscriptions 메서드를 호출하여 메시지 수신 완료를 나타내는 확인을 Pub/Sub에 전송합니다. 이렇게 하면 메일이 다시 전송되지 않습니다.

성공/오류 처리:

  • 메시지가 수신되고 확인되면 성공 메시지를 제공하고 다양한 실패 시나리오 (메시지 수신 없음, API 오류 등)에 대한 오류 메시지를 표시합니다.

연결 닫기:

  • Pub/Sub 서비스에 대한 HTTP 연결을 닫습니다.

10. 축하합니다

'Google Cloud용 ABAP SDK를 사용하여 Cloud Pub/Sub에서 이벤트 수신' Codelab을 완료해 주셔서 감사합니다.

ABAP와 Google Cloud Pub/Sub 간에 브리지를 빌드했습니다. Codelab을 완료하면 이벤트 기반 메시지와 ABAP SDK for Google Cloud를 사용하여 Google Cloud 서비스와 통합하는 방법을 확실히 이해했음을 알 수 있습니다. 잘하셨습니다.

이제 ABAP와 Google Cloud 서비스 간에 새로운 수준의 통합을 활용할 수 있습니다. 다음과 같은 흥미로운 옵션으로 지평을 넓혀 보세요.

  • ABAP SDK for Google Cloud에서 Translation API 사용
  • 단위 분할을 사용하여 Cloud Storage 버킷에 대용량 객체 업로드
  • ABAP SDK for Google Cloud를 사용하여 Secret Manager에서 사용자 인증 정보/비밀 검색
  • ABAP에서 Vertex AI test-bison 호출
  • ABAP에서 BigQuery ML 호출

11. 삭제

ABAP SDK for Google Cloud와 관련된 추가 Codelab을 계속 진행하고 싶지 않다면 정리를 진행하세요.

프로젝트 삭제

  • 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