@@ -1199,11 +1199,11 @@ sequenceDiagram
11991199
12001200業務システムにおいても点検結果の写真や動画、WordやPDFなど非構造データをアップロードすることがしばしば求められる。クラウド環境ではアップロードされたコンテンツは、最終的に通常オブジェクトストレージに格納することとするが、手法については以下のようにいくつかパターンがある。
12011201
1202- | 手法 | 説明 | Poc/Cons |
1203- | :-------------------- | :----------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------- |
1204- | 1.multipart/form-data | RFC 2388でも定義された、古くから利用される方式 | ✅️枯れている ⚠️ブラウザ以外のクライアントからは扱いにくい |
1205- | 2.Base64 | ファイルをBase64形式にエンコードして、通常のフォームデータとして送信する方法 | ✅️通常のリクエストボディでJSON要素の値として設定できるので楽 ⚠️ファイルサイズが大きくなるため、ファイルサイズによってはオーバーヘッドが大きい |
1206- | 3.署名付きURL | オブジェクトストレージで特定の期間内にのみ有効な一時的なURLを生成し、そのURLを使用してアップロードを行う方法 | ✅️負荷をクラウドサービス側にオフロードできる ⚠️メタデータ系の登録は、別途Web APIを叩く必要があるなど、クライアント側に手続きが発生 |
1202+ | 手法 | 説明 | Poc/Cons |
1203+ | :-------------------- | :----------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
1204+ | 1.multipart/form-data | RFC 2388でも定義された、古くから利用される方式 | ✅️枯れている< br > ⚠️ブラウザ以外のクライアントからは扱いにくい |
1205+ | 2.Base64 | ファイルをBase64形式にエンコードして、通常のフォームデータとして送信する方法 | ✅️通常のリクエストボディでJSON要素の値として設定できるので楽< br > ⚠️ファイルサイズが大きくなるため、モバイルなどのクライアントでは帯域の観点で懸念 |
1206+ | 3.署名付きURL | オブジェクトストレージで特定の期間内にのみ有効な一時的なURLを生成し、そのURLを使用してアップロードを行う方法 | ✅️負荷をクラウドサービス側にオフロードできる< br >✅️ Amazon API Gateway を利用する場合は、2023 年 6 月時点で [ ペイロード上限が 10MB ] ( https://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html ) 、 [ AWS Lambda でもペイロード制限がある ] ( https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/gettingstarted-limits.html#api-requests ) ため、許容するファイルサイズによってはこの手法一択となる< br >⚠️メタデータ系の登録は、別途Web APIを叩く必要があるなど、クライアント側に手続きが発生 |
12071207
12081208本規約の推奨は以下の通り。
12091209
@@ -1253,6 +1253,7 @@ sequenceDiagram
12531253参考:
12541254
12551255- [ 署名付きURLを利用したファイルアップロードWeb API設計の勘所 | フューチャー技術ブログ] ( https://future-architect.github.io/articles/20240705a/ )
1256+ - [ AWS のサーバーレスと Amazon S3 署名付き URL、クライアントサイド JavaScript で大きなサイズの複数ファイルの一括アップロード・ダウンロード機能を実現する方法 | Amazon Web Services ブログ] ( https://aws.amazon.com/jp/blogs/news/large-size-files-transferring-by-serverless-s3presignedurl-and-clientside-javascript/ )
12561257- [ S3 バケットを AWS Lambda を使って、ウィルススキャンしてみた | DevelopersIO] ( https://dev.classmethod.jp/articles/s3-bucket-antivirus-lambda/ )
12571258- [ S3のメタデータを用いた攻撃] ( https://zenn.dev/p0n/articles/3a6139cce9fa17 )
12581259
@@ -1262,7 +1263,7 @@ sequenceDiagram
12621263
12631264- サムネイルなど小さなデータの場合(数KB程度を想定)は、Base64でエンコードし、JSON項目の値に設定して返す
12641265 - この場合は、URIでそのままimageタグに埋め込めるようにデータURIスキームで返す
1265- - 例えば、` \ <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA..." alt="サムネイル画像"\ >` srcに設定されるような形式である
1266+ - 例えば、` <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA..." alt="サムネイル画像"> ` srcに設定されるような形式である
12661267- 上記以外の場合は、署名付きURLを利用してダウンロード
12671268
12681269### 署名付きURLの処理フロー
@@ -1436,7 +1437,7 @@ sequenceDiagram
14361437| :----------- | :----------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------- |
14371438| 説明 | サーバー側で更新があるまで待機し、更新があったタイミングで応答。再びクライアント側から再接続してもらう | HTTPプロトコルを使用し、クライアント側からサーバへHTTPリクエストを送り、その接続を維持することで、サーバから継続的にデータをストリーム送信する | 双方向通信が可能で、サーバ/クライアント間でメッセージを送受信できる。バイナリ送信も可能で効率が良い |
14381439| 通信方向 | 一方向 | 双方向 | 双方向 |
1439- | 即時性 | ❌️1度のやり取りでヘッダなどが付与されるためオーバーヘッドあり | ⚠️高いが | ✅️最も低レイテンシ |
1440+ | 即時性 | ❌️1度のやり取りでヘッダなどが付与されるためオーバーヘッドあり | ⚠️高い | ✅️最も低レイテンシ |
14401441| プロキシ対応 | ✅️高い | ✅️高い | ⚠️ブロックされる可能性がほかと比較すると高い |
14411442| 接続維持 | ❌️自前実装(再接続実装) | ✅️自動再接続機能がある | ⚠️クライアント側で再接続ロジックを実装 |
14421443| 保守運用性 | ⚠️古い手法である | ✅️比較的低い | ⚠️WebSocketの扱いをサーバ/クライアントで慣れる必要がある |
0 commit comments