Azureの小ネタ (改)

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

色々なAzure WebApps に Spring Boot アプリケーションをデプロイする方法

Azure WebAppsへのデプロイは azure-webapp-maven-plugin でやっているのですが、いつも色々細かい設定を忘れがちなので、備忘録にまとめました。

github.com

以下README転載気味

色々なAzure WebApps に Spring Boot アプリケーションをデプロイする方法

Azure WebApps は複数のOS(Windows、Linux)と複数のアプリケーションコンテナをサポートしています。それぞれのAzure WebAppsにデプロイする最小コードのサンプルです。

以下の組み合わせを想定しています

  • Windows

    • Jetty (jar)
    • Tomcat 8.5 (war)
  • Linux

    • JRE (jar)
    • Tomcat 8.5 (war)

最小サンプルは、JSON を返却する RestControllerです。

デプロイ方法

pom.xml(共通)

azure-webapp-maven-plugin を利用しています。Web Appsの構成は pom.xml に記述されています。mvn azure-webapp:config で再構成が可能です。またconfiguration 要素を削除してから実行すると、初期設定可能です。

最小限、各々の pom.xml の以下を書き換えてください。

appName 要素 は、 Azure WebApps のドメインです。Azure全体で一意な必要があるため、そこだけは書き換える必要があります。

resourceGroupappServicePlanName また、pricingTierregion は任意に書き換えればよいです。

各要素の詳細は、 Maven Plugin for Azure App Service | Microsoft Docs のリファレンスを参照のこと。

サブスクリプション

az コマンドであらかじめAzureサブスクリプションにログインする必要があります。サブスクリプションが複数ある場合は、一覧の IsDefaultTrue なものに作られますので、デフォルトに注意してください。

az account login
az account list -o table 

実際の操作

linux jre8

WebApps on Linux に Spring Boot の jar をデプロイするサンプルです。

mvn clean package azure-webapp:deploy

とAzure上にリソースが作成され、デプロイされます。リソースが作成済みの場合はそれが利用されます。ブラウザや curl でURLを叩くとJSONのレスポンスが取得できます。

curl https://foobar.azurewebsites.net/hello?name=world

Windows jetty

WebApps on Windows に Spring Boot の jar をデプロイするサンプルです。コンテナがJettyになっています。

オペレーションはlinux jre8 と同様です。

Linux Tomcat 8.5

WebApps on Linux に Spring Boot の war をデプロイするサンプルです。jar をデプロイする場合との差分を説明します。

SpringBootServletInitializer を継承します。これがないとデプロイは成功しますが起動しません。 war からSpring Bootアプリケーションを起動するときには必須です。それに加えconfigure メソッドをオーバーライドします(しなくても実行できたけど)。

また、pom.xml<packaging>war</packageing> を定義します。詳細はサンプルを参照してください。

以下でデプロイします。spring boot plugin を削除するのが面倒だったので(ローカルでrunしたかったので)、リパッケージをスキップしてます。

mvn clean package azure-webapp:deploy -Dspring-boot.repackage.skip=true

サンプルでは sample コンテキストにデプロイするようになっています。ROOTコンテキストにデプロイしたい場合は、configuration 配下の以下の要素を削除してください。

<targetPath>${project.build.finalName}</targetPath>

curl を実行してレスポンスを確認します。

curl https://foobar.azurewebsites.net/sample/hello

Tomcatですとデプロイしてからレスポンスが返ってくるまで少し時間がかかりるみたいです。

Windows Tomcat 8.5

Linux の場合と同じです。

以上

最近のAzure Client SDK事情 Java編

Azure storage SDK for java V10 (その1) - Azureの小ネタ (改) で言及したように、V8から大幅変更されたV10がリリースされてから約一年たちましたが、V10系(現在はV11)の失敗を認めて、V12系を新規に立ち上げるようです。

V10を試してみたとき使いにくいSDKだなとは思っていたのですが、 こんな Issue まで立てられるしまつ。 This API is useless (v10) · Issue #432 · Azure/azure-storage-java

そして以下のようなリリースを見つけました。(この記事執筆時点で5 days ago なので、そこそこ早く見つけた感)

azure-storage-java/V12 Upgrade Story.md at master · Azure/azure-storage-java

そもそもV8では

そのそもV8ではBlob/Queue/Tableなどすべての機能が入っておりフィットプリントの大きさや、スレッドセーフ、オブジェクトの不変性、同期APIベースなどが問題になりV10への移行が決定したわけですが、V10では少々やり過ぎて、ホントにREST APIに薄い皮が被ったラッパーAPIと化した感じでしたし、非同期APIしかなかったし。

V10になって

先ほどの文書を多少意訳しますと以下のような感じです。

  • 大規模なアプリでのネットワーク不安定 Rx-Netty実装の結果
  • 同期APIの非サポート
  • 扱いにくく、直感的でな設計(クラス)
  • 利便性の欠如(まあ、SDKは便利なAPIをサポートしてなんぼという気もしますが、コンテナのexistsメソッドもなかったですし)

V12では

V12ではこれらを反映して、同期、非同期の両APIサポート、フレームワークライブラリ変更(RxJavaからReactor、okhttp から Reactor-Netty などなど。

その他、色々と反省の弁が書かれていますので、ぜひご一読を(Google翻訳で普通に読める感じに翻訳されますw)

ライブラリは既に公開されていますので、例によってコンテナ作ってファイルをアップロードするサンプルの破片など。名前空間は、com.azureに変更されてます。MavenのGroupIdもcom.microsoft.azureからcom.azureへ。

SharedKeyCredential creds = new SharedKeyCredential(accountName, key);
        
        StorageClient client = new StorageClientBuilder()
                .credential(creds)
                .endpoint("https://" + accountName + ".blob.core.windows.net").buildClient();

        ContainerClient containerClient = client.getContainerClient("hoge");
        if (containerClient.exists().value() == false) {
            containerClient.create();
        }

        BlockBlobClient blobClient = containerClient.getBlockBlobClient("blob.txt");
        blobClient.uploadFromFile("c:/temp/a.pdf");

ちなみに、V8系, V10系はともにメンテナンスは継続されるとのこと。ではでは。

[追加]

ソースのありか。READMEにサンプルが書かれてます。

azure-sdk-for-java/sdk/storage/azure-storage-blob at master · Azure/azure-sdk-for-java · GitHub

最近の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の小ネタ (改)

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

以上