[Azure] N層のアプリケーション アーキテクチャ[Learn]

この記事は2019年1月31日に書いています（詳細はAzure Learnなどを参照してください）

- この記事でざっくり分かること
    - N層アーキテクチャの機能と制限（考慮）を知る
    - N層アーキテクチャのユースケースを知る
    - ARMテンプレでN層をサンプルでdeployする

- はじめに　〜あなたの状況とシナリオ〜
    - Webアプリケーションをオンプレミスにデプロイしている中小企業があります
    - そこであなたはITエンジニアとして勤務しています
    - よくある話で偉い人が「うちもクラウドに移行するか！」の鶴の一声で決定
    - あなたは技術オリエンテッドで機能ありきな案件は危険なことになるのをわかりつつ
    - まず個人的な活動として、あなたは要件を洗い出していきました
        - サービスのダウンタイムを抑えて、チームの既存スキルを活用したい
        - アプリのスケーリングや管理、およびセキュリティ保護を確実にしたい
        - そもそもクラウドのN層アーキテクチャへの理解なども平行で学んでいきます
- N層アーキテクチャ
    - まず一般的な3層アーキテクチャ(3層のレイヤ）に注目する
        - User Interface Layer
            - HTML/CSS, JSON
        - Business Logic Layer
            - Business Rules, Data validation, processing
        - Data Access Layer
            - RDB, SQL, NoSQL
            
    - レイヤに分割することのメリット
        - 層毎にリソース追加をするのでアプリのコンポーネントを個別に管理
        - 障害が発生したリソースを見つけて正常状態にリクエストをリダイレクトできる
        - 負荷分散などでアプリの回復性を向上させることができる
        - 各レイヤのネットワーク間の通信を必要なアクセスのみ許可できる
        
    - 3層にした場合の各層の役割
        - プレゼンテーション
            - ユーザにどのように見せるか表示させるだけに特化する
        - アプリケーション
            - 実際に処理を行うコードが記述される、DBとのやり取りなんかもkさいいされる
        - データ
            - データ格納を行う
    - N層アーキテクチャは従来のオンプレ環境と考え方やアプローチが類似しているので
    まずクラウドへ移行するという考え方を持つ組織に優しい（以降はPaaSも検討する）

- N層アーキテクチャをDeployする
    - まずは3層アーキテクチャへの移行のためにチーム内で利用していた簡単なシステムから着手することにしました
    - システムはチームメンバの中の投票システムで昼食の決定やメンバの意思決定を支援するサービスがオンプレで動いていたのでこれを3層アーキテクチャ化することにしました

- アーキテクチャのイメージは下記
<img width="350" alt="スクリーンショット 2019-01-31 17.02.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/187331/d0cb11c1-c20e-8282-9de8-7e7e623db694.png">

- デプロイ
    - az group deployment createコマンドを利用
    - サンドボックスなリソースグループが作成される
    - az goup deployment showで閲覧
    
azureuser@Azure:~$ az group deployment show \
>   --output table \
>   --resource-group 4e62e36e-91c7-45f8-b9b2-9ba532a9e984 \
>   --name azuredeploy \
>   --query properties.outputs.webSiteUrl
##### Value → http://70.37.59.なんたら

- URLが払い出されたブラウザでアクセスしてみる
    - 実際にアクセスしてみた
<img width="500 alt="スクリーンショット 2019-01-31 17.16.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/187331/11f89700-095e-04dc-8596-13bdb11f227f.png">

- デプロイされたリソースの詳細イメージ
<img width="350" alt="スクリーンショット 2019-01-31 17.17.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/187331/6223e590-a0bd-d4ee-4372-d7e16c604d8c.png">

az resource list --tag tier=presentation --output table
azureuser@Azure:~$ az resource list--tag tier=presentation --output table
    -プレゼンテーション層のリソース一覧
Name                 ResourceGroup                       Location   Type        Status
-------------------  ------------------------------------  --------------  ---------------------------------------  --------
demo-web-vm-disk     4E62E36E-91C7-45F8-B9B2-9BA532A9E984  southcentralus  Microsoft.Compute/disks
demo-web-vm          4e62e36e-91c7-45f8-b9b2-9ba532a9e984  southcentralus  Microsoft.Compute/virtualMachines
demo-web-vm-nic      4e62e36e-91c7-45f8-b9b2-9ba532a9e984  southcentralus  Microsoft.Network/networkInterfaces
demo-web-nsg         4e62e36e-91c7-45f8-b9b2-9ba532a9e984  southcentralus  Microsoft.Network/networkSecurityGroups
demo-web-vm-nic-pip  4e62e36e-91c7-45f8-b9b2-9ba532a9e984  southcentralus  Microsoft.Network/publicIPAddresses

- az resource list --tag tier=application --output table
    - アプリケーション層のリソース一覧
azureuser@Azure:~$ az resource list--tag tier=application --output table
Name              ResourceGroup                    LocationType     Status
----------------  ------------------------------------  -----------------------------------------------------  --------
demo-biz-vm-disk  4E62E36E-91C7-45F8-B9B2-9BA532A9E984  southcentralusMicrosoft.Compute/disks
demo-biz-vm       4e62e36e-91c7-45f8-b9b2-9ba532a9e984  southcentralusMicrosoft.Compute/virtualMachines
demo-biz-vm-nic   4e62e36e-91c7-45f8-b9b2-9ba532a9e984  southcentralusMicrosoft.Network/networkInterfaces
demo-biz-nsg      4e62e36e-91c7-45f8-b9b2-9ba532a9e984  southcentralusMicrosoft.Network/networkSecurityGroups
azureuser@Azure:~$


azureuser@Azure:~$ az resource list--tag tier=data --output table
    -データ層のリソース一覧
Name    ResourceGroup      Location        Type                   Status
--------------------------------------  ------------------------------------  --------------  -------------------------------  --------
demo-dbserver-mvvpi3tooebwi    4e62e36e-91c7-45f8-b9b2-9ba532a9e984  southcentralus  Microsoft.Sql/servers
demo-dbserver-mvvpi3tooebwi/demo-sqldb  4e62e36e-91c7-45f8-b9b2-9ba532a9e984  southcentralus  Microsoft.Sql/servers/databases

    - この層では、VNet サービス エンドポイントを介してポート 1433 経由で接続が公開されます。 VNet サービス エンドポイントは、PaaS サービス (Azure SQL Database など) をサブネットに接続し、接続をそのサブネット内のリソースのみに制限する

- N層アーキテクチャのメリットとデメリット
    - オンプレとのアーキテクチャの移行における親和性が高い
    - Windows/Linuxも大丈夫
    - 各層のスケーリングや更新が各層個別で実行が可能（リソース定義が別）
    - ネットワークの分離でアプリケーションが層に分離される
        - NSGやvNet、アクセスポートでで定義できる

- N層アーキテクチャのベストプラクティス
    -下記がイメージ
<img width="500" alt="スクリーンショット 2019-01-31 17.27.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/187331/d3fa2262-1bfc-a633-3ab7-06379a57a0f7.png">

- ベストプラクティスの7つの考慮点
    - パフォーマンスの最適化
    - 自動スケール
    - 負荷分散
    - メッセージング
        - 層の間でメッセージング サービスを使用すると非同期である要求の場合は、パフォーマンスがよくなる
        - メッセージはキューに配置され処理されるまでそこにとどまる
        - ダウン ストリームの負荷の影響が相殺される
        - さらに、システム停止が発生した場合でも、メッセージの処理を続行できます。 それはキューに残り、システムがオンラインに戻った後で処理される
        - Azure Service Bus、Azure Storage キュー、および Azure Event Hubs は、メッセージング サービスを探しているときに考慮できるサービス例
   
    - データのキャッシュ
        - アクセスの頻度は高いが変更されることは少ないデータや長期間保存する必要がないセッション状態などのデータでは、キャッシュを使用する
        - 層の間にキャッシュ システムを配置すると、この種のデータを取得するための時間が短縮される
        - Azure Cache for Redis は、このシナリオに適した PaaS サービス
    - セキュリティの最適化
    - ネットワークの分離
    
- まとめ
    - N層アーキテクチャの機能と制限（考慮）を知る
    - N層アーキテクチャのユースケースを知る
    - ARMテンプレでN層をサンプルでdeployする
- これから先はアーキテクチャセンタで学ぶ
    - https://docs.microsoft.com/ja-jp/azure/architecture/
- コードはこちら
    - https://github.com/MicrosoftDocs/mslearn-n-tier-architecture