Azure CosmosDBのテーブルAPI SDKのサポートバージョンでハマった

SQL Serverのテーブルを使っていたシステムの一部をAzure Cosmos DBのテーブルを使うように出来ないかという相談をされました。

もともと一時的な保存領域として使っていたので、システムとしての移行は問題なさそうでしたが、.NET Framework4.5で書かれていたのでCosmosDBのテーブルAPIのSDKが対応していませんでした。調べてみるとテーブルAPIのSDKは.NET Framework4.5.1以降の対応でした。他の機能との互換性もあって.NET Frameworkのバージョンは簡単には上げられそうにないです。これはさすがに詰みです。

その他のAPIと.NET Frameworkのバージョンを調べてみました。

API名 .NET Frameworkのサポートバージョン
SQL API v4.5
テーブル API v4.5.1
Graph API v4.6.1

新しいモノを使う時は下位互換性や上位互換性までチェックしないといけないという事例でした。

Azure Functionsで自作の外部ライブラリを使う

Visual StudioでAzure Functionsの関数を扱うときには、Functions用のプロジェクトを作成してデプロイしますが、別プロジェクトで作成した自作のライブラリを使うこともあると思います。

簡単な例として、足し算を行うライブラリと、それを用いて計算結果を表示するFunctionsで作ってみました。ライブラリとFunctionsは別のプロジェクトにしています。

ライブラリのコード

namespace Adder
{
    public class Class1
    {
        public static int Add(int a, int b)
        {
            return a + b;
        }
    }
}

 

Functionsのトリガーは何でもよかったのですが、簡単のため、キューをトリガーとして動作するようにしました。ライブラリを参照として追加しています。

Functionsのコード

using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Adder;

namespace FunctionApp
{
    public static class Function1
    {
        [FunctionName("Function1")]
        public static void Run([QueueTrigger("myqueue-items", Connection = "AzureWebJobsStorage")]string myQueueItem, TraceWriter log)
        {
            log.Info($"1 + 2 = {Class1.Add(1, 2)}");
        }
    }
}

 

これでビルド、Azure環境にデプロイ、実行すると計算結果がきちんとログに表示されています。

[Info] Function started (Id=c86b54e4-5af4-4d1a-af28-116a6fb0af12)
[Info] 1 + 2 = 3
[Info] Function completed (Success, Id=c86b54e4-5af4-4d1a-af28-116a6fb0af12, Duration=2ms)

また、コンソールからディレクトリを見てみると、Functions用のDLLの他に、ライブラリ用のDLLがアップロードされていることが分かります。

特に難しくはないのですが、注意としてフレームワークを揃えることと、クラスライブラリのプロジェクトにすることです。

SQLインストール済みの仮想マシンのディスク容量に驚いた

SQL Serverで作成したデータベースに外部からアクセスするテストを行うため、SQL Server Expressの環境が必要になりました。物理マシンにインストールすると環境が汚れるので、AzureのSQL Server Expressがインストールされた仮想マシンイメージを使うことにしました。

  • OSはWindows Server 2016
  • 仮想マシンのサイズはD1
  • SQL Serverのバージョンは2017のExpress
  • OSディスクはSSD

とここまでは良かったのですが、実際に作成してみると、OSディスクの他にデータディスクが自動で追加されており、そのサイズがP30(1023GiB)となっていました。データディスクはサイズの拡大が出来ても縮小はできません。値段も13000円/月程度になってしまいます。

Enterprise版とか本番環境を想定するならそれぐらい必要かもしれませんが、こちらはあくまでも簡易的な環境が用意できれば良いと言うことだったので、P6(60GiB)程度になってほしかったです。

テストが完了したら即刻削除しました。素直にAzure SQL Databaseにしておけばよかったと反省しています。