【Obsidian】画像ファイルをS3へアップロードする

本記事は 夏休みクラウド自由研究2026 8/6付の記事です

S3SCSK永見です。

Obsidian、使ってますか?AIとの連携もしかりですが、Markdownエディタとしてもすごく重宝するソフトウェアです。

ただ、画像の扱いに悩んでいました。格納庫のフォルダに溜まっていくのがどうにも性に合わず、ローカル以外にアップロードできないかなと色々調べていました。

そんなとき、画像をS3にアップロードできるプラグイン「s3-image-uploader」を発見しました。公式ガイドよりも少しセキュアな方法設定したのでご紹介します。

s3-image-uploaderとは?

s3-image-uploaderとは、Obsidianに画像を貼り付けた際、ローカルではなくS3にファイルアップロードし、そのリンクを貼り付けてくれるプラグインです。

GitHub - jvsteiner/s3-image-uploader: This project implements an image uploader, similar to others offered by the community, with one important difference: you can provide your own s3 based storage, instead of relying on a third party service, such as imgur.
This project implements an image uploader, similar to others offered by the community, with one important difference: yo...

高可用性なS3をストレージとして活用でき、設定を独自にカスタマイズできるのが素敵ポイントです。

少しセキュアにできる要素

公式のガイドでも、設定するだけであれば充分です。

GitHub - jvsteiner/s3-image-uploader: This project implements an image uploader, similar to others offered by the community, with one important difference: you can provide your own s3 based storage, instead of relying on a third party service, such as imgur.
This project implements an image uploader, similar to others offered by the community, with one important difference: yo...

ただ、もう少しセキュアにできる点が2点あります。

1つ目がS3のバケットポリシーです。公式のREADMEではPrincipalを*で設定、つまりあらゆるアクセス元から、無条件にGetObjectアクションを許可している状態です。

{
	"Version": "2008-10-17",
	"Statement": [
		{
			"Sid": "PublicReadGetObject",
			"Effect": "Allow",
			"Principal": "*",
			"Action": "s3:GetObject",
			"Resource": "arn:aws:s3:::<your-bucket>/*"
		}
	]
}

また、作成するIAMユーザにAmazonS3FullAccessをアタッチするよう書かれています。

You can do this by creating a new user in the IAM console, and attaching the AmazonS3FullAccess policy to it. More granular access control policies are possible, but this is the simplest way to get started.

AWS のセキュリティベストプラクティスである「最小権限の原則」に従うためには一工夫必要です。

※より詳細なアクセス制御ポリシーができる とも書いています。プラグインの作者も、最小権限の原則を分かったうえで、設定の簡易さを優先しているようですね。

設定手順

前提事項

以下が完了している前提で設定手順を記載します。

  • AWSアカウントを持っており、IAMユーザ、S3バケット、Cloudfrontなどの作成権限があること。
  • Obsidianをインストール済であること。

S3バケットの作成

まずは画像をアップロードするためのS3を作成します。

一般的な設定 はお好みで。作成したリージョンとバケット名は控えておきましょう。

今回はリージョン:ap-northeast-1、バケット名がobsidian-111122223333-ap-northeast-1-an とします。

ACLは無効、ブロックパブリックアクセス (バケット設定)はパブリックアクセスをすべてブロックにします。バケットのバージョニングは無効でよいでしょう。

タグもお好みで。暗号化はお手軽なS3マネージドキーを使います。

いったんS3の操作はこれで完了です。

IAMポリシー・IAMユーザの作成

次に、Obsidianに登録するIAMユーザと、アタッチするIAMポリシーを作成します。

IAMポリシーはputだけでOKです。画像を閲覧するときはこのIAMユーザ使うわけではないため、アップロードする権限だけあればよいです。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::obsidian-111122223333-ap-northeast-1-an/*"
            ]
        }
    ]
}

ポリシー名はAllowS3AccessForObsidianとします。

IAMユーザを作成し、先ほど作ったIAMポリシーをアタッチしましょう。

IAMユーザのアクセスキーを作成します。

アクセスキー、シークレットアクセスキーが記載されたcsvファイルをダウンロードしてください。プラグインの設定時に使います。

これでIAMリソースの作成は完了です。

cloudfrontの作成

ディストリビューションの作成

まずはCloudFrontのコンソールからディストリビューションを作成します。

無料枠で充分でしょう。

ドメインはお持ちのドメインがあれば割り当ててもOKです。なくてもOKです。

Origin TypeはS3を選択し、Browse S3から先ほど作成したS3バケットを選択します。他はこだわりがなければデフォルトのままでOKです。

WAFのモニタリングモードもお好みで。

内容確認し、Create distributionします。

無事作成ができました。ディストリビューションドメイン名を控えておきましょう。今回はディストリビューションドメイン名:abcdefghijk.cloudfront.net とします。

関数の作成

次に関数を作ります。

作成ができると、以下のような画面に遷移します。

関数コードの箇所に以下コードを貼り付けます。

SECRET_KEY、SECRET_VALUEの値はなんでもOKです。できるだけ複雑でランダムな文字列がよいでしょう。プラグインの設定時に使いますので控えておいてください。

今回はSECRET_KEY:scskcloudservice、SECRET_VALUE:perfectservice とします。

function handler(event) {
    var request = event.request;
    var querystring = request.querystring;

    var SECRET_KEY = 'scskcloudservice';
    var SECRET_VALUE = 'perfectservice';

    if (querystring && querystring[SECRET_KEY] && querystring[SECRET_KEY].value === SECRET_VALUE) {
        return request;
    }

    return {
        statusCode: 403,
        statusDescription: 'Forbidden'
    };
}

変更を保存し、発行します。更新をした場合、保存してから発行をすることで変更内容が反映されるので、発行を忘れないようにしてください。

発行すると一番下からディストリビューションを関連付けられるようになります。関連付けを追加しましょう。

ディストリビューションは先ほど作成したディストリビューションのID、EventタイプはViewer Request、キャッシュビヘイビアはDefault (*)を選択し、関連付けを追加します。

一番下の 関連付けられているディストリビューション に一行追加されていれば成功です。

これでAWS上でのリソースはすべて作成完了です。

Obsidianのプラグイン設定

Obsidianのプラグインを設定します。Obsidianを開き、設定→コミュニティプラグイン→閲覧 からコミュニティプラグインの検索画面へ遷移します。

検索ボックスに「s3 image uploader」と入力し、赤枠のプラグインを選択します。

インストール します。

プラグインタイトルの横に「インストール済み」と出力されたことを確認し、有効化します。

オプション を選択します。

控えて置いた設定値を入力します。

  • AWS Access Key ID にはcsvファイルのAccess key IDの値
  • AWS Secret Key にはcsvファイルのSecret access keyの値
  • RegionはS3バケットを作成したリージョン(今回の例ではap-northeast-1)
  • S3 BucketにはS3バケット名(obsidian-111122223333-ap-northeast-1-an)

少し下にスクロールし、Use custom image URLトグルをオンにし、Custom S3 Endpointにhttps:// に続けて、控えておいたディストリビューションドメイン名を入力します。今回は https://abcdefghijk.cloudfront.net という値が入ります。

さらに少し下にスクロールし、Query String KeyとQueryStringValueに控えて置いた設定値を入力します。

  • Query String KeyにはFunctionで設定したSECRET_KEYの値(scskcloudservice)
  • QueryStringValueにはFuncitonで設定したSECRET_VALUEの値(perfectservice)

これですべての設定が完了です!

試してみる

弊社サービス「SCSKクラウドサービス(AWS)」のホームページをスクショし、張り付けてみます。

SCSKクラウドサービス(AWS)│SCSK株式会社|サービス|企業のDX戦略を加速するハイブリッドクラウドソリューション
アマゾン ウェブ サービス(AWS)の最上位パートナーであり、多種多様な業界のシステム構築実績を持つSCSKが、最適なAWS導入をサポート。AWS活用によるお客様のITガバナンス強化とDX推進を強力に支援します。

貼り付けをすると、ノートに画像へのリンクが挿入されました。リンクの末尾にはSECRET_KEYとSECRET_VALUEの値が入っていることがわかります。

S3バケットを見てみると、画像がアップロードされていることがわかります。

ほんとにセキュア か?

本当にセキュアになったのでしょうか。まずはオブジェクトURLへのアクセスを試してみましょう。アップロードしたオブジェクトの「オブジェクトの概要」からオブジェクトURLにアクセスしてみましょう。

AccessDeniedが返ってきました。S3バケット名とファイル名がばれてもアクセスはできなさそうです。

では、https://abcdefghijk.cloudfront.net/画像名.png へアクセスしてみましょう。

関数コードで設定した通り、SECRET_KEY、SECRET_VALUEの値が一致していないと403を返すようになっていますね。

まとめ

Obsidianの画像をS3へアップロードできるプラグインを、公式ガイドより少しセキュアな設定方法含めてご紹介しました。

今後の課題としては、CloudFormation等を用いた、より簡単な設定方法も紹介できればと思っています。みなさまもよいObsidianライフを!

×
タイトルとURLをコピーしました