de:code 2019 [DT08] .NET とクラウド ネイティブ ～ 本格化するクラウド移行とそのアーキテクチャ（後編）


# [DT08].NET とクラウド ネイティブ ～ 本格化するクラウド移行とそのアーキテクチャ / 2019年5月30日

# TL;DR（要約）

- クラウドネイティブと呼べるのは、Caas、Pass, Faasとなる。クラウドネイティブの中でどの部分においてもAzureを使うことができる。
- これからの技術要素として、コンテナー（Docker）は外せない。高速起動でアプリケーションを展開したいという場合に、Dockerは優位になる。Visual Studioにおいても、Dockerのサポートは十分にされている。
- 小さいサービスで機能を分離するマイクロサービスの考え方が大事になる。
[.NET マイクロサービスアーキテクチャリファレンス
](https://docs.microsoft.com/ja-jp/dotnet/standard/microservices-architecture/)、および[ドキュメント（PDF）](https://aka.ms/microservicesebook)に詳しいので、ぜひ読んでほしい。


# リソース

- [セッション詳細](https://www.microsoft.com/ja-jp/events/decode/2019session/detail.aspx?sid=DT08&kw=DT08)
- [セッション動画](https://www.youtube.com/watch?v=KtI5z-r_gh4&feature=youtu.be)


# クラウド側の需要は増していく

前編でも話したように、クラウド側の需要はより増していく。

# 歴史を振り返ってみよう

## 2002年ごろは

2002年は、動画で流した通り、.NET Frameworkが発表された年

動画の中では、女性の管理者がいて、サーバー管理者がいて、オーダーをいっぱい受け付けてピークが来た時にサーバー管理者を心配して、様子を見に行く。

すると、サーバー管理者が、余裕ですよ！と.NET Frameworkが、高負荷な環境でも耐えうる性能を持っているということをアピールするコマーシャル。

## 現在は

そのころと違うのは、**今はサーバーを心配する時代ではない**、ということ。

今は、ハード面については、クラウド事業者に任せ、クラウドがすべてを解決する時代。ハードウェア、サーバーのスケーラビリティは、クラウドが面倒を見てくれる。

![img](https://xjcbmw.bl.files.1drv.com/y4mtnx334SOD07FojA2y_T9oi7uisUkah4Xfg2VgsfB3PeBZMfOI-GOcujKr3caefFnLjQ3kn5-46wnGvF4gTQUee-EukCsr2Ih01ZHUrkwtCVj9zU0XBAWpU2G7mnV6Vh41yHf86kokA3hwDofAdGTEcHw0MLSe8JgdkIdUV0QjBkEW07vGtCz1FYRTM4mvzC85NmJJD4ArYNIJNQe3_1EkQ?width=1280&height=631&cropmode=none)

# クラウドの利用形態とAzureのサービス範囲

![](https://xzchmw.bl.files.1drv.com/y4m0AXzj_qTCq_sJjz5WLwnqQRAZ90TPD_Nd6FhWPHU13HYVDde99CfdWZQFmh_VVzwS8-ecExyS7b0h-_lh1XvePHlmPx2vvEWcq9ZJ_j6pBWMkUOC_A9ZGYTH84ZNB1dliAakEayY4yBVsdNJk5gdu01lZjudKX6qx41j75ibH1uEfOiV1Hp4gYcgWzkrumiwuRz45X0PIGXy5oqVNafH_A?width=1280&height=654&cropmode=none)

この図はクラウドの利用形態により、どの部分をユーザーが管理し（青色）、どの部分をベンダー（クラウド業者）が管理をするか（緑色）ということを示した図となる。


## 利用形態と特徴

|利用形態|特徴|クラウドネイティブ|
|:--|:--|:--|
|オンプレ|ハードウェアの保守部分までユーザーが行う必要がある|×|
|Iaas|仮想化までをクラウド側で行う|×|
|**Caas**|仮想マシンと異なり、OSをユーザー側で考慮する必要はない|○|
|**Paas**|スケーリングを考慮する必要がある。|○|
|**Faas**|スケーリングを考慮する必要がない。クラウド側で適切に行ってくれる<br>アプリケーションの実装に集中することができる|○|
|Saas|Office 365などを指す|×|

この中で、クラウドネイティブと呼べるのは、Caas、Pass, Faasとなる。

### Faasとは？

Serverless Function（Azure Functions）を使用する形態を指す。関数を呼び出した瞬間にのみクラウドのリソースを使用する

### クラウドネイティブ（Cloud Native）とは？

![](https://xzcimw.bl.files.1drv.com/y4merzkehwV5ILiS5SV6Bk65TkIKB82n5h8NUpt9Oxzn6YBayEdL4eQR2hzU3Zpf2y6apCNYwYr21GPUCiGm2FqF2mzi-yxyVGd25JwxGPrVKkHqZW071FFBgIxVc7WQYtNNKSAaQxmXlZtpwnlhx82ppM8c2RMwmgZ3CZ6NFMkJlXahBqnxrxCq0trUIsvQjzqhS3fonL3YdNpVL6gg8wx2g?width=1280&height=620&cropmode=none)

Cloud Native Foundationが定義し、能力と技術との対応を示している。

では、クラウドネイティブが全て兼ね備えていないといけないのか？、というとそういうことはない。
この図の解釈としては、クラウドネイティブのアプリケーションを構築する場合は、こういった要素を意識して構成してもらえるといい、というものになる。

# .NET のクラウドネイティブを支えるAzureサービス

![](https://xzcfmw.bl.files.1drv.com/y4mUgzDCMvPbf4EjRYwXD-I0N9m_ufi61bnIU4HQrNtUE54G4dbx-IxV2u9SDsL-OJkAKcPUlfmXA-UWk2Rdts7d1xokwv6168VodhXx4LqhsZmhLnPyAuAaGvA5H2dxMK_EB5jKo-VisCGfFtK0gHCd_ajxwDskBKIE3s87D0hB4AOGju1yYAEB_lUcgEy_9BoL_-L8p1e4_-KNfg1MOswyQ?width=1280&height=652&cropmode=none)

クラウドを使用するにあたり、.NETが元気ないのでは、という心配を受ける声もあるが、そんなことはない。

- クラウドネイティブの中でどの部分においてもAzureを使うことができる。
- Iaasが必要であれば使うことができる
    - AKS（Azure Kubernetes Services）をデプロイできる

Azure Function も.NET Core(C#)でコーディングできる。また、SignalRもメッセージの1つとしてスケーラビリティを持たせたサービスとして作ることができる。SignalRを使用して、大きなサービスでスケーラビリティを持たせたい場合に使える。

ML.NET、モニタリング、そしてストレージを.NETのアプリケーションから使用できる。

# Containers

![](https://xzcdmw.bl.files.1drv.com/y4mlU45Cwf1qvEiTHzijrjqsfh_M0ODA9XzMZEJ1xNpm7Hn8e_tjBql1EWxZTHu-A3x2rEkRcb_AMWTkoLrIpXORKZPvwqm9fN9A179XxObPMtsJFSd-329ESzUvP1hsdVAn0k8mO-BISEYF8IBAixGQYZGMVxA8lPg1CPGp9yba_DyOX3wSyKqYo19oJsDV0-QOQ3v9XvlXB5N6t4fHbS2cg?width=1280&height=593&cropmode=none)

これからの技術要素として、コンテナーは外せない。

コンテナとは、一種の仮想化技術でOSレイヤーとは分離した形でアプリケーションを簡単に展開できる

![](https://xzcemw.bl.files.1drv.com/y4mEUsZjc8tgPCEeFrJLLKsyoSzi1JLnJeMHhCGZl96eIDxnB3M6pNduNJvsJ3jPH_cgq_kDHbHEPGHJSrUHdenwk8_vtEbv-zSz89S_-iYZ8gxwmgbVC9SNeFe0JXVWfjTevfLSrUNrdqg7Yj7saYQnRDqbtNkz2x2DdJ4Pl4TehItfCUqpNOnu6jVYWJe2245wXNsrxu79Dses98L6yfqlw?width=1280&height=702&cropmode=none)

## 仮想マシンとコンテナの違い

![](https://xzccmw.bl.files.1drv.com/y4mSZGSwDy_kVprEmxRsMHRxozyeDe1vOJzl7qa4k4syE_ipPTkJY3PELvM1cVj2NHiS4pc7mblVCfLk7Wlnwfbtc_vtYDucKle5cqjuel1RJ_mAGAn48z2pn16vT_wfzT07KCmi1YIiuYf5gNR3WO0QhD4Z1Sn7t1HDCEZfwnPaqSMUV6VODbQ8mvjyicCLtijpKjb9mLRyOghxP9LYMuaNg?width=1280&height=624&cropmode=none)

Hyper-Vベースの仮想化マシンは、仮想ドライブのイメージ（VHD）の中には、OSも入っていてドライバも入っているので、基本的には大きいサイズ。Iaasにデプロイもできるが、それなりに時間がかかる。

高速起動でアプリケーションを展開したいという場合に、Dockerは優位になっていくる。
ホストのオペレーティングのシステム上では動作するが、ホストとは分離した形で動くので、よりコンパクトに動いて、高速に展開、動作させることができる

## 一度イメージを作るとどこでも動く！

![](https://xpcjmw.bl.files.1drv.com/y4mMvGMn9oFqqHLk8QShchGuLV58LKD9O0qRaNlmN61u9rn63ORAXnRqczWMhfu_JRF59TGkpRDpWK66pQNN1fkLyqqmE7kfZZiVrUmuzQVJvwxw4Htrg52q88LB2rlTZ7vNqPe1jmF2WFfNDBuToTcpegxqFYyRHoo9Y5p7tSfqjma0QTZJqg-nMqhbOrIM0-U22jFKlGtncpf5fjej3__oA?width=1280&height=599&cropmode=none)

一度イメージを作ると、Dockerエンジンが動作しているところに移動すると、ほぼどこの環境でも動作させることができる。

DevからOps側にいざ回したときに、コンパイルすると動かないよ！、ライブラリが足りなかった…、OSの設定が足りなかった…、などの問題を回消するための技術である。DevOpsの中で無駄を省いて、自動化できるところは自動化するというDeVOpsの考えの中で重要な位置づけを占めている。

## 共通デプロイ単位

![](https://xpchmw.bl.files.1drv.com/y4m_LeuDY5DBI9_O8J5hoZhtVJUW69Z7RTjgK7P3tbTN6hKYr4fy0Cf9dwOqDE5tLFJGd5y-jsgpCxG3ehwnsJISVAdGG_JwECWa4vLiybpyL2x1nwdaVVHIa5h9tua38HJMXgF7UMkCMFmt6j6KPMZOSPj9xdo6IxiNZU_x5IpBqlMJIGjKVuGMubdtkxPXx17Ijr4YqKxUFMpLL8sFCPi9g?width=1280&height=663&cropmode=none)

**つまり、Dockerというのものは、共通デプロイ単位として成立している。**

Azure PlatformやAKS、複数のインスタンス、多数のインスタンスを立てるということもできる

これから、自分のアプリケーションを作っていく中では、**デフォルトとして考えてもよい**。
皆さんが使用されるVisual Studioにおいても、Dockerのサポートは十分にされている。

## Web App for Containers

![](https://xpcimw.bl.files.1drv.com/y4m12nspOm7iIO_R8ufejG-Iv73iPQUlZjTMSBoEn9cDuwjHENNUGvPXx75aIEGZ5AO6gbiULc53c_AY8CjfFwQ2k_P91ynSijsjpyMhhe6fV7DergX_vyY1eWWyjkGJhffoyA78mo3AEBdBBnJLD5gWIpOukwhkNEQT8MGwnkeitxN4xN-DfZXADKp0LRwBcA8-2FbJJkasYvLEzW7JKeIgQ?width=1280&height=622&cropmode=none)

Dockerのイメージを作ってDeployするというのも非常に簡単。もし、マイクロサービスを作らず、シングルサービスを作るうえでも、非常に簡単に行うことができる。

## 【デモ】Visual StuioでDockerを作る

1. Docker Desktopをインストール。
1. VSでプロジェクトタイプとしてDockerのサポート入れた上で作製する（Dokcer Compose）
1. ターゲットOSを選ぶ。 今回はLinux
1. ブラウザが上がってくるが、すでにもうこれは、Dockerで動いている
1. サンプルプログラムでは、実行しているOSの種別を表示させるような仕組みを入れているのでLinuxで動作していることが確認できた。
1. Dockerなので、アドレスは、localhost
1. Docker Engine上で動いているものについてもDebugができる。ブレークポイントが使える。

# Microservices

![](https://xpcfmw.bl.files.1drv.com/y4mPDgVyE6F2dHhyeGeL59YGyw4GpSmPc2G7LKCV2o_cT9J2mwOAI2ksvG7MjxfNDOQNJKda81qnPAjcf6DfbtBCF8ReIPUZYcT_ddaKkmnkQPqj7NibWN155YkRDY8M6JzFQy8S-cde0biR1HOmv5oVj6PKDZQ8Wl1kkqVwTZlmBUaR18ftw-HyzUVL6q2Tb8C8h25orZqO2S8VVdEgHoz-g?width=1280&height=635&cropmode=none)

## モノリシック

  - 昔からあるモノリシックでもよい。もちろん。
  - それぞれを1つのコンテナーイメージとして作る

## マイクロサービス

  - 小さいサービスで機能を分離
  - 停止、開始するとき影響が少ない単位でデプロイの面で、非常にメリットになってくる

### ではどのように分割しするのか？

  - "Micro"だから小さくしなければいけないのか、そんなことはない。オーダーの単位、ビジネスドメインの単位ということであれば、垂直的な3階層が良いこともある。クラウドをどのように使っているのかということを考えて、分割が必要
  - アプリケーションの部分だけをMicroサービスとして作っていくことが重要になってくる

# Azure Kubernets Services(AKS)

![](https://xpcgmw.bl.files.1drv.com/y4mhPPFfl4uoSq55bnJ2DaYGsWwV5dtbIn7OeJ7ZxVduitAZQQYkYhBRFhxLpjluJJOuNFKqCc95t6fAoQPmXICk1zgS6dLVKkMMayHmDFcmEqU0ELlk62RW_gvx0KY-iCPw3PfaXFdUyJa35U2rxB3DBQ_2NW427qK6POoU-eYQoC-oR4h5MCYRRsVTMUvGcSXY7oyVTpGn8e0tmPJyZX6TQ?width=1280&height=616&cropmode=none)

複数のコンテナーを管理していくことによって非常に簡単に行える。
Kubernetesは、環境を構築するまでがなかなか難しいが、AKSを使えば、VMを準備するだけで、Kubenrnetesの準備を行う必要がない

## Kubernetesを使う場合のライフサイクル

![](https://xpcbmw.bl.files.1drv.com/y4mp9GActTUcYzCWLjgYSP53wIWBRnaH0-VtZT4hYh3nNG6uF-o31SMWQTyOpHX4qiGh-CwaekWeK846xkmH-SjLqaqoDxYJL_keWv5Ou2Gv8D9toQDBG6FsJgEE_qvR16MCOwLQ5F9p0Xd6T9OuLZdoV7Oqu2Ho0eS55RtdviBVRkNkp8WO31ErTKTNxQ2lh7Mo_AfQ_24JBFgaF35az3hEQ?width=1280&height=631&cropmode=none)

## Azure Dev Spaces

![](https://xpccmw.bl.files.1drv.com/y4mZGWjcibAsCxMnPtpvoFCeZs_X-H0_COaRaERdXzMB1hAWBtMLBYyuVa6J8iPLdkQYw6EkLXIFQDrUCYYtHpe24i1LOca3EcxdReKHz-v39vPhLN_osFjHL_TZY2BSZ_NOcPeUbUduea9BSnR0hxRST0SS_g_D7XsY7i6W6ONYmlpUkjj3HK-FgdxbDwb-KJgDxRZ08iGAndg1fUAyROuLA?width=1280&height=688&cropmode=none)

デバッグしながら、ビルドして変更することが必要になった際に、自分だけの名前空間の中に、自分のものをビルドすることができる。
ここで重要なのは、特に、**自分だけの名前空間**というところ

# マイクロサービスのダイレクトコミュニケーション

![](https://x5cimw.bl.files.1drv.com/y4mcjaae-t821k9oHOBYoTBdTe-7v1yopDUAPebqELYLwK0hv0TAtgmWmoZ-WvxNgjiQOn9kpv_VIzEAbBvXf-2o0DrH-3QePJ0Jpaxt_vYwewdqHY1_Ha49L58Ic1RylWU_Lx3FyOY-jjwQ9y8XLzShy1qiU_pw8h4ihOPD1ohBrUyf04B1snS2TT9IODIbX--SUkR_SBrG7kKxBoYwv3msg?width=1280&height=597&cropmode=none)

では、認証トークンを個々のサービスで管理しないといけないのか？ ゲートウェイを介したうえで、Microサービスに渡していくという考え方が非常に重要となる。Microサービスを増やしてもスケールを簡単に行うためのパターンは次のようになる。

![](https://x5cfmw.bl.files.1drv.com/y4m5hlC2ib5520QsXzBa2zcYcrR0xA995En4vuejHdX2IY_pzosdZeDC7gTtdNTNvbZxTyhEAgfpu6FWkZ_8kkYxiJLfHRBRp5h-TRC6Iieudn-npfdT8yWlAfjVJj7HF8Pyo1FJnDLFAidz89oUm76wb-3B3HNAmUcCwGRw87T3rYl1krx-dXSZjy4msaXvappfO5v9o3l735IkNHdZnUuRw?width=1280&height=605&cropmode=none)

ゲートウェイに追い出してしまえば、スケールはAzureが行う。

エンドポイントが一元定期に管理しやすくなる、アプリケーションとしても、固定のエンドポイントを考えればよいし、認証周りの管理も踏まえて、1つのエンドポイントに対して、認証トークンを管理するということで楽になるし、バックエンドについてもAzureに任せると楽になる

![](https://x5cdmw.bl.files.1drv.com/y4mfqBOfG583P6rGG88eB_PhsjwraQZ8NTVC6F3WjqTTdSRORRSNkxYHRaQ_LlmaZFkAMGolgH-5LXA-gmt8l4xv9mIOzfH0j2zP9o9TI70lKYrGyPETskULaAMIVPqv0F-m2BbfjNDKWpILOzqbkZi-SooJ0LZyF9N4gzENVPaLwvjtwqdh4BjMrjj5YI5_iARkNm5k5pwy15cA04cFQuZag?width=1280&height=742&cropmode=none)

一方で、単一障害店になるので注意が必要（APIマネージメントに追い出す）

## .NET マイクロサービスアーキテクチャリファレンス

[オンライン](https://docs.microsoft.com/ja-jp/dotnet/standard/microservices-architecture/)、および[ドキュメント（PDF）](https://aka.ms/microservicesebook)。ぜひ読んで！

# .NET の移行について

## .NET アプリのモダナイズとクラウドネイティブ

![](https://x5ccmw.bl.files.1drv.com/y4mnCJjBeVVu4feWXx4MQNbsKU1uhd5lC0PFmf-vJ2FIWSwgtJjuxWsRLXy0jcY7B_2oW2_qAozIil474Dus_GpDTCxKBDiuNttYZ-t7DPXXYS4aevbh2lbgux1pkRiIx67jKEidLMm8XPn-jmTHYl7f4xsaGph1nJI4qEud8WD8MofAZcztt9ov6yXSdmXrLX6hcd_9Gvum8oOyvsftJl8sg?width=1280&height=635&cropmode=none)

まず、.NET アプリケーションとして、通常の構成をクラウドに乗せてみよう。

やり方としては、まずはIaasという考え方になる。しかし、よりクラウドネイティブということを考えると、
モノリシックだとしてもコンテナー構成とすることで、アーキテクチャを変えないまでも、クラウドに親和性が高いアプリケーションとすることができる。

最終的にはコードの変更が必要となってくる。


## .NET Coreと.NET Framework

![](https://yjcimw.bl.files.1drv.com/y4mdlZJjxmb5rqcJ7Ntb3coM1ojmBpFV5oXEdjmP2eda-468MbNFTj1jdH7G9yUyptHpkHUNwYnxmr-zuSAy2IFPLOMQ350hVquH-kFC_CsnGTF2GIQoUciNO4ETjqlVJV89IFW4U4a5rybCdsD9qLZgl0Nnr6wijANJ8Gsr1GvBzv6mAT1oB9pqyUhgwdfUtASAJfeZikVu8umfxMBkla6mQ?width=1280&height=737&cropmode=none)


### 移行パターン（.NET Framework）

![](https://yjcemw.bl.files.1drv.com/y4mWbegxdVqokMlMyfxA9JI4fAmIVlYiEJHYj55_kX23itecpVh90KocPIbnso9fVjmyGAVbI_UQOueadMh9CpLWjfXREnSZvLCLGtvm6prsxgfSdEaloG7Po939QPZoxcLunn7sPiBdgqC5l3f1J07FvutQP7fIce7v0HKRdnIz_v-oNlNRdKUHciMGpfjavpWbZ7kcdAPAd9TjKerPEK-8Q?width=1280&height=672&cropmode=none)

まずは、VMとして載せて、アプリケーションだけを追い出す。次に、Windows Containerとしてやっていくのが運用として楽なのかもしれない。
ただし、クラウドネイティブなアプリとして最終的なおすすめは、Azure App Serviceとなる

### 移行パターン（.NET Core）

![](https://yzcjmw.bl.files.1drv.com/y4mNYdg1CNV57qZXQwOOLdMubElsLrUjKnsQxHjSdAdCb_d2elA6JNkEGcOiMTc1WRPU5SffeKIVlUcNUYjwVEuUji7XJaIy9NMkFudaCnM_oEVj9so70-5WhN4XECAVSvLFf1WanhhEmdiLFHpu9E00Y88T3OPwu7rvJWbXCkAI_jci1q4OWsqK4BmISrtDywS8d9JEQ3Puagdzd3Mti_U3w?width=1280&height=627&cropmode=none)

.NET Core では、Linuxコンテナーを使用することができ、デバッグもできる。
最終的なおすすめは、Linux Containersとなる

同世代の .NET Core 3.0 では Windows 限定機能(WPF, UWP)にもついに対応する。もう .NET Framework の方でしか使えない機能が残っていない。
**新規案件で .NET Framework を使うメリットがもう何もない、**
保守モードな既存のアプリでは .NET Core への移行は必要ない。そのための「保守アップデート」が .NET Framework 4.8となる。セキュリティパッチとかはきっちり当てて出す

### 3.5と4.8

無理に移行する必要は特にない。3.5についてもOSがサポートされている限りは、問題ない。

# クラウドを目指した開発を行っていきましょう！！

![](https://yzckmw.bl.files.1drv.com/y4mbOTeaBLbSsPOcqG2ry4YhU_vSa4B4QcFsVOxcgagOFiQop20rLBjTMlFYPqA1ivgswc_s5ogyFSB0u10kwzmyz9P8RO_eZ07r6tL1Z4SLXZ_kWLOCoovcOlbkp103n_I3lrO6nJ7A4sxOcKijDj1M5YUXYLUye7uzz_ILJ9BHgN33OEwJd1eMTzlF3NvL3l7Jxbk6S8cucjAkb2rr6RZKw?width=1280&height=645&cropmode=none)

![](https://yzchmw.bl.files.1drv.com/y4mRaC6nNcFIUxei8yZBckEnVjruf6lfDYX3JFclArDiBxcuA5BKF6n4u32HqgdHXgcXCLNTiRZVMgIKIioEgZz8Tho1VtZbI_5pkeFkXIdCnSZ96WJvihhn0eGH4QBsy2dXUPMDEY_2A_qWafxpY1T-8CZoo4n3o5jW5wOJP1Ba9cF6Un00454CRkBs6TYYP_L6d9qPHptpMWIwSTPDb6lbA?width=1280&height=633&cropmode=none)

# .NET Conf バーチャルのイベント 9/23-25

![](https://yzcimw.bl.files.1drv.com/y4mU5N3HK4sBRRNZ-GwyivGwqGmFxiftSSCvUxPUGMuen_QwsjHrTSUk74R3fUcniwtwR0Xa9PlgsgL1gaqWs_zizupyOZ5Qj2T4dibvSUKRw2G8Rj_1FGPwMwDBMydEf3jgj4ocCmTRXKO9ChmtnPQceOwZ8CzNWtNTb88AhNKOGk1lFLscYM4yLT9oTDxhASLSFmTKB-MBZYSMfNA6RwZrQ?width=1280&height=627&cropmode=none)