อัปโหลดไฟล์ไปยัง Cloud Storage ด้วยการแบ่งออกเป็นส่วน

1. บทนำ

ใน Codelab นี้ เราได้แสดงขั้นตอนในการสร้างบัญชีบริการและใช้บัญชีดังกล่าวเพื่อกำหนดค่าคีย์ไคลเอ็นต์และตารางแผนที่การสื่อสารที่จัดทำโดย ABAP SDK สำหรับ Google Cloud และเรียกใช้ Cloud Storage JSON API ใน ABAP

บริการ Google Cloud ต่อไปนี้ใช้ใน Codelab นี้

  • Compute Engine
  • บริการเครือข่าย
  • Cloud Shell
  • Cloud Storage JSON API V1

หมายเหตุ: เมื่อสร้างโปรเจ็กต์ Google Cloud ใหม่ ระบบจะเปิดใช้ชุด API และบริการที่เฉพาะเจาะจงโดยอัตโนมัติ ซึ่งรวมถึง Cloud Storage เพื่อให้คุณใช้ประโยชน์จากโซลูชันพื้นที่เก็บข้อมูลที่มีประสิทธิภาพนี้ได้ทันที ดังนั้นคุณจึงไม่จำเป็นต้องเปิดใช้เป็นขั้นตอนเพิ่มเติม

ข้อกำหนดเบื้องต้น

สิ่งที่คุณจะสร้าง

คุณจะสร้างโปรแกรมต่อไปนี้ในระบบ SAP โดยใช้ ABAP SDK สำหรับ Google Cloud

  • สร้าง Bucket ของ Cloud Storage
  • อ่านไฟล์จากเซิร์ฟเวอร์แอปพลิเคชันและอัปโหลดไปยัง Bucket ของ Cloud Storage ที่สร้างขึ้น

2. ข้อกำหนด

  • เบราว์เซอร์ เช่น Chrome หรือ Firefox
  • โปรเจ็กต์ Google Cloud ที่เปิดใช้การเรียกเก็บเงิน หรือสร้างบัญชีทดลองใช้ฟรี 90 วันสำหรับ Google Cloud Platform
  • SAP GUI (Windows หรือ Java) ที่ติดตั้งในระบบ หากติดตั้ง SAP GUI ในแล็ปท็อปแล้ว ให้เชื่อมต่อกับ SAP โดยใช้ที่อยู่ IP ภายนอกของ VM เป็น IP ของเซิร์ฟเวอร์แอปพลิเคชัน หากใช้ Mac คุณยังติดตั้ง SAP GUI สำหรับ Java ได้ด้วยโดยไปที่ลิงก์นี้

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
  • คุณต้องมีสิทธิ์เข้าถึงระบบ SAP ที่ติดตั้ง ABAP SDK สำหรับ Google Cloud
  • คุณต้องทำ Codelab 1 (ติดตั้ง ABAP Platform Trial 1909 ใน Google Cloud Platform และติดตั้ง ABAP SDK สำหรับ Google Cloud) และ Codelab 2 (กำหนดค่าการตรวจสอบสิทธิ์ ABAP SDK โดยใช้โทเค็นสำหรับ SAP ที่โฮสต์ใน VM ของ Compute Engine) ให้เสร็จสมบูรณ์ก่อนจึงจะดำเนินการกับ Codelab นี้ได้
  • หากคุณทำ Codelab 1 และ Codelab 2 เสร็จแล้ว ระบบจะจัดสรรระบบทดลองใช้ ABAP Platform 1909 ใน Google Cloud พร้อมกับการตั้งค่าที่จำเป็นสำหรับการตรวจสอบสิทธิ์และการเชื่อมต่อให้คุณ
  • หากยังไม่ได้ทำ Codelab 1 และ Codelab 2 คุณจะไม่มีโครงสร้างพื้นฐานและการเชื่อมต่อที่จำเป็นทั้งหมดเพื่อทำตามขั้นตอนที่ระบุไว้ใน Codelab นี้ ดังนั้น คุณต้องทำ Codelab 1 และ Codelab 2 ให้เสร็จก่อนจึงจะทำ Codelab นี้ต่อได้

4. สร้างบัญชีบริการที่มีบทบาทผู้ใช้ที่เข้าถึงออบเจ็กต์ใน Cloud Storage

หากต้องการสร้างบัญชีบริการที่มีบทบาทที่จำเป็น ให้ทำตามขั้นตอนต่อไปนี้

  1. เรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัล Cloud Shell
gcloud iam service-accounts create abap-sdk-storage-tester \
--display-name="Service Account for Cloud Storage"
  1. ตอนนี้ให้เพิ่มบทบาทที่จำเป็นลงในบัญชีบริการที่สร้างในขั้นตอนข้างต้น
gcloud projects add-iam-policy-binding abap-sdk-poc \
--member='serviceAccount:abap-sdk-storage-tester@abap-sdk-poc.iam.gserviceaccount.com' \
--role='roles/storage.objectUser'

คำสั่งข้างต้นใช้ abap-sdk-poc เป็นตัวยึดตำแหน่งสำหรับโปรเจ็กต์ Google Cloud แทนที่ abap-sdk-poc ด้วยรหัสโปรเจ็กต์

  1. หากต้องการยืนยันว่าได้เพิ่มบทบาทแล้ว ให้ไปที่หน้า IAM บัญชีบริการที่คุณสร้างควรแสดงพร้อมกับบทบาทที่ได้รับมอบหมาย ดังที่แสดงด้านล่าง

92d75ce1554efb69.png

5. สร้างการกำหนดค่าคีย์ไคลเอ็นต์

ตอนนี้คุณได้ตั้งค่าข้อกำหนดเบื้องต้นในฝั่ง Google Cloud แล้ว เราจึงสามารถดำเนินการกำหนดค่าในฝั่ง SAP ต่อไปได้

สำหรับการกำหนดค่าที่เกี่ยวข้องกับการตรวจสอบสิทธิ์และการเชื่อมต่อ ABAP SDK สำหรับ Google Cloud จะใช้ตาราง /GOOG/CLIENT_KEY

หากต้องการรักษาการกำหนดค่าในตาราง /GOOG/CLIENT_KEY ให้ทำตามขั้นตอนต่อไปนี้

  1. ใน SAP GUI ให้ป้อนรหัสธุรกรรม SPRO
  2. คลิก SAP Reference IMG
  3. คลิก ABAP SDK สำหรับ Google Cloud > การตั้งค่าพื้นฐาน > กำหนดค่าคีย์ไคลเอ็นต์
  4. คงค่าต่อไปนี้ไว้ในช่อง

ช่อง

ค่า

ชื่อคีย์ Google Cloud

TEST_STORAGE

ชื่อบัญชีบริการของ Google Cloud

abap-sdk-storage-tester@abap-sdk-poc.iam.gserviceaccount.com

ขอบเขตของ Google Cloud

https://www.googleapis.com/auth/cloud-platform

รหัสโปรเจ็กต์

abap-sdk-poc

คลาสการให้สิทธิ์

/GOOG/CL_AUTH_GOOGLE

เว้นช่องอื่นๆ ทั้งหมดว่างไว้

6. สร้างรายงาน Z เพื่อสร้าง Bucket ใน Cloud Storage

  1. เข้าสู่ระบบ SAP
  2. ไปที่รหัสธุรกรรม SE38 แล้วสร้างโปรแกรมรายงานที่มีชื่อ ZDEMO_CREATE_BUCKET.
  3. ในป๊อปอัปที่เปิดขึ้น ให้ระบุรายละเอียดตามที่แสดงด้านล่าง

93f3edb7bbb5c3c4.png

ในป๊อปอัปถัดไป ให้เลือกออบเจ็กต์ในเครื่องหรือระบุชื่อแพ็กเกจตามที่คุณต้องการ

  1. ใน ABAP Editor ให้เพิ่มโค้ดต่อไปนี้
DATA lv_json_response TYPE string.
DATA ls_input         TYPE /goog/cl_storage_v1=>ty_001.
DATA lo_storage       TYPE REF TO /goog/cl_storage_v1.

TRY.

    lo_storage = NEW #( iv_key_name = 'TEST_STORAGE' ).
        
        " Bucket Name should be globally unique & permanent
    ls_input = VALUE #( name = 'newtest_bucket_abapsdk_gcloud001' ).  
    lo_storage->insert_buckets
                ( EXPORTING iv_q_project = CONV #( lo_storage->gv_project_id )
                    is_input     = ls_input
          IMPORTING es_raw       = lv_json_response
                    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_storage->is_success( lv_ret_code ) = abap_true.
      cl_demo_output=>new(
        )->begin_section( 'Result:'
        )->write_text( 'Bucket was created:'
        )->next_section( 'JSON Response:'
        )->write_json( lv_json_response
        )->display( ).

    ELSE.
      DATA(lv_msg) = lv_ret_code && ':' && lv_err_text.
      cl_demo_output=>new(
        )->begin_section( 'Result:'
        )->write_text( 'Bucket creation failed;'
        )->next_section( 'Error:'
        )->write_json( lv_msg
        )->display( ).
    ENDIF.

  CATCH /goog/cx_sdk INTO DATA(lo_sdk_excp).
    lv_msg = lo_sdk_excp->get_text( ).
    MESSAGE lv_msg TYPE 'S' DISPLAY LIKE 'E'.
ENDTRY.
 

โปรดทราบว่าหากชื่อ Bucket ไม่ซ้ำกันทั่วโลก ระบบจะไม่สร้าง Bucket ดังนั้นโปรดลองใช้ชื่อที่ไม่ซ้ำกันสำหรับ Bucket ก่อนที่จะเรียกใช้โค้ด

  1. บันทึกและเปิดใช้งานรายงาน
  2. เรียกใช้รายงาน (กด F8)

เมื่อดำเนินการสำเร็จ คุณควรเห็นเอาต์พุตของรายงานดังที่แสดงด้านล่าง

ff232fba9a4178fb.png

7. สร้างรายงาน Z เพื่ออ่านไฟล์จากเซิร์ฟเวอร์แอปพลิเคชันและอัปโหลดไปยัง Bucket ของ Cloud Storage

ก่อนที่จะทำกิจกรรมนี้ คุณต้องเตรียมไฟล์ข้อความขนาดใหญ่ ในที่นี้ เรามีไฟล์ข้อความขนาดใหญ่ที่สร้างและอัปโหลดไปยังเซิร์ฟเวอร์แอปพลิเคชันแล้ว คุณสามารถใช้รหัสธุรกรรม CG3Z เพื่ออัปโหลดไฟล์ไปยังเซิร์ฟเวอร์แอปพลิเคชันของระบบ SAP

ในตัวอย่างนี้ เราใช้ไฟล์ข้อความขนาดประมาณ 40 MB ซึ่งอัปโหลดไปยังเซิร์ฟเวอร์แอปพลิเคชันในไดเรกทอรี /tmp แล้ว

คุณยังดาวน์โหลดโฟลเดอร์นี้จาก GitHub ได้โดยใช้ลิงก์ต่อไปนี้ ไฟล์ตัวอย่าง

  1. เข้าสู่ระบบ SAP
  2. ไปที่รหัสธุรกรรม SE38 แล้วสร้างโปรแกรมรายงานที่มีชื่อ ZDEMO_UPLOAD_FILE.
  3. ในป๊อปอัปที่เปิดขึ้น ให้ระบุรายละเอียดตามที่แสดงด้านล่าง

19cbe6987bba58e4.png

ในป๊อปอัปถัดไป ให้เลือกออบเจ็กต์ในเครื่องหรือระบุชื่อแพ็กเกจตามที่คุณต้องการ

  1. ใน ABAP Editor ให้เพิ่มโค้ดต่อไปนี้
DATA lv_file_length TYPE i.
DATA lv_msg         TYPE string.
DATA lv_dset        TYPE string.
DATA lv_data        TYPE string.
DATA ls_data        TYPE xstring.
DATA lo_storage     TYPE REF TO /goog/cl_storage_v1.

" Read file data from the application server
DATA(dset) = '/tmp/sample_file.txt'.
OPEN DATASET dset FOR INPUT IN TEXT MODE ENCODING DEFAULT.
IF sy-subrc <> 0.
  MESSAGE 'Cannot opening/reading dataset' TYPE 'E'.
ENDIF.
DO.
  READ DATASET dset INTO lv_dset.
  IF sy-subrc <> 0.
    EXIT.
  ENDIF.

  CONCATENATE lv_data lv_dset INTO lv_data SEPARATED BY cl_abap_char_utilities=>newline.
  CLEAR lv_dset.

ENDDO.

CLOSE DATASET dset.

CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
  EXPORTING  text   = lv_data
  IMPORTING  buffer = ls_data
  EXCEPTIONS failed = 1
             OTHERS = 2.
IF sy-subrc <> 0.
  MESSAGE 'Conversion from string to xstring failed' TYPE 'E'.
ENDIF.

TRY.

    lo_storage = NEW #( iv_key_name = 'DEMO_STORAGE' ).

    lo_storage->add_common_qparam( iv_name = 'uploadType' iv_value = 'resumable' ).

    lo_storage->insert_objects( EXPORTING iv_q_name       = 'large_text_file_demo.txt'
                                          iv_p_bucket     = 'newtest_bucket_abapsdk_gcloud001'
                                          is_data         = ls_data
                                          iv_content_type = 'text/pdf'
                                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_storage->is_success( lv_ret_code ) = abap_true.
      cl_demo_output=>new(
        )->begin_section( 'Result:'
        )->write_text( 'Object was uploaded successfully'
        )->write_text( 'Object Self Link:'
        )->write_text( ls_output-self_link
        )->display( ).
    ELSE.
      cl_demo_output=>new(
        )->begin_section( 'Error:'
        )->write_text( lv_msg
        )->display( ).
    ENDIF.
  CATCH /goog/cx_sdk INTO data(lo_sdk_excp).
    lv_msg = lo_sdk_excp->get_text( ).
    MESSAGE lv_msg TYPE 'S' DISPLAY LIKE 'E'.
    RETURN.
ENDTRY.

lo_storage->close( ).
  1. บันทึกและเปิดใช้งานรายงาน
  2. เรียกใช้รายงาน (กด F8)

เมื่อดำเนินการสำเร็จ คุณควรเห็นเอาต์พุตของรายงานดังที่แสดงด้านล่าง

c982bfcd07d7e487.png

คุณสามารถตรวจสอบว่าอัปโหลดไฟล์สำเร็จหรือไม่โดยไปที่ Bucket ของ Cloud Storage ตามที่แสดงด้านล่าง

90678b475e165adf.png1886be610c63ed6b.png

8. อัปโหลดไฟล์ไปยัง Cloud Storage โดยใช้โค้ด ABAP SDK ที่อธิบายไว้

โดยพื้นฐานแล้ว โปรแกรม ABAP นี้จะผสานรวมกับ Google Cloud Storage โดยจะอ่านไฟล์จากเซิร์ฟเวอร์แอปพลิเคชันและส่งข้อมูลไฟล์ไปยัง API Client Stub ของ Storage API เพื่ออัปโหลดไปยังที่เก็บข้อมูล ซึ่งสร้างขึ้นในโปรแกรมรายงานก่อนหน้านี้

โปรแกรมรายงานที่คุณสร้างขึ้นเพื่ออัปโหลดไฟล์จะทำสิ่งต่อไปนี้

รายละเอียดทีละขั้นตอน

สร้างการเชื่อมต่อ:

  • โดยจะสร้างการเชื่อมต่อ HTTP กับบริการ Google Storage โดยใช้คลาส /GOOG/CL_STORAGE_V1

อ่านข้อมูลไฟล์

  • อ่านไฟล์ในเซิร์ฟเวอร์แอปพลิเคชันโดยทำ OPEN DATASET แล้วเรียกใช้ฟังก์ชันโมดูล SAP มาตรฐาน SCMS_STRING_TO_XSTRING เพื่อแปลงเป็นรูปแบบ XSTRING

เพิ่มพารามิเตอร์การค้นหาทั่วไป

  • หากต้องการแบ่งเป็นก้อน ประเภทการอัปโหลดที่เราต้องเลือกคือการอัปโหลด "ที่อัปโหลดต่อได้" โดยค่าเริ่มต้น เมื่อเลือกการอัปโหลดที่ดำเนินการต่อได้ ระบบจะแบ่งข้อมูลไฟล์ออกเป็นก้อนขนาด 8 MB แล้วอัปโหลด อย่างไรก็ตาม นักพัฒนาแอปสามารถเปลี่ยนขนาดการแบ่งกลุ่มนี้ได้โดยการตั้งค่าพารามิเตอร์ IV_P_CHUNK_SIZE แต่ขอแนะนำให้ใช้การตั้งค่าเริ่มต้น
  • หากต้องการให้เมธอด API ทราบว่าต้องเลือกตัวเลือกการอัปโหลด "อัปโหลดต่อได้" เราจะเรียกเมธอด ADD_COMMON_QPARAM และส่ง uploadType เป็น resumable.

แทรกออบเจ็กต์

  • เรียกใช้เมธอด INSERT_OBJECTS โดยส่งพารามิเตอร์ต่อไปนี้ไปยังเมธอด
  • IV_Q_NAME: ชื่อไฟล์ที่จะใช้จัดเก็บเนื้อหาใน Cloud Storage
  • IV_P_BUCKET: ชื่อที่เก็บข้อมูลที่ต้องอัปโหลดไฟล์
  • IS_DATA: ข้อมูลไฟล์ที่ต้องอัปโหลด
  • IV_CONTENT_TYPE: ประเภทเนื้อหาของไฟล์ ในสถานการณ์ปัจจุบัน เราใช้ "text/plain" เนื่องจากเราอัปโหลดไฟล์ข้อความ

โปรดทราบว่าเราจะไม่ส่งค่าใดๆ ไปยังพารามิเตอร์การนำเข้า IV_CHUNK_SIZE และปล่อยให้ Stub ไคลเอ็นต์ API ใช้ค่าเริ่มต้นที่เชื่อมโยงกับพารามิเตอร์นี้ ซึ่งก็คือ 8 MB

จัดการความสำเร็จ/ข้อผิดพลาด:

  • แสดงการตอบกลับจาก API โดยพิจารณาว่าการเรียก API สำเร็จหรือไม่

ปิดการเชื่อมต่อ:

  • ปิดการเชื่อมต่อ HTTP กับบริการพื้นที่เก็บข้อมูล

9. ขอแสดงความยินดี

ยินดีด้วย คุณทำ Codelab "การอัปโหลดไฟล์ไปยังที่เก็บข้อมูล Cloud Storage" เสร็จเรียบร้อยแล้ว

Cloud Storage JSON API มีความสามารถมากมาย และด้วย ABAP SDK สำหรับ Google Cloud คุณจะเข้าถึงความสามารถเหล่านั้นได้โดยตรงในระบบ SAP โดยใช้ ABAP

Google Cloud Storage เป็นตัวเลือกที่ยอดเยี่ยมสำหรับการจัดเก็บและจัดการข้อมูลจำนวนมาก โดยธุรกิจ องค์กร และแอปพลิเคชันต่างๆ จำนวนมากใช้ประโยชน์จากเทคโนโลยีนี้

ประโยชน์บางส่วนของการใช้ Google Cloud Storage มีดังนี้

  • ความคุ้มค่า: Google Cloud Storage เป็นวิธีที่คุ้มค่าในการจัดเก็บและจัดการข้อมูลจำนวนมาก
  • ความเรียบง่าย: Google Cloud Storage ใช้งานง่ายด้วย API ที่เรียบง่ายและใช้งานได้ง่าย
  • ความยืดหยุ่น: Google Cloud Storage ใช้ได้กับแอปพลิเคชันและแพลตฟอร์มต่างๆ

ตอนนี้คุณสามารถทำตาม Codelab ด้านล่างเพื่อเรียนรู้การใช้ ABAP SDK เพื่อเข้าถึงบริการต่างๆ ของ Google Cloud ต่อไปได้

  • ส่งเหตุการณ์ไปยัง Pub/Sub
  • รับเหตุการณ์จาก Cloud Pub/Sub
  • ใช้ Cloud Translation API เพื่อแปลข้อความ
  • ใช้ DLP API สำหรับการปกปิดข้อมูลส่วนบุคคล
  • เรียกใช้ BigQuery ML จาก ABAP

10. ล้างข้อมูล

หากไม่ต้องการทำ Codelab เพิ่มเติมที่เกี่ยวข้องกับ ABAP SDK สำหรับ Google Cloud ต่อ โปรดดำเนินการล้างข้อมูล

ลบโปรเจ็กต์

  • ลบโปรเจ็กต์ Google Cloud โดยทำดังนี้
gcloud projects delete abap-sdk-poc

ลบทรัพยากรแต่ละรายการ

  1. ลบอินสแตนซ์ Compute โดยทำดังนี้
gcloud compute instances delete abap-trial-docker
  1. ลบกฎไฟร์วอลล์โดยทำดังนี้
gcloud compute firewall-rules delete sapmachine
  1. ลบบัญชีบริการโดยทำดังนี้
gcloud iam service-accounts delete \
    abap-sdk-dev@abap-sdk-poc.iam.gserviceaccount.com