Azure Cosmos DB のバックアップ

技術情報
公開 2025年4月10日 最終更新 2025年10月5日

はじめに

Cosmos DB には 2 種類のバックアップモード(Backup policy mode)があります。

  • Periodic(定期的バックアップ:デフォルト)
  • Continuous(継続的バックアップ)

どちらの設定になっているかは 設定 > バックアップと復元 から確認できます(図1)。

図1 バックアップモードの確認図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 Data Migration Tool のダウンロード

2設定ファイル(migrationsettings.json)の編集

zip を解凍したフォルダに設定ファイル(migrationsettings.json)があります。
ここに入出力の設定を記述します。

SourceSink の方向にデータが出力されます。

以下は 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 を使用すると以下の手順でダウンロードできます。

  1. リンクサービスの作成
  2. データセットの作成
  3. パイプライン(コピーアクティビティ)の作成と実行

Azure Data Factory、リンクサービス、データセット、パイプラインの作成時点では課金は発生せず、パイプラインの実行時に以下の単位で課金が発生します。

  • コピーアクティビティ: 実行時間単位
  • Cosmos DB: Request Unit(RU)単位
  • Blob Storage: 書き込み容量+トランザクション単位

リージョン間のデータ転送が発生する場合もデータ量に応じた課金が発生するので、Cosmos DB と Blob Storage は同じリージョンに配置したほうが低コストになります。

パイプラインを実行するまでの手順を見てみましょう。

1Azure Data Factory(ADF)を作成

ポータルから Data Factory (V2) を選択します(図3)。
(日本語では「データ ファクトリ」です)

図3 Data Factory (V2)を選択図3 Data Factory (V2)を選択


「作成」ボタンをクリックして「データ ファクトリの作成」画面に進みます(図4)。

図4 データ ファクトリの作成図4 データ ファクトリの作成

  • リソースグループ
  • 名前
  • リージョン

をそれぞれ選択、入力してください。
バージョンは「V2」を選択し、「確認と作成」をクリックしてデータファクトリを作成します。

2Cosmos DB のリンクサービスを作成

作成したデータファクトリから「スタジオの起動」をクリックします(図5)。

図5 「スタジオの起動」をクリック図5 「スタジオの起動」をクリック


管理 > リンク サービス > リンク サービスを作成 をクリックします(図6)。

図6 リンク サービスを作成図6 リンク サービスを作成


Azure Cosmos DB for NoSQL を選択して「続行」をクリックします(図7)。

図7 Azure Cosmos DB for NoSQL を選択図7 Azure Cosmos DB for NoSQL を選択


名前に任意の識別名をつけて、Cosmos DB の接続情報を選択し、「作成」をクリックします(図8)。

図8 新しいリンクサービス図8 新しいリンクサービス

3Blob Storage のリンクサービスを作成

Cosmos DB の場合と同様に、リンクサービスの新規作成 >「Azure BLOB ストレージ」を選択 > 「続行」をクリックします(図9)。

図9 新しいリンク サービス図9 新しいリンク サービス


名前に任意の識別名をつけて、Blob Storage の接続情報を選択し、「作成」をクリックします(図10)。

図10 新しいリンク サービスを作成図10 新しいリンク サービスを作成

4Cosmos DB のデータセットを作成

次に Cosmos DB のデータセットを作成します。

作成(鉛筆マーク) > データセット > 新しいデータセット を選択します(図11)。

図11図11


「Azure Cosmos DB for NoSQL」を選択して、「続行」をクリックします(図12)。

図12 新しいデータセット図12 新しいデータセット


リンクサービスに 2. で作成した Cosmos DB のリンクサービスを選択し、出力元となるコンテナーを選択します(図13)。

図13 プロパティの設定図13 プロパティの設定

5Blob Storage のデータセットを作成

Cosmos DB と同様に Blob Storage のデータセットを作成します。

作成(鉛筆マーク) > データセット > 新しいデータセット >「Azure BLOB ストレージ」を選択して、「続行」をクリックします(図14)。

図14 新しいデータセット図14 新しいデータセット


「JSON」を選択し、「続行」をクリックします(図15)。

図15 形式の選択図15 形式の選択

  • リンクサービス
    作成した Blob Storage のリンクサービスを選択します。

  • ファイル パス
    出力先のファイルパスになります。

  • スキーマのインポート
    「なし」を選択します。


「OK」をクリックします(図16)。

図16図16

6パイプラインの作成

Cosmos DB から Blob Storage へデータをコピーするパイプラインを作成します。

作成 >パイプライン > 新しいパイプライン を選択します(図17)。

図17図17


アクティビティから「データのコピー」をドラッグします(図18)。

図18 「データのコピー」をドラッグ図18 「データのコピー」をドラッグ


「ソース」タブで Cosmos DB のデータセットを選択します(図19)。

図19 ソースに Cosmos DB のデータセットを選択図19 ソースに Cosmos DB のデータセットを選択


「シンク」タブで Blob Storage のデータセットを選択します(図20)。

図20 シンクに Blob Storage のデータセットを選択図20 シンクに Blob Storage のデータセットを選択


ここで「すべて発行」をクリックして作成を確定します(図21、図22)。発行を行わなかった場合、作成したデータセットとパイプラインはブラウザを閉じると消えてしまうので注意してください。(リンクサービスは残ります)

図21 すべて発行図21 すべて発行

図22 発行図22 発行

7パイプラインの実行

「デバッグ」をクリックするとデバッグが開始されます(図23)。

図23図23


しばらく待つと以下のように実行結果が表示されます(図24)。

図24図24

8JSON をダウンロード

出力先に指定した Blob Storage のコンテナー/ディレクトリーに移動します。
ファイルが作成されているので、コンテキストメニューから「ダウンロード」を選択します(図25)。

図25図25

Azure Data Factory を使用した Cosmos DB のバックアップ手順は以上になります。

この例では出力ファイル名は固定でしたが、動的なファイル名を指定することもできます。

  • シンク側のデータセットにパラメータを追加(図26)
    filename という名前で String 型のパラメータを追加します。
  • パイプラインの 「データのコピー」アクティビティ > シンク > データセットのプロパティ
    filename に以下の式を設定します(図27)。
@concat('output_', formatDateTime(utcNow(), 'yyyyMMddHHmmss'), '.json')

図27 filename に式を設定図27 filename に式を設定

これで、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 とは何ですか