이 Codelab 정보
1. 소개
이 Codelab에서는 ABAP SDK for Google Cloud를 사용하여 Google Cloud Pub/Sub 주제에서 이벤트 세부정보를 수신하는 방법을 안내합니다. 다음 Google Cloud 서비스를 활용합니다.
- Cloud Pub/Sub
- Cloud Shell
기본 요건
- ABAP SDK for Google Cloud가 설치된 SAP 시스템에 액세스할 수 있는지 확인합니다.
- 'Google Cloud Platform에 ABAP 플랫폼 트라이얼 설치 및 ABAP SDK 설치' Codelab을 참고하여 새 시스템을 설정할 수 있습니다.
- Google Cloud 프로젝트에서 Codelab 'ABAP SDK를 사용하여 SAP에서 Pub/Sub로 이벤트 전송'의 일부로
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'
위 명령어에서는 Google Cloud 프로젝트의 자리표시자로 abap-sdk-poc
를 사용합니다. abap-sdk-poc
를 프로젝트 ID로 바꿉니다.
- 역할이 추가되었는지 확인하려면 IAM 페이지로 이동합니다. 생성한 서비스 계정이 할당된 역할과 함께 나열됩니다.
5. 풀 구독 이해하기
풀 구독의 경우 SAP 시스템이 구독자 클라이언트 역할을 하며 Pub/Sub 서버에 메시지 검색을 요청합니다. 구독자 클라이언트는 REST 풀 API를 사용합니다.
주요 API 메서드
Google Cloud Pub/Sub API
- pull: 메시지를 가져오는 요청을 시작합니다.
- 확인: 메시지가 성공적으로 처리되었음을 Pub/Sub에 알립니다.
ABAP SDK for Google Cloud 동등 항목
- /GOOG/CL_PUBSUB_V1 -> PULL_SUBSCRIPTIONS
- /GOOG/CL_PUBSUB_V1 -> ACKNOWLEDGE_SUBSCRIPTIONS
풀 구독의 메시지 흐름
다음 이미지는 구독자 클라이언트와 풀 구독 간의 워크플로를 보여줍니다.
- 풀 요청: SAP 시스템 (구독자)이 풀 메서드를 사용하여 Pub/Sub 서버에서 메시지를 요청합니다.
- 풀 응답: Pub/Sub 서버는 0개 이상의 메시지와 확인 ID로 응답합니다. 메시지가 0개이거나 오류가 있는 응답이 반드시 수신 가능한 메시지가 없음을 나타내는 것은 아닙니다. 이 응답은 이미지에 표시된 PullResponse입니다.
- 확인: 메시지를 처리한 후 SAP 시스템은 수신된 확인 ID와 함께 확인 메서드를 사용합니다. 이렇게 하면 Pub/Sub가 메시지를 다시 전송하지 않습니다.
6. 구독 설정 및 메시지 전송
풀 구독 만들기
- 다음 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. 축하합니다
'ABAP SDK for Google Cloud를 사용하여 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