1. 소개
이 Codelab에서는 ABAP SDK for Google Cloud를 사용하여 Google Cloud Pub/Sub 주제에서 이벤트 세부정보를 수신하는 방법을 안내합니다. 다음 Google Cloud 서비스를 활용합니다.
- Cloud Pub/Sub
- Cloud Shell
기본 요건
- ABAP SDK for Google Cloud가 설치된 SAP 시스템에 액세스할 수 있는지 확인합니다.
- 새 시스템을 설정하려면 Codelab 'Google Cloud Platform에 ABAP 플랫폼 체험판 설치 및 ABAP SDK 설치'를 참고하세요.
- Codelab 'ABAP SDK를 사용하여 SAP에서 Pub/Sub로 이벤트 전송'의 일부로 Google Cloud 프로젝트에서 주제
PUBSUB_DEMO_TOPIC
를 만들었습니다. 생성되지 않은 경우 아래 명령어를 사용하여 만듭니다.
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. 시작하기 전에
- Google Cloud 콘솔의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다 (예:
abap-sdk-poc
). - Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요. 90일 무료 체험 계정을 사용하는 경우 이 단계를 건너뜁니다.
- Google Cloud에서 실행되는 명령줄 환경인 Cloud Shell을 사용합니다. Cloud 콘솔에서 오른쪽 상단에 있는 Cloud Shell 활성화를 클릭합니다.
- 다음 명령어를 실행하여 계정을 인증하고 기본 프로젝트를
abap-sdk-poc
로 설정합니다. 영역us-west4-b
를 예로 들 수 있습니다. 필요한 경우 다음 명령어에서 프로젝트와 영역을 원하는 대로 변경하세요.
gcloud auth login
gcloud config set project abap-sdk-poc
gcloud config set compute/zone us-west4-b
- 이전 Codelab 'Pub/Sub에 이벤트 전송'의 일부로 이미 pub/sub API를 사용 설정하고, 주제를 만들고, Pub/Sub에 메시지를 게시했어야 합니다.
4. Pub/Sub 액세스를 위한 서비스 계정 만들기
Subscriber
역할이 있는 서비스 계정을 사용하는 것이 ABAP 프로그램이 Pub/Sub에서 메시지를 수신하는 가장 안전한 방법입니다. 이 역할은 메시지 검색 권한으로만 제한하여 잠재적인 보안 취약점을 방지합니다.
서비스 계정 만들기
필요한 역할이 있는 서비스 계정을 만들려면 다음 단계를 따르세요.
- Cloud Shell 터미널에서 다음 명령어를 실행합니다.
gcloud iam service-accounts \
create abap-sdk-pubsub-subscriber \
--display-name="Service Account for Pub/Sub Subscriber"
- 이제 위 단계에서 만든 서비스 계정에 필요한 역할을 추가합니다.
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로 바꿉니다.
- 역할이 추가되었는지 확인하려면 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 구독 간의 워크플로를 보여줍니다.
- 가져오기 요청: SAP 시스템 (구독자)이 가져오기 메서드를 사용하여 Pub/Sub 서버에서 메시지를 요청합니다.
- 풀 응답: Pub/Sub 서버는 0개 이상의 메시지와 확인 ID로 응답합니다. 메시지가 0개이거나 오류가 있는 응답이 반드시 수신 가능한 메시지가 없음을 나타내는 것은 아닙니다. 이 응답은 이미지에 표시된 PullResponse입니다.
- 확인: 메시지를 처리한 후 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
테이블의 구성을 유지하려면 다음 단계를 따르세요.
- SAP GUI에서 트랜잭션 코드 SPRO를 입력합니다.
- SAP 참조 IMG를 클릭합니다.
- ABAP SDK for Google Cloud > 기본 설정 > 클라이언트 키 구성을 클릭합니다.
- 필드에 대해 다음 값을 유지합니다. 다른 모든 필드를 비워둡니다.
필드 | 값 |
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 보고서 빌드
- SAP 시스템에 로그인합니다.
- 트랜잭션 코드
SE38
로 이동하여 이름이ZDEMO_RECEIVE_CPS_EVENTS.
인 보고서 프로그램을 만듭니다. - 열리는 팝업에서 아래와 같이 세부정보를 입력하고 저장을 클릭합니다.
- 다음 팝업에서 로컬 객체를 선택하거나 적절하게 패키지 이름을 입력합니다.
- 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.
- 보고서를 저장하고 활성화합니다.
- 보고서를 실행합니다 (F8).
실행에 성공하면 아래와 같이 보고서 출력이 표시됩니다.
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
개별 리소스 삭제
- 컴퓨팅 인스턴스를 삭제합니다.
gcloud compute instances delete abap-trial-docker
- 방화벽 규칙을 삭제합니다.
gcloud compute firewall-rules delete sapmachine
- 서비스 계정을 삭제합니다.
gcloud iam service-accounts delete \
abap-sdk-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com