Googleドライブにファイルを格納し、格納したフォルダやファイルのURLをSlackに通知する


やりたいこと

  1. 毎日の処理で作成されたファイル数点をGoogleドライブに置きたい
  2. 置いたファイルの直接のリンクをSlackに通知したい。

、、、これらを簡単にやりたい

課題

特に2が課題でAmazon S3などであれば置く先と、パスの構成とファイル名があれば再現できるが、GoogleドライブはURLが独特の構成をしているため、置く場所とフォルダ名やファイル名だけではURLが再現できない(たぶん)。

解決方法

・いずれもrcloneを駆使する
・rclone lsjson でフォルダやファイルのIDが返却されるのでそれで頑張る
・jq職人になる

手順

rcloneセットアップ

割愛します、が
・本連携用のサービスアカウントキーのJSONを用意
・rclone config でdriveを選択肢、JSONファイルを絶対パスで指定

ファイルを転送してみる

今回、上記config で xxxxxxxx_daily_report というremoteを作成しています。

送り込むファイル

・フォルダ構成

root_folder/
     └yyyymmdd/
         └diva/
           └ yyyymmddhis.csv
           └ yyyymmddhis.png
         └divb/
           └ yyyymmddhis.csv
           └ yyyymmddhis.png

これらのファイルを、Googleドライブの特定のフォルダ以下に毎日転送したいです。

以下のコマンドで出来ます。

$ rclone copy ./yyyymmdd/ xxxxxxxx_daily_report:yyyymmdd/

実際にGoogleドライブにアクセスすると、無事ファイルが転送されています。

転送したファイルのURLの取得

上記ドライブに置かれること、自体を運用ルールとしても良いのですが、Slackだけ見ていればリンクが通知され押せばファイルが確認できる、ようにしたほうがQOLが上がろうというものです。

結論としては、lsjson というサブコマンドを使うことでIDが取得可能です。

アップしたディレクトリの取得

$ rclone lsjson  xxxxxxxx_daily_report:
[
{"Path":"20200226","Name":"20200226","Size":-1,"MimeType":"inode/directory","ModTime":"2020-02-26T09:54:29.000Z","IsDir":true,"ID":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
{"Path":"20200227","Name":"20200227","Size":-1,"MimeType":"inode/directory","ModTime":"2020-02-26T21:56:13.071Z","IsDir":true,"ID":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"},
{"Path":"20200228","Name":"20200228","Size":-1,"MimeType":"inode/directory","ModTime":"2020-02-27T22:05:59.635Z","IsDir":true,"ID":"ccccccccccccccccccccccccccccccccc"},
{"Path":"20200229","Name":"20200229","Size":-1,"MimeType":"inode/directory","ModTime":"2020-02-28T22:12:34.958Z","IsDir":true,"ID":"ddddddddddddddddddddddddddddddddd"}
]

こんな感じで返ってきます。bash, grepとjqを駆使し

DIRID=`rclone lsjson xxxxxxxx_daily_report: |grep 20200229| jq .'ID'`
DIRURL="https://drive.google.com/drive/u/0/folders/"${DIRID//\"//}

とか することでURLの生成が行えます。
※ワンライナーに拘っている訳ではないので自己責任にてお願い致します...

アップしたファイルの取得

以下のように remote:(フォルダ)/ファイル名 をlsjsonに渡すと、上記同様にIDが返却されます。

$ /usr/bin/rclone lsjson  xxxxxxxx_daily_report:/20200229/diva/yyyymmddhis.csv
[
{"Path":"aaa","Name":"aaa","Size":0,"MimeType":"application/octet-stream","ModTime":"2020-02-29T11:58:55.419Z","IsDir":false,"ID":"1ixOc30WmdczvNAlUlgeiyZ5dN97y2oHT"}
]

さきほどのようにgrepをしても良いのですが、1個しかないので

DIVACSVID=`/usr/bin/rclone lsjson  xxxxxxxx_daily_report:/20200229/diva/yyyymmddhis.csv|jq .[].ID`
DIVACSVURL="https://drive.google.com/file/d"${DIVACSVID//\"//}

といった形で取得できます。
※ワンライナーに拘っている訳ではないので自己責任にてお願い致します...

無事URLが取得できたので、事前に用意したワークフローにPOSTすればSlack通知完了です。

※活用イメージ

猫は正義