Azure Files & Azure File Sync を使ったバックアップや共有フォルダの同期

前にも調べたのだけど、ついに使う時が来てくれそうなので、【オンライン】札幌 Azure/Microsoft Learn もくもく会 30(2021/01) – connpass で思い出しつつまとめ。Azure Filesや同期の仕組みはかなり簡単に導入できるし、ファイルサイズの大きいデータを大量に扱わないのであれば料金もさほど高くないのでありがたい。

やりたいこと

  • オンプレの共有フォルダをクラウド側に同期(バックアップ)したい。
  • 他の拠点の共有フォルダにも同期して使いたい日もあるかもしれない。
  • クラウド側の共有フォルダのファイルも使いたい(現状ちょっと微妙)。

手順

  1. Azure Files で共有フォルダを作る
    1. ストレージアカウントを作成する
    2. ファイル共有を作る
  2. オンプレミスに共有フォルダを作る(というか、元からある)
    1. OSは同期ツールの関係で2012R2、2016、2019にする。
    2. 他は特に何もすることはないけど、WindowsServer上で共有フォルダを作る。
  3. ストレージ同期サービスを追加する
    1. 同期グループを追加
    2. クラウド エンドポイントを追加(同期グループを追加するときに一緒に追加できた気がする)
    3. オンプレミスの共有フォルダサーバーに、Azure File Sync Agentをインストールして、Azureに接続する。
    4. ストレージ同期サービスからサーバーエンドポイントを追加する。
  4. 別の拠点にも同期させたい場合には、同期グループに対して、サーバーエンドポイントを追加する(同期サーバーは1台まで無料、あとは1台ごとに追加費用がかかる)。

できること

  • 同期
    • ここまで設定すると、オンプレのサーバーでファイルを編集すると、Azure の共有フォルダに同期してくれるようになる。
    • また、他の同期サーバーに対しても同期してくれる。
    • 同時に更新があった場合には、上書きはされず、別名で保存してくれる。
  • Azure Files
    • 私の家の環境では、VPN接続して利用している会社の共有フォルダとAzure Filesの共有フォルダは同じくらいの応答速度で操作できる。

ポイント・こまることなど

  • Azure Filesの共有フォルダにアクセスする場合、ポート445の通信をできるようにしておく必要がある。昔のファイアウォール設定のままだと445の通信を遮断している場合がある。
  • Azureの共有フォルダのファイルを更新した場合、何もしないと24時間ごとに変更を検知して同期する(らしい。未確認)。
    即時同期させたい場合には、Invoke-AzStorageSyncChangeDetection コマンドで変更を検知して同期させる必要がある。
    このコマンドでは結局ファイルを全検索しての検知になるのでそれなりに時間がかかる。パラメータでPathやディレクトリを指定できるのでいい感じにするしかない。
  • 24時間とか遅いじゃん! という方は、要望があがっているのでVoteしておきましょう。
    Enable immediate sync after changes on the Azure file share for Azure File Sync – Customer Feedback for ACE Community Tooling
  • 料金のうちディスク容量、同期サーバー数ははっきりわかるが、操作による金額やデータ転送量の金額がどの程度になるかがざっくり計算しかできずモヤモヤする。
    同期するとしてどの程度の操作数やデータ転送量になるか、サーバーで計測できるツールとかないでしょうか・・・。SQL ServerのDTU計算みたいなやつがあると楽なんだけどなー。
  • 実際に複数人で使った時にどんな感じになるとか、パフォーマンスがどうか、とかわからないことはまだあるので、実際に使うことができたらまとめていきたい。

CosmosDB Serverless preview

CosmosDBのserverlessのPreviewがきたということで、【オンライン】札幌 Azure/Microsoft Learn もくもく会 25(2020/08) でちょっと試してみました。といっても限界まで試したとか金額計算したというわけではないので、そこらへんはしばやんさんのブログがわかりやすいです。

Azure Cosmos DB Serverless が Preview になったので試した – しばやん雑記

今回は、.netのコンソールアプリからCosmosDBにアイテムを追加するところを試してみました。

CosmosDBの準備

1.適当にリソースグループを作成します。
2.リソースグループにCosmosDBを作成します。
Capacity modeを Serverless(preview) に設定します。

3.接続文字列をメモっておきます。

CosmosDBにアイテムを追加してみる

1.Visual Studio から .Net Frameworkのコンソールプロジェクトを作成します。
2.nugetから Microsoft.Azure.Cosmos をインストールします。
3.下のような感じのプログラムを作ります。
CosmosClientを作って接続して、CreateDatabaseIfNotExistsAsync、CreateContainerIfNotExistsAsyncでデータベース、コンテナを作成し、CreateItemAsyncでコンテナにアイテムを追加します。
using Microsoft.Azure.Cosmos;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace CosmosDB_BulkSupport
{
    class DemoItem
    {
        public string Id { get; set; }
        public string Name { get; set; }
        public DateTime CreatedOn { get; set; }
        public string PartitionKey { get; set; }
    }


    class Program
    {
        static async Task Main(string[] args)
        {
            var connectionString = "xxxx";
            var databaseId = "TestDB";
            var containerId = "TestContainer";
            var partitionKey = "/partitionKey";


            // SerializerOptionsで CosmosPropertyNamingPolicy.CamelCaseを指定しているので、
            // CosmosDBに投げるJSONは "PartitionKey": "..." ではなく "partitionKey": "..."になる。
            // そのため、コンテナの PartitionKey には "/partitionKey" を指定する
            // また、CosmosDBのアイテムに id が必要なので、 CosmosPropertyNamingPolicy.CamelCase を指定しない場合には、
            //         [JsonProperty(PropertyName = "id")]
            //         public string Id { get; set; }
            // こんな感じで Id を id にしてあげる。
            // その場合には、コンテナのPartitionKeyには、"/PartitionKey"を指定する(のだと思う。試してない)


            var cosmosClient = new CosmosClient(connectionString, new CosmosClientOptions
            {
                AllowBulkExecution = true,
                SerializerOptions = new CosmosSerializationOptions
                {
                    PropertyNamingPolicy = CosmosPropertyNamingPolicy.CamelCase
                }
            });


            Database database = await cosmosClient.CreateDatabaseIfNotExistsAsync(databaseId);
            Container container = await database.CreateContainerIfNotExistsAsync(containerId, partitionKey);


            var tasks = Enumerable.Range(1, 10000)
                                  .Select(x => new DemoItem
                                  {
                                      Id = Guid.NewGuid().ToString(),
                                      Name = $"Test-{x}",
                                      CreatedOn = DateTime.Now,
                                      PartitionKey = Guid.NewGuid().ToString()
                                  })
                                  .Select(x => container.CreateItemAsync(x, new PartitionKey(x.PartitionKey)));


            await Task.WhenAll(tasks);
        }
    }
}
4.実行して、Azureのコントロールパネルからアイテムの登録やRUの状況を確認します。
これだけだとServerlessは全然関係ないですが、料金の感じを見ると、平均してRUを消費するわけではなく、Free Tierを超えるような使い方であればちょうどよい・・・んでしょうか。つかってないのでよくわかりません。 次のような記事もありましたので、今度どこかでマスタ系にFree Tierを使ってみて、感触を確かめてみようかなーとおもいます。

Azure Cosmos DB Free Tier をプロダクション環境で使う – PaaSがかりの部屋