MW01 - eventmarketing.blob.core.windows.net · de:code 2019 MW01 ASP.NET Core + Azure で支える...

Post on 19-Aug-2020

3 views 0 download

Transcript of MW01 - eventmarketing.blob.core.windows.net · de:code 2019 MW01 ASP.NET Core + Azure で支える...

de:code 2019 MW01

ASP.NET Core + Azure で支える

熟成 3 年「私だけのポン酢」アーキテクチャ

株式会社オルターブース

松村優大 森田邦裕

松村優大 (まつむらゆうた)

業務執行役員 / Chief Technical ArchitectMicrosoft MVP for Developer Technologies

C# / PHP / Microsoft AzureFukuoka.NET 主催

森田邦裕 (もりた くにひろ)

ソリューションアーキテクト

JAWS-UG福岡, Serverless Meetup Fukuoka 運営

株式会社オルターブース

2015 年 3 月設立 (5 期目)Microsoft Azure を活用したソリューションを展開するクラウドインテグレーター2017 年 8 月 Japan Microsoft Partner of the Year (OSS on Azure) 受賞

本セッションについて

本セッションについて

世界でたったひとつだけの、

自分だけのオリジナルソースを作ろう。

簡単に、お手軽に。あなたの「コレ、好き!」を作るお手伝い。

https://mysaucefactory.com/

マイソースファクトリーの構成

アプリケーション インフラストラクチャ

マイソースファクトリーの構成

アプリケーション インフラストラクチャ

クラウドネイティブ技術

https://github.com/cncf/toc/blob/master/DEFINITION.md

クラウドネイティブのメリット

https://github.com/cncf/toc/blob/master/DEFINITION.md

クラウドネイティブを実践する上で大事なこと

アーキテクチャ

連携

連携

ASP.NET Core の採用

• MVC (Model-View-Controller)

• Web API

バージョン マイソースファクトリー 取り組んだこと

1.0-preview 開発初期~ベータ版 .xproj + project.json

1.0 正式公開 .csproj に移行

2.0

正式公開継続的なアップデート

(大きな問題は起きていない)2.1

2.2

なぜ .NET Core を最初から採用したか

なぜ .NET Core を最初から採用したか

なぜ .NET Framework ではなかった?

開発当初に苦労したこと

API バージョニング

/api/v1/resources

/api/v2/resources

API バージョニング

Swagger で API のデバッグ

リポジトリパターンの採用

リポジトリパターンとは

https://docs.microsoft.com/ja-jp/dotnet/standard/microservices-

architecture/microservice-ddd-cqrs-patterns/infrastructure-persistence-layer-design

リポジトリパターンとは

データ ソースへのアクセスに必要なロジックをカプセル化する

クラスまたはコンポーネントです。

リポジトリは一般的なデータ アクセス機能を一元管理して

保守性を向上させ、ドメイン モデル レイヤーからデータベース

にアクセスするためのインフラストラクチャやテクノロジを切り

離します。

Data Source

Repository

Controller

View

Model

Service

Data Source

Model

Controller

View

Data Source

Model

Controller

View

Data Source

Repository

Controller

View

Model

Service

連携

初代アーキテクチャ

全体の利用ツール・クラウド

ACS

WebApps

BLOB

SQLDatabase

DocumentDB

LogicApp

Functions

OMS

CloudFrontRoute53

S3

API Gateway

ECR

Cognito

IAM

Lambda

CloudWatch

• .NET Core で動く

• コンテナーで本番環境

• ログの可視化

• CI/CD による自動化

• 自動フェイルオーバー

リリースに向けたアーキテクチャ方針 (2016年)

.NET Core が動く

コンテナーで本番環境

アーキテクチャ

AWS LambdaAmazon

API Gateway

Amazon Cognito

Web Apps

SQL DatabaseContainer Service

アーキテクチャ

AWS LambdaAmazon

API Gateway

Amazon Cognito

Web Apps

SQL DatabaseContainer Service

Single Page Application

アーキテクチャ

AWS LambdaAmazon

API Gateway

Amazon Cognito

Web Apps

SQL DatabaseContainer Service

アーキテクチャ

AWS LambdaAmazon

API Gateway

Amazon Cognito

Web Apps

SQL DatabaseContainer Service

アーキテクチャ

AWS LambdaAmazon

API Gateway

Amazon Cognito

Web Apps

SQL DatabaseContainer Service

• 自前で認証を持ちたくなかった

• Azure AD B2C はデザインの一貫性が合わなかった

• AWS で実現

アーキテクチャ

AWS LambdaAmazon

API Gateway

Amazon Cognito

Web Apps

SQL DatabaseContainer Service

Azure と AWS のマルチクラウド

ログの可視化Azure Container Service

Storage

CI/CD による自動化

実行結果

Push

Polling

Azure Container Service

docker swarm

docker pulldocker push

docker build

Amazon EC2 Container Registry

blue green

開発メンバー

フェイルオーバー

Azure での構成も検討したが

Amazon Route 53

Web Apps Amazon CloudFront

Amazon S3

マイソースファクトリー

https://mysaucefactory.com

連携

時代・環境の変化 (2017年)

サービス提供を持続可能な運用形式へのシフト

運用の手間を無くす

マネージメントレベルの高いサービスへ乗り換え

解決するには?

マネージメントレベルの高いサービス

https://docs.microsoft.com/ja-jp/azure/security/security-management-and-monitoring-

overview

連携

2代目アーキテクチャ

改善の目的 (2018年~)

アーキテクチャ

AWS LambdaAmazon

API Gateway

Amazon Cognito

Web Apps

SQL DatabaseContainer Service

アーキテクチャ

AWS LambdaAmazon

API Gateway

Amazon Cognito

Web Apps

SQL DatabaseWeb Apps

Managed Identities

Container Instance

Function Apps

アーキテクチャ

AWS LambdaAmazon

API Gateway

Amazon Cognito

Web Apps

SQL DatabaseWeb Apps

Managed Identities

Container Instance

Function Apps• コンテナーホスティングを辞めた

• Azure Container Service から Web Apps へ乗り換え

アーキテクチャ

AWS LambdaAmazon

API Gateway

Amazon Cognito

Web Apps

SQL DatabaseWeb Apps

Managed Identities

Container Instance

Function Apps

Azure Container 上のコンテナーで動いていた一部処理を Function Apps に移植

アーキテクチャ

AWS LambdaAmazon

API Gateway

Amazon Cognito

Web Apps

SQL DatabaseWeb Apps

Managed Identities

Container Instance

Function Apps

Azure Container Service 上でバッチ起動していたコンテナーを Azure Container Instance で起動するように移植

アーキテクチャ

AWS LambdaAmazon

API Gateway

Amazon Cognito

Web Apps

SQL DatabaseWeb Apps

Managed Identities

Container Instance

Function Apps

• サービスプリンシバルからの脱却

• コードにアスセスキーを埋め込まない

• SDK が期限付きトークンを自動的に取得/再取得

• これまで通り Azure サービスに対しアクセス可能( Azure AD 認証をサポートするサービスのみ)

アーキテクチャ (検討中)

Web Apps

SQL DatabaseWeb Apps

Managed Identities

Container Instance

Function Apps

Azure AD B2C

認証機能を Azure AD B2C へ移行

新旧リソース切り替え

Container Service

Web Apps

Amazon Route 53 SQL Database

リソースのサブスクリプション移動

旧 Subscription 新 Subscription

リソースのサブスクリプション移動

Web Apps

Amazon Route 53 SQL Database

Web Apps

Azure Container Service からWeb Apps へAzure Container Service Web Apps

as a Service IaaS PaaS

アップデート対応 自前で対応 プラットフォーム側対応

サービス監視 自前で対応 プラットフォーム側対応

セキュリティ 自前で対応 プラットフォーム側対応

Infrastructure as Code Terraform, Ansible Terraform

環境構築OS からミドルウェア、アプリデプ

ロイまで全て自前で対応アプリデプロイするだけ

Web Apps に変えて

Kubernetes (k8s) に変えなかったの?

ログの可視化Azure Container Service

Storage

ログの可視化

Web Apps Application Insights

アプリにApplication Insights SDK を組み込み

Elasticsearch + Fluentd + Kibana から Application Insights へ

Elasticsearch + Fluentd +

KibanaApplication Insights

as a Service IaaS SaaS

アップデート対応 自前で対応 プラットフォーム側対応

サービス監視 自前で対応 プラットフォーム側対応

セキュリティ 自前で対応 プラットフォーム側対応

Infrastructure as Code Terraform, Ansible Terraform

環境構築OS からミドルウェアまで全て

自前で対応サービスを利用する

Application Insights に変えて

CI/CD による自動化

実行結果

Push

Polling

Azure Container Service

docker swarm

docker pulldocker push

docker build

Amazon EC2 Container Registry

blue green

開発メンバー

CI/CD による自動化

実行結果

Push

Polling

Azure DevOps

Web Apps Web Apps

ReleaseBuild

開発メンバー

Jenkins から Azure DevOps へJenkins Azure DevOps

as a Service IaaS SaaS

アップデート対応 自前で対応 プラットフォーム側対応

サービス監視 自前で対応 プラットフォーム側対応

セキュリティ 自前で対応 プラットフォーム側対応

Infrastructure as Code Terraform, Ansible -

環境構築OS からミドルウェアまで全て

自前で対応。 Jenkins職人サービスを利用する

Azure DevOps に変えて

連携

ログの送信先

ログの送信先

メールのアーキテクチャ

AWS LambdaAmazon

API Gateway

Amazon Cognito

Web Apps

SQL DatabaseWeb Apps

Managed Identities

Container Instance

Function Apps

メールのアーキテクチャ

サーバーレスで実現する負荷分散メール

API

責任範囲が明確になる

API

責任範囲が明確になる

API

責任範囲が明確になる

API

シークレットの保護(= 機密情報)

AWS LambdaAmazon

API Gateway

Amazon Cognito

Web Apps

SQL DatabaseWeb Apps

Managed Identities

Container Instance

Function Apps

https://12factor.net/ja/config

Secret Manager

Development Staging / Production

Azure Key Vault

Managed Identities

secrets.json

Azure Key Vault でシークレットを管理する理由

Managed Identities

分散キャッシュ

• 分散キャッシュ

キャッシュ

まとめ

ASP.NET Core に挑戦して良かった

ASP.NET Core に挑戦して良かった

アーキテクチャに関するドキュメントが豊富

https://dot.net/architecture

継続的クラウドネイティブ

© 2018 Microsoft Corporation. All rights reserved.

本情報の内容(添付文書、リンク先などを含む)は、作成日時点でのものであり、予告なく変更される場合があります。

© AlterBooth,inc.

本情報の内容 (添付文書、リンク先などを含む) は、de:code 2019 開催日 (2019年5月29~30日) 時点のものであり、予告なく変更される場合があります。

本コンテンツの著作権、および本コンテンツ中に出てくる商標権、団体名、ロゴ、製品、サービスなどはそれぞれ、各権利保有者に帰属します。