SlideShare a Scribd company logo
サーバーレスの常識を覆す
Azure Durable Functionsを使い倒す
2018/08/22 Serverless Meetup Fukuoka #2
@tsubakimoto_s
松村優大 (MLBお兄さん)
• 株式会社オルターブース
• Microsoft MVP
(Developer Technologies)
• C#/PHP/Azure/AWS
• 島根県出身 3031歳
2
本日の内容
• Serverless Services on Microsoft Azure
• Azure Durable Functions
• デモ
3
Serverless Services on
Microsoft Azure
https://azure.microsoft.com/ja-jp/overview/serverless-computing/
https://azure.microsoft.com/ja-jp/campaigns/serverless/
4
5https://www.youtube.com/watch?v=cOFlSvnupQM
6
Azure Functions
Logic Apps
Event Grid
7
Platform as a Service
アプリケーション
コード
ロジック
トリガー
Azure
Functions
8
イベントドリブン型のコードを実行でき
るサービス。従来のホスティングプラン
の他、実行時間・実行回数に対する従量
課金プランが提供されている。
Webhookをはじめ、Microsoft Azure、
Microsoft Graph、サードパーティの
サービスと連携することができる。
Language Runtime v1.x Runtime v2.x
C# GA Preview
Node.js GA Preview
F# GA -
Java - Preview
Python Experimental -
PHP Experimental -
TypeScript Experimental -
.cmd, .bat Experimental -
Bash Experimental -
PowerShell Experimental -
9
Language Runtime v1.x Runtime v2.x
C# GA Preview
Node.js GA Preview
F# GA -
Java - Preview
Python Experimental -
PHP Experimental -
TypeScript Experimental -
.cmd, .bat Experimental -
Bash Experimental -
PowerShell Experimental -
10
仕様変更もある
通常のFunctionsの実装
11
トリガー(入力)
バインド(出力)
単一処理の軽量な
コードが望ましい
Azure Durable Functions
The primary use case for Durable Functions is
simplifying complex, stateful coordination problems
in serverless applications.
12
【de:code 2018】AD02 Serverless の世界を進化させるイノベーション - Durable Functions
https://youtu.be/QuXO5plBiFM
Visual Studio
• Visual Studio 15.3~
• Azure開発のワークロード
• Azure Storage Emulator
• 拡張機能
Microsoft.Azure.WebJobs.Extensions.DurableTask
• C#での開発に適している
13https://docs.microsoft.com/ja-jp/azure/azure-functions/durable-functions-install
Visual Studio Code
• Azure Functions Core Tools 2.x
• Azure Storage Emulator
• 拡張機能
Microsoft.Azure.WebJobs.Extensions.DurableTask
• C#, Node.jsでの開発に適している
14https://docs.microsoft.com/ja-jp/azure/azure-functions/durable-functions-install
Durable Functions Pattern
1. 関数チェーン
2. ファンアウト/ファンイン
3. 非同期のHTTP API
4. 監視
5. 人による操作
15https://docs.microsoft.com/ja-jp/azure/azure-functions/durable-functions-overview
パターン1 : 関数チェーン
16
本来、Queueでつないで連鎖する一連の
関数を、Queueなしで実行できる機能。
ドキュメントのサンプルでは動かない
17
Durable Functionsの仕組み
• クライアント関数(OrchestrationClientAttribute)
• 関数全体の実行トリガーとなる
• オーケストレーター関数(OrchestrationTriggerAttribute)
• アクティビティ関数を呼出し、結果の受取を行う
• アクティビティ関数(ActivityTriggerAttribute)
• 実際の処理を行う作業単位
18
19
[FunctionName("F1")]
public static async Task<HttpResponseMessage> HttpStart(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")]HttpRequestMessage req,
[OrchestrationClient]DurableOrchestrationClient starter,
ILogger log)
{
string instanceId = await starter.StartNewAsync("F2", null);
log.LogInformation($"Started orchestration with ID = '{instanceId}'.");
return starter.CreateCheckStatusResponse(req, instanceId);
}
[FunctionName("F2")]
public static async Task<List<string>> RunOrchestrator(
[OrchestrationTrigger] DurableOrchestrationContext context)
{
var outputs = new List<string>();
outputs.Add(await context.CallActivityAsync<string>("F3", "Tokyo"));
outputs.Add(await context.CallActivityAsync<string>("F3", "Osaka"));
outputs.Add(await context.CallActivityAsync<string>("F3", "Fukuoka"));
return outputs;
}
[FunctionName("F3")]
public static string SayHello([ActivityTrigger] string name, ILogger log)
{
log.LogInformation($"Saying hello to {name}.");
return $"Hello {name}!";
}
クライアント関数
オーケストレーター関数
アクティビティ関数
パターン2 : ファンアウト/ファンイン
20
複数の関数を並列に実行してすべてが
完了するまで待機するパターン。
パターン3 : 非同期のHTTP API
21
長時間実行する関数の“状態”を取得する
ためのAPIを公開する。
Durable FunctionsのAPIレスポンス(JSON)
項目 説明
id
オーケストレーションインスタンス
の ID
statusQueryGetUri
オーケストレーションインスタンス
の状態を取得するURL
sendEventPostUri
オーケストレーションインスタンス
のイベントを発生させるURL
terminatePostUri
オーケストレーションインスタンス
を終了させるURL
22
例
23
{
"id": "2b729f0beb2c44358a9f1c2a75197322",
"statusQueryGetUri":
"http://localhost:7071/runtime/webhooks/DurableTaskExte
nsion/instances/2b729f0beb2c44358a9f1c2a75197322?taskHu
b=DurableFunctionsHub&connection=Storage&code=2bYl3HewP
In8QZMTYiPA0ifHuJ6WSR/t38v1923ru8S8LzbXFNaaCg==", ...
}
statusQueryGetUri (待機中)
24
{
"instanceId": "2b729f0beb2c44358a9f1c2a75197322",
"runtimeStatus": "Pending",
"input": null,
"customStatus": null,
"output": null,
"createdTime": "2018-08-15T20:58:47Z",
"lastUpdatedTime": "2018-08-15T20:58:47Z"
}
statusQueryGetUri (実行中)
25
{
"instanceId": "2b729f0beb2c44358a9f1c2a75197322",
"runtimeStatus": "Running",
"input": null,
"customStatus": null,
"output": null,
"createdTime": "2018-08-15T20:58:47Z",
"lastUpdatedTime": "2018-08-15T20:58:48Z"
}
statusQueryGetUri (完了)
26
{
"instanceId": "2b729f0beb2c44358a9f1c2a75197322",
"runtimeStatus": "Completed",
"input": null,
"customStatus": null,
"output": [
"Hello Tokyo!", "Hello Seattle!", "Hello London!"
],
"createdTime": "2018-08-15T20:58:47Z",
"lastUpdatedTime": "2018-08-15T20:59:01Z"
}
パターン4 : 監視
27
外部の関数を監視し、関数の状態によっ
て後続の処理を変える。
パターン5 : 人による操作
28
イベントが呼び出されるまで関数の実行
を止める。
例)上司の承認が必要なワークフロー
29
[FunctionName("Approval_Run")]
public static async Task RunOrchestrator(
[OrchestrationTrigger] DurableOrchestrationContext context)
{
bool approved = await context.WaitForExternalEvent<bool>("Approval");
if (approved) { /* approval granted */ }
else { /* approval denied */ }
}
[FunctionName("Approval_Request")]
public static async Task RequestApproval(
[QueueTrigger("approval-queue")] string instanceId,
[OrchestrationClient]DurableOrchestrationClient client)
{
await client.RaiseEventAsync(instanceId, "Approval", true);
}
オーケストレーター関数
外部イベント関数
30
[FunctionName("Approval_Run")]
public static async Task RunOrchestrator(
[OrchestrationTrigger] DurableOrchestrationContext context)
{
bool approved = await context.WaitForExternalEvent<bool>("Approval");
if (approved) { /* approval granted */ }
else { /* approval denied */ }
}
[FunctionName("Approval_Request")]
public static async Task RequestApproval(
[QueueTrigger("approval-queue")] string instanceId,
[OrchestrationClient]DurableOrchestrationClient client)
{
await client.RaiseEventAsync(instanceId, "Approval", true);
}
ここで処理が止まり
“Approval”という
イベント呼出しを待つ
31
[FunctionName("Approval_Run")]
public static async Task RunOrchestrator(
[OrchestrationTrigger] DurableOrchestrationContext context)
{
bool approved = await context.WaitForExternalEvent<bool>("Approval");
if (approved) { /* approval granted */ }
else { /* approval denied */ }
}
[FunctionName("Approval_Request")]
public static async Task RequestApproval(
[QueueTrigger("approval-queue")] string instanceId,
[OrchestrationClient]DurableOrchestrationClient client)
{
await client.RaiseEventAsync(instanceId, "Approval", true);
}
キューにインスタンスID
をセットする
32
[FunctionName("Approval_Run")]
public static async Task RunOrchestrator(
[OrchestrationTrigger] DurableOrchestrationContext context)
{
bool approved = await context.WaitForExternalEvent<bool>("Approval");
if (approved) { /* approval granted */ }
else { /* approval denied */ }
}
[FunctionName("Approval_Request")]
public static async Task RequestApproval(
[QueueTrigger("approval-queue")] string instanceId,
[OrchestrationClient]DurableOrchestrationClient client)
{
await client.RaiseEventAsync(instanceId, "Approval", true);
}
指定したインスタンスIDの
“Approval”イベントを呼出す
33
[FunctionName("Approval_Run")]
public static async Task RunOrchestrator(
[OrchestrationTrigger] DurableOrchestrationContext context)
{
bool approved = await context.WaitForExternalEvent<bool>("Approval");
if (approved) { /* approval granted */ }
else { /* approval denied */ }
}
[FunctionName("Approval_Request")]
public static async Task RequestApproval(
[QueueTrigger("approval-queue")] string instanceId,
[OrchestrationClient]DurableOrchestrationClient client)
{
await client.RaiseEventAsync(instanceId, "Approval", true);
}
イベントの結果を受けて
後続の処理を実行
34
[FunctionName("Approval_Run")]
public static async Task RunOrchestrator(
[OrchestrationTrigger] DurableOrchestrationContext context)
{
bool approved = await context.WaitForExternalEvent<bool>("Approval");
if (approved) { /* approval granted */ }
else { /* approval denied */ }
}
[FunctionName("Approval_Request")]
public static async Task RequestApproval(
[QueueTrigger("approval-queue")] string instanceId,
[OrchestrationClient]DurableOrchestrationClient client)
{
await client.RaiseEventAsync(instanceId, "Approval", true);
}
文字列やオブジェクトを
渡すことも可能
価格モデル
• App Serviceプラン
• 使用するリソースに対する課金
• 常時接続可能(AlwaysOn)
• 従量課金プラン
• 関数の実行時間と実行回数に対する課金
• 無料枠あり
• Cold Startやオートスケールの考慮が必要
35
36
[FunctionName("Approval_Run")]
public static async Task RunOrchestrator(
[OrchestrationTrigger] DurableOrchestrationContext context)
{
bool approved = await context.WaitForExternalEvent<bool>("Approval");
if (approved) { /* approval granted */ }
else { /* approval denied */ }
}
ここで処理が止まり
“Approval”という
イベント呼出しを待つ
待機中の時間(=イベントが呼び出されるまで)は課金対象になる?
課金対象にならない
デモ
https://github.com/tsubakimoto/serverless-meetup-fukuoka-v2
37
38
Application
Insights
Azure Functions
Blob
Storage
SlackWeb Browser 上司の承認 結果の通知
私が思う アンチパターン
39
if
条件1 条件2 条件3 条件4 条件5
output1 output2 output3 output4 output5
トリガー
ひとつのFunctionで複数の出力を行うやつ
40
output output output output output
単処理になるように分解する
宣伝
41
42
43
44
https://fukuten.connpass.com/event/95744/
ご清聴ありがとうございました
45

More Related Content

PPTX
はじめてのAzure Web App for Containers! -コンテナの基礎から DevOps 環境の構築まで-
PDF
Dockerセキュリティ: 今すぐ役に立つテクニックから,次世代技術まで
PDF
Serf / Consul 入門 ~仕事を楽しくしよう~
PDF
Microsoft Azureのビッグデータ基盤とAIテクノロジーを活用しよう
PPTX
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
PPTX
[CEDEC2017] LINEゲームのセキュリティ診断手法
PDF
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
PDF
CyberAgentのプライベートクラウド Cycloudの運用及びモニタリングについて #CODT2020 / Administration and M...
はじめてのAzure Web App for Containers! -コンテナの基礎から DevOps 環境の構築まで-
Dockerセキュリティ: 今すぐ役に立つテクニックから,次世代技術まで
Serf / Consul 入門 ~仕事を楽しくしよう~
Microsoft Azureのビッグデータ基盤とAIテクノロジーを活用しよう
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
[CEDEC2017] LINEゲームのセキュリティ診断手法
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
CyberAgentのプライベートクラウド Cycloudの運用及びモニタリングについて #CODT2020 / Administration and M...

What's hot (20)

PDF
EC2のストレージどう使う? -Instance Storageを理解して高速IOを上手に活用!-
PDF
Keycloak拡張入門
PDF
Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)
PDF
[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例
PPTX
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]
PDF
BuildKitの概要と最近の機能
PDF
コンテナにおけるパフォーマンス調査でハマった話
PDF
Resilience Engineering on Kubernetes
PDF
スマートフォンゲームのチート事情
PDF
マルチテナントのアプリケーション実装〜実践編〜
PPTX
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
PDF
AWS Black Belt Techシリーズ AWS Key Management Service
PDF
20200303 AWS Black Belt Online Seminar AWS Cloud Development Kit (CDK)
PPTX
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
PPTX
どうやって決める?kubernetesでのシークレット管理方法(Cloud Native Days 2020 発表資料)
PPTX
はじめてのElasticsearchクラスタ
PDF
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
PDF
Kuberneteの運用を支えるGitOps
PDF
Google Cloud で実践する SRE
EC2のストレージどう使う? -Instance Storageを理解して高速IOを上手に活用!-
Keycloak拡張入門
Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)
[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]
BuildKitの概要と最近の機能
コンテナにおけるパフォーマンス調査でハマった話
Resilience Engineering on Kubernetes
スマートフォンゲームのチート事情
マルチテナントのアプリケーション実装〜実践編〜
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
AWS Black Belt Techシリーズ AWS Key Management Service
20200303 AWS Black Belt Online Seminar AWS Cloud Development Kit (CDK)
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
どうやって決める?kubernetesでのシークレット管理方法(Cloud Native Days 2020 発表資料)
はじめてのElasticsearchクラスタ
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
Kuberneteの運用を支えるGitOps
Google Cloud で実践する SRE
Ad

Similar to サーバーレスの常識を覆す Azure Durable Functionsを使い倒す (20)

PPTX
Azure で Serverless 初心者向けタッチ&トライ
PPTX
「Azure durable functions」の概要
PPTX
"サーバーレス"を超越する。なぜ?から理解する Durable Functions
PDF
[Japan Tech summit 2017] APP 003
PDF
20190514 Smart Store - Azure servlerless architecture
PDF
Smart Store サーバーレスアーキテクチャ編
PPTX
Azure Functions あれこれ
PDF
20190731 Azure Functions x Line at Azure Tech Lab #4
PDF
Azure Functions と Serverless - 概要と企業向け Tips
PPTX
Azure serverless!! azure functionsでサーバーを意識しない開発
PDF
[Japan Tech summit 2017] APP 004
PDF
Azureをフル活用したサーバーレスの潮流について
PDF
Azure Functions 入門
PDF
[AC11] サーバー管理よ、サヨウナラ。サーバーレスアーキテクチャの意義と実践
PPTX
サーバー管理よ、サヨウナラ。サーバーレス アーキテクチャの意義と実践
PDF
ゆるふわAzure Functions
PPTX
できる!サーバレスアーキテクチャ
PDF
[HAKODATE Developer Conference 2018] 「Azure Functions」で始めるサーバーレス アプリケーション開発
PDF
Azure Functionsでサーバーレスアプリケーション構築
PDF
Smart store servlerless-20191030-40min
Azure で Serverless 初心者向けタッチ&トライ
「Azure durable functions」の概要
"サーバーレス"を超越する。なぜ?から理解する Durable Functions
[Japan Tech summit 2017] APP 003
20190514 Smart Store - Azure servlerless architecture
Smart Store サーバーレスアーキテクチャ編
Azure Functions あれこれ
20190731 Azure Functions x Line at Azure Tech Lab #4
Azure Functions と Serverless - 概要と企業向け Tips
Azure serverless!! azure functionsでサーバーを意識しない開発
[Japan Tech summit 2017] APP 004
Azureをフル活用したサーバーレスの潮流について
Azure Functions 入門
[AC11] サーバー管理よ、サヨウナラ。サーバーレスアーキテクチャの意義と実践
サーバー管理よ、サヨウナラ。サーバーレス アーキテクチャの意義と実践
ゆるふわAzure Functions
できる!サーバレスアーキテクチャ
[HAKODATE Developer Conference 2018] 「Azure Functions」で始めるサーバーレス アプリケーション開発
Azure Functionsでサーバーレスアプリケーション構築
Smart store servlerless-20191030-40min
Ad

More from Yuta Matsumura (20)

PDF
「自分のとこでは動くけど…」を無くす devcontainer
PDF
チーム開発で徐々にコード品質をあげていく取り組み
PDF
.NETのサポートポリシーのおさらい #csharptokyo
PDF
App Modernization for .NET
PDF
分かったうえではじめるCI/CD
PDF
VSCodeで始めるAzure Static Web Apps開発
PDF
いつでもどこでも .NET
PDF
.NET アプリを改善して実践する継続的インテグレーション
PDF
マイクロサービス開発が捗る Project Tye
PDF
オンライン中心だから地方のコミュニティも見てみませんか? - Fukuoka.NETの紹介
PDF
Azure の ID 管理サービスに LINE ログインを組み込もう
PDF
Blazor Server テンプレート解説
PDF
The Twelve-Factor (A|M)pp with C#
PDF
改めて C# でできることを振り返る
PDF
スタートアップ企業が実践するクラウドネイティブアプリケーションの開発手法
PDF
忙しい人のための .NET Conf 2019 まとめ
PDF
.NET Conf の歩き方
PDF
PHPカンファレンス福岡2019 閉会式
PDF
PHPカンファレンス福岡2019 開会式
PDF
これから始める Bot Builder 開発のコツと舞台裏
「自分のとこでは動くけど…」を無くす devcontainer
チーム開発で徐々にコード品質をあげていく取り組み
.NETのサポートポリシーのおさらい #csharptokyo
App Modernization for .NET
分かったうえではじめるCI/CD
VSCodeで始めるAzure Static Web Apps開発
いつでもどこでも .NET
.NET アプリを改善して実践する継続的インテグレーション
マイクロサービス開発が捗る Project Tye
オンライン中心だから地方のコミュニティも見てみませんか? - Fukuoka.NETの紹介
Azure の ID 管理サービスに LINE ログインを組み込もう
Blazor Server テンプレート解説
The Twelve-Factor (A|M)pp with C#
改めて C# でできることを振り返る
スタートアップ企業が実践するクラウドネイティブアプリケーションの開発手法
忙しい人のための .NET Conf 2019 まとめ
.NET Conf の歩き方
PHPカンファレンス福岡2019 閉会式
PHPカンファレンス福岡2019 開会式
これから始める Bot Builder 開発のコツと舞台裏

サーバーレスの常識を覆す Azure Durable Functionsを使い倒す