ASP.NET Core を Visual Studio 2017 RC から App Service Web App for Linux へデプロイしてみる

ざくり言えば、以下をやっていけばいいです。あまりにざっくりなんですが、プレビューで期待しない動きも多いので、とりあえず今の時点で、と思ってもらえればと。手順としては 11 Dec. 2016 時点です。

本記事は、 http://qiita.com/advent-calendar/2016/asp-net の12日目です。

こんなのまるで ASP.NET Core の話じゃないじゃん、という気もややするのですが、そこは一つ。どうしてもここ、VS2017 でやると、同じ軸足の話とも言えなくもない。はず。ダメなら連絡ください。

Dock for Windows を入れる

Stable でもいいのでしょうが、私は都合で Beta channel を入れてます。最初の確認手順のPS> docker run hello-world が動作すれば十分だと思います。

検証確認を3つやった場合の3つ目で、Windows 上で nginx を起動するやつがあります。楽しい時代ですなホント。ここ、既に 80 番ポートを起動してるやつがいるとコケるので、焦らずに。IIS が既に入っている場合は止めてやってください。また、 Skype は 80 を握ったりするギルティなやつなので、消し去ってもいいと思います。

Hyper-V 上で動いてる MobyLinuxVM で動いてるようです。

Visual Studio 2017 RC を入れる

バージョンは適当に状況に合わせて。インストールの機能選択の画面で、ASP.NET Core 開発のチェックボックス入れてあげてください。

ASP.NET Core のソリューション・プロジェクトを作成します。 Enable Container (Docker) Support にチェック入れてあげます。ここに書いてあるリンクが、先の Docker for Windows のインストール手順がかかれている URL です。

さらっといけば、こんなノリ。いろいろ入ってますな。

しれっとな動きですが、VS2017 RC だと .csproj でしか作成されません。仮に project.json なプロジェクトを開くと、片道切符の変換するぜ(バックアップはするけどな)よろしく、っていう画面が出てきます。余談ですが。

そしてこれも余談なのですが、RC1/2 の時代、不慣れだったので、ASP.NET Core を net 461 限定で動かすような設定を project.json に書いて動かしてたのですが(ようは ASP.NET Core な上の箱を .NET Framework 4.6.1 でのみ動かすぞ、という強い意思での設定)、そのプロジェクトの変換に、 VS2017 RC は 100% 確実に失敗します。なので直したんですが、まぁ3時間ほどかかる作業で。。

なかなかに世の中は難しいです。

で本題。デバッグに 「Docker」の表示があるので、クリックして、いつもの ASP.NET な画面が出るか、確認しましょう。

無事、いつもの画面。

Azure 上に App Service for Linux Web App for Linux の箱を作る

毎度の Azure ポータルから。ばりばり GUI 使っていきましょう。

まだプレビューなのでちょっとクセあります。以下注意点。手動でひとつひとつやるケースです。RMで一括でドン、って感じは先々誰かなんとかしてくれるはず。

  • Service App for Linux が設定可能な場所が限られてるので、何かといろいろ困らないよう、全て米国西部を前提でやりましょう。
  • まずは専用の リソースグループ を作りましょう。
  • で、ストレージアカウントを作りましょう。汎用でいいです。Containerのレジストリが利用します。次の手順で同時に作成することも可能です。気持ちの問題。
  • こちらもプレビューな Container registry サービスを追加します。ここの設定画面で、 「ADMIN USER」を Enable にしてください。ちなみに後でも変えられます。

で、ここで変な操作します。多分、プレビューな今だけ手順。

使わずに捨てる用の「Web App for Linux」を最初に作成します。

これ。ここの作成手順で同時に作成する「サービスプラン」を、後ほど使いまわします。なので、うまい感じのネーミングでお願いします。Linux 用のサービスプランは Linux 専用なわけで、Windows用のそれとは別です。

また、現時点では、Linux 用のサービスプランを使う App Service が存在しなくなると、管理ポータルからそのサービスプランをいじれなくなってしまい、リソースグループまるごと消す羽目になります。CUI ならなんとかなるんでしょうか。GUI だとダメなんす。

で、ここで作成した、捨てる用の App Service は、停止して放置しておいてください。FTP 配置用など別の検証に使ってもいいかもしれません。設定次第で使い方は無限大。

ここまでできたら、Visual Studio 2017 RC に戻ります。VS2017 RC から、期待したContainer registry を参照した Web Apps を上手く自動でよろしく作ってくれるので、任せましょう。楽が出来る事は楽しましょう。

Visual Studio 2017 RC でパブリッシュの設定を作る

プロジェクトの「公開」を選ぶと、ノペっとした作成画面が出てくるので、

「New Profile」 で「OK」すれば、

以下の画面が出ます。

この画面から、直接に リソースグループや サービスプラン、Container registry も作成できるよう。なのですが、ストレージアカウントのネーミングが毎度の数字になってしまったりでもろもろなので、どうかな、という感じ。私はあの名前付けが嫌な人なので、予め作っておいて、見た目の気分を良くします。

で、「作成」を押しましょう。

Azure の管理ポータル側で見ると、 App Service が一つ増えています。

この状態だと、まだアプリは空の状態で、初期の設定だけが入っています。

空ですが、アプリ設定だけ入ってます。 Web Deploy する際の繋ぎの設定ですかね。
こちらは見事に空で、プライベートレジストリも入ってない様子。デプロイ後に入ってきます。

で、 VS2017 RC からデプロイします。「Publish」をぽちっとな。

ビルドして docker さんが仕事して、

ブラウザが起動して、画面に出てきます。

2回目以降は、コミット差分がある分を見て必要な分だけ push するようなので、時間が短縮されてささっと起動します。

先ほど空だった設定にも、各種の値が入ってます。

スケールアウトして3倍の性能を手に入れてみる

PaaS の本領発揮。OSや基盤の構成をほぼやってないのに、ボタンぽちっとで性能3倍。かつOS側のパッチ適用メンテが不要。神ですな。

でここ。設定前は 1 になってるので、3にして「保存」です。おわり。

さすがに確認してみたいところなので、コード側を雑に直します。

// ..\Views\Home\Index.cshtml に以下を適当に追加
<div class="row" style="margin-top:12px;">
<div class="col-md-12">
@(Environment.GetEnvironmentVariable("HOSTNAME"))
</div>
</div>

で、「Publish」します。 docker さんがまた仕事してくれるので、ブラウザが起動するまで待ちましょう。で以下の通り。

Docker のコンテナIDっぽいですね。

で、F5 で更新!って変わらない。変わらないです。ARRアフィニティってのがあって、極力同じインスタンスにつながるようになってるからですね。以下の設定でオフにして、保存しましょう。

で、また F5 更新だ!おりゃー

を、

をを、

ををを?

あ、もどった。3回ぐらいでサイクリックしたので、3インスタンスっぽい。いいですね。

テストが終わったら、忘れずにサイズは戻しましょう。

まとめ

あまりまとめる事もないんですが、以前やったこれ、

FTP で VS2015 から配置して動かしたときは、大変時間がかかったのですが、今回のはなかなにスムースですね。いい感じです。

まるで マイクロソフト な世界とは違う感じでいろんな技術ががっちゃんこして動いてて、感心するばかり。今後の成長に期待が膨らみますね。いや素晴らしい。