目次

目次

ディレクトリに変更があったものをS3にアップロードするシェル書いてみた

アバター画像
岡崎拓哉
アバター画像
岡崎拓哉
最終更新日2017/04/12 投稿日2017/04/12

はじめに

岡崎です。 今回は、タイトル通りディレクトリに変更があったものを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]" &gt;&gt; $LOG_FILE`date "+%Y%m%d_%H%M%S"`.log
    fi
done


作成したシェルスクリプトの実行結果

f656a9b04f5782b643a63fd172a78ee8.png
408-s3.png

※ aws s3 cp コマンドが正常に終了しなかった場合(0以外のexit statusを返した場合)は下記のようにログとして出力されます。

408-log.png

手段

ディレクトリ監視に使用を行ったツール

  • 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年に入社した新卒。ドラムとインコが好きな人。
最近は、デザイン駆動設計や関数型プログラミングに興味あり。
マネジメントも覚えていきたい系エンジニア。

目次