LS220をS3にバックアップ

# LS220を手に入れた
ので、sshで入れるようにしたりしました。
が、肝心のs3cmdや、awscliのインストールが上手くいかない。。。。
LS220を色々無茶をしすぎて壊してしまうのも怖いので、一旦、s3の取り扱いをラズベリーパイでやってみる。


# 目的
LS220というRAID1のNASを手に入れたのですが、AWS S3に保存し、冗長性を確保するのが目的です。
ラズパイからNASをマウントし、これをS3に日次バックアップしていきます。
構想としては、下記のような感じです。

https://qiita.com/taku-y-9308/items/6294b7198c72fb98768e

https://huruyosi.hatenablog.com/entry/2015/06/28/185216

数TBのバックアップなら、数百円/月程度で保存できることになります。

# ところで、
s3cmdは、amazon非公式のs3に特化したツールのようです。
一方、awscliは、amazon公式のaws全体を取り扱えるツールのようです。
それぞれに得手不得手があるようです。
なので、今回はインストールの簡便性から、awscliを使います。
s3cmdを使う手もあるようです。

https://huruyosi.hatenablog.com/entry/2015/06/28/224122


## AWSCLI
# インストール
公式は下記の通り

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html

ラズパイの場合、Linux ARMを参考にし、

    $ curl "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o "awscliv2.zip"
    unzip awscliv2.zip
    sudo ./aws/install

# 設定

https://zenn.dev/akkie1030/articles/aws-cli-setup-tutorial

を参考にする。Mac向けでしたが、他のOSでも参考になります。
下記で設定内容を確認できます。

    $ aws configure
初期設定はこれから入ります。
以下は、設定内容の確認です。

    $ aws configure list
    $ cat ~/.aws/credentials
    $ aws configure list --profile default
          Name                    Value             Type    Location
          ----                    -----             ----    --------
       profile                  default           manual    --profile
    access_key     ****************ZH7U shared-credentials-file
    secret_key     ****************oGwn shared-credentials-file
        region                <not set>             None    None


下記で接続確認できます。

    $ aws s3 ls --profile default
    2024-07-12 18:16:01 [bucket name]


# 試しになにかアップロードしてみる。
アップロードしたいディレクトリにて
   
    aws s3 sync . s3://my_bucket/path --storage-class DEEP_ARCHIVE


無事アップロードまでできました。

# NASのマウント
次に対象のディレクトリを持つNASをラズパイ上にマウントします。

https://dotiga.software/linux/smb/2023-mounting-a-nas-drive-under-linux

を参考にします。
本当は、LS220上で上記awscli（またはs3cmd）を実行したかったのですが、断念しています。
マウント先のディレクトリも迷うところです。
mntや、mediaいずれでもいいようですが、mediaがUSBドライブや、CD-ROMの自動マウント先として使われることが多く、またmntは一時的なマウント先として使われるようです。
って両方とも一時的なマウント先として使ってるからだいたい同じやん！

気を取り直して、マウント先にディレクトリを作成後、

    sudo mount -t cifs //192.168.x.xxx/share /mnt/ls220d_share -o username=yyyyy,password=xxxxx,vers=2.0

ここでは念の為に、LS側でリードオンリーのユーザーを本件専用に作っています。
なにかしらラズパイに汚染があったとしても、LS側まで行かない設定です。
と思いましたが、log用のディレクトリにアクセス・保存できませんので、
一部書き込みできるように開放し、

    $ id
    uid=1000(hoge) gid=1000(hoge) ......

こんなんみてもわからないんですが、,uid=1000,gid=1000を追記します。

    sudo mount -t cifs //192.168.x.xxx/share /mnt/ls220d_share -o username=yyyyy,password=xxxxx,vers=2.0,uid=1000,gid=1000

https://armadillo.atmark-techno.com/blog/10899/11316




# crontabで自動化

https://zenn.dev/ttskch/articles/a2ce0952856142

こちらのようにcrontabでawsを実行するだけで十分なのですが、NASへ接続できなかったときなどの対処（勝手に消えることとはいと思いますが）を考え、必要なときにマウントし、処理が終わればアンマウントのバッチファイルにしようと思います。


```sh:back2s3.sh
#!/bin/bash
# 20240812
# chmod u+x back2s3.sh
# chmod 755 back2s3.sh

# LS220をマウント
sudo mount -t cifs //192.168.x.xxx/log /mnt/ls220d_log -o username=yyyy,password=zzzz,vers=2.0,uid=1000,gid=1000
sudo mount -t cifs //192.168.x.xxx/share /mnt/ls220d_share -o username=yyyy,password=zzzz,vers=2.0
sudo mount -t cifs //192.168.x.xxx/private /mnt/ls220d_private -o username=yyyy,password=zzzz,vers=2.0

# private全体をバックアップ
# aws s3 sync "/mnt/ls220d_private/" "s3://my_bucket/private" --storage-class DEEP_ARCHIVE
# セミテスト用ILのみバックアップ
# aws s3 sync "/mnt/ls220d_private/Image Library" "s3://my_bucket/private/Image Library" --storage-class DEEP_ARCHIVE
# テスト用バックアップ（一旦軽めのバックアップを実施してみる。）
aws s3 sync "/mnt/ls220d_private/test" "s3://my_bucket/private/test" --storage-class DEEP_ARCHIVE > log_`date "+%Y%m%d%H%M%S"`.log

# アンマウント
sudo umount /mnt/ls220d_log
sudo umount /mnt/ls220d_share
sudo umount /mnt/ls220d_private
```

実行権限を与えます。

    $ chmod u+x back2s3.sh
    $ chmod 755 back2s3.sh



最後にcrontabに追記します。

    $ sudo nano /etc/crontab 

毎日午前４時前ぐらいな感じでいきます。

    54 3  * * *   user    works/back2s3.sh


# 課題

### autofs
autofsは、リソース消費が少なくていいらしい。
オンデマンドでマウントでき、自動でアンマウントできる点もいい。

https://qiita.com/quenhulu/items/c3b306ec1cf6278bdd81

https://qiita.com/zmtkr/items/5ec0d82650f9471e7fca

https://documentation.suse.com/ja-jp/sles/15-SP5/html/SLES-all/cha-autofs.html


### logの保存
logの保存用にNAS内にLOGフォルダを作りましたが、書き込みできません。
NAS側の権限ではなく、クライアント側の権限の問題のようです。
マウントする際に uid と gid オプションを指定してやらないといけないようです。
→対応済み

https://red-full-moon.com/automount-to-nas-on-linux/

### マウント判別
NASへの接続に失敗し、アップロードができないようなときには中止し、
この旨をメールにて知らせたい。



# 追記
どうやら、64bit版をインストールしてしまっているようです。
ログを確認すると下記のエラーが発生しています。

    hoge.sh: line 42: /usr/local/bin/aws: cannot execute binary file: Exec format error


https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/uninstall.html


に従い、64bit版をアンインストールします。

念の為、ディストリビューションと、32bitを確認し、32bit版をインストールします。

    $ uname -m
    armv7l

    $ getconf LONG_BIT
    32

上記で、ARM、32bitだと確認できる。

    pip3 install awscli --upgrade --user

もちろん、初期設定から始めることになります。