DBサーバーにAzure Table Storageと言う選択肢

個人で作ってるWebアプリ(Node/Express.js)に使うDBを選定中でして、Azure Table Storageをお試しで使ってみたら中々良さげだったのでざっくり紹介。


# Azure Table Storage
- [Table Storage - Microsoft Azure](https://azure.microsoft.com/ja-jp/services/storage/tables/)

Microsoft Azure Storageの一種で、ドキュメント型データストレージサービスです。

所謂、NoSQL(Mongo)的な感じのJSON構造で保存/管理するタイプです。


# 良かった所
## 1. 安全/堅牢
これは何より大切です。
商用実績も多数ある堅牢サービスを個人レベルで使える、この安心感は大きいと思います。

オンプレ(自宅)管理は外部へ公開するとなると、セキュリティ設定、証明書発行、ドメイン取得などなど...
大掛かりになってしまい、設定漏れリスクや時間やお金が掛かります。
バックアップや冗長性の確保なども考えると、キリがありません。


### セキュリティ
デフォルト状態で`HTTPS接続`/`非公開`の設定になっており、うっかり公開したままと言う事故も防げます。
公開する際の`アクセス制御`/`IP制限`/`CORS`も、ポータルサイトから簡単に設定可能です。


### 可用性
最低設定でもデータセンター内ノード間での冗長構成となります。
他にも、データセンター内AZ間での構成や、複数データセンター間での構成も、設定1つで何時でも変更可能です。

(AZ: Availability Zone ... データセンター内はAZと呼ばれる区画毎に、電力供給/ネットワーク/冷却装置/消防設備などのインフラが隔離されている。一部のAZが停電や出火により万一落ちても、他AZは問題なく稼働が続けられる構造)


## 簡単/便利
各言語プラットフォームで公式ライブラリが充実しており、Mongoライクな操作が可能になっています。
公式ドキュメントも一通り揃っているので、それをなぞれば基本すんなり行けます。

アプリケーションサーバーとの接続も`接続文字列`と呼ばれるキーをコピペするだけなので至極簡単。

- [Azure Cosmos DB の概要:テーブル API - Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/cosmos-db/table-introduction)

なお、私はセッション管理に`express-session`を使っているのですが、Table Storageでセッションストアが可能になるライブラリがありました。
これは嬉しい。

- [connect-azuretables - NPM](https://www.npmjs.com/package/connect-azuretables)


### 各言語向けライブラリ
- Node.js
    - [azure-storage - NPM](https://www.npmjs.com/package/azure-storage)
- Ruby
    - [azure-storage - RubyGems](https://rubygems.org/gems/azure-storage)
- PHP
    - [azure-storage-php - GitHub](https://github.com/Azure/azure-storage-php/tree/master/azure-storage-table)
- Java
    - [Azure Storage Libraries for Java - Microsoft Docs](https://docs.microsoft.com/ja-jp/java/api/overview/azure/storage?view=azure-java-stable)
- Python
    - [azure-cosmosdb-table - pypi](https://pypi.org/project/azure-cosmosdb-table/)
- .NET
    - [Microsoft.Azure.Storage.Common - NuGet](https://www.nuget.org/packages/Microsoft.Azure.Storage.Common/)
- F#
    - [WindowsAzure.Storage - NuGet](https://www.nuget.org/packages/WindowsAzure.Storage/)
- C++ (Windows)
    - [wastorage - NuGet](https://www.nuget.org/packages/wastorage/)
- C++ (Linux)
    - [azure-storage-cpp - GitHub](https://github.com/Azure/azure-storage-cpp/blob/master/README.md)


### 余談
Cosmos DBはTable Storageの上位互換です。
Table Storageは各種Storageサービス(Blob/File/Table/Queue)内の1つですが、Cosmos DBはデータベース専門となっています。

SQL/Mongoから選択可能で、高速応答と世界中のデータセンターに冗長構成を撒ける鉄壁さがウリなのですが...
最低構成でも、3分に1回程度の頻度で自動バックアップが走る為、たとえ数MBしか保存しておらず、1ヶ月殆どアクセスしなかったとしても、ほぼ720時間分の料金が発生します。

私はその事を知らず、数日間お試しで使ったまま2ヶ月間放置して、10900円の請求が来る羽目に...
それがTable Storageへ移行するきっかけでした。

これは流石に、完全な商用前提サービスだと感じました。


## 3. 安い
いくらキラキラした能書きを並べられても、お値段が張ってしまっては採用出来ませんからね...
普通に使う分であれば、かなり安く済みます。

### 料金の例
大体、1ヶ月で缶コーヒー1本分くらいの料金で運用可能です。

- `汎用v1`/`LRS`/`Standard`/`Hot`での構成
    - 容量単価 - `7.84円/GB`
    - アクセス(読み書き)単価 - `0.04円/10000件`


# 良くなかった所
あまりヨイショしすぎてもアレなので、不満点も上げておきます。

## リソース管理
Blob Storageなどはポータルサイト上でリソース編集可能なのですが、Table Storageは既存キーの値を編集する事は可能でも、キーを新規に増やす事は出来ません。
Azure Storage Explorerと言う専用ツールか、各種プログラム経由でしか増やせません。

それが少し手間だと思いました。
が、ドキュメント毎にキーを好き勝手増減できてしまう仕組み上、あえて対応してないのかも...?

- [Azure Storage Explorer - Microsoft Azure](https://azure.microsoft.com/ja-jp/features/storage-explorer/)


### 2019/02/12追記
何と、ポータルサイト上でキーの新規追加が可能になっていました。
これは便利。


# まとめ
最初はTable "Storage"という名称に迷ってしまったのですが、使ってみたら中身は普通のNoSQLデータベースでした。
高性能でお財布にも優しく、中々優秀だなぁと感じました。

皆さんも、ご検討されてみては如何でしょうか。