mountainduck (マウンテンダック) を使って S3 をマウントする【管理者編】

S3 をwindows や mac にマウントして簡単かつ高セキュリティでクラウドなNAS相当のものを構築したいと思います。

本編はAWS の設定など管理者向けの情報になっています。

mountainduck のインストール以降は【利用者編】 を参照ください。

cameong.hatenablog.com

S3 とは

S3 とは、AWS が提供するインターネット用のストレージサービスです。

【セキュリティが高く、ほとんどサービス停止しないのに、安い】という三拍子そろった製品です。

このS3 をNASの代わりに使おうと思います。

Linuxであれば s3fuse というオープンソースなソフトウェアがあるのですが

mac・windows はs3fs が未対応(mac は対応してるかも?) なので

別の製品を使って実現したいと思います。

cameong.hatenablog.com

商品比較

いくつか調べた結果、tntdrive と mountainduck を利用しているケースが多かったため、この2つを比較しました。

S3 Drive. Mount Amazon S3 Bucket as a Windows Drive. Map Amazon S3 Bucket. Mount S3 Drive. Amazon S3 Disk.

mountainduck.io

- tntdrive mountainduck
無料トライアル 有り あり
課金体系 1PCごと(複数PC不許可) 1ユーザごと(複数PC可能)
価格 $39.99 以上 $39 以下
大量購入割引 なし あり
対応OS Windows Vista/2008/7/8/8.1/2012 R2/10 Windows 8.1, OS X 10.11.6

windows 10 で試してみたかったのですが、期待も込めて

もろもろ良さそうなmountainduck を利用することにしました。

詳細な機能比較はこちらからどうぞです。

管理者向け設定

この項目は管理者向けの設定ですので、利用するだけであれば飛ばしてください。

S3 のバケット設定

S3 はバケットという大きなフォルダを最初に作るところから始まります。

S3 にアクセスします。左上の「create bucket」ボタンをクリックします。

https://i.gyazo.com/097c6fd31f212744d22490d9bf018e34.png

こういう画面に成るので

https://i.gyazo.com/9f15e9c28ab0d0ebedb78787aea84398.png

バケット名 (ここだと cameong ) を入力し、「create」ボタンをクリックします。

https://i.gyazo.com/02eeaed477b024f10ca483d8560ee344.png

バケットが作成されました。

https://i.gyazo.com/7281b4c830d9a286b2c5cb5d3d2597d4.png

次は、だれでもバケットの権限設定です。

閲覧・書込みを特定の人にしかしないように設定します。

バケットの権限設定

バケットポリシーの作成

ポリシーの作成 ページに移動し、左上の「Create Policy」ボタンをクリックします。

https://i.gyazo.com/feb1cd23ca9a839f072570f374f44fcf.png

「Create Own Policy」を選択します。

https://i.gyazo.com/5f035b61320507947e392d1ecf1fec0f.png

ポリシーを以下のように作成します。

https://i.gyazo.com/952d08e798128c94447018f49288e8e6.png

Policy Name: s3_cameong_rw_policy

Policy Document :

cameong はご自身のバケット名に置き換えてください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets"
            ],
            "Resource": "arn:aws:s3:::cameong"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Resource": "arn:aws:s3:::cameong"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::cameong/*"
        }
    ]
}

エラーが出た場合は、修正してから右下灰色の「Validate Policy」ボタンをクリックすると、正しいかどうかがわかります。

正常に作成できると、このようになります。

https://i.gyazo.com/726d5dbaf93e714e4515d01e6deafb3f.png

特定のバケットしか閲覧・書き込みできないグループを作成

特定のバケットだけ操作できるグループを作成します。

iam にアクセスし、左上青色の「Create New Group」ボタンをクリックします。

https://i.gyazo.com/d15bb2ac659a31cc9a31d775943b2642.png

ここでは、グループ名を s3_cameong_rw とします。

https://i.gyazo.com/721b83c9dbd05b0cb8f02026ab027720.png

https://i.gyazo.com/bccb9eea63366c2572733baed6846fc3.png

https://i.gyazo.com/eb8e1ba0843786ef83b82fa05ead9ba6.png

ユーザ作成・グループに所属

こちらページに移動し、左上青色の「Add User」ボタンをクリックします。

https://i.gyazo.com/6d02dabb7f0b02e1b3483ba0f149e683.png

ユーザ名 (ここでは s3_cameong_001)を入力し、「Programmatic Access」にチェックをいれ、「Next Permissions」をクリックします。

https://i.gyazo.com/d48b12bf35320aca695e3328a0ab4fc2.png

先程作成したグループを選択して

https://i.gyazo.com/9dd426f90b1e0c79206d4c2b192fcd59.png

右下、「Next: Review」をクリックします。

https://i.gyazo.com/349589b74fcdf901332482dbd8f7892c.png

内容に不備がなければ、右下「Create User」をクリックします。

https://i.gyazo.com/f460d85dff10c41941b69e67a8540682.png

「Download CSV」ボタンをクリックし、Access Key ID と Secret access key を入手します。 Access Key ID と Secret access key はとても重要なので、流出しないようにしてください。

https://i.gyazo.com/26a69c4ecd85b0b2e077529f7b4be9c7.png

https://i.gyazo.com/57258ed14da7e096617f3c79a25e8a6c.png

これで、S3 側の設定は完了しました。次は利用者向けの設定を行います。

cameong.hatenablog.com

mountainduck (マウンテンダック) を使って S3 をマウントする【利用者編】

mountainduck を使ってS3 をマウントする

mountainduck を使ってS3 をマウントする。利用者編です。

AWSの設定などは【管理者編】 を参照ください。

mountainduck のインストール

まずmountainduck をインストールします。

公式HP からインストーラをダウンロードします。

ダウンロード完了後、インストーラーを起動するとインストールが開始されます。

ウィザードにしたがってインストールを行います。

mountainduck の起動・S3へのアクセス

インストール完了後、mountainduck を起動します。

といっても、自動的に起動しているはずです。

画面一番上のツールバーあるアヒルっぽいアイコンをクリックします。

アヒルのアイコンをクリックした後、ダイアログの「New Bookmark」をクリックします。

https://i.gyazo.com/c6db2edca61b5b3c6a92a51889f0b076.png

下図のように、それぞれ入力し、右下の「Connect」ボタンをクリックします。

https://i.gyazo.com/b8e245a413d01ac482948e6196d0359b.png

フォームに情報を入力します。Access Key ID, Secret Access Key をそれぞれ入力し、「login」 をクリックします。

https://i.gyazo.com/0ad9ea4893c9e133f78d67fb9f2675c4.png

正常にログインできると、次のようにバケットが見えるようになります。

gyazo.com

レポジトリ内のファイルに含まれる文字列を全て置換するコマンド

特定の文字列を全て置換するコマンド

環境

  • OSX (Yosemite)

他OSだとsed の引数の扱いが微妙に違うので、ご注意ください。Ubuntuなどで検証したら、更新します。

例では dir ディレクトリに含まれる coincheck.jpcoincheck.com に置換

% grep -irl coincheck.jp dir | xargs -I {} sed -i '' 's/coincheck.jp/coincheck.com/g' {}

結果

結果はgit diff とかで確認してください。

% git diff 

参考

sedコマンドで覚えておきたい使い方12個(+1個) | 俺的備忘録 〜なんかいろいろ〜

Linuxコマンド集 - 【xargs】標準入力から生成したコマンドラインを実行する:ITpro

python3 でyyyymmddhhmmss形式をdatetime形式に変換する

python で byte 型のyyyymmddhhmmss形式をdatetime形式に変換します

native なdatetime形式

datetime パッケージを用いてdatetime型にします。

>>> from datetime import datetime
>>> _time=b"20161229122800Z"
>>> td = datetime.strptime( _time.decode('utf-8'), '%Y%m%d%H%M%SZ')
>>> td
datetime.datetime(2016, 12, 29, 12, 28)

これだとnative (UTCオンリー) となり、マルチリージョン対応が困難。

aware なdatetime形式

以下のようにして、aware な形式(オブジェクトの中にタイムゾーンの情報を思っている形式) にするにはpytz を用いる。

pytz は標準パッケージではないものの、準公式パッケージ相当の信頼性があるもよう。

// pytz のインストール
% pip install pytz

awareなdateime形式を得る。

>>> from datetime import datetime
>>> import pytz
>>> _time=b"20161229122800Z"
>>> td = datetime.strptime( _time.decode('utf-8'), '%Y%m%d%H%M%SZ').replace(tzinfo=pytz.utc)
>>> td
datetime.datetime(2016, 12, 29, 12, 28, tzinfo=<UTC>)

参考

Pythonの日付処理とTimeZone | Nekoya Press

systemd を利用してプロセスをデーモン化する

systemdを利用すれば、プロセスのデーモン化を簡単に行うことができます。

環境

  • ubuntu 16.04
  • ( systemd のシステムであれば使えるはず。)
    • CentOS7 など

デーモン化前

次のようなコマンドをバックグラウンドで実行しているとします。

% cd /var/lib/nem/0.6.79/package/nis
% java -Xms512M -Xmx1G -cp ".:./*:../libs/*" org.nem.deploy.CommonStarter > /var/log/nis.log 2>/var/log/nis.error.log &

これをsystemd でデーモン化します。

systemd でデーモン化する

systemd に必要なファイルを作成します。

/etc/systemd/system/nis-0.6.79.service

[Unit]
Description=NIS
After=syslog.target network.target

[Service]
Type=forking
EnvironmentFile=-/etc/default/nis-0.6.79
WorkingDirectory=/var/lib/nem/
ExecStart=/usr/local/bin/nis-0.6.79-start.sh
ExecStop=/usr/local/bin/nis-0.6.79-stop.sh
User=nem
Group=nem
KillMode=none
Restart = always

[Install]
WantedBy=multi-user.target

Restart = always によって、プロセスが停止したら、自動的に再起動します。

ただ、この段階ではファイルが不足しているので動きません。

  • /etc/default/nis-0.6.79
  • /usr/local/bin/nis-0.6.79-start.sh
  • /usr/local/bin/nis-0.6.79-stop.sh

必要なファイルを作成する

環境変数のためのファイルを作成しておきます。

/etc/default/nis-0.6.79

LOG="/var/log/nem/nis.log"
ERROR_LOG="/var/log/nem/nis.error_log"
RUN_DIR="/var/lib/nem/run/nem"
LOCK_FILE=/var/lib/nem/nis.lock
PID_FILE=/var/lib/nem/run/nem/nis-0.6.79.pid

このファイルに記載した変数はこのサービス内のスクリプトで利用することができます。

起動スクリプトや停止スクリプトで利用します。

起動スクリプトを作成

起動スクリプトを作成します。

/usr/local/bin/nis-0.6.79-start.sh

#!/bin/bash
[ -d $RUN_DIR ] || mkdir -p ${RUN_DIR}
cd /var/lib/nem/0.6.79/package/nis
java -Xms512M -Xmx1G -cp ".:./*:../libs/*" org.nem.deploy.CommonStarter > $LOG 2>$ERROR_LOG &
echo $! > ${PID_FILE}

実行権限・所有権を変更しておきます。

% sudo chown nem. /usr/local/bin/nis-0.6.79-start.sh
% sudo chmod +x /usr/local/bin/nis-0.6.79-start.sh

停止スクリプトを作成

停止スクリプトを作成します。

/usr/local/bin/nis-0.6.79-stop.sh

#!/bin/bash
[ -f ${PID_FILE} ] && kill -9 $(cat ${PID_FILE})
[ -f ${LOCK_FILE} ] && rm ${LOCK_FILE}
[ -f ${PID_FILE} ] && rm ${PID_FILE}

実行権限・所有権を変更しておきます。

$ sudo chown nem. /usr/local/bin/nis-0.6.79-stop.sh
$ sudo chmod +x /usr/local/bin/nis-0.6.79-stop.sh

Serviceとして認識されたか確認する

systemd にservice として認識されたか確認します。

% systemctl list-unit-files --type=service | grep nis
nis-0.6.79.service                         disabled

ここに表示されたら、認識されていることがわかります。

もし表示されなかったら、なにかおかしいのでエラー文などを参考に修正してみてください。

サーバ起動時に自動起動する

サーバ起動時に自動起動するようにします。

# 自動起動on
$ sudo systemctl enable nis-0.6.79
$ systemctl list-unit-files --type=service | grep nis
nis-0.6.79.service                         enabled

起動 / 確認 / 停止

#  起動
$ sudo systemctl start nis-0.6.79

# 確認
$ sudo systemctl status nis-0.6.79

● nis-0.6.79.service - NIS
   Loaded: loaded (/etc/systemd/system/nis-0.6.79.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2016-10-17 06:25:05 JST; 1 day 5h ago
  Process: 30714 ExecStop=/usr/local/bin/nis-0.6.79-stop.sh (code=exited, status=0/SUCCESS)
  Process: 30720 ExecStart=/usr/local/bin/nis-0.6.79-start.sh (code=exited, status=0/SUCCESS)
 Main PID: 13771
    Tasks: 43
   Memory: 1.1G
      CPU: 19min 49.692s
   CGroup: /system.slice/nis-0.6.79.service
           └─30721 java -Xms512M -Xmx1G -cp .:./*:../libs/* org.nem.deploy.CommonStarter

#  起動
$ sudo systemctl stop nis-0.6.79

OSを再起動して、サービスが自動起動するか確認

もしサービスインする前でしたら、OS を再起動して、サービスが自動起動するか確認します。

# 再起動
$ reboot

起動していたらokです

# 確認
$ sudo systemctl status nis-0.6.79

以上です。

参考

Systemd入門(1) - Unitの概念を理解する - めもめも

いまさらだけどsystemdに入門した - 雑なメモ

Systemdを使ってさくっと自作コマンドをサービス化してみる - Qiita

djangoの管理者パスワードを再設定する

django の管理者パスワードを忘れてしまったときに、コマンドラインから再設定する方法の備忘録

stackoverflow によると幾つか方法が提案されているので主要な2つを紹介します。

環境

  • django 1.9

方法

changepassword コマンドを使う方法

% manage.py changepassword USERNAME

django shell を利用する方法

標準のUserモデルを使っているときは次の通り。

from django.contrib.auth.models import User
// superuser の一覧を取得する
User.objects.filter(is_superuser=True) 
u = User.objects.get(username='your username')
u.set_password('raw password')
u.save()

独自のモデル(たとえば、CustomUser.models に MyUser クラスを作っているとする)を利用するときは次の通り

from CustomUser.models import MyUser as User
usr = User.objects.get(username='your username')
usr.set_password('raw password')
from django.contrib.auth.models import User
// superuser の一覧を取得する
User.objects.filter(is_superuser=True)
u = User.objects.get(username='your username')
// パスワードリセット 
u.set_password('raw password')
// 保存
u.save()

参考

stackoverflow.com

Using the Django authentication system | Django documentation | Django