# How-toガイド - CLIでのストリーミングダウンロードアクション/トリガーの実行方法

このセグメントでは、Workato Gemを使用してファイルストリーミングを利用するアクションを実行し、簡単にデバッグする方法について説明します。ファイルストリーミングは、ダウンロードファイルアクションとアップロードファイルアクションの2つの主要なコンポーネントに分けることができます。以下では、CLIでのダウンロードファイルアクションの手順について説明します。

# 前提条件

  • Workato SDK Gemをインストールし、実行できるようにしています。詳細については、入門ガイドを参照してください。
  • SDKのファイルストリーミングの仕組みについて理解しています。詳細については、ガイドを参照してください。

# ダウンロードファイル - サンプルコネクタ - Egnyte

Egnyteコネクタを例に説明します。

# ダウンロードファイルアクションのexecuteラムダの実行

ダウンロードファイルアクションでは、アクション/トリガーがジョブで実行される際に、実際のファイルの内容のダウンロード(streamsコールバックに含まれる)はその時点ではトリガーされません。ダウンロードファイルアクションのstreamsコールバックは、ファイルの内容を表すデータピルが下流のアクションで使用されたときにのみトリガーされます。

そのため、SDK Gemでは、ダウンロードファイルアクションを通常のアクションとしてテストし、streamsコールバックを別々にテストすることができます。まず、ダウンロードファイルアクションについて説明します。

execute: lambda do |connection, input|
  file_path = input['file_path']&.gsub(/ja/%2F/, '/')

  file_details = get("/pubapi/v1/fs/#{file_path}")

  file_details['file_contents'] = workato.stream.out("download_file_by_path", { file_path: file_path})
  
  file_details
end,

executeラムダとともに、SDK CLIでダウンロードファイルアクションを実行する際には、egnyte_download_file_input.jsonという入力JSONファイルも必要です。

{
    "file_path": "/path/to/sample/file"
}

ダウンロードファイルアクションを実行するには、通常のアクションと同じコマンドを使用します。

workato exec actions.download_object.execute --input='egnyte_download_file_input.json' --verbose

SETTINGS
{
  "domain": "acme.egnyte.com",
  "client_id": "client_id",
  "client_secret": "client_secret",
  "access_token": "valid_access_token",
  "refresh_token": "valid_refresh_token",
  "expires_in": 3599,
  "token_type": "Bearer"
}
INPUT
{
    "file_path": "/path/to/sample/file"
}

RestClient.get "https://acme.egnyte.com/pubapi/v1/fs/path/to/sample/file", "Accept"=>"application/json", "Accept-Encoding"=>"gzip, deflate", "Authorization"=>"Bearer valid_access_token", "Content-Length"=>"207", "Content-Type"=>"application/json", "User-Agent"=>"rest-client/2.0.2 (darwin19.6.0 x86_64) ruby/2.4.10p364"
# => 200 OK | application/json 176 bytes       

OUTPUT
{
  "checksum": "abc123",
  "size": 1000,
  "path": "/path/to/sample/file",
  "name": "file",
  "file_contents": {
    "__stream__": true,
    "name": "stream",
    "input": {
      "file_path": "/path/to/sample/file"
  }
}

この時点では、Egnyteからのファイルの実際のダウンロードは実際には行われていません。CLIを介してアクションを呼び出す際には、download_file_by_pathストリームを除いたexecuteラムダの評価のみが行われます。file_contentsの出力は、ファイルストリームのための人工的な値です。

TIP

--outputのような他のオプションも使用でき、関数の出力をJSONファイルに保存することもできます。

# ダウンロードファイルアクションで使用されるstreamsラムダの実行

次に、streamsラムダをデバッグおよびテストするために、CLIを使用して直接ラムダを呼び出すことができます。

streams: {
  download_file_by_path: lambda do |input, starting_byte_range, ending_byte_range, requested_byte_size|
    # 例:starting_byte_range = 0
    # 例:ending_byte_range = 10485759 
    # 例:requested_byte_size = 10485760 (10MB)
    chunk = get("/pubapi/v1/fs-content/#{file_path}").
              headers("Range": "bytes=#{starting_byte_range}-#{ending_byte_range}").
              response_format_raw
    # chunk.sizeが要求されたbyte_sizeよりも小さい場合、
    # ファイルの終わりに達したことがわかります。
    [chunk, chunk.size < requested_byte_size]
  end
}

SDK Gemを使用すると、特定のストリーミングコールバックラムダを呼び出して単一のチャンクのダウンロードをシミュレートしたり、複数のチャンクを順次ダウンロードするためにダウンロードプロセス全体をループすることができます。

単一のチャンクを読み取るには、3つのパラメータを使用して単純にストリームを呼び出すことができます。

workato exec streams.download_file_by_path --input='egnyte_download_file_input.json' --from=0 --frame_size=256 --verbose

SETTINGS
{
  "domain": "acme.egnyte.com",
  "client_id": "client_id",
  "client_secret": "client_secret",
  "access_token": "valid_access_token",
  "refresh_token": "valid_refresh_token",
  "expires_in": 3599,
  "token_type": "Bearer"
}
INPUT
{
    "file_path": "/path/to/sample/file"
}

RestClient.get "https://acme.egnyte.com/pubapi/v1/fs-content/path/to/sample/file", "Range"=>"bytes=0-255", "Accept"=>"application/json", "Accept-Encoding"=>"gzip, deflate", "Authorization"=>"Bearer valid_access_token", "Content-Length"=>"207", "User-Agent"=>"rest-client/2.0.2 (darwin19.6.0 x86_64) ruby/2.4.10p364"
# => 206 PartialContent | text/csv 255 bytes, 1.85s       

OUTPUT
[
  "256_byte_string",
  false
]

すべてのチャンクを読み取るには、同じ3つのパラメータを使用してストリームを呼び出すことができますが、バン (!) メソッドを使用します。

workato exec streams.download_file_by_path! --input='egnyte_download_file_input.json' --frame_size=256 --verbose

TIP

from 引数はバン (!) メソッドでは機能しないことに注意してください。ダウンロードプロセスが終了するのを待つために長い時間を待つことを避けるために、小さいファイルでこれをテストすることをお勧めします。


Last updated: 2024/2/13 16:59:53