【Joplin+S3】閉塞環境の複数サーバで同期可能なメモアプリを導入

## 背景
某案件の某クライアント (データ分析チーム) がOneNoteを利用していました。しかし、新たに構築している分析環境 (AWS上のWindows) で Microsoft Office のライセンスを利用できず、代わりとなるメモアプリが必要となりました。
メモアプリに求められる条件は以下の通り。
 
 - フォルダを切って階層構造を作れること
 - スクショを簡単にぺたぺた貼れること
 - 複数の環境 (今回は EC2 上の Windows Server) で同期できること
     - ただしセキュリティ上、オープンな環境にデータを出してはならない
 - できれば無料

うーん、閉塞環境で同期するのがネックになりそうですかねえ (そもそもOneNoteでも無理じゃない？？)。

## アプリ選定
いわゆるクラウドアプリである Notion や Evernote なんかはインターネット上に出てしまうので使えません。
そもそもインターネット経由せずに同期させようと思うと、S3にファイルを置いてエンドポイント経由で連携するのが妥当と思われます。
色々調べた結果候補に残ったのが、以下の2つでした。

 - Joplin
 - Obsidian

(どっちも聞いたことなかった)

ざっくりと機能的な比較をすると...
|| Joplin | Obsidian |
|----|----|----|
|記法| Markdown | Markdown |
|階層構造| ○ | ○ |
|スクショぺたぺた| ○ | ○ |
|S3利用した同期| ○ | ○ |
|日本語対応| x | ○ |
|タグ管理| ○ | x |
|キャンバス| x | ○ |

最初はまあまあいい勝負かなと思っていたのですが、途中である事実に気が付きました。

https://obsidian.md/pricing

なんと Obsidian の商用利用は毎年1人につき 50 USD かかるとのこと。
金額自体はそこまで大きくないですが、結局こういうのって手続きが面倒なので、無料か1円以上かみたいなところありますよね。

https://joplinapp.org/help/

JoplinはOSSで無料です。じゃあ、Joplinにしましょう！

## 構成図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777293/5a039933-7c4a-3683-edf4-1737057612aa.png)

プライベートサブネット上のインスタンス2台にJoplinをインストールし、同期できるか検証します。
実際の案件は専用線で接続しますが、今回はあくまでJoplinの導入が目的なのでそこはスルーします。

## 環境
 - Amazon EC2 (Windows Server 2022 Datacenter)
 - Joplin 2.13.15

## 導入手順
### VPC、EC2インスタンス、S3バケット、エンドポイントの作成

この辺りは情報がたくさんあると思いますので割愛します。
インスタンスは無料利用枠のもので十分です。
セキュリティグループ設定で、各インスタンスがRDP接続できることをご確認ください。
バケットはSSE-S3で暗号化され、パブリックアクセスを全てブロックしています。
エンドポイントはGateway型のS3用を作成し、プライベートサブネット用のルートテーブルに紐づけます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777293/566d5643-c518-ae53-d6bd-5d102ac4fd42.png)

### IAMユーザ・ロールの作成
Joplinの同期の際にアクセスキー、シークレットキーが必要となるので、なければIAMユーザを作成します。
アクセスキー、シークレットキーをダウンロードしておきましょう。
S3に書き込むのでロールには AmazonS3FullAccess があれば安心です。


### Joplin インストール
#### インストーラのダウンロード・配置
こちらから実行ファイルをダウンロードします (300MBくらい)。

https://joplinapp.org/

各Private Instanceにダウンロードしたファイルを配置します。

#### インストール
踏み台サーバ経由でどちらかの Private instance にRDP接続し、インストーラを起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777293/1a6b0b8f-70c7-376e-1728-eb110405a7cb.png)

複数ユーザで使うので、全員分入れましょうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777293/3bd14926-36bc-c6db-4459-1d8c7da76978.png)

終わり！楽勝だね！
同じことをもう一つの Private instance でも行います。

### 同期設定

どちらかのPrivate InstanceでJoplinを起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777293/f851ff52-c31d-0ec3-8dee-a5459336e749.png)

左下の Synchronise をクリックすると3つの選択肢が出現しますが、今回はS3を利用するので下部の「Click here to select one」を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777293/c1bc8053-04fb-36a6-0b7e-8e4215517888.png)

Synchronisation targetで「S3 (beta)」を選択します (ベータ版なのね)。
バケット名 (ARNではなく名前の部分のみ)、Region、アクセスキー、シークレットキーを入力し、「Check synchronisation configuration」を選択。
「Success!」と表示されれば一安心。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777293/f3fa69e6-1dd3-f719-9d48-696f6208f902.png)

※試しにエンドポイントを除外して接続を試みると繋がらないので、ちゃんとエンドポイント経由してくれていそうです。

一度、同期に利用したバケットの中を見ると、
 - .resource
 - .sync
 - *****.md


といったフォルダ、ファイルが作成されています。
無事アップロードはできているようですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777293/8f21eada-32b4-8b37-a1f5-0791a5d77b62.png)

### 同期確認

先ほど設定したインスタンスで、試しに適当なファイルを作って、「Synchronise」します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777293/da8c269d-1df2-bd94-6dcd-1d6ebfa2d977.png)

続いて、もう1台のPrivate Instanceから先ほど作ったメモを取得できるか確認します。
開いた段階では、初期のままです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777293/f851ff52-c31d-0ec3-8dee-a5459336e749.png)

上記「同期設定」をこちらでも実施し、左下の「Synchronise」を押すと、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777293/c058522a-54fc-8e45-4542-e1492d23f8ed.png)

先ほど作成したメモが取得できました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777293/edd1f146-fe42-8acf-eaea-f5c5b53c3cca.png)

(ちゃんと別のインスタンスであることを主張するスクショ)

もちろん一方で削除すれば、もう一方からも消えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777293/fa5bd1d2-c8ff-2704-53e5-f8ae64931e45.png)


## まとめ
セキュリティ要件が厳しいときにしかこのようなメモアプリが必要となることはないと思いますが、またいつか来るその日のために記録を残してみました。

ちょっと微妙だなと思っているのは、同期用のS3バケットを指定できますが、フォルダ単位での指定はできないので、バケット直下にmdファイルがぽんぽこ量産される点です。
そのためJoplin専用バケットを作成するのが得策かと思います。そのうちバージョンアップで改善されるかもしれませんね。