S3をNextCloudのプライマリストレージ(データディレクトリ)に設定する方法

# TL;DR

* NextCloudのユーザデータを，AWS S3に保存する方法を解説します
    * NextCloudのデータがクラウドストレージに格納されるようになるので（費用が掛かるデメリットを除けば），容量を気にせずに使用することができます
    * (NextCloudの機能通り)ユーザごとに個別のディレクトリが使え，かつ，共有設定もできます

# NextCloudがS3を利用する２つの方法

* NextCloudがS3を利用する方法として，以下の2つの方法があります
    * NextCloudアプリを使用して，ユーザが共有されるディレクトリをS3上に作る方法
    * データディレクトリをS3にまるまる置く方法
* この記事では，後者の方法を扱います
    * 前者の（アプリを使う）方法は，NextCloudに設定された全ユーザが共有するディレクトリを作る方法で，ユーザごとに振り分けることができないようです（未調査です)
        * [Qiita nextcloudによるプライベートオンラインストレージの構築](https://qiita.com/h_amakasu/items/9947d81bc0d3bc18f06d)などが参考になります
    * 後者の方法は，データディレクトリがS３に置かれるので，ホストのストレージ負荷を軽減できます（その分費用も掛かります）

# NextCloudのユーザデータをS3に置く方法

* [NextCloudの主ストレージ設定のドキュメント](https://docs.nextcloud.com/server/16/admin_manual/configuration_files/primary_storage.html)を参考に取り組みます

## 設定

* 以下の3つの手順で進めます
    * IAMでS3にアクセスできるユーザを作成する
    * S3にNextCloud用のバケットを作成する
    * NextCloudに作成したバケット情報を設定する

### IAMでS3アクセスユーザを作成する

[aws IAM](https://console.aws.amazon.com/iam/home#/home)にアクセスし，ユーザを作成します．

* メニューから[ユーザ]を選び，[ユーザを追加]をクリックする
    * <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309617/dd912181-3f8e-87d5-3ee3-cde73c934891.jpeg" width=50%>
* 適当なユーザ名を入力し[プログラムによるアクセス]にチェックします
    * <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309617/452fca26-36a0-9d5c-78d7-e6a2acbded84.jpeg" width=80%>
* アクセス許可の設定で[既存のポリシーを直接アタッチ]を選択し，[AmazonS3FullAccess]をチェックする
    * <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309617/4b322857-43f8-b350-8f2e-6ab1344e8dc3.jpeg" width=80%>
* 「成功」と言われたら，[アクセスキーID]および[シークレットアクセスキー]を記録しておく
    * **注意**: [表示]リンクをクリックするとシークレットアクセスキーが表示されますが，このときだけしか表示されないので注意してください！紛失したら別のユーザを作る必要があります．
    * ![04_keys.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309617/bc5cf802-43ae-38e4-ef72-42e9e5d70cdb.jpeg)

### S3のバケットを作成する

[aws S3](https://s3.console.aws.amazon.com/s3)で，前項のユーザでアクセスできるNextCloud用のバケットを作成します.

* [バケットを作成する]をクリックします
    * <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309617/fa37b840-96fa-a7ef-9097-25bb48e7bc12.jpeg" width=50%>
* 適当なバケット名を入力します
    * (別のユーザも含めて)awsサービス全体一意な名前である必要があります
    * 適当な名前や日付などを入れて一意な名前にしてください
    * <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309617/b4f0a7cc-9f09-d7cd-4b9f-fc88ee1afb23.jpeg" width=50%>
* アクセス許可などはそのまま（「パブリックアクセスをすべてブロック」）でOKです
* 「バケットの作成」をクリックし，バケットを作成します
    * ![07_access.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309617/199276d2-9d9f-c2f9-35c7-37adbc4f839d.jpeg)
* バケットが作成されました．次節では，このバケットにデータを格納するようにNextCloudの設定を行います
    * <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309617/8ea447ff-f9b1-bedb-5827-9ac06f6c0c4f.jpeg" width=50%>

### NextCloudの設定

* NextCloudが稼働しているホストの，```config/config.php```のCONFIGアレイの中に，S3の設定を記載します．
    * NextCloudをDockerで稼働させている場合は，コンテナの```/var/www/html```にconfigディレクトリがあります
* 以下のように，```objectstore```キーで，前項までで作ったawsユーザおよびS3の情報を記載します
    * ```'bucket'``` : バケット名
    * ```'region'``` : S3のリージョン('ap-northeast-1'など)
    * ```'key'```    : 20文字の大文字英数字のアクセスキー
    * ```'secret'``` : 40文字の英数字記号のシークレットキー

```php
<?php
// config/config.php
$CONFIG = array (
  //.....<snip>.....
  'objectstore' => array(
        'class' => 'OC\\Files\\ObjectStore\\S3',
        'arguments' => array(
                'bucket' => '<バケット名>',
                'autocreate' => true,
                'region' => '<S3のリージョン>',
                'key'    => '<20文字の大文字英数字のアクセスキー>',
                'secret' => '<40文字の英数字記号のシークレットキー>',
                'use_ssl' => false,
                'use_path_style'=> false,
        ),
    ),
    //.....<snip>.....
);
```

## 動作確認

* ブラウザでNextCloudにアクセス（ログイン）すると，ユーザディレクトリがS3になります
    * もともとデータが(ローカルに)存在していた場合は，設定が上書きされて見えなくなっています
    * 上述のconfig.phpの設定を消すと，元に戻すことができます
    * <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309617/68a36278-4d1f-2652-d3e9-0e339ebf3e54.jpeg" width=50%>
* S3のバケットには，```urn:oid:数字```のようなファイル名で，データが格納されます
    * <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309617/7a4a5644-2595-336f-f036-2817d16a980c.jpeg" width=50%>

# 参考

* [Configuring Object Storage as Primary Storage](https://docs.nextcloud.com/server/16/admin_manual/configuration_files/primary_storage.html)
* [Qiita nextcloudによるプライベートオンラインストレージの構築](https://qiita.com/h_amakasu/items/9947d81bc0d3bc18f06d)