Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

The Twelve-Factor (A|M)pp with C#

https://alterbooth.connpass.com/event/164976/

  • Be the first to comment

The Twelve-Factor (A|M)pp with C#

  1. 1. #aadojo The Twelve-Factor (A|M)pp with C# 2020/02/12 AADojo @tsubakimoto_s
  2. 2. #aadojo Yuta Matsumura @tsubakimoto_s Developer (C#, PHP, Azure) Microsoft MVP (Development Technologies) Fukuoka.NET Organizer Microsoft de:code 2019 Speaker PHP Conference Fukuoka 2019 Organizer Currently working for
  3. 3. #aadojo 今日のテーマ 私は The Twelve-Factor App を意識してアプリケーション アーキテクチャの設計を行っています。 各要素を意識する理由や、 C#/.NET Core を例に各要素の 実装を達成する方法について紹介します。 ※ The Twelve-Factor App を「12FA」と表記します。
  4. 4. #aadojo C# の歴史 バージョン リリース年 主な機能 1.0 2002年 クラス、構造体、インターフェイス 2.0 2005年 ジェネリック、匿名メソッド、null 許容値型 3.0 2007年 自動実装プロパティ、匿名型、LINQ 4.0 2010年 dynamic キーワード 5.0 2012年 非同期 (async, await) 6.0 2015年 自動プロパティ初期化子、文字列補間 7.0 2017年 Tuple、パターンマッチング、ローカル関数 8.0 2019年 null 許容参照型、静的ローカル関数 https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-version-history
  5. 5. #aadojo C# で使えるフレームワーク
  6. 6. #aadojo .NET Core • クロスプラットフォームの実行環境 • Windows, macOS, Linux をサポート • GitHub で管理されているオープンソースなフレームワーク • https://try.dot.net/ ←すぐ試せます
  7. 7. #aadojo .NET Core サポートポリシー https://qiita.com/tsubakimoto_s/items/73aa31cce1cb662a0de4 ※LTS : Long Term Support / 安定版 ※Current : 新機能を含むが将来的な変更の可能性あり / 継続的なアップデートが必要 ※Maintenance : セキュリティアップデートが提供される
  8. 8. #aadojo https://12factor.net/ja/
  9. 9. #aadojo 12FA 1. コードベース 2. 依存関係 3. 設定 4. バックエンドサービス 5. ビルド、リリース、実行 6. プロセス 7. ポートバインディング 8. 並行性 9. 廃棄容易性 10.開発/本番一致 11.ログ 12.管理プロセス
  10. 10. #aadojo なぜ 12FA を意識するのか 拡張性 と 可搬性 を得るため (Scalability) (Portability) クラウドを活用した SaaS 開発で
  11. 11. #aadojo すごく説明しにくいので MindMap にしました https://github.com/tsubakimoto/12factor
  12. 12. #aadojo
  13. 13. #aadojo 1. コードベース
  14. 14. #aadojo 1. コードベース • デプロイ対象となるファイルは Git で管理する • アプリケーションのソースコードや設定ファイル • 外部サイトの Config ファイル (ex. NuGet.config) • Infrastructure as Code の構成ファイル、など
  15. 15. #aadojo Git で設定ファイルを管理するときの注意点 サーバーの接続文字列などの秘匿情報をコミットしない ※特にインターネットでアクセス可能なリポジトリ
  16. 16. #aadojo Deployment まで繋がる Git サーバー選び • Git をホスティングできるサービスはたくさんある • 実行環境への展開まで行うことができるサービスを選定し たほうが良い • CI/CD (Continuous Integration, Continuous Delivery)
  17. 17. #aadojo Deployment まで繋がる Git サーバー選び サービス CI/CD GitHub GitHub Actions GitLab GitLab CI/CD Bitbucket Bitbucket Pipeline Azure DevOps Repos Azure DevOps Pipelines AWS CodeCommit AWS CodePipeline
  18. 18. #aadojo 2. 依存関係
  19. 19. #aadojo 2. 依存関係 • 依存関係を明示的に宣言し分離する • アプリケーションに必要なライブラリはパッケージ管理シ ステムを介して利用する システム全体にインストールされるパッケージが 暗黙的に存在することに依存しない
  20. 20. #aadojo
  21. 21. #aadojo [C#] .NET Standard でライブラリ共通化
  22. 22. #aadojo [C#] ライブラリの公開方法
  23. 23. #aadojo 3. 設定
  24. 24. #aadojo 環境ごとに異なる設定値をどこに保管するか • 環境:開発環境、ステージング環境、本番環境 等 • 環境変数に保管する • JSON 等のファイルで管理しても良いが、秘匿情報が コミット対象にならないように注意が必要 • C# では開発環境ではユーザーシークレットに保管し、実行 環境では環境変数に保管し、安全に設定値を管理する
  25. 25. #aadojo .NET Core のユーザーシークレット機能 <UserSecretsId>MySecret</UserSecretsId> %APPDATA%¥Microsoft¥UserSecrets¥MySecret¥secrets.json { “App:Title”: “AADOJO” } Secret Manager Configuration["App:Title"]
  26. 26. #aadojo$ dotnet new webapp -n UserSecretSample $ dotnet user-secrets init $ dotnet user-secrets set "App:Title" "AADOJO" // アプリケーション内で設定値を取得する Console.WriteLine(Configuration["App:Title"]); $ dotnet run AADOJO info: Microsoft.Hosting.Lifetime[0] Now listening on: https://localhost:5001 ...
  27. 27. #aadojo 4. バックエンドサービス
  28. 28. #aadojo バックエンドサービス バックエンドサービスをアタッチされたリソースとして扱う。 環境ごとによって接続方法が変わらないようにする。
  29. 29. #aadojo 5. ビルド、リリース、実行
  30. 30. #aadojo .NET Core CLI コマンド 機能 dotnet new プロジェクトの新規作成 dotnet restore パッケージの復元 dotnet build プロジェクトのビルド dotnet run プロジェクトの実行 dotnet test 単体テストの実行 dotnet pack プロジェクトのパッケージ化 dotnet publish プロジェクトの展開 (=実行形式ファイルの生成)
  31. 31. #aadojo 2種類の展開方法 1. フレームワークに依存する展開方法 • Framework Dependent Deployments (FDD) • OS にインストール済のランタイムを使って実行する 2. 自己完結型の展開方法 • Self Contained Deployments (SCD) • 実行に必要なランタイムやライブラリを全て内包する
  32. 32. #aadojo$ dotnet publish --self-contained --configuration Release --runtime win-x64 .NET Core 向け Microsoft (R) Build Engine バージョン 16.4.0+e901037fe Copyright (C) Microsoft Corporation.All rights reserved. D:¥tmp¥MyApp¥MyApp.csproj の復元が 414.92 ms で完了しました。 MyApp -> D:¥tmp¥MyApp¥bin¥Release¥netcoreapp3.1¥win-x64¥MyApp.dll MyApp -> D:¥tmp¥MyApp¥bin¥Release¥netcoreapp3.1¥win-x64¥MyApp.Views.dll MyApp -> D:¥tmp¥MyApp¥bin¥Release¥netcoreapp3.1¥win-x64¥publish¥
  33. 33. #aadojo Zipで展開可能 (大半がランタイム)
  34. 34. #aadojo 7. ポートバインディング
  35. 35. #aadojo ポートバインディング • ポートバインディングを通してサービスを公開する • Webアプリケーションとして公開可能な自己完結形式 • ビルトインサーバーがあること • ASP.NET Core : Kestrel (HTTP(S)/WebSocket/Reverse Proxy)
  36. 36. #aadojo ASP.NET Core のホスト方式 • Web ホストと 汎用ホストの2種類 • Web ホスト:Web アプリケーションとして実行する構成 • 汎用ホスト:Web 以外のシナリオで同様の初期構成を行う • ホスト起動時に以下のリソースをカプセル化する • ミドルウェア、ログプロバイダー、DI、設定値、 HTTP サーバー (Web ホストのみ)
  37. 37. #aadojo 汎用ホスト
  38. 38. #aadojo Web ホスト
  39. 39. #aadojo 8. 並行性
  40. 40. #aadojo スケールアウト前提で設計する • 複数のプロセスで実行する • PaaS : スケールアウトで複数インスタンス稼働 • Kubernetes : Pod 数を増やす • ステートフル構成ではデータ不整合が起こる →データを外部に保管してステートレス構成にする
  41. 41. #aadojo 9. 廃棄容易性
  42. 42. #aadojo 廃棄容易姓 • 廃棄が容易なプロセスとは高速な起動と正確な停止ができ ること • コードや設定を素早くデプロイするため
  43. 43. #aadojo ASP.NET Core での起動と停止のイベント Microsoft.Extensions.Hosting.IHostApplicationLifetime イベント トリガー ApplicationStarted ホストが完全に起動したとき ApplicationStopped ホストが正常なシャットダウンを完 了しているとき ApplicationStopping ホストが正常なシャットダウンを 行っているとき
  44. 44. #aadojo ホストが完全に起動したとき ホストが正常なシャットダウンを完了しているとき ホストが正常なシャットダウンを行っているとき
  45. 45. #aadojo$ dotnet run info: Microsoft.Hosting.Lifetime[0] Now listening on: https://localhost:5001 Application started now... info: Microsoft.Hosting.Lifetime[0] Now listening on: http://localhost:5000 info: Microsoft.Hosting.Lifetime[0] Application started. Press Ctrl+C to shut down. info: Microsoft.Hosting.Lifetime[0] Hosting environment: Development info: Microsoft.Hosting.Lifetime[0] Content root path: D:¥tmp¥12factor¥src¥HostApplicationLifetimeSample Application stopping now... info: Microsoft.Hosting.Lifetime[0] Application is shutting down... Application stopped now...
  46. 46. #aadojo 10. 開発/本番一致
  47. 47. #aadojo 環境ごとのギャップ • 時間のギャップ • 開発者が編集したコードが本番に反映されるまで数日、数週間、 時には数ヶ月かかることがある。 • 人材のギャップ • 開発者が書いたコードを、インフラエンジニアがデプロイする。 • ツールのギャップ • 本番デプロイではApache、MySQL、Linuxを使うのに、開発者が Nginx、SQLite、OS Xのようなスタックを使うことがある。
  48. 48. #aadojo ツールのギャップを埋める • 開発環境 : PC • ステージング環境や本番環境 : クラウド • クラウドのリソースを扱うコードにギャップが出やすい →エミュレーター等の開発ツールを活用する ⇒異なるのは接続情報(接続文字列)だけにする
  49. 49. #aadojo Azure のローカル開発ツール リソース エミュレーター Storage Account Storage Emulator Cosmos DB Cosmos Emulator SQL Database SQL Server Express LocalDB Bot Service Bot Framework Emulator
  50. 50. #aadojo 11. ログ
  51. 51. #aadojo ログの出力方法 • ストリームに出力することが好ましい • 出力先 (コンソールやファイル等) は意識しない IaaS : 収集~可視化のよくある構成
  52. 52. #aadojo ASP.NET Core の豊富なログプロバイダー 種別 ログプロバイダー ビルトイン Microsoft.Extensions.Logging.Console ビルトイン Microsoft.Extensions.Logging.Debug ビルトイン Microsoft.Extensions.Logging.EventSource ビルトイン Microsoft.Extensions.Logging.TraceSource ビルトイン Microsoft.Extensions.Logging.AzureAppServices ビルトイン Microsoft.Extensions.Logging.ApplicationInsights サードパーティ Log4Net サードパーティ NLog サードパーティ SeriLog
  53. 53. #aadojo 12. 管理プロセス
  54. 54. #aadojo 管理タスクを1回限りのプロセスとして実行する • アプリケーションを管理するためのタスク • DB マイグレーション • REPL シェル • dotnet interactive ←New!! https://devblogs.microsoft.com/dotnet/net-interactive-is-here-net-notebooks-preview-2/
  55. 55. #aadojo DBマイグレーション • .NET Core では Entity Framework Core を O/Rマッパーと して利用できる • dotnet ef コマンドでマイグレーションファイルの管理や データベースのマイグレーションを実行できる
  56. 56. #aadojo まとめ • 12FA を意識するのは拡張性と可搬性を得るため • ”ステートレス”を重視する要素が多い →最低限のステートレス設計となる • .NET Core の基本機能で実装できることが多い →クラウドを組み合わせることで品質を高める

×