Cloud Service
Azure Queue Storage
ストレージアカウント上に作るシンプルで安価なメッセージキュー。大量のメッセージを低コストでため込み、AWS の SQS に相当する。
- 1.ストレージアカウント上に置くシンプルで安価なメッセージキュー。
- 2.送信側と処理側を疎結合化し、急増分をバッファして順に処理する。
- 3.高機能が要るなら Service Bus、それ以外の単純用途は本サービスが安い。
解決する課題
アクセスが急増してもバックエンドを詰まらせず、送信側と処理側を独立してスケールさせたい、という疎結合化のニーズに、最小限の機能と低コストで応えるのが Queue Storage です。高度な順序保証や Pub/Sub は不要で、「とにかくメッセージを安くためて順に処理する」用途に向きます。
- アクセス急増でバックエンドが処理しきれない、キューでバッファして負荷を平準化したい
- 送信側(フロント)と処理側(ワーカー)を疎結合にし、それぞれ独立にスケールさせたい
- 大量のジョブを安価にため込みたく、エンタープライズ機能までは要らない
- 処理が失敗したメッセージを取りこぼさず、再試行できるようにしたい
AWS で言えば Amazon SQS(とくに標準キュー)に近く、機能はシンプルでストレージ課金が中心という位置づけです。
主要概念と用語
- ストレージアカウント: キューを束ねる入れ物。Blob やテーブルと同じアカウント上に同居する
- キュー: メッセージを格納する順序付きの入れ物。1つのアカウントに多数作成できる
- メッセージ: キューに入れる1件のデータ。テキストやエンコードしたバイナリを持ち、1件あたりのサイズに上限がある
- 可視性タイムアウト(Visibility Timeout): 取得したメッセージを一定時間ほかの受信側から隠す仕組み。処理が終わるまで二重取得を防ぐ。AWS SQS の同名機能に相当する
- メッセージ TTL: メッセージの保持期限。期限を過ぎると自動的に削除される
- デキューカウント(Dequeue Count): そのメッセージが取得された回数。再試行の上限管理や毒メッセージ検出に使う
- ポップレシート(Pop Receipt): メッセージ取得時に発行される識別子。削除や可視性更新の操作にはこの値が必要になる
仕様・制限・クォータ
- メッセージサイズ: 1件あたり最大で数十キロバイト程度(おおむね 64 KB まで)。大きなデータは Blob に置き、キューには参照だけを入れる
- キュー容量: 1つのキューに保持できるメッセージ数は実質的にストレージ容量の上限まで及び、テラバイト級の大量メッセージを安価に保持できる
- メッセージ保持(TTL): 規定値があり、最大保持期間を超えると自動削除される。設定により無期限の保持も指定できる
- 配信方式: プル型で、受信側がキューをポーリングして取得する。プッシュ連携が要る場合は Event Grid や Functions のトリガーで補う
- 配信保証: 最低1回(at-least-once)。まれに同じメッセージが複数回配信されうるため、処理は冪等に作る
- 順序: 厳密な FIFO は保証されない(おおむね投入順だが保証ではない)。厳格な順序が必要なら Service Bus を使う
- 厳密な数値は変動しうるため、上限値は公式ドキュメントで確認すること
内部の仕組み
受信側はキューをポーリングしてメッセージを取得します。取得した瞬間にメッセージは削除されず、可視性タイムアウトの間だけほかの受信側から隠されます。処理に成功したら、受信時に得たポップレシートを使ってメッセージを明示的に削除します。
- 処理が成功し削除されれば、そのメッセージは二度と配信されない
- 可視性タイムアウト内に削除されなかった場合、メッセージは再び可視になり、別の受信側に再配信される(ワーカーがクラッシュしても取りこぼさない)
- 取得のたびにデキューカウントが増える。毒メッセージ(何度処理しても失敗するメッセージ)はこの値で検出する
- 標準では自動のデッドレターキューはなく、リトライ上限の管理や退避は受信側の実装で行う
配信は「最低1回」が前提で、まれに同じメッセージが重複配信される。処理は何度実行しても結果が変わらない冪等な作りにしておくのが鉄則。デキューカウントを見て、規定回数を超えたメッセージは別キューへ退避するなどの毒メッセージ対策も用意する。
設計パターン / ベストプラクティス
- 負荷平準化(Queue-Based Load Leveling): スパイクをキューで吸収し、受信側は自分のペースで処理する
- 競合コンシューマー: 複数のワーカーで同一キューを処理し、スループットを水平にスケールする
- 可視性タイムアウトは処理時間に合わせる: 短すぎると処理中に再配信され二重処理が起きやすく、長すぎるとクラッシュ後の再開が遅れる
- 取得後に明示削除: 処理が完全に終わってからメッセージを削除し、途中失敗時は再配信に任せる
- 大きいペイロードは Blob に置きキューには参照を入れる(Claim-Check パターン)
- 毒メッセージ対策: デキューカウントが規定回数を超えたメッセージは退避キューに移し、本処理を止めない
- KEDA などでキュー長に応じて受信側を自動スケールさせると、滞留を抑えつつコストも最適化できる
運用・監視
- Azure Monitor / ストレージメトリクスでキューのメッセージ数、トランザクション数、レイテンシ、エラー率を監視する
- メッセージ数(滞留)が増え続ける場合は、受信側ワーカーの不足やダウンストリーム障害を疑う
- スロットリングを示すレスポンスが出たら、アクセス集中やアカウント単位の上限到達を確認する
- 診断ログを Log Analytics に送り、遅い操作や高頻度のポーリングを把握する
- 毒メッセージが溜まる退避キューを定期的に確認し、処理ロジックやメッセージ形式の不具合を調査する
コスト
Queue Storage の最大の魅力は安さです。スループットを事前確保して支払う方式ではなく、課金は基本的に操作回数(トランザクション)と保存データ量、リージョン外へのデータ転送で決まります。単純なキュー用途であれば、エンタープライズ機能を持つ Service Bus より大幅に安く済みます。
| コスト要素 | 課金の考え方 | 抑えるコツ |
|---|---|---|
| トランザクション | 送受信や削除などの操作回数に応じて課金 | 空ポーリングを減らし無駄な取得を避ける |
| ストレージ | 保持しているメッセージ量に応じて課金 | 処理後は確実に削除し滞留をためない |
| データ転送 | リージョン外への送信で課金 | アプリと同一リージョンに配置する |
受信側がメッセージのないキューを高頻度でポーリングすると、空の取得でもトランザクション課金が積み上がる。待機時間を設けたポーリングやキュー長に応じたスケールで、無駄な取得回数を抑える。
セキュリティ
- 保存時暗号化はデフォルトで有効(ストレージサービスの暗号化)。通信は TLS で暗号化される
- アクセス制御はアカウントキー、SAS(Shared Access Signature)、Microsoft Entra ID(RBAC)から選べる。可能なら Entra ID とマネージド ID を使い、キーのハードコードを避ける
- アプリにはマネージド ID を付与して接続する(AWS の IAM ロール相当)
- SAS を使えば、有効期限と権限を絞った一時的なアクセスを発行できる
- プライベートエンドポイント(Private Link) で VNet 内からの到達に限定し、パブリックアクセスを最小化する
アカウントキーや接続文字列をアプリやリポジトリに直書きするのは NG。漏えいすれば誰でも送受信でき、アカウント全体に影響が及ぶ。マネージド ID と Entra ID/RBAC に寄せ、鍵の管理・ローテーション・漏えいリスクを排除する。
Well-Architected の観点
- 信頼性: 可視性タイムアウトと明示削除により、ワーカーがクラッシュしてもメッセージを取りこぼさず再配信できる。キューが送信側と処理側のバッファとなり、片側の障害がもう片側へ波及しにくい
- コスト最適化: スループットを確保して払う方式ではなく操作回数と保存量が中心のため、大量メッセージを安価に扱える。空ポーリングを抑え、過剰な機能を持つサービスを選ばないことで費用を最小化できる
試験で問われるポイント
- Queue Storage はストレージアカウント上のシンプルで安価なキューであり、高機能が要るなら Service Bus という棲み分け
- 取得したメッセージはすぐ消えず、可視性タイムアウトの間隠され、処理成功後に明示的に削除する流れ
- 配信は最低1回で重複しうるため、処理は冪等に作るのが基本である点
- 厳密な FIFO 順序や Pub/Sub(トピック)には非対応で、それらが要る場合は Service Bus を選ぶ点
- 大きなデータはキューに入れず Blob に置いて参照を渡す(Claim-Check)こと、AWS の SQS に相当する点
関連サービス・比較
同じ「キューでメッセージをためる」用途でも、シンプルで安い Queue Storage と、順序保証や Pub/Sub を備える Service Bus のどちらを選ぶかが論点になります。AWS の対応サービスとあわせて整理します。
| 観点 | Queue Storage | Service Bus | AWS SQS |
|---|---|---|---|
| 位置づけ | 安価でシンプルなキュー | 高機能メッセージブローカー | マネージドキュー |
| 順序保証 | ベストエフォート | FIFO / セッション | FIFO キューで保証 |
| Pub/Sub | なし | トピック / サブスクリプション | SNS と組み合わせ |
| 可視性制御 | 可視性タイムアウト | PeekLock(ロック) | 可視性タイムアウト |
| 失敗退避 | 実装で対応(DLQ なし) | DLQ(サブキュー) | DLQ |
| 権限付与 | マネージド ID + Entra/RBAC / SAS | マネージド ID + Entra/RBAC | IAM ロール |
ハンズオン / CLI例
# リソースグループを作成
az group create --name demo-rg --location japaneast
# ストレージアカウントを作成(キューはこのアカウント上に作る)
az storage account create \
--name demoqueuestg0614 \
--resource-group demo-rg \
--location japaneast \
--sku Standard_LRS
# キューを作成
az storage queue create \
--name jobs \
--account-name demoqueuestg0614 \
--auth-mode login
# メッセージを1件送信
az storage message put \
--queue-name jobs \
--content "order-100" \
--account-name demoqueuestg0614 \
--auth-mode login
# メッセージを1件取得(可視性タイムアウトの間ほかから隠れる)
az storage message get \
--queue-name jobs \
--account-name demoqueuestg0614 \
--visibility-timeout 30 \
--auth-mode login
# キューにたまっているメッセージのおおよその件数を確認
az storage queue stats \
--account-name demoqueuestg0614 \
--auth-mode login
Azure Service
Azure Queue Storageを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
アプリ統合
比較で見る軸
クラウド: Azure / カテゴリ: アプリ統合 / 難易度: basic
導入後に効く点
送信側と処理側を疎結合化し、急増分をバッファして順に処理する。
先に潰すリスク
サービス単体ではなく、権限、ネットワーク、監視、課金、バックアップを含めて設計する必要がある。
- クラウド
- Azure
- カテゴリ
- アプリ統合
- 難易度
- basic
- 関連資格
- —
- 設計柱
- reliability / cost
判断チェックリスト
- 自社の用途が「アプリ統合 / reliability」に近いか確認する。
- 強みである「ストレージアカウント上に置くシンプルで安価なメッセージキュー。」が本当に評価軸になるか確認する。
- 注意点の「サービス単体ではなく、権限、ネットワーク、監視、課金、バックアップを含めて設計する必要がある。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。