ROMANCE DAWN for the new world

Microsoft Azure を中心とした技術情報を書いています。

書籍「プログラミング ASP.NET Core」の感想

Dino Esposite が書いた「Programming ASP.NET Core」の日本語翻訳版が出版されると知って、早速「プログラミング ASP.NET Core」を読んでみました。

プログラミングASP.NET Core (マイクロソフト関連書)

プログラミングASP.NET Core (マイクロソフト関連書)

  • 作者: Dino Esposito,日本マイクロソフト井上章監訳,株式会社クイープ
  • 出版社/メーカー: 日経BP社
  • 発売日: 2019/05/23
  • メディア: 単行本
  • この商品を含むブログを見る

目次

第1部 新しい ASP.NET の概要
 第1章 新しい ASP.NET の存在意義
 第2章 初めての ASP.NET Core プロジェクト
第2部 ASP.NET MVC のアプリケーションモデル
 第3章 ASP.NET MVC の起動
 第4章 ASP.NET MVC のコントローラー
 第5章 ASP.NET MVC のビュー
 第6章 Razor の構文
第3部 横断的関心事
 第7章 設計について考える
 第8章 アプリケーションのセキュリティ
 第9章 アプリケーションデータへのアクセス
第4部 フロントエンド
 第10章 Web API の設計
 第11章 クライアント側からのデータ送信
 第12章 クライアント側のデータバインディング
 第13章 デバイスフレンドリなビューの構築
第5部 ASP.NET Core のエコシステム
 第14章 ASP.NET Core のランタイム環境
 第15章 ASP.NET Core アプリケーションのデプロイメント
 第16章 移行戦略と導入戦略

書籍で解説されているサンプルコードは、GitHub でも公開されています。
github.com

どんな書籍なのか

この書籍は、Web 開発の最低限の知識を持っていれば、ASP.NET の初心者にも理解できる内容ですが、やはり従来の ASP.NET 開発者に読んでほしい書籍です。

第1部では、これまでの .NET の歴史を振り返りながら、ASP.NET Core が登場した背景を明らかにし、Hello World な ASP.NET Core アプリケーションを動かすまでのイントロダクションとなっています。

第2部では、ASP.NET Core の MVC アプリケーションモデルについて、順を追ってアーキテクチャを解説しており、従来の ASP.NET との違いを押さえつつ、構造や仕組みを理解することができます。

第3部では、ASP.NET Core では欠かすことができない DI の役割を紹介し、従来の3層アーキテクチャではなく、プレゼンテーション、アプリケーション、ドメイン、インフラストラクチャの4層の Layered Architecture パターンをベースに横断的関心事を解説しています。セキュリティとして ASP.NET Identity による認証認可、データアクセスとして Entity Framework Core を解説していますが、モノリシックなアプリケーションを例に挙げたコマンドとクエリの分割にも触れ、Layered Architecture パターンと CQRS パターンの組み合わせまで解説している部分がよかったです。

第4部では、従来の ASP.NET では MVC とは別実装となっていた Web API について、ASP.NET Core での Web API をしっかりと解説しています。合わせて、クライアント側からのデータ送信やデータバインディングも解説しています。

第5部では、ASP.NET Core のランタイム環境やデプロイメント、最後に移行戦略を述べています。従来の ASP.NET アプリケーションの移行は、それなりのコストがかかるので、単純に最新版へのマイグレーションという目的だけでは不十分であり、クロスプラットフォーム、マイクロサービス、コンテナーといったクラウドネイティブなアプリケーションへの移行にビジネス上の価値があると見極めることが重要とする意見に同意です。

まとめ

先日の Microsoft Build 2019 では、.NET Core 3.0 の次バージョンが .NET 5 となるロードマップが発表されました。.NET 5 のネーミングはアレですが、ひとつの .NET として統一されることになります。
従来の ASP.NET 開発者に読んでもらい、クラウドネイティブなアプリケーションという未来に向かってチャレンジしてほしいと感じました。
devblogs.microsoft.com

Managed Service Identity を使って Azure Key Vault から接続文字列を取得する

Azure Key Vault は、アプリケーションが利用するシークレットを安全に保管してくれるサービスです。シークレットには、DBの接続文字列、API のアクセスキー、証明書などの情報があります。
アプリケーションで Azure Key Vault から接続文字列を取得するには、Azure Active Directory のサービスプリンシパルが必要となり、ソースコードに決め打ちしない構成やサービスプリンシパルの有効期間の管理など、少し手間がかかります。
Managed Service Identity(MSI)を使うことで、このあたりの煩わしさを解消できるようになっていたので、まとめておきます。

azure.microsoft.com

Azure Key Vault を作成する

Azure Portal を開いて、Azure Key Vault を作成します。特に説明は必要ないと思います。

f:id:TonyTonyKun:20190410202248p:plain

続いて、シークレットを作成します。今回は、SQL の接続文字列を想定したシークレット(SqlConnection)を追加しました。

f:id:TonyTonyKun:20190410202408p:plain

Azure Key Vault 側の準備は、これで完了です。

ローカル開発環境で接続文字列を取得する

Managed Service Identity(MSI)を利用すると、認証資格情報をアプリケーションに含めずに、Azure の各サービスへ認証を行うことができます。
今回は、ASP.NET Core で作成した Web アプリケーションで試してみます。Visual Studio のテンプレートから作成したシンプルな MVC アプリケーションです。
MSI を使って Azure Key Vault に接続するための2つの NuGet ライブラリをインストールします。

Install-Package Microsoft.Azure.KeyVault -Version 3.0.3
Install-Package Microsoft.Azure.Services.AppAuthentication -Version 1.0.3

HomeController クラスで、MSI を使って Azure Key Vault から接続文字列を取得するコードを書きます。
vaultBaseUrl は、先ほど作成した Azure Key Vault のURL です。AzureServiceTokenProvider を使って KeyVaultClient をインスタンス化している部分がポイントです。

public class HomeController : Controller
{
    public async Task<IActionResult> About()
    {
        var vaultBaseUrl = "https://xxx.vault.azure.net/";
        var provider = new AzureServiceTokenProvider();
        using (var client = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(provider.KeyVaultTokenCallback)))
        {
            var secret = await client.GetSecretAsync(vaultBaseUrl, "SqlConnection");
            ViewData["Message"] = secret.Value;
        }

        return View();
    }
}

ローカル開発環境で Visual Studio からデバッグ実行してみます。Azure Key Vault に作成したシークレット(SqlConnection)の値が取得できたことがわかります。

f:id:TonyTonyKun:20190410202424p:plain

ここで疑問に思うのが、ローカル開発環境からシークレットを取得できた理由です。
最近の Visual Studio では、Azure サービス認証に登録されたアカウントのトークンを使って AzureServiceTokenProvider が生成されるようになっているので、Visual Studio から Azure Web Apps にデプロイなどの機能を使っていれば、特に意識せずに Azure Key Vault に作成したシークレットを取得することができます。

f:id:TonyTonyKun:20190420121207p:plain

環境によってこの方法が利用できない場合には、環境変数「AzureServicesAuthConnectionString」を使いましょう。設定する値については、こちらを参照してください。

Azure Web Apps で接続文字列を取得する

先ほど作成した ASP.NET Core の Web アプリケーションを Azure Web Apps にデプロイしてみます。
Azure Web Apps の MSI を有効にしておきます。このタイミングで、サービスプリンシパルが追加されます。

f:id:TonyTonyKun:20190410203001p:plain

続いて、Azure Key Vault の Access policies で、Azure Web Apps のサービスプリンシパルを許可します。必要最低限のパーミッションとして、シークレットの Get だけを許可しました。忘れずに Save ボタンで保存ましょう。

f:id:TonyTonyKun:20190410202454p:plain

ASP.NET Core の Web アプリケーションを Azure Web Apps にデプロイし、結果を確認します。

f:id:TonyTonyKun:20190410202505p:plain

Azure Key Vault に作成したシークレット(SqlConnection)の値が取得できたことがわかります。

まとめ

アプリケーションを開発する際には、DBの接続文字列、API のアクセスキー、証明書などのシークレットは手間をかけずに安全に管理したいところです。MSI と Azure Key Vault を組み合わせて使うことで、このあたりの煩わしさを解消できます。パブリックなリポジトリでシークレットを公開してしまう事故を防ぐためにも、しっかりとアーキテクチャで考慮しておきたい事項です。

2018 年振り返り

今年も、しばやんさんが作った 2018 年の人気記事ランキング生成 を使わせてもらい、1年を振り返ってみます。

  1. ASP.NET でクライアントの IP アドレスを取得する
  2. HttpClient を使って同期で通信する
  3. ASP.NET Web API で multipart / form-data を使ってファイルをアップロードする
  4. プロキシ環境下で Web API を呼び出す
  5. ASP.NET MVC の Ajax 通信で例外を処理する
  6. ASP.NET MVC で JSON の一部として PartialView を返す方法
  7. ASP.NET Web API で返す JSON のプロパティを指定する
  8. ASP.NET Web API を経由して Azure Blob Storage にアクセスする
  9. ファイルをアップロードする API の Swagger ドキュメントを書く
  10. Entity Framework Core 1.0 で SQLite を使ってみる

例年通り、ASP.NET 関連の記事が、多く読まれているようです。Azure の記事が少ないというか、そもそも今年に書いた記事が少なめでした。
その代わり、Azure Kubernetes Service が 6月に GA したこともあり、コミュニティやイベントで登壇する機会を多く頂いて、これまでの知見を活かしてアウトプットできたかなとは思います。

あと、先日のAzureもくもく会@新宿では AKS のハンズオンっぽいこともやりました。2時間だと時間が足りず、基礎的な部分だけになってしまいましたが。会場はネクストスケープさんの会議室なのですが、セッション形式とは違った良さがあっていいなと思います。

今年の出来事としては、Microsoft MVP Global Summit 2018 に初めて参加できたことが印象に残っています。たくさんの刺激を受けたし、楽しかった。内容については NDA なので書けないのですが、記事にまとめておけば良かったなと思いました。英語が話せたら何倍も楽しいはずなので勉強しようと思いながらも、ほとんど何もしなかった・・・
でも、次回も参加したい思いがモチベーションにもなり、7月には Microsoft MVP を無事に更新できたので、また来年の3月に参加できそうです。

f:id:TonyTonyKun:20181231162654j:plain

あとは、Microsoft の寺田さんによる AKS ハッカソンに2日間参加できたことも良かったです。いろいろな分野のエキスパートである MVP の方々でさえ苦労される Kubernetes は、やはりハードルが高いと実感しました。多少なりとも知見をもつエンジニアとして、適用エリアは広くないものの今後も重要なテクノロジーとなってくるので、良いところも悪いところも広く伝えていきたいと思いました。ハッカソンには初めて参加しましたが、参加者全員で1つのことに向かって取り組めるし、スキルや経験も合わせて底上げできて楽しかったです。このハッカソン形式は仕事でも使えそうかなとも思いました。

昨年の課題だった仕事とコミュニティ活動とのバランスは、転職して2年が経って慣れてきたこともあり、そこそこ改善できたかなと思います。来年は自分でやりたい提案を書いて、それで仕事ができるようにしていきたいです。
MVP や仕事で多くの方々と出会う機会に恵まれ、新しいことにも挑戦することができ、充実した1年だったと思います。

本年もお世話になりました。よい年をお迎えください。