naoketa.net

ObsidianをRemotelySaveとS3で同期する

October 29, 2023

はじめに

ノートアプリのObsidianをRemotely SaveというCommunity PluginとS3を使って、AndroidやmacOS上の複数環境で同期を取る設定を行った。

これまでノートアプリとしてObsidianを利用してきて、Markdownの書きやすさや手軽さなど気に入っている。ただ複数環境での同期には色々と苦労が多く、これまでGoogle Drive上にVaultを作りMacアプリからは直接参照、AndroidアプリからはFolderSyncというアプリを使って同期を行っていたが何かと不都合が多かった。今回はRemotely SaveというCommunity Pluginを使って同期をとる方法を試したので今後の備忘のため、作業のメモを残しておく。

RemotelySaveについて

Remotely Saveは複数環境上のVaultをAWS S3やDropboxなどを介して両方向の同期が可能なObsidianのCommunity Pluginのようである。

README.mdにも書かれているが、Obsidian非公式のプラグインであり利用前にバックアップ推奨とのこと。

Remotely Saveで同期に利用できるサービスの一覧は以下に記載がある。

https://github.com/remotely-save/remotely-save/blob/master/docs/services_connectable_or_not.md

ちなみにS3互換なサービスであれば利用できるようで、上記の一覧に記載がなかったがCloudflareのR2で試したところMac/Androidでの同期など一通りの操作が利用できた。 AWSのS3と比べて書き込み・読み込みの無料枠が大きく、また個人的にはCloudflare Developer Platformを使い始めて好感を持っていたのでR2を利用することも考えたが、後述のパーミッション周りが今回のユースケースには微妙だったので最終的にはAWS S3を使うことにした。

Remotely Saveで必要なパーミッション

Remotely SaveでS3互換サービスを利用する場合、各種S3操作が行えるIAMユーザーのアクセスキーIDとシークレットアクセスキーを設定することで利用できるようになる。Remotely SaveでS3操作を行なっている箇所をざっと確認したところ、対象バケットで以下のActionに絞って許可できていれば良さそうである。以下、適当にTerraformでS3やIAMユーザーを作った時のIAMポリシー例(aws_s3_bucket.obsidianが今回利用するS3バケット)。今の所、以下のパーミッションのみで問題なく動いている。

data "aws_iam_policy_document" "allow_obsidian_s3" {
	statement {
		actions = [
			"s3:GetObject",
			"s3:PutObject",
			"s3:DeleteObject",
		]
		resources = [
			"${aws_s3_bucket.obsidian.arn}/*",
		]
		effect = "Allow"
	}
	
	statement {
		actions = [
			"s3:ListBucket",
		]
		resources = [
			"${aws_s3_bucket.obsidian.arn}",
		]
		effect = "Allow"
	}
}

RemotelySaveの中身を見てみるとHeadBucketCommandの実行があり、s3:ListBucket相当の権限が必要なようである。執筆時点のR2の場合はListBucket相当の操作にはObject Read & Writeのパーミッションでは不足するため、Admin Read and Writeが必要となる。こちらのパーミッションを付与してしまうと他バケットに対する操作やバケットの公開など何でもできてしまうので、今回R2を使うのは諦めてS3を利用した。

R2のパーミッションは以下参照。 - https://developers.cloudflare.com/r2/api/s3/tokens/#permissions

Remotely Saveの設定

今回はMacとAndroid上のObsidianアプリ間で同期を取りたかったため、それぞれのアプリ上でRemotely SaveのPluginインストールと設定を行った。 設定の詳細は公式ドキュメントを参照。S3を使う場合の最低限必要な設定は以下になる。S3互換の他サービスの場合は適宜読み替えること。

  • Endpoint
    • s3.{対象リージョン}.amazonaws.com
      • 例: s3.ap-northeast-1.amazonaws.com
  • Region
    • 対象リージョン
      • 例: ap-northeast-1
  • Access Key ID / Secret Access Key
    • IAMユーザーのアクセスキー ID とシークレットアクセスキー
  • S3 URL Style
    • Path-Styleを選択

上記設定後に、Connectivity Checkを実行してGreat! The bucket can be accessed.の表示が出れば疎通確認OK。

その他 Schedule For Auto Runの設定により、毎分同期実行など定期的な自動同期も可能だが、私の使い方では不要であり同期の事故を引き起こしそうなので無効のままにしておいた。

また同期の事故対策のためS3についてはバージョニング有効化しておいた。

必要なAWSリソース一式のTerraformコード

RemotelySaveのS3同期に必要なS3やIAMポリシー、IAMユーザーなどの一式のコードをこのリポジトリに置いた。

さいごに

事故に気をつけて良きObsidianライフを。


© 2024, Built with Gatsby by Naoki Tazawa