IT業務効率化

digdagでファイルが生成されるまでretryする

使いたいファイルが生成されるのを待つ

結論:コード

timezone: Asia/Tokyo

+check_file_existence:
    _retry:
        limit: 5
        interval: 300  # seconds
    _export:
        FILE_PATH: "/usr/local/sample/log"
        FILE_NAME1: "file1_${today_string}*.log"
        FILE_NAME2: "file2.log"
    sh>: ssh ${USER}@${HOST} -p ${PORT} -i ${KEY_FILE} ls ${FILE_PATH}/${FILE_NAME1}
         && ssh ${USER}@${HOST} -p ${PORT} -i ${KEY_FILE} ls ${FILE_PATH}/${FILE_NAME2}
    _check:
        +succeed:
            echo>: success
    _error:
        +failed:
            echo>: fail

モチベーション

digdagでとある別のサーバにあるデータを取得して、次の処理に使いたいという状況でした。

しかしシステムが別になっているため、使いたいファイルが出力されたと同時にそのシステムからdigdagを実行させるのは少々難しかったです。ファイルの出力はDBの重さで多少前後し、5分程度遅れることがあります。

ファイルが出力されるのをdigdagで待つことにしました。

ファイルの存在を確認する

ファイルの存在を確認する時に「shellでls実行した結果」を取得する必要がありました。

lsでファイルがないときの「No such file or directory」をdigdag側で取得するためには_checkと_errorを用います。

+check_file_existence:
    sh>: ls sample.csv
    _check:
        +succeed:
            echo>: success
    _error:
        +failed:
            echo>: fail

上記のコードだとsample.csvがない時には_errorに進み、ファイルが存在するときは_checkに進みます。

retryさせる

timezone: Asia/Tokyo

+check_file_existence:
    _retry:
        limit: 5  # retryする回数
        interval: 300  # 単位は秒
        interval_type: constant # exponentialもある。constantがデフォルト
    sh>: ls sample.csv

公式のドキュメントはこちらです。(https://docs.digdag.io/workflow_definition.html#retrying-failed-tasks-automatically )

interval_type

interval_typeをconstantにしておくと、毎回その秒数待つ設定です。

上記のコードでは300秒(5分)に設定しているので、5分後失敗していたら、そこからさらに5分待ちます。

一方exponentialは指数関数的に増加していきます。10秒を設定しておくと次は20秒、その次は40秒待つような設定です。

ABOUT ME
hirayuki
今年で社会人3年目になります。 日々体当たりで仕事を覚えています。 テーマはIT・教育です。 少しでも技術に親しんでもらえるよう、noteで4コマ漫画も書いています。 https://note.mu/hirayuki