ビジネスや私用ともに、とても便利に使える Synology NAS ですが、1 点だけ不満があります。それはオブジェクトストレージ API 機能が存在しないことです。
スクリプトでバックアップ作業等を自動化する際、オブジェクトストレージ API があるととても便利です。
MinIO という Go 言語で書かれたオブジェクトストレージが使えそうです。
ネットを検索すると Synology NAS のコンテナ機能を使って MinIO をホストする記事が多いのですが、私の使っている DS216J はメモリも少なくコンテナは起動しません。
そこで、Synology NAS のネイティブ OS 上で動くバイナリを探して、お手軽に MinIO を起動してみた、という記録です。
https://dl.min.io/server/minio/release/
SynologyNAS DS216j は Intel CPU ではないので ARM 用のバイナリを探します。 linux-arm を選び、ダウンロード。
cd /usr/local/bin wget https://dl.min.io/server/minio/release/linux-arm/minio chmod +x minio ./minio server /volume1/minio/data Endpoint: http://192.168.254.199:9000 http://127.0.0.1:9000 AccessKey: minioadmin SecretKey: minioadmin Browser Access: http://192.168.254.199:9000 http://127.0.0.1:9000 Command-line Access: https://docs.min.io/docs/minio-client-quickstart-guide $ mc config host add myminio http://192.168.254.199:9000 minioadmin minioadmin Object API (Amazon S3 compatible): Go: https://docs.min.io/docs/golang-client-quickstart-guide Java: https://docs.min.io/docs/java-client-quickstart-guide Python: https://docs.min.io/docs/python-client-quickstart-guide JavaScript: https://docs.min.io/docs/javascript-client-quickstart-guide .NET: https://docs.min.io/docs/dotnet-client-quickstart-guide Detected default credentials 'minioadmin:minioadmin', please change the credentials immediately using 'MINIO_ACCESS_KEY' and 'MINIO_SECRET_KEY'
ブラウザで NAS のポート 9000 にアクセスすると管理画面が表示される。
以下の失敗編では、オレオレ証明書では AWS CLI も MC もアクセスを受け付けてくれなかったため、SynologyNAS 本体に設定した LetsEncrypt 証明書のフックを試みる。
SynologyNAS の Nginx の設定から、証明書の保存場所を割り出す。
# cat /etc/nginx/nginx.conf | grep ssl_ ssl_certificate /usr/syno/etc/certificate/system/default/fullchain.pem; ssl_certificate_key /usr/syno/etc/certificate/system/default/privkey.pem; ...
場所は判ったが、minio のドキュメントを見ると、minio 側では秘密鍵、証明書のファイル名がそれぞれ、private.key、public.crt でなければならないらしいため、ファイル名を変えてシンボリックリンクを作成する.
# cd /root/.minio/certs # ln -s /usr/syno/etc/certificate/system/default/privkey.pem ./private.key # ln -s /usr/syno/etc/certificate/system/default/fullchain.pem ./public.crt
なお、この証明書はドメイン名を使用したものであり、グローバル IP 経由の接続となるので、Firewall で ターゲットポートが通過できるよう、ブロードバンドルーターで Port Forwarding を行った。
この状態で minio server を起動すると、mc コマンドも AWS CLI も成功!
openssl で生成した秘密鍵、証明書を ~/.minio/cert に保存し、サービスを再起動する.
$ cd /root/.minio/cert $ openssl genrsa -out private.key 2048 Generating RSA private key, 2048 bit long modulus ....................................................................................... .........+++++ ...........................+++++ e is 65537 (0x10001) $ openssl req -new -x509 -days 3650 -key private.key -out public.crt You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [TW]:JP State or Province Name (full name) [Taiwan]:XXXXXX Locality Name (eg, city) [Taipei]:XXXXXX Organization Name (eg, company) [Synology Inc.]:XXXXXX Organizational Unit Name (eg, section) []:XXXXXX Common Name (e.g. server FQDN or YOUR name) []:XXXXXX Email Address [product@synology.com]:XXXXXX # 以下のコマンドでも大丈夫かも知れない. # openssl req -new -x509 -days 3650 -key private.key -out public.crt -subj "/C=JP/ST=XXXXXX/L=XXXXXX/O=XXXXXX/CN=XXXXXX"
この作業の後にサービスを起動すると、
/usr/local/bin# ./minio server /volume1/minio/data Endpoint: https://192.168.xxx.xxx:port https://127.0.0.1:port AccessKey: minioadmin SecretKey: minioadmin Browser Access: https://192.168.xxx.xxx:9000 https://127.0.0.1:9000 Command-line Access: https://docs.min.io/docs/minio-client-quickstart-guide $ mc config host add minio_host https://192.168.xxx.xxx:port minioadmin minioadmin Object API (Amazon S3 compatible): Go: https://docs.min.io/docs/golang-client-quickstart-guide Java: https://docs.min.io/docs/java-client-quickstart-guide Python: https://docs.min.io/docs/python-client-quickstart-guide JavaScript: https://docs.min.io/docs/javascript-client-quickstart-guide .NET: https://docs.min.io/docs/dotnet-client-quickstart-guide Certificate: Signature Algorithm: SHA256-RSA Issuer: C=JP, ST=XXXXXX, UnknownOID=2.5.4.7, O=XXXXXX, OU=XXXXXX, CN=XXXXXX, emailAddress=XXXXXX Validity Not Before: Thu, 09 Jul 2020 04:27:18 GMT Not After : Sun, 07 Jul 2030 04:27:18 GMT Detected default credentials 'minioadmin:minioadmin', please change the credentials immediately using 'MINIO_ACCESS_KEY' and 'MINIO_SECRET_KEY'
となり、TLS 対応になっていることが判る. なお、この状態でブラウザからアクセスすると、セキュリティ警告はでるが問題なく利用できる. 但しこの状態だと、下記 AWS CLI によるアクセスは証明書の問題で拒否される. 同様に MC コマンドでも自己署名証明書で TLS にチャレンジすると接続できなくなった.
自分は SynologyNAS を前提に作業をするので、NAS で導入している証明書を流用することで解決した.
証明書を使う場合、接続はグローバル IP を使うことになるので Firewall のポートを空けることも忘れずに.
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-windows.html
とりあえず、動いた!
$ aws configure # AccessKey と SecretKey を入力。Regionは何でもいい。 $ s3_url=http://<Synology NASのIP>:port bucket_name="abc" $ aws --endpoint-url $s3_url s3 mb s3://${bucket_name} make_bucket: abc $ aws --endpoint-url $s3_url s3 ls 2018-01-07 12:38:01 abc $ echo Hello > ./hello.txt $ aws --endpoint-url $s3_url s3 cp ./hello.txt s3://${bucket_name}/ upload: ./hello.txt to s3://${bucket_name}/hello.txt
cd /c/users/me/bin curl -L -O https://dl.min.io/client/mc/release/windows-amd64/mc.exe mc config host add minio_host https://minio.fqdn AccessKey SecretKey mc ls minio_host
手動で ~/mc/config.json を編集してもよい (linux の場合は ~/.mc/config.json)
/minio/health/live にアクセスし ステータスコード 200 が帰れば動いている. ちなみにレスポンスボディは空っぽ.
curl https://minio.fqdn:port/minio/health/live echo $? 0 ← 動作中 7 ← 落ちている...
#!/bin/env bash export MINIO_ACCESS_KEY=some_access_key export MINIO_SECRET_KEY=some_secret_key curl https://minio.fqdn:port/minio/health/live if [[ $? -ne 0 ]] then cd /root/.minio/certs ln -s /usr/syno/etc/certificate/system/default/privkey.pem ./private.key ln -s /usr/syno/etc/certificate/system/default/fullchain.pem ./public.crt /usr/local/bin/minio server /volume1/minio/data & fi
echo $PATH cd ~ mkdir bin cd bin curl -L -O https://dl.min.io/client/mc/release/linux-amd64/mc chmod +x mc mc config host add minio_host https://minio.fqdn:port MINIO_ACCESS_KEY MINIO_SECRET_KEY Added `minio_host` successfully. mc ls minio_host [2020-07-08 17:42:55 JST] 0B abc/ [2020-07-09 18:28:18 JST] 0B xyz/