はじめに
岡崎です。
今回は、タイトル通りディレクトリに変更があったものをS3にアップロードするシェルをつくってみました。
業務上作成したものの簡易版を以下に記載します。
ゴール
指定のディレクトリに何か変更があったもの(ファイル、ディレクトリの上書き・新規作成)に対して
その変更を検知して、S3にその変更内容をアップロードする。
※ただし、指定のディレクトリの構造とS3上のディレクトリ構造は同じにする
例)
監視ディレクトリ:hoge
変更箇所: hoge/fuga/foo/helloS3.txt(新規でhelloS3.txtが作成された場合、helloS3.txtに変更があった場合)
=> 対象のS3バケット:対象のバケット名+hoge/fuga/foo/helloS3.txtに変更内容をアップロードする
作成したシェル(簡易版)
<br />#!bin/sh # @usage: # sh monitor.sh # @desc # ディレクトリの中を監視して、変更があればS3にアップロードする # @author Takuya Okazaki MONITOR_DIR="/tmp/" BUCKET_PATH="s3://hellos3okazaki/hello/world/" LOG_FILE="/var/log/s3cp" #close_writeが行われたディレクトリ名+ファイル名を標準出力 inotifywait -rm -e close_write $MONITOR_DIR --format "%w%f" | while read line; do # hoe/fuga/.../tmp/ の部分を削除する prefix=`echo $line | sed -e "s/.*tmp[/]//"` aws s3 cp $line $BUCKET_PATH$prefix # aws s3 cp コマンドが正常に終了しなかった場合 if [ $?- ne 0 ]; then echo "error:[aws s3cp failed]" >> $LOG_FILE`date "+%Y%m%d_%H%M%S"`.log fi done |
作成したシェルスクリプトの実行結果
※ aws s3 cp コマンドが正常に終了しなかった場合(0以外のexit statusを返した場合)は下記のようにログとして出力されます。
手段
ディレクトリ監視に使用を行ったツール
- inotifywait
- inotify-tools.x86_64
- 3.14-1.el6
- @epel => epelリポジトリ
inotifywaitについて、yumでインストールを行いました。
inotifywaitのオプション
詳細のオプションは
man コマンドで調べることができます。
man inotifywait |
inotifywaitのメリット
- 比較的扱いやすい
- -eオプションで検知したいイベントについて設定できる
inotifywaitのデメリット
- –excludeが複数かけない
任意のファイルを監視対象から除外したい場合は、–excludeオプションを用いることで
除外することができるのですが、例えば以下のように書くことができません。
(厳密には、書くことができるのですが、実行すると後の方に書いた–excludeオプションのみが有効化されます。)
## 正規表現は、使用可能です inotyfiwait --exclude 'hogehoge' \ --exclude 'fugafuga' \ |
対処法として、かなり雑なのですが、正規表現の|(または)を使用して、取り除くことにしました。
どなたか、この辺り知っている方がいれば、ぜひ岡崎に教えてください。
--exclude 'hoge | fuga' |
補足
因みに、s3 upload failed と標準出力される場合は、
対象のEC2に対するIAMロールが割り当てられていないと考えられます。
なぜなら、対象のEC2に対象のS3へのアクセス権が与えられていないと
そもそもアップロードできないためです。
また、IAMロールの他にS3バケットポリシーにて
更にスコープを絞った操作が指定できます。(ここでは、割愛します)
この記事を書いた人
-
2016年に入社した新卒。ドラムとインコが好きな人。
最近は、デザイン駆動設計や関数型プログラミングに興味あり。
マネジメントも覚えていきたい系エンジニア。
最近書いた記事
- 2018.12.02シリコンバレー1日ツアーに参加してきました(後半)
- 2018.11.29【re:Invent 2018】Day3 -いよいよ本命のKeynote!-
- 2018.11.27【re:Invent 2018】Day1 - re:Inventに参加してきました!!!
- 2018.02.21CloudFormationでAPIGatewayのリソースとメソッドを作成する方法