メインコンテンツまでスキップ

「Hardware」タグの記事が3件件あります

全てのタグを見る

AWS サーバーレスでクラウドストレージを作った

· 約4分
ひかり
Main bloger

はじめに

自分専用のファイル共有システムが欲しいと思い、AWS のサーバーレスサービスだけでファイルストレージサービスを作りました。

この記事では、設計で意識したポイントと、実際のアーキテクチャを紹介します。

何を作ったか

制作した Web システムは、Web ブラウザからファイルのアップロード・ダウンロード・フォルダ管理ができるクラウドストレージサービスです。

主な機能

  • ファイルのアップロード / ダウンロード
  • フォルダの作成・階層管理
  • 複数ファイル / フォルダの一括 ZIP ダウンロード
  • ユーザー認証(サインアップ・ログイン・パスワードリセット)
  • ユーザープロフィール管理

アーキテクチャ

以下、構成図です。

認証の大部分は Cognito で行い、 ファイル転送は S3 の Presigned URL を Lambda で発行してクライアントと S3 が直接やり取りする仕組みです。

技術スタック

レイヤー技術
バックエンドC# (.NET 8) / AWS Lambda
認証Amazon Cognito + Managed Login v2
APIAPI Gateway (REST) + Cognito Authorizer
ストレージAmazon S3

設計判断とその理由

認証を Cognito で行う

Cognito の OAuth 2.0 エンドポイントと Managed Login を活用し、認証機能を実現しました。

最終的に認証系の Lambda は TokenFunction 1 つだけになりました。

機能的にもセキュリティ的にも減らせるコードは減らすのが吉です。

AWS のサービスがやってくれることを自前で書く必要はありません。

Presigned URL によるファイル転送

ファイルのアップロード・ダウンロードで Lambda を経由すると、いくつかの問題が生じます:

  • Lambda のペイロード上限に引っかかる
  • 大きなファイルを Lambda のメモリに載せるとコストがかかる
  • 転送時間が Lambda の実行時間としてカウントされる

Presigned URL なら、Lambda は URL を発行するだけで、実際のファイル転送はブラウザと S3 が直接行います。

Lambda の実行時間は数十ミリ秒で済み、ファイルサイズの制約も S3 の上限までとなります。

アップロードの流れ:
1. ブラウザ → Lambda: 「file.pdf をアップロードしたい!アップロード先の URL を送れ~」
2. Lambda → ブラウザ: 「アップロード先の Presigned URL だよ。ここに PUT してね~」
3. ブラウザ → S3: 「S3 に PUT するよ~」
4. ブラウザ → Lambda: 「アップロード完了したよ~」

4. フォルダの ZIP ダウンロード

S3 にはフォルダごとダウンロードする機能がありません。

複数ファイルの一括ダウンロードは、Lambda 上で ZIP を生成して一時的に S3 に置き、その Presigned URL を返す方式にしました。

一時 ZIP ファイルは S3 のライフサイクルルールで 1 日後に自動削除されるので、ゴミが溜まることはありません。

セキュリティ

対策実装
ブルートフォース防止Cognito 標準のロック機能 (5 回失敗: 15 分ロック)
API 保護Cognito Authorizer による JWT 検証
CORSAllowedOrigin を特定のドメインに限定
一時ファイル管理S3 ライフサイクルで不要なファイルを 1 日で自動削除

コスト

サーバーレス構成なので、利用がなければコストはほぼゼロです。

  • Cognito: ESSENTIALS Tier は MAU 10,000 まで無料
  • Lambda: 月 100 万リクエストまで無料
  • S3: 保存量に応じた従量課金(GB あたり約 $0.025/月)
  • API Gateway: 100 万リクエストあたり $3.50

個人利用なら月額数十円〜数百円程度に収まります。

インフラのコード化

インフラ全体を 1 つの template.yaml (AWS SAM) で定義しています。

Cognito User Pool、API Gateway、Lambda 3 関数、S3 バケット、CloudWatch アラーム、SNS — すべてのリソースを 600 行程度の YAML で定義しています。

USB 3 と Type-C について解説

· 約5分
ひかり
Main bloger

USB はパソコンやスマートフォンなどの機器を接続するための規格ですが、 種類や性能が多様化しており、 どれを選べばいいのか迷ってしまうこともあるでしょう。 そこで、USB でよく聞く Type-C と USB 3 について解説し、 ケーブルの選び方についても紹介します。

Type-C とは

Type-C とは、USBのコネクタの形状の一種です。 Type-C は従来の Type-A や Type-B と比べて小型で両面挿し可能なデザインになっており、どちら向きでも接続できる便利さが特徴です。 また、Type-C は電力供給や映像出力などの機能があるものも存在し、対応しているものであればモニターやドッキングステーションなどの周辺機器との接続ができます。 しかし、全てのケーブルが映像出力だったり、高速通信ができるわけではないので注意が必要です。 そのため、通信が遅い USB 2.0 の Type-C ケーブルも存在します。

Thunderbolt と Type-C の関係

Thunderbolt は形状は Type-C と同じものですが、機能が異なります。 Thunderbolt は通常のデータ転送に加えて以下のことができます。

  • 高速通信 (Thunderbolt 3: 40 Gbps)
  • 映像出力 (DisplayPort)
  • 高電流

USB 3 とは

USB 3 とは、USB の転送速度や電力供給能力を向上させた規格です。 USB 3.0 は 最大 5 Gbps、USB 3.1 は最大 10 Gbps、USB 3.2 は最大 20 Gbps の転送速度が可能です。 また、USB 3.1 からは USB PD (Power Delivery) という技術が導入され、最大 100 W の電力供給ができるようになりました。

USB 3 の規格のややこしさ

USB 3 はバージョンアップデートごとに、規格の名前が変更されてきた歴史から名称がややこしくなっています。 以下に、USB の規格をまとめます。 同じ行のものは同じ規格になります。

一般名旧旧名旧名規格名速度
USB 2.0---480 Mbps
USB 3.0USB 3.0USB 3.1 Gen 1USB 3.2 Gen 15 Gbps
USB 3.1-USB 3.1 Gen 2USB 3.2 Gen 110 Gbps
USB 3.2--USB 3.2 Gen 2x220 Gbps

Type-C ケーブルの選び方

USB のケーブルを選ぶときには、まず自分が接続したい機器や目的に合った規格かどうかを確認しましょう。 高速なデータ転送や高画質な映像出力をしたい場合は、USB 3.2 (USB 3.2 Gen 2x2) の Type-C ケーブルや Thunderbolt ケーブルを選ぶと良いでしょう。 また、電力供給や充電をしたい場合は、USB PD に対応した Type-C ケーブルを選ぶと良いでしょう。 ただし、対応するケーブルだけでなく、接続する機器も同じ規格に対応している必要があります。その点に注意してください。

Thunderbolt ケーブルを選ぶ

Thunderbolt ケーブルは Type-C ケーブルの中でも高性能かつ高価格な最強のケーブルです。

怪しい製品に注意

Thunderbolt ケーブルには、本物のケーブルとパチモンのケーブルが存在します。 簡単な見分け方ですが、雷マークがあるものは Thunderbolt のケーブルで、マークがないものや 40 と書かれているものはパチモンです。 また、Thunderbolt 「対応」とあるものもパチモンの可能性が高いため注意が必要です。

ちなみに、先月以下のケーブルを購入しました。

Type-C 変換アダプタ

Type-C 変換アダプタが存在します。 たとえば、以下のようなものです。

これらは、Type-C ポートしかないスマホやパソコンに Type-A のデバイスを接続するために使用します。

アウトな Type-C 変換アダプタ

Type-C メスの変換アダプタはアウトです。 たとえば、以下のようなものがあります。

  • Type-C メス to Type-A オス
  • Type-C メス to Type-C オス

C to A は規格違反のため、できるだけ買わないほうが望ましいです。