0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS S3: プリサインドURL(Pre-Signed URL)とは何か

0
Posted at

📝 概要(Summary)

プリサインド URL(Pre-Signed URL)は、S3 の私有(private)オブジェクトに対して、一時的にアクセス権を付与するための特別な URL です。通常、private の S3 オブジェクトは外部から直接アクセスできませんが、Pre-Signed URL を使うことで 署名付きの一時的な「公開 URL」 を発行でき、特定のユーザーが期間限定でオブジェクトを取得・アップロードできます。

💡 なぜプリサインドURLが必要なのか?

✔ セキュリティと利便性の両立

  • S3 バケットやオブジェクトを public にすると誰でもアクセス可能 になるため、セキュリティ上のリスクがあります。
  • しかし、Webアプリや管理画面では 画像・資料など S3 のファイルを表示したい というケースが多い。
  • このギャップを埋めるのが「プリサインドURL」。

プリサインド URL を使用すると:

  • S3 バケットは 完全 private のまま 保つことができる
  • 必要なユーザーだけに 一時的アクセス権 を配布できる
  • URL は期限が切れると無効になる

つまり、安全にファイルを公開したい内部システムに最適 です。


🔒 プリサインドURLのポイント

🎯 1. 有効期限がある

例:5分、10分、1時間など。 有効期限が切れると、URL を持っていてもアクセス不可。

🎯 2. バケットやオブジェクトは private のまま

バケットの設定(Block Public Access)は ON のままでよい。 アクセス制御を破らず、AWS のベストプラクティスに完全準拠。

🎯 3. サーバー側で生成する

原則としてプリサインドURLは バックエンドで生成して、フロントに返す。 セキュリティ的に AccessKey をフロントに渡さないため。

🎯 4. GET と PUT が作れる

  • GET:ファイルをダウンロード/表示するための URL
  • PUT:フロントから直接 S3 にアップロードできる URL

🧩 プリサインドURLの典型的なユースケース

🖼 1. 管理画面に画像を表示したい(あなたのケース)

private なまま画像を <img src="..."> で表示したい

→ GET のプリサインドURLを生成して返せばOK。

📄 2. ダウンロードリンクを安全に提供したい

ユーザーへの資料、請求書など。

📤 3. フロントから S3 に直接アップロードしたい

サーバーを経由しない高速アップロードが可能。


🔧 プリサインドURLを生成する流れ(SDK v2)

① サーバー側で presigner を作成

S3Presigner presigner = S3Presigner.builder()
        .region(Region.of(region))
        .credentialsProvider(StaticCredentialsProvider.create(
                AwsBasicCredentials.create(accessKey, secretKey)
        ))
        .build();

② GET 用のプリサインドURL生成

GetObjectRequest getObjectRequest = GetObjectRequest.builder()
        .bucket(bucketName)
        .key(path)
        .build();

GetObjectPresignRequest presignRequest = GetObjectPresignRequest.builder()
        .signatureDuration(Duration.ofMinutes(10))
        .getObjectRequest(getObjectRequest)
        .build();

PresignedGetObjectRequest presigned = presigner.presignGetObject(presignRequest);

String url = presigned.url().toString();

③ これを API のレスポンスとしてフロントへ返す

{
  "url": "https://s3.ap-northeast-1.amazonaws.com/..."
}

🎨 フロント側(React / Vue / 静的ページ等)

<img src="{プリサインドURL}" />

特別な認証は不要。期限内であれば表示できる。 期限切れなら 403 Forbidden になるため安全。


🔐 プリサインドURLのセキュリティ性

✔ URL を知っていても期限が切れれば無効

✔ 署名付きのため改ざん不可能

✔ バケットは完全 private のまま

✔ AWS が推奨する方式

⚠ 注意点

  • URL をコピーした人は期限内ならアクセスできる(内部用途なら問題なし)
  • 極端に長い有効期限の設定は避ける(一般的には 5分〜60分)

🔥 なぜあなたのケースにはプリサインドURLが最適か?

あなたの用途:

  • 内部管理システム
  • ユーザーがブラウザで画像を見たい(<img> で表示)
  • でも S3 を public にしたくない
  • そして 将来 private モード(Scheme B)に切り替える可能性がある

→ 結論:プリサインドURLは将来的な拡張性、安全性、現場運用の柔軟性すべてに適合。

✨ メリットまとめ

項目 プリサインドURL 公開バケット(Policy)
セキュリティ ⭐ 最高 ❌ 低い(全公開)
将来の切替容易さ ⭐ 一瞬で PRIVATE に戻せる ❌ 歴史ファイルがすべて public
AWS推奨 ⭐ Yes ❌ No
管理負担 低 中

🎯 まとめ(結論)

プリサインドURLは、S3のファイルを安全に一時的に公開しつつ、将来の構成変更にも柔軟に対応できる最良の選択肢。

  • バケットは private のまま
  • フロントは URL を貼るだけで画像を表示可能
  • 期限切れで自然に無効化
  • Public Access や ACL の煩雑な管理も不要
  • 特に「内部用途」「非公開システム」「将来の拡張性を重視」する場合に最適

おまけ:

📤 ファイルのアップロード(PUT)用プリサインドURLとは?

📝 アップロード版プリサインドURLの概要

プリサインドURLには GET(ダウンロード/閲覧) と PUT(アップロード) の2種類があります。 そのうち PUT プリサインドURL は、フロントエンドなどのクライアントが サーバーを経由せずに S3 に直接ファイルをアップロードできる仕組み です。

サーバー側はアクセスキーを保持し、アップロード権限を持つ「署名付きURL」だけをクライアントに渡します。 これにより安全なアップロードフローが実現できます。


🔧 PUT プリサインドURLの生成方法(SDK v2)

① Presigner の生成

S3Presigner presigner = S3Presigner.builder()
        .region(Region.of(region))
        .credentialsProvider(StaticCredentialsProvider.create(
                AwsBasicCredentials.create(accessKey, secretKey)
        ))
        .build();

② PutObjectRequest を作る

PutObjectRequest objectRequest = PutObjectRequest.builder()
        .bucket(bucketName)
        .key(path)
        .contentType("image/jpeg") // 任意
        .build();

③ PUT 用プリサインドURLを生成

PutObjectPresignRequest presignRequest = PutObjectPresignRequest.builder()
        .signatureDuration(Duration.ofMinutes(10))
        .putObjectRequest(objectRequest)
        .build();

PresignedPutObjectRequest presigned = presigner.presignPutObject(presignRequest);

String uploadUrl = presigned.url().toString();

サーバーはこの uploadUrl をクライアントへ返します。


🎨 フロント側(JavaScript)でアップロード

プリサインドURLを受け取ったフロントは以下のようにアップロードできます:

await fetch(uploadUrl, {
  method: "PUT",
  headers: {
    "Content-Type": file.type
  },
  body: file
});

✔ 特徴

  • 認証不要で S3 に直接アップロード
  • サーバー帯域を消費しない(大幅な高速化)
  • URL が漏れても有効期限が切れれば無効

🔐 PUT プリサインドURLのセキュリティ特性

✔ バケットは private のまま

✔ URLに署名があり、操作は PUT に限定される

✔ 有効期限があるため安全

✔ 誰がアップロードしたかトラッキングも可能(key にユーザーIDを付与など)

⚠ 注意点

  • PUT プリサインドURLは アップロード専用 であり、閲覧(GET)はできません
  • フロントで Content-Type を正しく指定する必要があります

🧩 PUT プリサインドURLが活躍する場面

  • 大容量ファイルのアップロード(動画・画像)
  • サーバー帯域を節約したい場合
  • マイクロサービス構成でファイルアップロードを共通化したい場合
  • ブラウザから直接 S3 アップロードを許可したい場合

🚀 GET と PUT のプリサインドURLの違いまとめ

種類 目的 操作
GET ファイルを表示・ダウンロード 読み取り
PUT ファイルをアップロード 書き込み
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?