Azure Cosmos DB のバックアップ
目次
-
- 3.1. ダウンロード
- 3.2. 設定ファイル(migrationsettings.json)の編集
- 3.3. 実行
- 3.4. 補足
-
- 4.1. Azure Data Factory(ADF)を作成
- 4.2. Cosmos DB のリンクサービスを作成
- 4.3. Blob Storage のリンクサービスを作成
- 4.4. Cosmos DB のデータセットを作成
- 4.5. Blob Storage のデータセットを作成
- 4.6. パイプラインの作成
- 4.7. パイプラインの実行
- 4.8. JSON をダウンロード
はじめに
Cosmos DB には 2 種類のバックアップモード(Backup policy mode)があります。
- Periodic(定期的バックアップ:デフォルト)
- Continuous(継続的バックアップ)
どちらの設定になっているかは 設定
> バックアップと復元
から確認できます(図1)。
デフォルトでは以下の設定になっています。
- バックアップモードは
Periodic(定期)
- 4 時間(240分)ごとに自動バックアップ
- 最大 2 つまでのバックアップを保持
- 料金は無料(バックアップ保持数を 2 より大きくすると課金対象)
Periodic(定期)
の場合、復元したい時には Microsoft のサポートに連絡 する必要があります。
データベースまたはコンテナーを誤って削除した場合は、サポート チケットを申請するか、Azure サポートに連絡して、自動オンライン バックアップからデータを復元できます。
自分で復元操作を行いたい場合は Continuous(継続)
を選択する必要がありますが、課金対象となります。
そこで、Azure Cosmos DB のバックアップ機能を使用せずにデータをエクスポートする方法について調査してみました。
Azure ポータル
Azure ポータルのデータ エクスプローラーで Cosmos DB のデータを閲覧・編集することはできますが、エクスポートする機能はなさそうでした。
Upload Item
で JSON データをインポートすることはできるので、復元はここからでも可能です。
Azure Cosmos DB Desktop Data Migration Tool
- オープンソースのコマンドラインツール
- エクスポート/インポートの両方ができる
- エクスポート/インポート先は JSON だけなく、CSV、Azure Blob Storage、SQL Server なども指定可能
- 入出力の指定は設定ファイルで行う
このツールでエクスポート/インポートができます。
1ダウンロード
GitHub の Releases から最新版をダウンロードします(図2)。
図2 Data Migration Tool のダウンロード
2設定ファイル(migrationsettings.json)の編集
zip を解凍したフォルダに設定ファイル(migrationsettings.json)があります。
ここに入出力の設定を記述します。
Source
➜ Sink
の方向にデータが出力されます。
以下は Cosmos DB(Cosmos-NoSql) からローカル PC の json ファイルに出力する例です。
{
"Source": "Cosmos-NoSql",
"Sink": "JSON",
"SourceSettings":
{
"ConnectionString": "AccountEndpoint=https://<Cosmos DBアカウント名>.documents.azure.com:443/;AccountKey=<アカウントキー>;",
"Database":"<データベース名>",
"Container":"<コンテナ名>",
"IncludeMetadataFields": true
},
"SinkSettings":
{
"FilePath": "output.json",
"Indented": true
}
}
3実行
dmt.exe
カレントディレクトリに output.json
が出力されます。
JSON から Cosmos DB へのインポートなど、他のパターンについては Example migrationsettings.json Files を参照してください。
補足
Cosmos DB は Request Unit(RU)課金なので、エクスポートのリクエスト分の課金は発生しますが、ローカル PC にダウンロードしてもアウトバウンド転送(インターネットへの転送)料金は発生しません。
Azure Data Factory
Azure Data Factory
を使用すると以下の手順でダウンロードできます。
- リンクサービスの作成
- データセットの作成
- パイプライン(コピーアクティビティ)の作成と実行
Azure Data Factory、リンクサービス、データセット、パイプラインの作成時点では課金は発生せず、パイプラインの実行時に以下の単位で課金が発生します。
- コピーアクティビティ: 実行時間単位
- Cosmos DB: Request Unit(RU)単位
- Blob Storage: 書き込み容量+トランザクション単位
リージョン間のデータ転送が発生する場合もデータ量に応じた課金が発生するので、Cosmos DB と Blob Storage は同じリージョンに配置したほうが低コストになります。
パイプラインを実行するまでの手順を見てみましょう。
1Azure Data Factory(ADF)を作成
ポータルから Data Factory (V2)
を選択します(図3)。
(日本語では「データ ファクトリ」です)
「作成」ボタンをクリックして「データ ファクトリの作成」画面に進みます(図4)。
- リソースグループ
- 名前
- リージョン
をそれぞれ選択、入力してください。
バージョンは「V2」を選択し、「確認と作成」をクリックしてデータファクトリを作成します。
2Cosmos DB のリンクサービスを作成
作成したデータファクトリから「スタジオの起動」をクリックします(図5)。
管理
> リンク サービス
> リンク サービスを作成
をクリックします(図6)。
Azure Cosmos DB for NoSQL
を選択して「続行」をクリックします(図7)。
図7 Azure Cosmos DB for NoSQL を選択
名前に任意の識別名をつけて、Cosmos DB の接続情報を選択し、「作成」をクリックします(図8)。
3Blob Storage のリンクサービスを作成
Cosmos DB の場合と同様に、リンクサービスの新規作成 >「Azure BLOB ストレージ」を選択 > 「続行」をクリックします(図9)。
名前に任意の識別名をつけて、Blob Storage の接続情報を選択し、「作成」をクリックします(図10)。
4Cosmos DB のデータセットを作成
次に Cosmos DB のデータセットを作成します。
作成(鉛筆マーク)
> データセット
> 新しいデータセット
を選択します(図11)。
「Azure Cosmos DB for NoSQL」を選択して、「続行」をクリックします(図12)。
リンクサービスに 2. で作成した Cosmos DB のリンクサービスを選択し、出力元となるコンテナーを選択します(図13)。
5Blob Storage のデータセットを作成
Cosmos DB と同様に Blob Storage のデータセットを作成します。
作成(鉛筆マーク)
> データセット
> 新しいデータセット
>「Azure BLOB ストレージ」を選択して、「続行」をクリックします(図14)。
「JSON」を選択し、「続行」をクリックします(図15)。
リンクサービス
作成した Blob Storage のリンクサービスを選択します。ファイル パス
出力先のファイルパスになります。スキーマのインポート
「なし」を選択します。
「OK」をクリックします(図16)。
6パイプラインの作成
Cosmos DB から Blob Storage へデータをコピーするパイプラインを作成します。
作成
>パイプライン
> 新しいパイプライン
を選択します(図17)。
アクティビティから「データのコピー」をドラッグします(図18)。
「ソース」タブで Cosmos DB のデータセットを選択します(図19)。
「シンク」タブで Blob Storage のデータセットを選択します(図20)。
図20 シンクに Blob Storage のデータセットを選択
ここで「すべて発行」をクリックして作成を確定します(図21、図22)。発行を行わなかった場合、作成したデータセットとパイプラインはブラウザを閉じると消えてしまうので注意してください。(リンクサービスは残ります)
7パイプラインの実行
「デバッグ」をクリックするとデバッグが開始されます(図23)。
しばらく待つと以下のように実行結果が表示されます(図24)。
8JSON をダウンロード
出力先に指定した Blob Storage のコンテナー/ディレクトリーに移動します。
ファイルが作成されているので、コンテキストメニューから「ダウンロード」を選択します(図25)。
Azure Data Factory を使用した Cosmos DB のバックアップ手順は以上になります。
この例では出力ファイル名は固定でしたが、動的なファイル名を指定することもできます。
- シンク側のデータセットにパラメータを追加(図26)
filename
という名前で String 型のパラメータを追加します。
- パイプラインの
「データのコピー」アクティビティ
>シンク
>データセットのプロパティ
filename
に以下の式を設定します(図27)。
@concat('output_', formatDateTime(utcNow(), 'yyyyMMddHHmmss'), '.json')
これで、output_yyyyMMddHHmmss.json
というファイル名で出力されるようになります(時刻は UTC)。
トリガーの追加で定期的に実行することもできますので、Cosmos DB のデータを Blob Storage に毎日決まった時間にバックアップすることも可能です。
SDK 経由でバックアップ
他の手段としては、自前でプログラムを書いてローカルに保存する手段があります。
- .NET / Python / Node.js SDK でデータを取得し、ローカル JSON に保存
- Change Feed API を組み合わせれば差分エクスポートも可能
SELECT * FROM c
これで全件取得はできるので、あとはよしなに。
参考資料
Azure Cosmos DB の定期的なバックアップと復元
Azure Cosmos DB Desktop Data Migration Tool
Azure Data Factory とは何ですか