さいきょうのクラウドストレージを Amazon FSx for NetApp ONTAP + Nextcloud で作る！（その1）

# はじめに
この記事は、NetApp のストレージ OS である ONTAP の機能を活用して、自前のクラウドストレージを構築する為のアイディアの紹介と構築メモです。

クラウドストレージというと、ブラウザやモバイル端末からもアクセス出来るインターネット経由で使えるファイル共有サービスというイメージがありませんか？
例えば Box や OneDrive が有名ですね。

簡単手軽につかえて便利なサービスである一方で、IT管理者としてはこんな課題もあるそうです。

* データが国外に保存されるので、コンプライアンス的に問題
* 動画や画像の大量保存には不向き（容量や保存できるファイルサイズが限られている）
* 移行が大変
* 使い勝手の大幅な変化（Excelで作った共有ツール等が動かない）
* ランサムウェア・ウィルス対策が難しい

クラウド移行はしたいけど、このような課題の為に断念したり、一部は移行してもオンプレも残すといった選択をする方もいるかもしれません。

そんな課題を解決できる（かもしれない）クラウドストレージを自前で構築しよう

というテーマで数回に分けて投稿をします。

## Amazon FSx for NetApp ONTAP
Amazon FSx for NetApp ONTAP（以下 FSxN） は、NetApp社がオンプレで30年培ったストレージ専用OS「ONTAP」をクラウド環境に移植したものです。
ONTAP は非常に高機能かつ高速なストレージサービスを提供します。

FSxNをストレージとして使うことで、次のような効果が期待できます。
* [便利] Windows クライアントからは、従来型のファイルサーバーとしてアクセス可能
* [安全] オプションのランサムウェア対策サービスと連携し、ユーザー単位での検知やレポーティング
* [高速] オンプレや別サイトにキャッシュして、アクセスを高速化
* [コストダウン] 効率化機能による格納容量の削減、非アクティブなデータの自動階層化、キャッシュによる帯域削減

単体では、ブラウザやモバイル端末向けアプリからアクセスする機能はありません。
それを補う為に、フロントエンドのサーバーとしてNextcloudを構築していきます。

## Nextcloud
Nextcloudは、オンラインストレージを構築するオープンソースのソフトウェアです。
オンプレミス環境に置いて企業のストレージをオンライン化する事も可能です。
様々なデータソースにも対応していますが、この記事では AWS 上の FSxN をストレージとして利用するので、Nextcloud のサーバーも AWS の EC2 で構築します。


# 構成イメージ
とりあえず動かしてみる、という最小の目的ではこんなイメージになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2815139/637ca35a-5649-bd78-cb61-542153d70a6d.png)

ユーザーデータ用のストレージとしてFSxNを用意します。

FSxNにはストレージ仮想マシンという考え方があり、ファイルシステムをいわばコンテナ化して、用途に応じて独立したストレージを提供できます。
データを置くボリュームは、ストレージ仮想マシンの中に作成されます。

例えるならば、
ファイルシステム＝食卓
ストレージ仮想マシン＝お盆
ボリューム＝お椀
という感じでしょうか。

今回はストレージ仮想マシンを1台作成し、Nextcloudのユーザーデータ置き場のリポジトリとしてNFS経由で使います。

Nextcloudはインターネット経由で http/https で接続する想定ですので Public subnet にサーバを立てて global ip address を振ります。
自分は慣れと好みの都合で、Ubuntu 22.04 で作ってみました。
Webサーバーも好みですが、Apache2 を使用しました。
DBとしてMySQL/MariaDB等も必要になりますので、これも同居させました。


# 手順
## FSxN の構築
FSx コンソールから FSx for NetApp ONTAP を選択し、ファイルシステムを作成します。
試してみる程度ならクイック作成で問題ありません。
クイック作成にすると、ストレージ仮想マシンとボリュームもこのタイミングでデフォルト値で作成されます。

各設定項目を入れて30分ほど焼成を待つと出来上がります。

## Nextcloud サーバの構築

### EC2 インスタンスの作成
Nextcloud のサーバーを EC2 で構築します。
こちらは public subnet に配置して、グローバル IP を割り当てます。

この記事では、以下の構成で作っています。
* インスタンス : t3.micro (必要最低限)
* OS : Ubuntu 22.04 LTS

### Linux の構成
apt コマンドで最新パッケージにアップデートをしておきます。
アップデート後にリブートもしておきます。
```bash
$ sudo apt update
$ sudo apt upgrade -y
$ sudo reboot
```

後々必要になるパッケージを追加します。
```bash
$ sudo apt install build-essential pkg-config tcl -y
$ sudo apt install nfs-client -y
```

MariaDB が libssl の特定バージョンを必要としますので、インストールします。
```bashwget http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.0g-2ubuntu4_amd64.deb
sudo dpkg -i libssl1.1_1.1.0g-2ubuntu4_amd64.deb
```

FSxN のボリュームを NFS マウントします。
```bash
$ sudo mkdir /mnt/nextcloud_data
$ sudo mount -t nfs -o vers=v3 [NFS_IP]:/vol1 /mnt/nextcloud_data
```
[NFS_IP] は、AWSコンソールから
FSx > ストレージ仮想マシン の「SVM 名」を選択すると確認できる「NFS IP アドレス」です。


EC2再起動時に自動マウントできるように、fstabに以下内容を追記しておきます。

【/etc/fstab 内容】
```/etc/fstab
[NFS_IP]:/vol1  /mnt/nextcloud_data  nfs  vers=3  0  0
```

Apache のインストールと設定をします
```bash
$ sudo apt install apache2 -y
$ cd /etc/apache2/mods-available
$ sudo a2enmod rewrite
$ sudo a2enmod ssl
$ sudo a2ensite default-ssl
```

Nextcloud サイトの設定ファイルを編集します。
```bash
$ sudo vi /etc/apache2/sites-available/nextcloud.conf
```

【nextcloud.conf 設定内容】
```/etc/apache2/sites-available/nextcloud.conf
<VirtualHost *:80>
  DocumentRoot /var/www/html/nextcloud/
  ServerName 【サーバーのIPアドレス】

  <Directory "/var/www/html/nextcloud/">
    Require all granted
    AllowOverride All
    Options FollowSymLinks MultiViews
  </Directory>
</VirtualHost>
```

Apache 設定の残りと起動
```bash
$ cd /etc/apache2/sites-available/
$ sudo a2ensite nextcloud
$ sudo a2dissite 000-default

$ sudo systemctl enable apache2.service
$ sudo systemctl start apache2.service
```

PHP のインストール
```bash
$ sudo add-apt-repository ppa:ondrej/php -y
$ sudo add-apt-repository ppa:ondrej/apache2 -y
$ sudo apt install php7.4 php7.4-curl php7.4-dom php7.4-gd php7.4-mbstring php7.4-zip php7.4-mysql php7.4-bz2 php7.4-intl php7.4-apcu php7.4-redis php7.4-imagick php7.4-bcmath php7.4-gmp php7.4-ldap php7.4-smbclient -y
```

PHP パラメータの変更
```
$ sudo sed -i "s/^max_execution_time = 30/max_execution_time = 60/" /etc/php/7.4/apache2/php.ini
$ sudo sed -i "s/^memory_limit = 128M/memory_limit = 512M/" /etc/php/7.4/apache2/php.ini
```

MariaDBのインストール
```bash
$ sudo apt-key adv --fetch-keys 'https://mariadb.org/mariadb_release_signing_key.asc'
$ sudo add-apt-repository 'deb [arch=amd64] http://mariadb.mirror.glo
bo.tech/repo/10.5/ubuntu' focal main -y

$ sudo apt install mariadb-server mariadb-client -y

$ sudo systemctl enable mariadb.service
$ sudo systemctl start mariadb.service
```

DBの作成
```
$ sudo mysql_secure_installation
```
Wizard形式でいくつか質問に答えます。
質問の
2番目の「Switch to unix_socket authentication」
3番目の「Change the root password?」 
に関する質問だけは「n」を選択します。
他は enter で進めます。

``` mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
haven't set the root password yet, you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password or using the unix_socket ensures that nobody
can log into the MariaDB root user without the proper authorisation.

You already have your root account protected, so you can safely answer 'n'.

Switch to unix_socket authentication [Y/n]
 ... skipping.


You already have your root account protected, so you can safely answer 'n'.

Change the root password? [Y/n] n
 ... skipping.

By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n]
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n]
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n]
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n]
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!
```

Nextcloud 用のデータベースの作成します。
```bash
$ sudo mysql -uroot

CREATE DATABASE nextcloud DEFAULT CHARACTER SET utf8mb4;
CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY 'p@ssw0rd';
GRANT ALL ON nextcloud.* TO "nextcloud"@"localhost";
SHOW GRANTS FOR 'nextcloud'@'localhost';
quit;
```

Nextcloud のインストールをします。
```bash
$ cd /tmp

$ wget https://download.nextcloud.com/server/releases/nextcloud-24.0.5.tar.bz2
$ wget https://download.nextcloud.com/server/releases/nextcloud-24.0.5.tar.bz2.md5
$ md5sum -c nextcloud-24.0.5.tar.bz2.md5 < nextcloud-24.0.5.tar.bz2

$ cd /var/www/html
$ sudo tar -xvf /tmp/nextcloud-24.0.5.tar.bz2

$ sudo chown -R www-data:www-data /var/www/html/nextcloud
$ sudo chown www-data:www-data /mnt/nextcloud_data

$ sudo systemctl restart apache2.service
```

### Nextcloud の設定
ブラウザ経由で Nextcloud のサーバに接続します。
初回接続時は初期設定画面になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2815139/14e4cda1-a6a2-e204-abfa-7ee16ff2092c.png)

必要パラメータは以下です。
| 設定項目 | 設定例 |
|:-:|:-:|
| ユーザー名  | cloudadmin  |
| パスワード  | p@ssw0rd  |
| データフォルダー  | /mnt/nextcloud_data  |
| データベースのユーザー名  | nextcloud  |
| データベースのパスワード  | p@ssw0rd  |
| データベース名  | nextcloud  |
| ホスト名  | localhost:3306 |

入力後、「インストール」をクリックします。
これで設定は完了です。

管理画面でユーザーを作ると、FSxN にある「nextcloud_data」というボリュームの配下にユーザー用のフォルダが生成されます。
そのユーザーのデータ保存用として利用できるようになります。

FSxN はデフォルトのままでも自動でボリュームの Snapshot バックアップを作ってくれますので、万が一データを誤って消したりしてしまっても、即座に戻す事が出来るので安心です。
このあたりの使い方は、検索すればすぐに発見できると思うので探してみて下さい。

# おわりに
次回の記事では、FSxNおよびNextcloudをAD連携させ、PCクライアントからもアクセスできるファイルサーバーとしても使えるような設定をしていきます。


# 参考リンク
FSxN
https://aws.amazon.com/jp/fsx/netapp-ontap/

Nextcloud
https://nextcloud.com/