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

AWS, S3, Shell

はじめに

岡崎です。
今回は、タイトル通りディレクトリに変更があったものをS3にアップロードするシェルをつくってみました。
業務上作成したものの簡易版を以下に記載します。


ゴール

指定のディレクトリに何か変更があったもの(ファイル、ディレクトリの上書き・新規作成)に対して
その変更を検知して、S3にその変更内容をアップロードする。

※ただし、指定のディレクトリの構造とS3上のディレクトリ構造は同じにする

例)
監視ディレクトリ:hoge

変更箇所: hoge/fuga/foo/helloS3.txt(新規でhelloS3.txtが作成された場合、helloS3.txtに変更があった場合)

=> 対象のS3バケット:対象のバケット名+hoge/fuga/foo/helloS3.txtに変更内容をアップロードする


作成したシェル(簡易版)


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

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 コマンドで調べることができます。

inotifywaitのメリット

  • 比較的扱いやすい
  • -eオプションで検知したいイベントについて設定できる

inotifywaitのデメリット

  • –excludeが複数かけない
    任意のファイルを監視対象から除外したい場合は、–excludeオプションを用いることで
    除外することができるのですが、例えば以下のように書くことができません。
    (厳密には、書くことができるのですが、実行すると後の方に書いた–excludeオプションのみが有効化されます。)

対処法として、かなり雑なのですが、正規表現の|(または)を使用して、取り除くことにしました。
どなたか、この辺り知っている方がいれば、ぜひ岡崎に教えてください。

補足

因みに、s3 upload failed と標準出力される場合は、
対象のEC2に対するIAMロールが割り当てられていないと考えられます。
なぜなら、対象のEC2に対象のS3へのアクセス権が与えられていないと
そもそもアップロードできないためです。
また、IAMロールの他にS3バケットポリシーにて
更にスコープを絞った操作が指定できます。(ここでは、割愛します)

この記事を書いた人

岡崎拓哉
岡崎拓哉

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

AWS, S3, Shell