フルマネージドサーバーレスコンテナーという選択肢。Azure Container Apps の活用アイディア

8.2K Views

December 17, 22

スライド概要

2022/12/17 ServerlessDays Tokyo 2022 Virtual での登壇資料です。
https://serverless.connpass.com/event/267806/

profile-image

C#やAzureなどMS関連技術とLINE関連技術が好きです。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

フルマネージドサーバーレスコンテナーという選択肢。 Azure Container Apps の活用アイディア ServerlessDays Tokyo 2022 Virtual 2022/12/17 平林 拓将(ひらりん) himarin269 / himanago

2.

About me • name: 平林 拓将(ひらりん) • work: テクニカルトレーナー&開発 • award/title: - Microsoft MVP for Azure(2019.11~) - LINE API Expert(2020.3~) • like: - C# / serverless / cross-platform • social: - Twitter:@himarin269 GitHub:himanago Blog:https://himanago.hatenablog.com/

3.

今回お話しすること(35分) • サーバーレスにコンテナー・マイクロサービス運用が できる「Azure Container Apps」。 • このサービスの概要と活用アイデアを、既存のWeb ア プリケーションの移行や拡張、各種 API と連携した開 発などのシナリオをベースにご紹介します。 • 今回はASP.NET CoreのWebアプリにLINE Bot (チャットボット)の機能を追加・拡張するシナリオ です。

4.

Azure Container Apps サーバーレスなコンテナーアプリを動かすためのサービス 複数のコンテナーを組み合わせてマイクロサービスを運用可能 https://learn.microsoft.com/ja-jp/azure/container-apps/

5.

Azure Container Apps の特徴 • 複数のコンテナーを実行するように最適化 • フルマネージドなコンテナー実行基盤 • Kubernetes を中心に Dapr、KEDA、envoy などのオープン ソースのテクノロジが利用されている • サービス検出やトラフィック分割などの機能によって Kubernetes スタイルのアプリやマイクロサービスをサポート • トラフィックに基づくスケーリング (ゼロにスケーリング、イベント駆動) • 実行時間の長いプロセスをサポート https://learn.microsoft.com/ja-jp/azure/container-apps/compare-options#azure-container-apps

6.

他のサービスとの比較 イベント 駆動 コードを 直接デプロイ コンテナー 実行 k8s機能 ゼロにス ケーリング 任意の言語・ フレーム ワーク Azure Functions ○ ○ △ × ○ △ Azure Web Apps × ○ ○ × × △ Azure Container Apps △ × ○ △ ○ ○ Azure Kubernetes Service △ × ○ ○ ○ ○ 構築・管理の容易性と柔軟性のバランスが良く、 Kubernetes 入門編としてもおすすめな フルマネージドサーバーレスコンテナー 設定構築が 容易・ 自由度 低 設定構築が 複雑・ 自由度 高

7.

Azure Container Apps の構成 Container Apps Environment Container App Container App Container App

8.

アプリ(ASP.NET Core)を移行 Container Apps Environment Azure Container Registry SQL Database Container App Push CI/CD (GitHub Actions) ASP.NET Core Webアプリ コンテナーで動作させる Push 接続情報など の管理 Key Vault

9.

今回の例:場所の予約システム(Web アプリ) C#(ASP.NET Core) で実装 これを Azure に移行したい

10.

[DEMO] Container Apps上の予約システム

11.

機能拡張はコンテナーを増設 Container Apps Environment Container App Container App Container App コンテナー同士を連携させることが可能

12.

Dapr(Distributed Application Runtime) • マイクロサービス同士の連携 などを容易に開発できるよう にする • オープンなAPIで開発言語も 問わない (各言語にSDKあり) https://dapr.io/ https://learn.microsoft.com/ja-jp/azure/container-apps/dapr-overview

13.

Dapr によるサイドカーパターン 別のコンテナーに分離・カプセル化されたコンポーネント同士を連携

14.

サイドカーとして LINE Bot 機能を追加 予約システム Bot Webhook エンドポイント (Botバックエンド) Python(Flask) で実装

15.

予約にはマルチターンの対話が必要 ユーザー Bot 予約したい どこを? エリア2 いつ? 10月23日

16.

マルチターンはけっこう大変 ユーザー・Bot間で数往復のやりとりをする場合、 会話の経緯(対話コンテキスト)をサーバー側で 覚えておく必要がある 対話コンテキストを DBなどに保存 Bot Webhook エンドポイント DBなど メッセージ受信時、 保存された対話コンテキストを 毎回確認し適切な応答を行う バックエンド

17.

Dapr の状態管理で対話コンテキストを保持 Daprを経由してユーザーごとの 対話コンテキストを保存 Container App (LINE Bot) state store

18.

Dapr の状態管理 ※ 今回のデモアプリでは Cosmos DBを使用 https://learn.microsoft.com/ja-jp/dotnet/architecture/dapr-for-net-developers/state-management

19.

WebアプリとBotでコンテキストを共有 LINEログインを実装 LINEユーザーIDをキーに状態を保存 Bot C#/ASP.NET Core Webアプリ Python/Flask LINE Bot 同一プロバイダー内においては共通のLINEユーザーIDを持つため、 それぞれのサービスでLINEユーザーIDを使う

20.

[DEMO] Dapr 状態管理によるコンテキスト共有

21.

チャットボット機能の拡張方法 • チャットボットのできること(=スキル)をマイクロサービス として実装して機能を拡張 • Dapr でコンテナー同士をつなぐことができるため、 手軽にスキル追加・拡張ができる Bot 予約スキル Webhook Endpoint 天気予報スキル 問合せスキル

22.

サーバーレスな他のサービスとの相性もよい Azure Functions Cosmos DB Static Web Apps Functionsランタイムを コンテナーで実行可能 Dapr の State Store として利用可能 バックエンド API を Container Appsに差替可能

23.

Azure Functions のコードを使用 • Azure Functions はコンテナー上で実行可能 • 以下のコマンドで Dockerfileを作成 func init --docker-only • KEDA で使用できるトリガー • Azure Storage キュー • Azure Service Bus • Azure Event/IoT Hubs • Apache Kafka • RabbitMQ キュー https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-kubernetes-keda

24.

フロントエンド(SPA)の追加・拡張 ◆ LIFF(LINE Front-end Framework) チャットボット機能だけでは物足りないときに Web画面を実行できる機能がある LINE内で実行できるミニアプリとしての利用も可能 スタンプカードや会員証の機能や、 よりリッチな予約機能の提供 (状態共有したい) 予約機能 その他便利機能 LINE Botに限らず、軽量なWeb UIを 追加・拡張する機会は多い

25.

Azure Static Web Apps • • • • • 静的Webサイトホスティングサービス カスタムドメイン・SSL 対応 GitHub との統合による CI/CD ステージング環境での PR レビュー Azure Functions の統合 ★ ドキュメント https://docs.microsoft.com/ja-jp/azure/static-web-apps/

26.

Azure Static Web Apps の特徴 /front </> ブラウザ /api API バックエンドAPI(Azure Functions)を 同一リポジトリで開発・デプロイ クロスオリジン制約を 気にすることなく アクセス可能 組み込みの Functions の代わりに Container Apps を使うことができる!

27.

Container Appsをバックエンドに使用できる SWA 各アプリにおける 操作状況を共有できる </> LIFFフロントエンド Container Apps Environment Webアプリ LINE Bot LIFFバックエンド ※現在 SWA で開発しているアプリも、バックエンド API のFunctions を そのまま Container App に載せ替えればサイドカーを使用可能に!

28.

おさらい/補足:実装・運用に便利な機能 • Container Apps での複数コンテナー運用 • Dapr によるコンテナー間連携 • GitHub Actions での CI/CD • リポジトリは任意の単位で作成 OK • Blue/Green デプロイメントも可能 • Key Vault によるシークレット管理

29.

おさらい/補足:実装・運用に便利な機能 • BicepによるIaC • Azure へのリソース作成をプログラミングライクに書ける • リソース間の接続・連携設定もコードで実現可能 param location string = resourceGroup().location param storageAccountName string = 'toylaunch${uniqueString(resourceGroup().id)}’ resource storageAccount 'Microsoft.Storage/storageAccounts@2021-06-01' = { name: storageAccountName location: location sku: { name: 'Standard_LRS’ } kind: 'StorageV2’ properties: { accessTier: 'Hot’ } } https://learn.microsoft.com/ja-jp/azure/azure-resource-manager/bicep/overview?tabs=bicep

30.

まとめ • Azure Container Apps は複数コンテナーの 運用が楽にできる“簡易版 Kubernetes” • Dapr の機能でコンテナー同士の連携や状態の 共有が可能 • Azure と Azure Container Apps には 複雑に絡み合うサービス間連携を統合的に管理・ 実装できる機能が揃っている