チャンクを使用してファイルを Cloud Storage にアップロードする

チャンク処理を使用して Cloud Storage にファイルをアップロードする

この Codelab について

subject最終更新: 9月 4, 2024
account_circle作成者: Satish Inamdar

1. はじめに

この Codelab では、サービス アカウントを作成し、ABAP SDK for Google Cloud で提供されるクライアント キーと通信マップ テーブルを構成して、ABAP で Cloud Storage JSON API を呼び出す手順について説明します。

この Codelab では、次の Google Cloud サービスを使用します。

  • Compute Engine
  • ネットワーク サービス
  • Cloud Shell
  • Cloud Storage JSON API V1

注: 新しい Google Cloud プロジェクトを作成すると、Cloud Storage を含む特定の API とサービスが自動的に有効になります。これにより、この堅牢なストレージ ソリューションをすぐに利用できます。そのため、追加の手順として有効にする必要はありません。

前提条件

作成するアプリの概要

ABAP SDK for Google Cloud を使用して、SAP システムに次のプログラムを作成します。

  • Cloud Storage バケットを作成します。
  • アプリケーション サーバーからファイルを読み取り、作成した Cloud Storage バケットにアップロードします。

2. 要件

  • ブラウザ(ChromeFirefox など)
  • 課金が有効になっている Google Cloud プロジェクト、または Google Cloud Platform の90 日間の無料トライアル アカウントを作成します。
  • システムにインストールされている SAP GUI(Windows または Java)。SAP GUI がラップトップにすでにインストールされている場合は、VM の外部 IP アドレスをアプリケーション サーバー IP として使用して SAP に接続します。Mac を使用している場合は、こちらのリンクから SAP GUI for 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
  • ABAP SDK for Google Cloud がインストールされた SAP システムにアクセスできる必要があります。
  • この Codelab に進む前に、Codelab 1(Google Cloud Platform に ABAP Platform Trial 1909 をインストールして ABAP SDK for Google Cloud をインストールする)と Codelab 2(Compute Engine VM でホストされている SAP のトークンを使用して ABAP SDK 認証を構成する)を完了する必要があります。
  • Codelab 1 と Codelab 2 を完了すると、Google Cloud に ABAP Platform Trial 1909 System がプロビジョニングされ、認証と接続に必要な設定が完了します。
  • Codelab 1 と Codelab 2 を完了していない場合、この Codelab の手順を実行するために必要なインフラストラクチャと接続がすべて揃っていません。そのため、この Codelab を進める前に、Codelab 1 と Codelab 2 を完了する必要があります。

4. 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'

上のコマンドでは、Google Cloud プロジェクトのプレースホルダとして abap-sdk-poc を使用しています。abap-sdk-poc は、実際のプロジェクト ID に置き換えます。

  1. ロールが追加されたことを確認するには、[IAM] ページに移動します。作成したサービス アカウントが、割り当てられたロールとともに以下のように表示されます。

92d75ce1554efb69.png

5. クライアント キー構成を作成する

Google Cloud 側の前提条件を設定したので、SAP 側の構成に進みます。

認証と接続関連の構成では、ABAP SDK for Google Cloud はテーブル /GOOG/CLIENT_KEY を使用します。

テーブル /GOOG/CLIENT_KEY の構成を維持するには、次の操作を行います。

  1. SAP GUI で、トランザクション コード SPRO を入力します。
  2. [SAP 参照 IMG] をクリックします。
  3. [ABAP SDK for Google Cloud] > [Basic Settings] > [Configure Client Key] をクリックします。
  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

プロジェクト ID

abap-sdk-poc

認可クラス

/GOOG/CL_AUTH_GOOGLE

その他のフィールドは空白のままにします。

6. Z レポートを作成して Cloud Storage にバケットを作成する

  1. SAP システムにログインします。
  2. トランザクション コード SE38 に移動し、ZDEMO_CREATE_BUCKET. という名前のレポート プログラムを作成します。
  3. 表示されたポップアップで、次のように詳細情報を入力します。

93f3edb7bbb5c3c4.png

次のポップアップで、[ローカル オブジェクト] を選択するか、必要に応じてパッケージ名を指定します。

  1. ABAP エディタで、次のコードを追加します。
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.
 

バケット名がグローバルに一意でない場合、バケットは作成されません。コードを実行する前に、バケットに固有の名前を使用してください。

  1. レポートを保存して有効にします。
  2. レポートを実行します(F8 キーを押します)。

実行が成功すると、次のようなレポート出力が表示されます。

ff232fba9a4178fb.png

7. Z レポートを作成してアプリケーション サーバーからファイルを読み取り、Cloud Storage バケットにアップロードする

このアクティビティを実行する前に、大きなテキスト ファイルを準備する必要があります。ここでは、すでに大きなテキスト ファイルが作成され、アプリケーション サーバーにアップロードされています。トランザクション コード CG3Z を使用して、SAP システムのアプリケーション サーバーにファイルをアップロードできます。

この例では、サイズが約 40 MB のテキスト ファイルを使用し、このファイルはすでにアプリケーション サーバーの /tmp ディレクトリにアップロードされています。

このフォルダは、サンプル ファイルのリンクを使用して GitHub からダウンロードすることもできます。

  1. SAP システムにログインします。
  2. トランザクション コード SE38 に移動し、ZDEMO_UPLOAD_FILE. という名前のレポート プログラムを作成します。
  3. 表示されたポップアップで、次のように詳細情報を入力します。

19cbe6987bba58e4.png

次のポップアップで、[ローカル オブジェクト] を選択するか、必要に応じてパッケージ名を指定します。

  1. ABAP エディタで、次のコードを追加します。
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

ファイルが正常にアップロードされたかどうかを確認するには、次の手順に沿って Cloud Storage バケットに移動します。

90678b475e165adf.png

1886be610c63ed6b.png

8. ABAP SDK コードを使用して Cloud Storage にファイルをアップロードする

本質的には、この ABAP プログラムは Google Cloud Storage と統合されています。アプリケーション サーバーからファイルを読み取り、ファイルデータを Storage API の API クライアント スタブに渡して、前のレポート プログラムで作成したストレージ バケットにアップロードします。

ファイルをアップロードするために作成したレポート プログラムは、次の処理を行います。

手順の詳細

接続を確立する:

  • /GOOG/CL_STORAGE_V1 クラスを使用して、Google Storage サービスへの HTTP 接続を確立します。

ファイルデータを読み取る

  • OPEN DATASET を実行してアプリケーション サーバー上のファイルを読み取り、標準の SAP 関数モジュール SCMS_STRING_TO_XSTRING を呼び出して XSTRING 形式に変換します。

一般的なクエリ パラメータを追加する

  • チャンク化を実現するには、アップロードの種類として「再開可能な」アップロードを選択する必要があります。デフォルトでは、再開可能なアップロードを選択すると、ファイルデータは 8 MB のチャンクに分割されてアップロードされます。ただし、パラメータ IV_P_CHUNK_SIZE を設定することで、このチャンクサイズを変更できます。デフォルト設定を使用することをおすすめします。
  • 「再開可能な」アップロード オプションを選択する必要があることを API メソッドに通知するため、メソッド ADD_COMMON_QPARAM を呼び出し、uploadTyperesumable. として渡します。

オブジェクトを挿入する

  • 次のパラメータを渡して、メソッド INSERT_OBJECTS を呼び出します。
  • IV_Q_NAME: コンテンツを Cloud Storage に保存するファイル名
  • IV_P_BUCKET: ファイルをアップロードするバケット名
  • IS_DATA: アップロードする必要があるファイルデータ
  • IV_CONTENT_TYPE: ファイルのコンテンツ タイプ。現在のシナリオでは、テキスト ファイルをアップロードするため「text/plain」を使用しています。

インポート パラメータ IV_CHUNK_SIZE には値を渡さず、API クライアント スタブにこのパラメータに関連付けられたデフォルト値(8 MB)を使用させます。

成功/エラーを処理する:

  • API 呼び出しが成功したかどうかに基づいて API レスポンスを表示します。

接続を閉じる:

  • Storage Service への HTTP 接続を閉じます。

9. 完了

これで、これで、「Cloud Storage バケットにファイルをアップロードする」Codelab は終了です。

Cloud Storage JSON API には多くの機能があり、ABAP SDK for Google Cloud を使用すると、ABAP を使用して SAP システムでネイティブに直接アクセスできます。

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 を使用して PII を除去する
  • ABAP から BigQuery ML を呼び出す

10. クリーンアップ

ABAP SDK for Google Cloud に関連する追加の Codelabs を続行しない場合は、クリーンアップに進んでください。

プロジェクトの削除

  • Google Cloud プロジェクトを削除します。
gcloud projects delete abap-sdk-poc

個々のリソースを削除する

  1. コンピューティング インスタンスを削除します。
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