t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

Amazon AWS S3とSambaサーバーの組み合わせで、自宅用の実用的なアーカイブソリューションを構築してみた

今回はAmazon AWS S3とSambaサーバーを組み合わせて、とりいそぎ使えそうなアーカイブソリューションが構築できたのでご紹介。
めったに参照しないけど無くなると困るファイルを、安全かつ恒久的にアーカイブする。

概要と使い方

仕組みを説明したのが以下の図。
f:id:t-hom:20220410223600p:plain

  1. Sambaサーバー上にあるToArchiveというフォルダーに大事なファイルを配置する。
  2. cronジョブにより実行されるバッチがToArchive内のファイルをAmazon S3へアップロードする
  3. 上記バッチはアップロードが完了したローカルファイルをSambaサーバー上のArchiveフォルダへ移動する。

この仕組みのメリットは図上の吹き出し参照。

特にファイルを間違って消しそうになっても、Archiveフォルダは書き込みアクセス権が無くて弾いてくれるのがありがたい。
f:id:t-hom:20220410230213p:plain

各種設定

/etc/samba/smb.conf

[global]
        dos charset = CP932
        unix charset = UTF-8

        workgroup = WORKGROUP
        security = user

        interfaces = 192.168.1.107 127.0.0.1
        bind interfaces only = yes
        socket address = 192.168.1.255

        printcap name = /dev/null
        log level = 1

[Archive]
        path = /mnt/pool/Archive
        writeable = no

[ToArchive]
        path = /mnt/pool/ToArchive
        writeable = yes

ここでのポイントは[Archive]のwritableをnoにしておくこと。

設定ファイルを保存したらsmbを再起動。

sudo systemctl restart smb.service

SE Linux環境でsambaに特定フォルダへアクセスを許可する設定コマンド

sudo chcon -t samba_share_t /mnt/pool/ToArchive
sudo chcon -t samba_share_t /mnt/pool/Archive

cronから実行するシェルスクリプト /home/thom/archive.sh

#!/bin/bash
FILES="/mnt/pool/ToArchive/*"

if [ -n "$(ls -A /mnt/pool/ToArchive/)" ];then
  for f in $FILES
  do
    echo "Processing: $f"
    /usr/local/bin/aws s3 cp $f s3://ここにS3バケット名/ --profile ここにユーザー名
    mv $f /mnt/pool/Archive/
  done
else
  exit
fi

crontab

*/1 * * * * /home/thom/archive.sh

関連のある過去記事

thom.hateblo.jp
thom.hateblo.jp

要改善点

同名の別ファイルをうっかりToArchiveに置いてしまうと恐らくアーカイブが上書きされてしまうので、バッチ処理にif文でArchiveに同じファイル名が存在するときは処理をしないか、あるいはArchiveErrorというフォルダを作ってそこに移動するか等考えたい。
これはさっさとやらないとまずそう。Redmineにタスク登録しておこう。

あと暗号化の仕組みもまだ導入できてない。
検証は以下の記事で終わってるので面倒くさがってるだけなんだけど、Redmineタスクには登録したので、近いうちに組み込みたいと思う。
thom.hateblo.jp

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。