# 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 を介してお使いのインスタンスまたはデフォルトのプロファイルを編集する必要があります。以下の例では、デフォルトのプロファイルを編集します。これはインスタンス固有のプロファイル名で置き換えることもできます。
プロファイルに入力する際は、プロファイルの最新バージョンを編集していることと、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 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 エラーコードもすべて、設定に問題がないことを示しています。
# 4. APIM エンドポイントを作成する
[Tools
] の下で Workato の API プラットフォーム に移動し、新しい API コレクションを作成します。API コレクションとはエンドポイントのコレクションで、API レシピを含むフォルダーに相当します。これにより、SAP の RFC は Workato 内のレシピを直接呼出してトリガーできるようになります。Workato の 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