# SAP の設定 - ABAP/4 から Workato API プラットフォームを呼び出す方法

この記事では、SAP インスタンスで TLS 1.2を有効にして、RFC が Workato の API プラットフォームと直接やり取りできるようにするのに必要な手順について説明します。

# TLS 1.2とは

TLS 1.2は、現在最も広範に使用されている TLS のバージョンで、TLS 1.1と比べてセキュリティの分野でいくつかの改良が行われています。TLS 1.2の暗号化の機能強化により、SHA-256 などのよりセキュアなハッシュアルゴリズムや、その他のデータモードの認証された暗号化をサポートする高度な暗号スイートを使用できるようになりました。Workato では、データのセキュリティが常に保たれるようにするために、TLS 1.2を使用して暗号化されていないすべての受信 Web トラフィックをブロックします。

# 1. RZ10 でプロファイルを編集する

TLS 1.2は、お使いの SAP インスタンスにおいても標準で設定されている可能性があります。SAP インスタンスに、以下の暗号スイートがすでにプロファイルに含まれていないかどうかを再確認してください。その場合は、このステップ全体をスキップできます。

SAP インスタンスで TLS 1.2を有効にするには、トランザクションコード RZ10 を使用して、SAP GUI を介してお使いのインスタンスまたはデフォルトのプロファイルを編集する必要があります。以下の例では、デフォルトのプロファイルを編集します。これはインスタンス固有のプロファイル名で置き換えることもできます。

RZ10 でのプロファイルの編集

プロファイルに入力する際は、プロファイルの最新バージョンを編集していることと、Extended maintenance が選択されていることを確認してください。上の図に示す入力項目すべてに入力したら、[Change] を選択してください。そうすると以下の画面が表示されます。

プロファイルに以下のパラメータを追加する

この画面で、以下のパラメータをプロファイルに追加する必要があります。これらのパラメータと値は、使用する必要のある暗号スイートを SAP インスタンスに指示します。

パラメータ名 パラメータの値
ssl/ciphersuites 135:PFS:HIGH::EC_P256:EC_HIGH
ssl/client_ciphersuites 150:PFS:HIGH::EC_P256:EC_HIGH
icm/HTTPS/client_sni_enabled TRUE
ssl/client_sni_enabled TRUE
SETENV_26 SECUDIR=$(DIR_INSTANCE)$(DIR_SEP)sec
SETENV_27 SAPSSL_CLIENT_CIPHERSUITES=150:PFS:HIGH::EC_P256:EC_HIGH
SETENV_28 SAPSSL_CLIENT_SNI_ENABLED=TRUE
SETENV_29 SAPSSL_CIPHERSUITES=135:PFS:HIGH::EC_P256:EC_HIGH

これが完了すると、プロファイルに対する変更は SAP インスタンスが次回再起動されたときにのみ適用されます。本番 SAP インスタンスの場合、これは次回のスケジュールされたメンテナンス時に行われます。

# 2. トラストマネージャーに Workato SSL 証明書を追加する

STRUST に移動し、サイドバーで [SSL server Standard] を選択します。System-wide フォルダーを選択すると、以下の画面が表示されます。

トラストマネージャーへの証明書のインポート

上の図に示される証明書のインポートのボタンを選択し、Amazon Root CA 1証明書 (opens new window)をインポートします。詳細についてはこちらをご覧ください (opens new window)

# 3. RFC 宛先を作成する

SM59 に移動し、サイドバーで [HTTP Connections to External Server] を選択します。RFC 宛先とは、Workato と通信するために SAP が RFC で呼び出すことのできるドメインを定義する手段です。これは、Workato の API プラットフォームやレシピの Webhook トリガーになるよう設定できます。以下に、Workato の API 管理プラットフォームへ接続する方法を説明します。

RFC 宛先

ログオンとセキュリティ

入力項目名 推奨される値
RFC Destination これは RFC で呼び出される RFC 宛先の名前です。以降のステップで使用するためにこのタイトルを覚えておいてください。
Connection type 外部サーバーへの G - HTTP 接続
Description RFC 宛先の正確な説明を入力します。上の図の例では、「Workato API Platform REST endpoints」という名前を付け、API 管理ドキュメントへのリンクを入力しています。
Target Host API 管理の場合、ターゲットホストは "apim.workato.com" になります。
Service No. 通信ポート。これは "443" になります。
Path Prefix これはターゲットホストの後に追加されます。エンドポイントの正確なパスは、RFC で設定する必要があります。この例では、1つの "/" のみを入力しています。
Security Options ([Logon & Security] タブ下) [SSL] は [Active] に切り替え、[SSL Certificate] は [Default SSL Client] に切り替えます。

この時点で、左上隅にある Connection test ボタンをクリックすると、接続をテストできます。404 Not Found レスポンスを受け取ることが予想され、TLS 1.2セキュア接続が確立されたことが通知されるはずです。その他の HTTP エラーコードもすべて、設定に問題がないことを示しています。

404 Not Found エラーメッセージ

# 4. APIM エンドポイントを作成する

[Tools] の下で Workato の API プラットフォーム に移動し、新しい API コレクションを作成します。API コレクションとはエンドポイントのコレクションで、API レシピを含むフォルダーに相当します。これにより、SAP の RFC は Workato 内のレシピを直接呼出してトリガーできるようになります。Workato の API プラットフォームの設定の詳細については、こちらを参照してください。

API コレクション

この例では、コレクションに「sap-connection-demo」という名前を付け、バージョン A0001 を付記しています。内部で、Hello, Workato! という名前の1つのレシピを使用してそれをフォルダーにリンクしています。これにより、単一のエンドポイント https://apim.workato.com/sap-connection-demo-va0001/hello-workato を持つコレクションが生成され、そのエンドポイントを修正して POST リクエストを受け入れるようにしました。以降のステップで、この情報を使用してこのエンドポイントに接続する RFC を作成します。

このレシピはこちら (opens new window)に掲載されています。自由にインストールおよび編集してご利用いただけます。

# 5. RFC を介した Workato への呼び出しを作成する

以下の図に、サンプルの RFC - ZWORKATO_API_ENDPOINT_DEMO で Workato に接続する方法を表すサンプルの ABAP コードを示しています。

*&---------------------------------------------------------------------*
*& Report ZWORKATO_API_ENDPOINT_DEMO
*&---------------------------------------------------------------------*
*& Author: Anthony Ananich
*&
*&---------------------------------------------------------------------*
REPORT zworkato_api_endpoint_demo.
DATA: lo_http_client TYPE REF TO if_http_client,
      lo_rest_client TYPE REF TO cl_rest_http_client,
      lv_url         TYPE        string,
      lv_body        TYPE        string,
      exref          TYPE REF TO cx_root,
      msgtxt         TYPE string.
cl_http_client=>create_by_destination(
  EXPORTING
    destination              = 'WORKATO_API'
* This should be configured to the name of your RFC destination made earlier.
  IMPORTING
    client                   = lo_http_client
  EXCEPTIONS
    argument_not_found       = 1
    destination_not_found    = 2
    destination_no_authority = 3
    plugin_not_active        = 4
    internal_error           = 5
    OTHERS                   = 6
).
* If you are using cl_http_client=>create_by_url use this code to supress and pass your
* HTTP basic authenication
*  lo_http_client->propertytype_logon_popup = lo_http_client->co_disabled.
*  DATA l_username TYPE string.
*  DATA l_password TYPE string.
*  l_username = 'user'.
*  l_password = 'password'.
*  CALL METHOD lo_http_client->authenticate
*    EXPORTING
*      username = l_username
*      password = l_password.
CREATE OBJECT lo_rest_client
  EXPORTING
    io_http_client = lo_http_client.
lo_http_client->request->set_version( if_http_request=>co_protocol_version_1_0 ).
IF lo_http_client IS BOUND AND lo_rest_client IS BOUND.
  lv_url = 'sap-connection-demo-va0001/hello-workato'.
  cl_http_utility=>set_request_uri(
    EXPORTING
      request = lo_http_client->request    " HTTP Framework (iHTTP) HTTP Request
      uri     = lv_url                     " URI String (in the Form of /path?query-string)
  ).
* ABAP to JSON
  TYPES: BEGIN OF ty_json_req,
           id      TYPE i,
           message TYPE string,
         END OF ty_json_req.
  DATA: json_req TYPE ty_json_req.
  json_req-id = 25252525.
  json_req-message = 'Hello, Workato!'.
  DATA lr_json_serializer TYPE REF TO cl_trex_json_serializer.
  lv_body = /ui2/cl_json=>serialize( data = json_req ).
* Converted JSON should look like this
* lv_body = '{ "id":25252525, "message":"Hello, Workato!"}'.
  DATA: lo_json        TYPE REF TO cl_clb_parse_json,
        lo_response    TYPE REF TO if_rest_entity,
        lo_request     TYPE REF TO if_rest_entity,
        lv_reason      TYPE  string,
        response       TYPE  string,
        content_length TYPE  string,
        location       TYPE  string,
        content_type   TYPE  string,
        lv_rcode       TYPE  i.
* Set Payload or body ( JSON or XML)
  lo_request = lo_rest_client->if_rest_client~create_request_entity( ).
  lo_request->set_content_type( iv_media_type = if_rest_media_type=>gc_appl_json ).
  lo_request->set_string_data( lv_body ).
  CALL METHOD lo_rest_client->if_rest_client~set_request_header
    EXPORTING
      iv_name  = 'API-TOKEN'
      iv_value = '{YOUR WORKATO API-TOKEN HERE}'.
* Provide the API-TOKEN to your own api platform.
  TRY.
* POST
      lo_rest_client->if_rest_resource~post( lo_request ).
* Collect response
      lo_response = lo_rest_client->if_rest_client~get_response_entity( ).
      lv_rcode = lo_response->get_header_field( '~status_code' ).
      lv_reason = lo_response->get_header_field( '~status_reason' ).
      content_length = lo_response->get_header_field( 'content-length' ).
      location = lo_response->get_header_field( 'location' ).
      content_type = lo_response->get_header_field( 'content-type' ).
      response = lo_response->get_string_data( ).
* JSON to ABAP
      DATA lr_json_deserializer TYPE REF TO cl_trex_json_deserializer.
      TYPES: BEGIN OF ty_json_res,
               job_id  TYPE i,
               job_url TYPE string,
             END OF ty_json_res.
      DATA: json_res TYPE ty_json_res.
      /ui2/cl_json=>deserialize( EXPORTING json = response pretty_name = /ui2/cl_json=>pretty_mode-camel_case CHANGING data = json_res ).
      WRITE:/ json_res-job_url.
    CATCH cx_rest_client_exception INTO exref.
      msgtxt = exref->get_text( ).
      CONCATENATE '[ERROR]' msgtxt INTO msgtxt SEPARATED BY space.
      WRITE:/ msgtxt.
  ENDTRY.
ENDIF.

この ABAP コードを使用すれば、API プラットフォームおよび SAP の RFC を使って、独自の Workato ワークスペース内のジョブを正常に呼び出しおよびトリガーできるはずです。


Last updated: 2023/10/13 18:10:21