goofysを使ってs3をNASのストレージのように使う

やりたいこと
===========

s3の単価がかなり安くなってきたので，ストレージとして使いたい

環境
====

最初はraspbian on raspberry pi3で動作させようとしていた…ものの，armアーキテクチャにgoofysを導入するのが難しくて諦めた．
普通のノートPCにdebian 9.7を入れて動かすことにする．

導入
====

goofys
------


色々と試してみたが，debianではgoofysのmakeを通せなかった．

てことで，x64のハードを用意し，[goofys/README\.md at master · kahing/goofys](https://github.com/kahing/goofys/blob/master/README.md)にあるように，
[pre-built binaries](http://bit.ly/goofys-latest)からリンクを張られた最新版のバイナリを落としてlinuxでpathを通す．
ここでは，~/binにpathが通ってるものとする．

```sh
wget http://bit.ly/goofys-latest -O ~/bin/goofys
chmod 755 ~/bin/goofys
```

なお，配布されているバイナリは，arm非対応．（←ここでraspberry pi3での運用を諦めた）


aws cli
-------

コマンド一発．
ただしpipのインストールが必須．

```sh
sudo apt install python3 python3-pip
python3 -m venv py3
. py3/bin/activate
pip install awscli
```

AWSの設定
====

S3バケットの設定
---------------

ちょっと画面のコピペがないので操作は省略．
最終的に以下の権限に落ち着いた．
置く物によるけど，アクセス元の制限はかけた方がいい気がする．私はsource ipで制限．

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets",
                "s3:HeadBucket"
            ],
            "Resource": "*",
            "Condition": {
                "ForAnyValue:IpAddress": {
                    "aws:SourceIp": [
                        "xxx.xxx.xxx.xxx/32"
                    ]
                }
            }
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::your-backet-name",
                "arn:aws:s3:::your-backet-name/*"
            ],
            "Condition": {
                "ForAnyValue:IpAddress": {
                    "aws:SourceIp": [
                        "xxx.xxx.xxx.xxx/32"
                    ]
                }
            }
        }
    ]
}
```

IAMのアクセスキー発行
-------------------

AWS → IAM → policy で対象バケットのアクセス権をつけたポリシーを作って IAM User にセット．
IAM User の Security credentials でアクセスキーとシークレットを発行．

awscliの設定
-----------

これを設定ファイルに書き込む．

```sh
aws configure
```

なお region は s3 でバケットを作る際に指定するはず．
もし，あなたがいくつかプロジェクトを持っていて請求の内訳を知りたい場合にリージョンを分けると分計できたりする．
いい方法とは思わんけど…

EC2 など他の AWS の機能を使ってる場合，リージョン間の転送量などに注意．
s3 は作成後にリージョンを移せない（削除して別リージョンに作り直し．名前のリースタイムがあるのですぐに作り直せない）ので，注意すること．

できた設定はこちら．

.aws/config

```conf
[default]
output = json
region = ap-northeast-1
```

.aws/credentials

```conf
[default]
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
aws_access_key_id = XXXXXXXXXXXXXXXXXXXX
```

ここで，``[default]``のとこを変えてプロファイル名を付けられる．それを``<profile_name>``表記で以降を記述する．

で，動作を試してみる．

```sh
aws s3 --profile <profile_name> ls  # バケット一覧が出ればOK
aws s3 --profile <profile_name> ls s3://your-backet-name  # バケット内のファイルがあれば，ファイル一覧
```

バケット内のlsは，credentialの指定を間違えているとAccess Deniedが返るので，ファイルがなくても正常かどうか判定できる．

goofysの操作
===========

実はawscliのオプションを受け付けてくれることを覚えておくと楽チン．

マウントポイントを作って，マウントしてみる．

```sh
sudo mkdir /mnt/s3
sudo chown -R $(id -un):$(id -gn) /mnt/s3
goofys -o allow_other --uid $(id -u) --gid $(id -g) --cheap your-backet-name /mnt/s3
df -h
```

こんな感じの出力が出ればOK．

> your-backet-name        1.0P     0  1.0P   0% /mnt/s3

アンマウントしてみる．

```sh
fusermount -u /mnt/s3
```

sambaの設定
==========

普通のディレクトリと思って設定すれば良いので省略．

起動時自動マウント
================

[goofys/README\.md at master · kahing/goofys](https://github.com/kahing/goofys/blob/master/README.md)のUsageにあるように，fstabで自動化できるらしい

…んだけど，私の場合は，常にs3に疎通が通ってるとは限らないので，設定はしてない．