0
0

Workato:Pythonコネクタで /tmp を活用してみる

Last updated at Posted at 2024-07-29

はじめに

WorkatoのPythonコネクタでは一時ディレクトリ(/tmp)が利用できないと思っていましたが、検証を進めたところ利用できることがわかりました。

Workatoのコネクタのアクションはそれぞれが独立したコンテナであり、かつエフェメラルなコンテナ(実行後に削除される、揮発性のコンテナ)で実行されるため、アクションを跨いで /tmp の保存内容を共有することはできないのと、実行時間の制限(30秒)に注意する必要はありますが、ちょっとした処理で便利に活用することはできるかと思います。

利用例

容量の大きなファイルや複数のファイルを処理する

容量の大きなファイルをPythonコネクタのrequestモジュールを利用して直接ダウンロードして取得したり、base64エンコードされたファイルを変数で渡して /tmp へ展開することで、Python3コネクタ上で容量の大きなファイルや複数のファイルを処理することができます。

例:URL指定でファイルをダウンロードし/tmpへ保存する

以下の通り Input fieldsおよびOutput fieldsを用意します。Output fieldsは、コードの戻り値に合わせて追加を行います。

image.png

コードは次の通りとします。なお、コード内の記述されている通り、必要な処理や戻り値も設定します。

import requests
import os

def main(input):  
  url = "ダウンロード先のURL"
  output_path = "/tmp/" + input['file_name']
  
  response = requests.get(url)
  with open(output_path, "wb") as file:
    file.write(response.content)

  result = ''
  # ここに必要な処理を記述する

  # 戻り値を設定する(Output fieldsもこれに合わせて変更する)
  # return {"result": result}

例:base64エンコードされたファイルを変数で渡し、/tmpへ保存する

以下の通り Input fieldsおよびOutput fieldsを用意します。Output fieldsは、コードの戻り値に合わせて追加を行います。

image.png

コードは次の通りとします。なお、コード内の記述されている通り、必要な処理や戻り値も設定します。

import base64
import os

def main(input):  
  file_data = base64.b64decode(input['file_b64'])
  output_path = "/tmp/" + input['file_name']
  
  with open(output_path, "wb") as file:
    file.write(file_data)

  result = ''
  # ここに必要な処理を記述する

  # 戻り値を設定する(Output fieldsもこれに合わせて変更する)
  # return {"result": result}

また、容量のかなり大きなファイルや複数ファイルの場合は、File tools by WorkatoコネクタのCompress filesを利用することで、Workato上でファイルを圧縮してから(gzip圧縮してから)Pythonコネクタへ渡すことが可能です。

image.png

Pythonコネクタに無いコマンドを実行する

responseモジュールを利用し、/tmp にファイルをダウンロードし、実行権限を付与することで、Pythonコネクタに無いコマンドを実行することができます。なお、実行時間の制限(30秒)があることと、ライブラリの制限等、実行上の制限があることから、シングルバイナリ(スタティックバイナリ)として動作するもの(ただしAppImageは不可)、あるいはPythonコネクタで実行可能なスクリプトである必要があります。

例:curlをダウンロードして実行する

Input fields, Output fields

image.png

Code

import requests
import subprocess
import os

def main(input):  
  url = "https://github.com/moparisthebest/static-curl/releases/download/v8.7.1/curl-amd64"
  output_path = "/tmp/curl"
  
  response = requests.get(url)
  with open(output_path, "wb") as file:
    file.write(response.content)
    
  os.chmod(output_path, 0o755)
  
  process = subprocess.Popen(input['shell_script'], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  stdout, stderr = process.communicate()
  
  return {"stdout": stdout.decode(), "stderr": stderr.decode()}

実行結果

image.png

注意事項

上記コードでは都度ファイルを取得していますが、ダウンロード先がアプリケーション(コマンド)の配布先URLである場合は、配布先のサーバに過度な負荷を与えないよう、予めダウンロードしておいたファイルを利用することを推奨します。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0