1. מבוא
בקודלאב הזה תלמדו איך לקבל פרטי אירועים מנושא ב-Google Cloud Pub/Sub באמצעות ABAP SDK ל-Google Cloud. נשתמש בשירותים הבאים של Google Cloud:
- Cloud Pub/Sub
- Cloud Shell
דרישות מוקדמות
- עליכם לוודא שיש לכם גישה למערכת SAP עם ABAP SDK ל-Google Cloud מותקן.
- אפשר להיעזר בקודלאב התקנת גרסת הטרום של ABAP Platform ב-Google Cloud Platform והתקנת ABAP SDK כדי להגדיר מערכת חדשה.
- יצרתם את הנושא
PUBSUB_DEMO_TOPIC
כחלק מה-Codelab שליחת אירועים מ-SAP ל-Pub/Sub באמצעות 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 החיצונית של ה-VM ככתובת ה-IP של שרת האפליקציות. אם אתם משתמשים ב-Mac, תוכלו גם להתקין את SAP GUI for Java שזמין בקישור הזה.
3. לפני שמתחילים
- בדף לבחירת הפרויקט במסוף Google Cloud, בוחרים או יוצרים פרויקט ב-Google Cloud (לדוגמה:
abap-sdk-poc
). - מוודאים שהחיוב מופעל בפרויקט ב-Cloud. כך בודקים אם החיוב מופעל בפרויקט אם אתם משתמשים בחשבון לתקופת ניסיון בחינם של 90 יום, אפשר לדלג על השלב הזה.
- תשתמשו ב-Cloud Shell, סביבת שורת פקודה שפועלת ב-Google Cloud. במסוף Cloud, לוחצים על 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
- כחלק מהקודלאב הקודם שליחת אירוע ל-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
משמש כ-placeholder לפרויקט ב-Google Cloud. מחליפים את abap-sdk-poc
במזהה הפרויקט.
- כדי לוודא שהתפקיד נוסף, עוברים לדף IAM. חשבון השירות שיצרתם אמור להופיע יחד עם התפקיד שהוקצה לו.
5. הסבר על מינויים מסוג 'משיכה'
במינוי משיכה, מערכת SAP פועלת כלקוח המנוי ומפעילה בקשות לשרת Pub/Sub כדי לאחזר הודעות. לקוח המינויים משתמש ב-API ל-REST מסוג Pull.
שיטות API של מפתחות
Google Cloud Pub/Sub API
- pull: שליחת בקשה לאחזור הודעות.
- acknowledge: אותות ל-Pub/Sub על כך שההודעה טופלה בהצלחה.
ABAP SDK ל-Google Cloud Equivalents
- /GOOG/CL_PUBSUB_V1 -> PULL_SUBSCRIPTIONS
- /GOOG/CL_PUBSUB_V1 -> ACKNOWLEDGE_SUBSCRIPTIONS
העברת הודעות במינוי לשליפה
בתמונה הבאה מוצג תהליך העבודה בין לקוח מנויים למינוי משיכה.
- Pull Request: מערכת SAP (המנוי) משתמשת בשיטת pull כדי לבקש הודעות משרת Pub/Sub.
- תגובה למשיכה: שרת Pub/Sub מגיב עם אפס או יותר הודעות ומזהי אישור. תשובה עם אפס הודעות או עם הודעת שגיאה לא בהכרח מציינת שאין הודעות זמינות לקבלה. התגובה הזו היא PullResponse כפי שמוצג בתמונה.
- אישור: אחרי עיבוד הודעה, מערכת SAP משתמשת בשיטת האישור יחד עם מזהה האישור שהתקבל. כך מונעים מ-Pub/Sub לשלוח מחדש את ההודעה.
6. הגדרת המינוי ושליחת הודעות
יצירת מינוי משיכה
- מריצים את הפקודה הבאה ב-gcloud כדי ליצור מינוי משיכה בשם
PUBSUB_DEMO_SUBSCRIPTION
שיקבל הודעות מה-PUBSUB_DEMO_TOPIC
:
gcloud pubsub subscriptions create PUBSUB_DEMO_SUBSCRIPTION \
--topic=PUBSUB_DEMO_TOPIC
פרסום הודעות
אפשר לשלוח הודעות אל PUBSUB_DEMO_TOPIC
באחת מהשיטות הבאות:
- שימוש חוזר בתוכנית: אם יש לכם את התוכנית מקודלאב קודם , תוכלו להשתמש בה לפרסום.
- פרסום ישיר: כדי לבצע בדיקה מהירה, אפשר לנסות את אחת מהאפשרויות הבאות:
- מסוף 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.
לצורך הגדרות שקשורות לאימות ולקישוריות, ערכת ה-SDK של ABAP ל-Google Cloud משתמשת בטבלאות /GOOG/CLIENT_KEY
ו-/GOOG/SERVIC_MAP.
.
כדי לשמור את ההגדרות בטבלה /GOOG/CLIENT_KEY
:
- בממשק המשתמש של SAP, מזינים את קוד העסקה SPRO.
- לוחצים על SAP Reference IMG.
- לוחצים על ABAP SDK for Google Cloud > Basic Settings > Configure Client Key.
- שומרים את הערכים הבאים בשדות. משאירים את כל שאר השדות ריקים.
שדה | ערך |
שם המפתח ב-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. הסבר על קוד המנוי של ABAP Pub/Sub
בעיקרון, תוכנית ה-ABAP הזו משתלבת עם Google Cloud Pub/Sub כמנוי להודעות. הוא בודק מינוי ספציפי כדי למצוא הודעות חדשות על פי דרישה, מעבד אותן ולאחר מכן מאשר את קבלתן כדי למנוע שליחה חוזרת בעתיד.
התוכנית תבצע את הפעולות הבאות:
פירוט שלב אחרי שלב
יצירת חיבור:
- הוא יוצר חיבור HTTP לשירות Google Cloud Pub/Sub באמצעות הכיתה
/GOOG/CL_PUBSUB_V1
.
הגדרת פרמטרים:
- Project ID: חילוץ של מזהה הפרויקט הרלוונטי שבו נמצא המינוי ל-Pub/Sub.
- Subscription Name (שם המינוי): שם המינוי שממנו רוצים למשוך הודעות (
PUBSUB_DEMO_SUBSCRIPTION
). - Message Limit: מגדיר את מספר ההודעות המקסימלי לאחזור בקריאה יחידה ל-API (במקרה הזה, 1).
אחזור הודעות:
- קריאה ל-method
pull_subscriptions
כדי לאחזר הודעות מהמינוי שצוין.
עיבוד ההודעות שהתקבלו:
- אם יש הודעות, התוכנה מפענחת את הנתונים, מתעדת את התוכן ושולחת אישור.
אישור הודעות:
- קריאה ל-method
acknowledge_subscriptions
כדי לשלוח אישור ל-Pub/Sub על קבלת ההודעות. כך לא יתבצע העברה חוזרת שלהן.
טיפול בהצלחות ובשגיאות:
- השירות מספק הודעות על הצלחה אם ההודעות מתקבלות ומאושרות, ומציג הודעות שגיאה בתרחישי כשל שונים (לא התקבלו הודעות, שגיאות API וכו').
סגירת החיבור:
- סגירת החיבור ל-HTTP לשירות Pub/Sub.
10. מזל טוב
עבודה נהדרת על השלמת הקודלה 'קבלת אירוע מ-Cloud Pub/Sub באמצעות ABAP SDK ל-Google Cloud'.
סיימתם ליצור גשר בין ABAP ל-Google Cloud Pub/Sub. סיום הקודלה הזה מוכיח שאתם מבינים היטב את התקשורת מבוססת-האירועים ואת השימוש ב-ABAP SDK ל-Google Cloud כדי לשלב עם שירותי Google Cloud. כל הכבוד!
הגעתם לרמה חדשה של שילוב בין ABAP לשירותי Google Cloud. אפשר להרחיב את האופק בעזרת האפשרויות המעניינות הבאות:
- שימוש ב-Translation API עם ABAP SDK ל-Google Cloud
- העלאת אובייקט גדול לקטגוריה של Cloud Storage באמצעות חלוקה למקטעים
- אחזור פרטי כניסה/סודות מ-Secret Manager באמצעות ABAP SDK ל-Google Cloud
- קריאה ל-Vertex AI test-bison מ-ABAP
- קריאה ל-BigQuery ML מ-ABAP
11. הסרת המשאבים
אם אתם לא רוצים להמשיך בקודלאבים הנוספים שקשורים ל-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