1. מבוא
בשיעור הזה תלמדו איך לקבל פרטי אירועים מנושא ב-Google Cloud Pub/Sub באמצעות ABAP SDK for Google Cloud. נשתמש בשירותים הבאים של Google Cloud:
- Cloud Pub/Sub
- Cloud Shell
דרישות מוקדמות
- מוודאים שיש לכם גישה למערכת SAP עם ABAP SDK for Google Cloud מותקן.
- אפשר להיעזר ב-codelab Install ABAP Platform Trial on Google Cloud Platform and Install ABAP SDK כדי להגדיר מערכת חדשה.
- יצרתם נושא
PUBSUB_DEMO_TOPIC
כחלק מ-Codelab Send events from SAP to Pub/Sub using ABAP SDK בפרויקט שלכם ב-Google Cloud. אם הוא לא נוצר, משתמשים בפקודה הבאה כדי ליצור אותו:
gcloud pubsub topics create PUBSUB_DEMO_TOPIC
מה תפַתחו
תצטרכו ליצור את הפריטים הבאים:
- חשבון שירות עם הרשאות 'מנוי' לאינטראקציה עם Pub/Sub API.
- תוכנית ABAP לקבלת הודעות מהנושא שלכם ב-Pub/Sub ולאישור קבלתן.
2. דרישות
- דפדפנים, כמו Chrome או Firefox.
- פרויקט ב-Google Cloud עם חיוב מופעל או יצירת חשבון לניסיון חינם למשך 90 יום ב-Google Cloud Platform.
- SAP GUI (Windows או Java) מותקן במערכת. אם SAP GUI כבר מותקן במחשב הנייד, מתחברים ל-SAP באמצעות כתובת ה-IP החיצונית של המכונה הווירטואלית ככתובת ה-IP של שרת האפליקציות. אם אתם משתמשים ב-Mac, אתם יכולים גם להתקין את SAP GUI for Java שזמין בקישור הזה.
3. לפני שמתחילים
- ב-Google Cloud Console, בדף לבחירת הפרויקט, בוחרים או יוצרים פרויקט ב-Google Cloud (לדוגמה:
abap-sdk-poc
). - מוודאים שהחיוב מופעל בפרויקט שלכם ב-Cloud. כך בודקים אם החיוב מופעל בפרויקט אפשר לדלג על השלב הזה אם אתם משתמשים בחשבון עם תקופת ניסיון בחינם ל-90 יום.
- תשתמשו ב-Cloud Shell, סביבת שורת פקודה שפועלת ב-Google Cloud. בפינה הימנית העליונה של Cloud Console, לוחצים על Activate 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
הדרך הכי בטוחה לתוכנית ABAP לקבל הודעות מ-Pub/Sub היא באמצעות חשבון שירות עם התפקיד Subscriber
. התפקיד הזה מגביל את ההרשאות לאחזור הודעות בלבד, וכך מונע פרצות אבטחה פוטנציאליות.
יצירת חשבון השירות
כדי ליצור חשבון שירות עם התפקיד הנדרש, מבצעים את השלבים הבאים:
- מריצים את הפקודה הבאה במסוף 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
הוא placeholder לפרויקט Google Cloud. מחליפים את abap-sdk-poc
במזהה הפרויקט.
- כדי לוודא שהתפקיד נוסף, עוברים לדף IAM. חשבון השירות שיצרתם אמור להופיע ברשימה יחד עם התפקיד שהוקצה לו.
5. הסבר על מינויים לשליפת הודעות
במינוי מסוג pull, מערכת SAP פועלת כלקוח המנוי ויוזמת בקשות לשרת Pub/Sub כדי לאחזר הודעות. לקוח המנוי משתמש ב-REST Pull API.
שיטות API מרכזיות
Google Cloud Pub/Sub API
- pull: מתחיל בקשה לאחזור הודעות.
- אישור: אות ל-Pub/Sub שהודעה עברה עיבוד בהצלחה.
ABAP SDK for Google Cloud Equivalents
- /GOOG/CL_PUBSUB_V1 -> PULL_SUBSCRIPTIONS
- /GOOG/CL_PUBSUB_V1 -> ACKNOWLEDGE_SUBSCRIPTIONS
זרימת ההודעות במינוי מסוג pull
בתמונה הבאה מוצג תהליך העבודה בין לקוח של מנוי לבין מנוי מסוג pull.
- בקשת משיכה: מערכת SAP (המנוי) משתמשת בשיטת המשיכה כדי לבקש הודעות משרת Pub/Sub.
- תגובת משיכה: שרת Pub/Sub מגיב עם אפס או יותר הודעות ומזהי אישור. תשובה עם אפס הודעות או עם שגיאה לא בהכרח מציינת שאין הודעות זמינות לקבלה. התגובה הזו היא PullResponse כפי שמוצג בתמונה.
- אישור: אחרי עיבוד ההודעה, מערכת SAP משתמשת בשיטת האישור יחד עם מזהה האישור שהתקבל. כך נמנעת מסירה מחדש של ההודעה ב-Pub/Sub.
6. הגדרת המנוי ושליחת הודעות
יצירת מינוי מסוג Pull
- מריצים את הפקודה הבאה ב-gcloud כדי ליצור מינוי מסוג pull בשם
PUBSUB_DEMO_SUBSCRIPTION
, שיקבל הודעות מ-PUBSUB_DEMO_TOPIC
:
gcloud pubsub subscriptions create PUBSUB_DEMO_SUBSCRIPTION \
--topic=PUBSUB_DEMO_TOPIC
פרסום הודעות
בוחרים אחת מהשיטות הבאות כדי לשלוח הודעות אל PUBSUB_DEMO_TOPIC
:
- שימוש חוזר בתוכנית: אם יש לכם תוכנית ממעבדת קודים קודמת לפרסום, תוכלו להשתמש בה.
- פרסום ישיר: כדי לבצע בדיקה מהירה, אפשר לנסות אחת מהאפשרויות הבאות:
- Cloud Console: פרסום ישירות מתוך Google Cloud Console. פרטים נוספים זמינים במסמכי התיעוד של Pub/Sub.
- פקודת gcloud: מריצים את הפקודה הבאה:
gcloud pubsub topics publish PUBSUB_DEMO_TOPIC \
--message='{"eventType":"SalesOrderChanged","source":"SAPDEV100","eventTime":"20240207183048","SalesOrder":1000924}'
7. יצירת הגדרת מפתח לקוח
אחרי שהגדרתם את הדרישות המוקדמות בצד של Google Cloud, אפשר להמשיך להגדרה בצד של SAP.
לצורך הגדרות שקשורות לאימות ולקישוריות, ערכת ה-SDK של ABAP ל-Google Cloud משתמשת בטבלאות /GOOG/CLIENT_KEY
ו-/GOOG/SERVIC_MAP.
כדי לשמור את ההגדרה בטבלה /GOOG/CLIENT_KEY
, מבצעים את השלבים הבאים:
- ב-SAP GUI, מזינים את קוד העסקה SPRO.
- לוחצים על SAP Reference IMG.
- לוחצים על ABAP SDK for Google Cloud > Basic Settings > Configure Client Key (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 |
מזהה פרויקט | abap-sdk-poc |
Authorization Class | /GOOG/CL_AUTH_GOOGLE |
8. יצירת דוח ABAP לקבלת הודעות מ-Google Cloud Pub/Sub
- מתחברים למערכת SAP.
- עוברים אל קוד העסקה
SE38
ויוצרים תוכנית דיווח בשםZDEMO_RECEIVE_CPS_EVENTS.
- בחלון הקופץ שנפתח, מזינים את הפרטים כמו שמוצג למטה ולוחצים על שמירה.
- בחלון הקופץ הבא, בוחרים באפשרות Local Object או מזינים שם חבילה לפי הצורך.
- בעורך 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. הסבר על קוד מינוי ל-Pub/Sub ב-ABAP
במהותה, תוכנת ה-ABAP הזו משתלבת עם Google Cloud Pub/Sub כמנוי להודעות. הוא בודק מינוי שצוין כדי לראות אם יש בו הודעות חדשות לפי דרישה, מעבד אותן ואז מאשר את הקבלה שלהן כדי למנוע מסירה חוזרת בעתיד.
במסגרת התוכנית יתבצעו הפעילויות הבאות:
פירוט שלב אחר שלב
יצירת חיבור:
- הוא יוצר חיבור HTTP לשירות Google Cloud Pub/Sub באמצעות המחלקה
/GOOG/CL_PUBSUB_V1
.
הגדרת פרמטרים:
- Project ID: חילוץ מזהה הפרויקט הרלוונטי שבו נמצאת המינוי ל-Pub/Sub.
- שם המינוי: מציינים את שם המינוי שממנו רוצים לשלוף הודעות (
PUBSUB_DEMO_SUBSCRIPTION
). - מגבלת הודעות: הגדרת המספר המקסימלי של הודעות לאחזור בקריאה יחידה ל-API (במקרה הזה, 1).
אחזור הודעות:
- מפעיל את שיטת
pull_subscriptions
כדי לאחזר הודעות מהמינוי שצוין.
עיבוד הודעות שהתקבלו:
- אם יש הודעות, התוכנה מפענחת את הנתונים, מתעדת את התוכן ושולחת אישור.
אישור קריאת הודעות:
- קוראים לשיטה
acknowledge_subscriptions
כדי לשלוח אישור ל-Pub/Sub שמציין שההודעות התקבלו בהצלחה. כך לא תתבצע מסירה חוזרת שלהם.
טיפול בהצלחות או בשגיאות:
- הכלי מספק הודעות הצלחה אם ההודעות מתקבלות ומאושרות, ומציג הודעות שגיאה בתרחישי כשל שונים (לא מתקבלות הודעות, שגיאות ב-API וכו').
סגירת החיבור:
- סגירת חיבור ה-HTTP לשירות Pub/Sub.
10. מזל טוב
עבודה מצוינת! סיימת את ה-Codelab בנושא 'קבלת אירוע מ-Cloud Pub/Sub באמצעות ABAP SDK ל-Google Cloud'.
יצרת בהצלחה גשר בין ABAP לבין Google Cloud Pub/Sub. השלמת שיעור ה-Codelab מעידה על הבנה טובה של העברת הודעות מבוססת-אירועים ושל השימוש ב-ABAP SDK ל-Google Cloud לצורך שילוב עם שירותי Google Cloud. כל הכבוד!
השגתם רמה חדשה של שילוב בין ABAP לבין שירותי Google Cloud. אלה האפשרויות המעניינות שיעזרו לכם להרחיב את האופקים:
- שימוש ב-Translation API עם ABAP SDK for Google Cloud
- העלאת אובייקט גדול לקטגוריה של Cloud Storage באמצעות חלוקה לחלקים
- אחזור פרטי כניסה או סודות מ-Secret Manager באמצעות ABAP SDK ל-Google Cloud
- קריאה ל-Vertex AI test-bison מ-ABAP
- קריאה ל-BigQuery ML מ-ABAP
11. הסרת המשאבים
אם לא רוצים להמשיך עם ה-codelab הנוסף שקשור ל-ABAP SDK ל-Google Cloud, צריך להמשיך לניקוי.
מחיקת הפרויקט
- מחיקת הפרויקט ב-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