Azureの小ネタ (改)

~Azureネタを中心に、色々とその他の技術的なことなどを~

最近のAzure Client SDK事情

更新をサボっている間に、Azure Storage SDK for .NET の V11がリリースされていました。NuGet Gallery | Microsoft.Azure.Storage.Blob 11.0.0、現時点でリリースノートを見つけられないので、Breaking Changesがあったのかは不明です。特に変わってないようですが。

また、並行して 12.0 が preview されております。NuGet Gallery | Azure.Storage.Blobs 12.0.0-preview.1 こちらはがっつりパッケージ名、名前空間、APIが変わっている感じです。

最近は、 Azure/azure-sdk: Azure SDK Client SDKのガイドラインなども公表されており、この流れにそって各言語のSDKが再デザインされるような流れになっているのかもしれません。

細かい話は以下なども参考に。

今まで(11.0)

例えばいままでの有り触れたBlobへのファイルアップロードコードです。やっていることと言えば、

  • アカウント名とキーからクレデンシャルを作成
  • それを元にアカウントオブジェクトからのBlobClientを作成
  • なければコンテナ作って
  • Blobへのリファレンスオブジェクト作って
  • ファイルをアップロードすると。UploadメソッドもFromFileやらFromStream、FromByteArray などいくつか用意されていました。
   var creds = new StorageCredentials(name, key);
   var account = new CloudStorageAccount(creds, useHttps: true);
   var client = account.CreateCloudBlobClient();

   var contaier = client.GetContainerReference("container");
   contaier.CreateIfNotExists();
   var blob = contaier.GetBlockBlobReference("blob.txt");
   blob.UploadFromFile(@"c:\some.txt");

※ 書きようによってはもっと違う書き方もできますけど一例ということで。

これから (12.0-preview)

12.0 preview ですと、また名前空間が Azure.Storage.Blobsに変わってます。またコードもザクと変わってます(一例ですが)

  • CloudStorageAccountが無くなった
  • CloudBlobClientも無くなった
  • 例えばUploadなんかは、Streamしか引数を取ってくれない(ユーティリティ的なメソッドなし)
  • 代わりに生レスポンスが受け取れる
    var creds = new StorageSharedKeyCredential(accountName, key);
    var container = new BlobContainerClient(new Uri($"https://{accountName}.blob.core.windows.net/clientTest"), creds);
    Response<ContainerInfo> res = container.Create();

    // 生レスポンスが取れる
    // res.GetRawResponse().ClientRequestId;
    // res.GetRawResponse().Headers
    // res.GetRawResponse().ReasonPhrase;
    // res.GetRawResponse().Status;
    // res.GetRawResponse().ContentStream;

    // ContanierInfo
    // res.Value.ETag;
    // res.Value.LastModified;

    BlobClient blob = container.GetBlobClient("blob.txt");
    using (var stream = File.OpenRead(@"c:\some.txt"))
    {
        Response<BlobContentInfo> res2 = blob.Upload(stream);
    }

レスポンスなどに興味のある方は以下のリファレンスを参照してください。

Response Struct(Azure)-Azure for .NET開発者| Microsoft Docs

ContainerInfo Class (Azure.Storage.Blobs.Models) - Azure for .NET Developers | Microsoft Docs

何度目ですか?って思うくらいの大幅変更です。対応言語も増えましたし、はやり廃りもありますから、ライブラリの設計って難しいですね。 そいえば以前、Storage SDK for Java が先行して新しいSDKを出していましたが、似たような感じになっていくのかもしれません。 Azure storage SDK for java V10 (その1) - Azureの小ネタ (改)

ずっと流れを追っていれば変遷も分かるのですが、初学者はとっつきにくくなっている気もします。

以上

Azure Storage SDK for .NET の V10が出ました

Azure Storage SDK for .NET の V10がリリースされました。(JavaのV10とは無関係です)

github.com

Breaking changeとして、名前空間変更があります。

例えば、V9 で BLOBを参照すると以下のような、WindowsAzure が未だに入っていましたが、

using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Auth;
using Microsoft.WindowsAzure.Storage.Blob;

V10になり、単にAzureに置き換えられました。

using Microsoft.Azure.Storage;
using Microsoft.Azure.Storage.Auth;
using Microsoft.Azure.Storage.Blob;

本記事執筆時の3日前ほどにリリースされたようです。4/6くらいでしょうか。

www.nuget.org

相変わらずTable API は無くなったままでCosmosDBのを使え的な感じですけど、問題ないんだっけ?

おわり

Maven Plugin for Azure で例外がでる場合の対処

Java 11を使っていると、mvn で例外が発生するので、その回避策のメモです。

> java --version
java 11.0.1 2018-10-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.1+13-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.1+13-LTS, mixed mode)

これは、一部ライブラリが標準でなくなってしまった影響です。実行結果を見ると、JAXBExceptionが発生していることがわかります。

www.oracle.com

> mvn azure-webapp:config
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------------< test.webapp:test-server2 >----------------------
[INFO] Building test-server2 Maven Webapp 1.0-SNAPSHOT
[INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] --- azure-webapp-maven-plugin:1.5.4:config (default-cli) @ test-server2 ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.471 s
[INFO] Finished at: 2019-03-29T07:10:35+09:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal com.microsoft.azure:azure-webapp-maven-plugin:1.5.4:config (default-cli) on project test-server2: Execution default-cli of goal com.microsoft.azure:azure-webapp-maven-plugin:1.5.4:config failed: A required class was missing while executing com.microsoft.azure:azure-webapp-maven-plugin:1.5.4:config: javax/xml/bind/JAXBException

回避方法

とりあえず、plugin要素下に普通にJAXBへの依存を書けばよいです。

  <build>
    <finalName>test-server2</finalName>
    <plugins>
      <plugin>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>azure-webapp-maven-plugin</artifactId>
        <version>1.5.4</version>
        <dependencies>
          <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.1</version>
          </dependency>
        </dependencies>
      </plugin>
    </plugins>
  </build>

pluginの下に記述できるのを知らなくてしばし悩みました。根本的には、Pluginで対処してもらうしかなさそうですが。