やりたいこと
- 毎日の処理で作成されたファイル数点をGoogleドライブに置きたい
- 置いたファイルの直接のリンクを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通知完了です。
猫は正義