Serverless ファイル転送: Architecture and Design
serverless ファイル転送 systems with AWS Lambda, Azure Functions, or Google Cloud Functions. Cost-effective and auto-scaling designs.
サーバーを管理せずにファイル転送サービスを運用できる—それがサーバーレスの本質的な価値だ。AWS Lambda、Azure Functions、Google Cloud Functionsが演算を担い、S3やBlob StorageがファイルストレージとなりS3の署名付きURLでクライアントが直接ストレージにアップロードするため、Lambdaはバイト列を一切触らない。低〜中トラフィックの転送サービスなら月額50ドル以下で自動スケーリングが実現できる。
なぜサーバーレスはファイル転送に向いているのか
ファイル転送はバースト的だ。ユーザーがアップロードボタンを押し、数分間リクエストが集中し、その後は静寂になる。このパターンで24時間365日VMを稼働させるのは費用の無駄だ。Lambdaはオンデマンドで起動し、100ミリ秒単位で課金され、手動設定なしに数千の同時実行にスケールする。重要なのは、実際のファイルバイト列は署名付きURLを通じてS3へ直接送信されるため、Lambdaは10GBのペイロードを処理せず、メタデータと認証チェックだけを扱う。これによりLambdaの実行時間は500ミリ秒以下に収まる。
コアコンポーネントと役割分担
最小構成のサーバーレスアーキテクチャ:API Gateway(またはエッジ認証用CloudFront Functions)がHTTPS要求を受け付け、Lambdaがアップロード初期化・メタデータCRUD・ダウンロード認可を処理し、S3が実際のファイルストアとなる。メタデータにはDynamoDBまたはAurora Serverless v2、通知メールにはSESまたはSNS、非同期イベントルーティングにはEventBridgeを使う。9つのサービス、サーバーはゼロ。TerraformまたはAWS CDKでスタックをプロビジョニングすれば、自動スケーリングと高可用性を備えた転送サービスが完成する。
署名付きURLによるS3への直接アップロード
サーバーレスを経済的にする核心パターン:クライアントがLambdaを呼び出し、Lambdaが15分間有効な署名付きPOSTまたはPUT URLを生成し、クライアントがS3に直接アップロードする。Lambdaの実行はわずか100ミリ秒。10GBのアップロードはS3の帯域幅を使い、Lambdaが関与するかどうかに関わらず標準料金で課金される。マルチパートアップロードの場合、Lambdaが各パートの署名付きURLを生成し、クライアントが並列でパートをアップロードし、最後にLambdaがCompleteMultipartUploadを完了させる。
イベント駆動型後処理
S3がオブジェクトのアップロードを完了すると、イベントが発火する。S3イベント通知またはEventBridgeが後処理のLambda関数にルーティングする:LambdaコンテナイメージでClamAVを実行するウイルスチェック、Lambda LayersのImageMagickまたはGhostscriptによるサムネイル生成、DynamoDBの転送ステータス更新、SESによる通知メール送信。各ステップはポーリングループでなく必要時のみ実行される。デッドレターキューが失敗を捕捉し、サイレントに消えることを防ぐ。
コールドスタートの軽減策
Lambdaのコールドスタートは常に議論の的だ。Node.jsのLambdaは通常200〜500ミリ秒、PythonもほぼSame、JavaやNETは1〜3秒かかることがある。転送サービスのユーザー向けアップロード初期化ではコールドスタートを避けたい。プロビジョニング済み同時実行性がGB秒あたり0.0000041667ドルで温かいプールを維持してくれる。GoやRustで依存性を最小化したホットパス関数を書けば、コールドスタートを100ミリ秒以下に抑えられる。バックグラウンドのLambda(アップロード後のスキャン、通知)では非同期処理なのでコールドスタートはほぼ無関係だ。
サーバーレススケールでのデータベース選択
Aurora Serverless v2はACUを0.5から128までオンデマンドでスケールし、バースト的ワークロードに費用対効果が高い。DynamoDBのオンデマンド料金はリクエスト単位で課金されるため、トラフィックが予測不能な場合に適している。単純な転送メタデータには、パーティションキーをtransfer_idとするDynamoDBの単一テーブル設計がCRUDを一桁ミリ秒で処理できる。コストは1,000件の読み取りで1セントの何分の一かだ。
認証パターン
Cognito、Auth0、またはカスタムLambdaオーソライザーが発行するJWTトークンがすべてのリクエストを検証する。API GatewayはJWTオーソライザーをネイティブにサポートし、Lambdaが起動する前にトークンを検証するため、無効なリクエストにLambdaコストが発生しない。HexaTransferのような匿名ファイル共有では、URLフラグメントに埋め込まれたランダムな256ビットトークンが識別子と復号鍵の両方として機能し、鍵はクライアント側に留まる。API GatewayのUsage Planによるレート制限が悪用を防ぐ。
コスト構造とスケーリングの落とし穴
サーバーレスの経済学は従来の常識を逆転させる。低トラフィックは実質無料、高トラフィックは予想外の請求になりうる。月1000万件の転送で典型的なコスト:Lambdaが2〜20ドル、API Gatewayが10〜35ドル、DynamoDBが20〜100ドル、S3ストレージは保持期間によって大きく変動し、CDNがダウンロードをフロントしない場合S3エグレスが最大の費用となる。DynamoDBスロットリングでLambdaが無限リトライするバグは1時間で500ドルの請求を生みうる。すべてのLambdaにCloudWatchの請求アラームと同時実行制限を設定して爆発半径を制限すること。
サーバーレスが不適切になるとき
転送量が常に高い(数百万の同時アップロード、24時間365日の飽和状態)なら、専用EC2またはFargateフリートの方が安くなる。長時間接続が必要な場合(分単位のセッションを持つWebSocket)はLambdaの15分上限と呼び出しごとの課金が問題になる。HexaTransferはサーバーレスとコンテナベースサービスのハイブリッドを使用し、アーキテクチャをシンプルに保ちながら、正確性と信頼性を優先している。詳細は https://hexatransfer.com で確認できる。無料、アカウント不要、最大10GB。
エンドツーエンド暗号化で大容量ファイルを安全に送信
エンドツーエンド暗号化で最大10GBのファイルを無料で転送。アカウント不要。ファイルはアップロード前にブラウザで暗号化されるため、他の誰にも読まれません。
ファイルを送信