SlideShare a Scribd company logo
Azure で Serverless
初心者向けタッチ&トライ(公開版)
2019.5.29 @de:code 2019
Serverless Community
Serverlessとは?
Azure Functions
...?
Durable Functions
• Azure Functions extension
• Enables long-running, stateful serverless operations
• Write complex function orchestrations in a single function
• Built on the open-source Durable Task Framework
• Only pay when your code is running
• Orchestrator replays itself to re-establish state every run
Durable Patterns
Function chaining Fan-out / fan-in
Event aggregation
Extended Status Monitoring
http
Async HTTP APIs
Human interaction / timeout
タッチ&トライ
作成するもの
Orchestration Client
(HttpStart)
Orchestrator
(OrchestratorFunction)
Activity Function
(E1_SayHello)
流れ
1. Visual Studio Code にAzure Functions 拡張機能をインストール
2. Azure Functions プロジェクトを作成
3. Durable Functions npm パッケージをインストール
4. starter 関数を作成
5. オーケストレーター関数を作成する
6. アクティビティ関数を作成する
7. Azure へのサインイン
8. Azure にプロジェクトを発行
9. Azure で関数をテスト
1. Azure Functions 拡張機能をインストール
• Visual Studio Code で [拡張機能] を開き、azure functions を検索するか、Visual
Studio Code でこのリンクを開きます。
• [インストール] を選択して、Visual Studio Code に拡張機能をインストールします。
• Visual Studio Code を再起動し、アクティビティ バーの Azure アイコンを選択しま
す。 サイド バーに Azure Functions 領域が表示されます。
1. Azure Functions 拡張機能をインストール
• Visual Studio Code で、Azure ロゴを選択して [Azure:Functions] 領域を表示し、[新し
いプロジェクトの作成] アイコンを選択します。
• プロジェクト ワークスペースの場所としてデスクトップの「 demo 」のフォルダを選択
し、[選択] をクリックします。
2. Azure Functions プロジェクトを作成
• 関数アプリ プロジェクトの言語は「JavaScript」を選択します。
• 「V2」を選択します。
• 「Skip for now」を選択します。
2. Azure Functions プロジェクトを作成
• 「Open in current window」を選択します。
2. Azure Functions プロジェクトを作成
3. Durable Functions npm パッケージをインストール
• VS Codeでターミナルを開き、ワークスペース用のフォルダ「demo」で「npm install
durable-functions」 を実行して、durable-functions npm パッケージをインストール
します。
※npmがインストールされていない場合は、事前にnpmをPCにインストールします
4. starter 関数を作成
• [Azure:Functions] で [関数の作成] アイコンを選択します。
• 関数アプリ プロジェクトが含まれたフォルダーを選択し、[HTTP trigger] 関数テンプレート
を選択します。
• 関数名として「HttpStart」と入力して Enter キーを押し、[Anonymous] 認証を選択します。
4. starter 関数を作成
• index.js を以下の JavaScript に置き換えます。
const df = require("durable-functions");
module.exports = async function (context, req) {
const client = df.getClient(context);
const instanceId = await client.startNew(req.params.functionName, undefined, req.body);
context.log(`Started orchestration with ID = '${instanceId}'.`);
return client.createCheckStatusResponse(context.bindingData.req, instanceId);
};
4. starter 関数を作成
• function.json を以下の JavaScript に置き換えます。
{
"bindings": [
{
"authLevel": "anonymous",
"name": "req",
"type": "httpTrigger",
"direction": "in",
"route": "orchestrators/{functionName}",
"methods": ["get", "post"]
},
{
"name": "starter",
"type": "orchestrationClient",
"direction": "in"
}
]
}
Orchestration Client
(HttpStart)
Orchestrator
(OrchestratorFunction)
Activity Function
(E1_SayHello)
{
"bindings": [
{
"authLevel": "anonymous",
"name": "req",
"type": "httpTrigger",
"direction": "in",
"route": "orchestrators/{functionName}",
"methods": ["get", "post"]
},
{
"name": "starter",
"type": "orchestrationClient",
"direction": ”in"
}
]
}
const df = require("durable-functions");
module.exports = async function (context, req) {
const client = df.getClient(context);
const instanceId = await client.startNew(req.params.functionName,
undefined, req.body);
context.log(`Started orchestration with ID = '${instanceId}'.`);
return client.createCheckStatusResponse(context.bindingData.req,
instanceId);
};
index.js
function.json
5. オーケストレーター関数を作成
• 前の手順を繰り返し、HTTP Trigger Templateを使用して 2 つ目の関数を作成しま
す。 今回は関数に 「 OrchestratorFunction」 と名前を付けます。
• index.js を以下の JavaScript に置き換えます。
const df = require("durable-functions");
module.exports = df.orchestrator(function*(context){
context.log("Starting chain sample");
const output = [];
output.push(yield context.df.callActivity("E1_SayHello", "Tokyo"));
output.push(yield context.df.callActivity("E1_SayHello", "Seattle"));
output.push(yield context.df.callActivity("E1_SayHello", "London"));
return output;
});
5. オーケストレーター関数を作成
• function.json を以下の JavaScript に置き換えます。
{
"bindings": [
{
"name": "context",
"type": "orchestrationTrigger",
"direction": "in"
}
]
}
Orchestration Client
(HttpStart)
Orchestrator
(OrchestratorFunction)
Activity Function
(E1_SayHello)
{
"bindings": [
{
"authLevel": "anonymous",
"name": "req",
"type": "httpTrigger",
"direction": "in",
"route": "orchestrators/{functionName}",
"methods": ["get", "post"]
},
{
"name": "starter",
"type": "orchestrationClient",
"direction": ”in"
}
]
}
const df = require("durable-functions");
module.exports = async function (context, req) {
const client = df.getClient(context);
const instanceId = await client.startNew(req.params.functionName,
undefined, req.body);
context.log(`Started orchestration with ID = '${instanceId}'.`);
return client.createCheckStatusResponse(context.bindingData.req,
instanceId);
};
const df = require("durable-functions");
module.exports = df.orchestrator(function*(context){
context.log("Starting chain sample");
const output = [];
output.push(yield context.df.callActivity("E1_SayHello", "Tokyo"));
output.push(yield context.df.callActivity("E1_SayHello", "Seattle"));
output.push(yield context.df.callActivity("E1_SayHello", "London"));
return output;
});
{
"bindings": [
{
"name": "context",
"type": "orchestrationTrigger",
"direction": "in"
}
]
}
index.js
function.json
6. アクティビティ関数を作成
• 前の手順を繰り返し、HTTP Trigger Templateを使用して 2 つ目の関数を作成しま
す。 今回は関数に 「 E1_SayHello 」 と名前を付けます。
• index.js を以下の JavaScript に置き換えます。
module.exports = async function(context) {
return `Hello ${context.bindings.name}!`;
};
6. アクティビティ関数を作成
• function.json を以下の JavaScript に置き換えます。
{
"bindings": [
{
"name": "name",
"type": "activityTrigger",
"direction": "in"
}
]
}
Orchestration Client
(HttpStart)
Orchestrator
(OrchestratorFunction)
Activity Function
(E1_SayHello)
{
"bindings": [
{
"authLevel": "anonymous",
"name": "req",
"type": "httpTrigger",
"direction": "in",
"route": "orchestrators/{functionName}",
"methods": ["get", "post"]
},
{
"name": "starter",
"type": "orchestrationClient",
"direction": ”in"
}
]
}
const df = require("durable-functions");
module.exports = async function (context, req) {
const client = df.getClient(context);
const instanceId = await client.startNew(req.params.functionName,
undefined, req.body);
context.log(`Started orchestration with ID = '${instanceId}'.`);
return client.createCheckStatusResponse(context.bindingData.req,
instanceId);
};
const df = require("durable-functions");
module.exports = df.orchestrator(function*(context){
context.log("Starting chain sample");
const output = [];
output.push(yield context.df.callActivity("E1_SayHello", "Tokyo"));
output.push(yield context.df.callActivity("E1_SayHello", "Seattle"));
output.push(yield context.df.callActivity("E1_SayHello", "London"));
return output;
});
{
"bindings": [
{
"name": "context",
"type": "orchestrationTrigger",
"direction": "in"
}
]
}
module.exports = async function(context) {
return `Hello ${context.bindings.name}!`;
};
{
"bindings": [
{
"name": "name",
"type": "activityTrigger",
"direction": "in"
}
]
}
index.js
function.json
7. Azure へのサインイン
• [Azure: Functions] 領域で、[Sign in to Azure...](Azure にサインインする...) を選択し
ます。
※Azure アカウントがない場合は無償アカウントを作成して下さい
https://azure.microsoft.com/ja-jp/free/
8. Azure にプロジェクトを発行
• [Azure: Functions] 領域で、[Deploy to Function App](関数アプリにデプロイ) アイコ
ンを選択します。
8. Azure にプロジェクトを発行
• [サブスクリプションを選択] してから、 [+ Create New Function App in Azure](+
Azure で新しい Function App を作成) を選択します。
8. Azure にプロジェクトを発行
• 「Deploy」を選択します。
9. Azure で関数をテスト
• ブラウザでオーケストラーの情報を確認します。
https://<function名>.azurewebsites.net/api/orchestrators/OrchestratorFunction
出力結果例:
{
"id": "a42bfdf91f9a49da9c9558e2ef5c7a65",
"statusQueryGetUri": "https://decode-
horike.azurewebsites.net/runtime/webhooks/durabletask/instances/a42bfdf91f9a49da9c9558e2ef5c7a65?taskHub
=DurableFunctionsHub&connection=Storage&code=BId08/uK/2jAhDKF3bNjgNPzJGdGfcalR3dlm6PJyate/aG/rtHZ
VA==",
"sendEventPostUri": "https://decode-
horike.azurewebsites.net/runtime/webhooks/durabletask/instances/a42bfdf91f9a49da9c9558e2ef5c7a65/raiseEve
nt/{eventName}?taskHub=DurableFunctionsHub&connection=Storage&code=BId08/uK/2jAhDKF3bNjgNPzJGdGfc
alR3dlm6PJyate/aG/rtHZVA==",
・・・・
9. Azure で関数をテスト
• 前ページのstatusQueryGetUri をブラウザのURLにコピペし、オーケストラーの状態を
確認します。
出力結果例:
{
"instanceId": "6fa01dd927a245229cff60e9596d01ee",
"runtimeStatus": "Completed",
"input": null,
"customStatus": null,
"output": [
"Hello Tokyo!",
"Hello Seattle!",
"Hello London!"
],
"createdTime": "2019-05-28T14:10:02Z",
"lastUpdatedTime": "2019-05-28T14:10:02Z"
}
Orchestration Client
(HttpStart)
Orchestrator
(OrchestratorFunction)
Activity Function
(E1_SayHello)
{
"bindings": [
{
"authLevel": "anonymous",
"name": "req",
"type": "httpTrigger",
"direction": "in",
"route": "orchestrators/{functionName}",
"methods": ["get", "post"]
},
{
"name": "starter",
"type": "orchestrationClient",
"direction": ”in"
}
]
}
const df = require("durable-functions");
module.exports = async function (context, req) {
const client = df.getClient(context);
const instanceId = await client.startNew(req.params.functionName,
undefined, req.body);
context.log(`Started orchestration with ID = '${instanceId}'.`);
return client.createCheckStatusResponse(context.bindingData.req,
instanceId);
};
const df = require("durable-functions");
module.exports = df.orchestrator(function*(context){
context.log("Starting chain sample");
const output = [];
output.push(yield context.df.callActivity("E1_SayHello", "Tokyo"));
output.push(yield context.df.callActivity("E1_SayHello", "Seattle"));
output.push(yield context.df.callActivity("E1_SayHello", "London"));
return output;
});
{
"bindings": [
{
"name": "context",
"type": "orchestrationTrigger",
"direction": "in"
}
]
}
module.exports = async function(context) {
return `Hello ${context.bindings.name}!`;
};
{
"bindings": [
{
"name": "name",
"type": "activityTrigger",
"direction": "in"
}
]
}
index.js
function.json
Appendix
無償アカウントの作成
• https://azure.microsoft.com/ja-jp/free/
チュートリアル
• 今回のタッチアンドトライは公式のチュートリアルをベースにしています。
JavaScript で最初の Durable Functions を作成する
https://docs.microsoft.com/ja-jp/azure/azure-functions/durable/quickstart-js-vscode
Functions Appの前処理
• Durable Functions ExtensionをPortalからInstallします。
• 「Durable Functions HTTP starter」をクリックし「Install」を作成します。
• Installが終わり次第「Cancel」します。
ローカル開発環境
• ローカルでの開発、テストを行うにはセットアップが必要です
Azure Functions V2 を Mac+VSCode で動かすまでの手順
https://qiita.com/miyake/items/83aac5524be91e3811ee
Functionsがサポートするバインディング
Type 1.x 2.x1 トリガー 入力 Output
Blob Storage ✔ ✔ ✔ ✔ ✔
Cosmos DB ✔ ✔ ✔ ✔ ✔
Event Grid ✔ ✔ ✔
Event Hubs ✔ ✔ ✔ ✔
HTTP と Webhooks ✔ ✔ ✔ ✔
Microsoft Graph Excel テーブル ✔ ✔ ✔
Microsoft Graph OneDrive ファイル ✔ ✔ ✔
Microsoft Graph Outlook メール ✔ ✔
Microsoft Graph Events ✔ ✔ ✔ ✔
Microsoft Graph Auth トークン ✔ ✔
Mobile Apps ✔ ✔ ✔
Notification Hubs ✔ ✔
Queue Storage ✔ ✔ ✔ ✔
SendGrid ✔ ✔ ✔
Service Bus ✔ ✔ ✔ ✔
SignalR ✔ ✔ ✔
Table Storage ✔ ✔ ✔ ✔
Timer ✔ ✔ ✔
Twilio ✔ ✔ ✔
https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-triggers-bindings#supported-bindings

More Related Content

What's hot

EWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/Webサービスにアクセスする
EWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/WebサービスにアクセスするEWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/Webサービスにアクセスする
EWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/Webサービスにアクセスする
Kiyoshi Sawada
 
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnJavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 Autumn
Koji Ishimoto
 
Pro aspnetmvc3framework chap19
Pro aspnetmvc3framework chap19Pro aspnetmvc3framework chap19
Pro aspnetmvc3framework chap19Hideki Hashizume
 
EWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/Webサービスにアクセスする
EWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/WebサービスにアクセスするEWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/Webサービスにアクセスする
EWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/Webサービスにアクセスする
Kiyoshi Sawada
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようず
Oda Shinsuke
 
アップルのテンプレートは有害と考えられる
アップルのテンプレートは有害と考えられるアップルのテンプレートは有害と考えられる
アップルのテンプレートは有害と考えられるBrian Gesiak
 
iOSビヘイビア駆動開発
iOSビヘイビア駆動開発iOSビヘイビア駆動開発
iOSビヘイビア駆動開発
Brian Gesiak
 
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみたYuki Takei
 
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiJavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
Tomohiro Kumagai
 
sbt, past and future / sbt, 傾向と対策
sbt, past and future / sbt, 傾向と対策sbt, past and future / sbt, 傾向と対策
sbt, past and future / sbt, 傾向と対策
scalaconfjp
 
swooleを試してみた
swooleを試してみたswooleを試してみた
swooleを試してみた
Yukihiro Katsumi
 
SlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみよう
SlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみようSlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみよう
SlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみよう
Shigeo Ueda
 
Introduction of aws-cli
Introduction of aws-cliIntroduction of aws-cli
Introduction of aws-cli
Masaaki HIROSE
 
FIWARE Orion Context Broker コンテキスト情報管理 (Orion 3.5.0対応)
FIWARE Orion Context Broker コンテキスト情報管理 (Orion 3.5.0対応)FIWARE Orion Context Broker コンテキスト情報管理 (Orion 3.5.0対応)
FIWARE Orion Context Broker コンテキスト情報管理 (Orion 3.5.0対応)
fisuda
 
Elasticsearchの基本動作まとめ
Elasticsearchの基本動作まとめElasticsearchの基本動作まとめ
Elasticsearchの基本動作まとめ
朋哉 池田
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
y_taka_23
 

What's hot (19)

EWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/Webサービスにアクセスする
EWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/WebサービスにアクセスするEWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/Webサービスにアクセスする
EWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/Webサービスにアクセスする
 
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnJavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 Autumn
 
Pro aspnetmvc3framework chap19
Pro aspnetmvc3framework chap19Pro aspnetmvc3framework chap19
Pro aspnetmvc3framework chap19
 
EWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/Webサービスにアクセスする
EWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/WebサービスにアクセスするEWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/Webサービスにアクセスする
EWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/Webサービスにアクセスする
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようず
 
アップルのテンプレートは有害と考えられる
アップルのテンプレートは有害と考えられるアップルのテンプレートは有害と考えられる
アップルのテンプレートは有害と考えられる
 
iOSビヘイビア駆動開発
iOSビヘイビア駆動開発iOSビヘイビア駆動開発
iOSビヘイビア駆動開発
 
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
 
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiJavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
 
sbt, past and future / sbt, 傾向と対策
sbt, past and future / sbt, 傾向と対策sbt, past and future / sbt, 傾向と対策
sbt, past and future / sbt, 傾向と対策
 
swooleを試してみた
swooleを試してみたswooleを試してみた
swooleを試してみた
 
SlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみよう
SlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみようSlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみよう
SlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみよう
 
後期03
後期03後期03
後期03
 
Introduction of aws-cli
Introduction of aws-cliIntroduction of aws-cli
Introduction of aws-cli
 
HTML5&API総まくり
HTML5&API総まくりHTML5&API総まくり
HTML5&API総まくり
 
FIWARE Orion Context Broker コンテキスト情報管理 (Orion 3.5.0対応)
FIWARE Orion Context Broker コンテキスト情報管理 (Orion 3.5.0対応)FIWARE Orion Context Broker コンテキスト情報管理 (Orion 3.5.0対応)
FIWARE Orion Context Broker コンテキスト情報管理 (Orion 3.5.0対応)
 
Elasticsearchの基本動作まとめ
Elasticsearchの基本動作まとめElasticsearchの基本動作まとめ
Elasticsearchの基本動作まとめ
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
 
HTML5最新動向
HTML5最新動向HTML5最新動向
HTML5最新動向
 

Similar to Azure で Serverless 初心者向けタッチ&トライ

初めての Data api
初めての Data api初めての Data api
初めての Data api
Yuji Takayama
 
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Toshiyuki Ienaga
 
OpenStack API
OpenStack APIOpenStack API
OpenStack API
Akira Yoshiyama
 
初めての Data api cms どうでしょう - 大阪夏の陣
初めての Data api   cms どうでしょう - 大阪夏の陣初めての Data api   cms どうでしょう - 大阪夏の陣
初めての Data api cms どうでしょう - 大阪夏の陣
Yuji Takayama
 
Data api workshop at Co-Edo
Data api workshop at Co-EdoData api workshop at Co-Edo
Data api workshop at Co-EdoYuji Takayama
 
サーバーレスの常識を覆す Azure Durable Functionsを使い倒す
サーバーレスの常識を覆す Azure Durable Functionsを使い倒すサーバーレスの常識を覆す Azure Durable Functionsを使い倒す
サーバーレスの常識を覆す Azure Durable Functionsを使い倒す
Yuta Matsumura
 
初めての Data API CMS どうでしょう - 仙台編 -
初めての Data API   CMS どうでしょう - 仙台編 -初めての Data API   CMS どうでしょう - 仙台編 -
初めての Data API CMS どうでしょう - 仙台編 -
Yuji Takayama
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSAyumi Goto
 
Knockout.js を利用したインタラクティブ web アプリケーション開発
Knockout.js を利用したインタラクティブ web アプリケーション開発Knockout.js を利用したインタラクティブ web アプリケーション開発
Knockout.js を利用したインタラクティブ web アプリケーション開発
Daizen Ikehara
 
Infrastructure as code for azure
Infrastructure as code for azureInfrastructure as code for azure
Infrastructure as code for azure
Keiji Kamebuchi
 
Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界
Yuji Takayama
 
Twitter連携chrome extension作り方
Twitter連携chrome extension作り方Twitter連携chrome extension作り方
Twitter連携chrome extension作り方Hiroshi Oyamada
 
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
Fujio Kojima
 
Tech talk salesforce mobile sdk
Tech talk   salesforce mobile sdkTech talk   salesforce mobile sdk
Tech talk salesforce mobile sdkKazuki Nakajima
 
Building React, Flutter and Blazor development and debugging environment with...
Building React, Flutter and Blazor development and debugging environment with...Building React, Flutter and Blazor development and debugging environment with...
Building React, Flutter and Blazor development and debugging environment with...
Shotaro Suzuki
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejsTakayoshi Tanaka
 
ScaLa+Liftとか
ScaLa+LiftとかScaLa+Liftとか
ScaLa+Liftとか
youku
 
densan2014-late01
densan2014-late01densan2014-late01
densan2014-late01
Takenori Nakagawa
 
実践 NestJS
実践 NestJS実践 NestJS
実践 NestJS
Ayumi Goto
 

Similar to Azure で Serverless 初心者向けタッチ&トライ (20)

初めての Data api
初めての Data api初めての Data api
初めての Data api
 
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
 
OpenStack API
OpenStack APIOpenStack API
OpenStack API
 
初めての Data api cms どうでしょう - 大阪夏の陣
初めての Data api   cms どうでしょう - 大阪夏の陣初めての Data api   cms どうでしょう - 大阪夏の陣
初めての Data api cms どうでしょう - 大阪夏の陣
 
Data api workshop at Co-Edo
Data api workshop at Co-EdoData api workshop at Co-Edo
Data api workshop at Co-Edo
 
サーバーレスの常識を覆す Azure Durable Functionsを使い倒す
サーバーレスの常識を覆す Azure Durable Functionsを使い倒すサーバーレスの常識を覆す Azure Durable Functionsを使い倒す
サーバーレスの常識を覆す Azure Durable Functionsを使い倒す
 
初めての Data API CMS どうでしょう - 仙台編 -
初めての Data API   CMS どうでしょう - 仙台編 -初めての Data API   CMS どうでしょう - 仙台編 -
初めての Data API CMS どうでしょう - 仙台編 -
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJS
 
Knockout.js を利用したインタラクティブ web アプリケーション開発
Knockout.js を利用したインタラクティブ web アプリケーション開発Knockout.js を利用したインタラクティブ web アプリケーション開発
Knockout.js を利用したインタラクティブ web アプリケーション開発
 
Infrastructure as code for azure
Infrastructure as code for azureInfrastructure as code for azure
Infrastructure as code for azure
 
Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界
 
Twitter連携chrome extension作り方
Twitter連携chrome extension作り方Twitter連携chrome extension作り方
Twitter連携chrome extension作り方
 
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
 
Ajax 応用
Ajax 応用Ajax 応用
Ajax 応用
 
Tech talk salesforce mobile sdk
Tech talk   salesforce mobile sdkTech talk   salesforce mobile sdk
Tech talk salesforce mobile sdk
 
Building React, Flutter and Blazor development and debugging environment with...
Building React, Flutter and Blazor development and debugging environment with...Building React, Flutter and Blazor development and debugging environment with...
Building React, Flutter and Blazor development and debugging environment with...
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
 
ScaLa+Liftとか
ScaLa+LiftとかScaLa+Liftとか
ScaLa+Liftとか
 
densan2014-late01
densan2014-late01densan2014-late01
densan2014-late01
 
実践 NestJS
実践 NestJS実践 NestJS
実践 NestJS
 

Recently uploaded

論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
Toru Tamaki
 
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援しますキンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
Takayuki Nakayama
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
Matsushita Laboratory
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
harmonylab
 
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさJSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
0207sukipio
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
Toru Tamaki
 
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
t m
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
Matsushita Laboratory
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
CRI Japan, Inc.
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
chiefujita1
 

Recently uploaded (10)

論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
 
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援しますキンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
 
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさJSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
 
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
 

Azure で Serverless 初心者向けタッチ&トライ

  • 3.
  • 5. Durable Functions • Azure Functions extension • Enables long-running, stateful serverless operations • Write complex function orchestrations in a single function • Built on the open-source Durable Task Framework • Only pay when your code is running • Orchestrator replays itself to re-establish state every run
  • 6. Durable Patterns Function chaining Fan-out / fan-in Event aggregation Extended Status Monitoring http Async HTTP APIs Human interaction / timeout
  • 9. 流れ 1. Visual Studio Code にAzure Functions 拡張機能をインストール 2. Azure Functions プロジェクトを作成 3. Durable Functions npm パッケージをインストール 4. starter 関数を作成 5. オーケストレーター関数を作成する 6. アクティビティ関数を作成する 7. Azure へのサインイン 8. Azure にプロジェクトを発行 9. Azure で関数をテスト
  • 10. 1. Azure Functions 拡張機能をインストール • Visual Studio Code で [拡張機能] を開き、azure functions を検索するか、Visual Studio Code でこのリンクを開きます。 • [インストール] を選択して、Visual Studio Code に拡張機能をインストールします。
  • 11. • Visual Studio Code を再起動し、アクティビティ バーの Azure アイコンを選択しま す。 サイド バーに Azure Functions 領域が表示されます。 1. Azure Functions 拡張機能をインストール
  • 12. • Visual Studio Code で、Azure ロゴを選択して [Azure:Functions] 領域を表示し、[新し いプロジェクトの作成] アイコンを選択します。 • プロジェクト ワークスペースの場所としてデスクトップの「 demo 」のフォルダを選択 し、[選択] をクリックします。 2. Azure Functions プロジェクトを作成
  • 13. • 関数アプリ プロジェクトの言語は「JavaScript」を選択します。 • 「V2」を選択します。 • 「Skip for now」を選択します。 2. Azure Functions プロジェクトを作成
  • 14. • 「Open in current window」を選択します。 2. Azure Functions プロジェクトを作成
  • 15. 3. Durable Functions npm パッケージをインストール • VS Codeでターミナルを開き、ワークスペース用のフォルダ「demo」で「npm install durable-functions」 を実行して、durable-functions npm パッケージをインストール します。 ※npmがインストールされていない場合は、事前にnpmをPCにインストールします
  • 16. 4. starter 関数を作成 • [Azure:Functions] で [関数の作成] アイコンを選択します。 • 関数アプリ プロジェクトが含まれたフォルダーを選択し、[HTTP trigger] 関数テンプレート を選択します。 • 関数名として「HttpStart」と入力して Enter キーを押し、[Anonymous] 認証を選択します。
  • 17. 4. starter 関数を作成 • index.js を以下の JavaScript に置き換えます。 const df = require("durable-functions"); module.exports = async function (context, req) { const client = df.getClient(context); const instanceId = await client.startNew(req.params.functionName, undefined, req.body); context.log(`Started orchestration with ID = '${instanceId}'.`); return client.createCheckStatusResponse(context.bindingData.req, instanceId); };
  • 18. 4. starter 関数を作成 • function.json を以下の JavaScript に置き換えます。 { "bindings": [ { "authLevel": "anonymous", "name": "req", "type": "httpTrigger", "direction": "in", "route": "orchestrators/{functionName}", "methods": ["get", "post"] }, { "name": "starter", "type": "orchestrationClient", "direction": "in" } ] }
  • 19. Orchestration Client (HttpStart) Orchestrator (OrchestratorFunction) Activity Function (E1_SayHello) { "bindings": [ { "authLevel": "anonymous", "name": "req", "type": "httpTrigger", "direction": "in", "route": "orchestrators/{functionName}", "methods": ["get", "post"] }, { "name": "starter", "type": "orchestrationClient", "direction": ”in" } ] } const df = require("durable-functions"); module.exports = async function (context, req) { const client = df.getClient(context); const instanceId = await client.startNew(req.params.functionName, undefined, req.body); context.log(`Started orchestration with ID = '${instanceId}'.`); return client.createCheckStatusResponse(context.bindingData.req, instanceId); }; index.js function.json
  • 20. 5. オーケストレーター関数を作成 • 前の手順を繰り返し、HTTP Trigger Templateを使用して 2 つ目の関数を作成しま す。 今回は関数に 「 OrchestratorFunction」 と名前を付けます。 • index.js を以下の JavaScript に置き換えます。 const df = require("durable-functions"); module.exports = df.orchestrator(function*(context){ context.log("Starting chain sample"); const output = []; output.push(yield context.df.callActivity("E1_SayHello", "Tokyo")); output.push(yield context.df.callActivity("E1_SayHello", "Seattle")); output.push(yield context.df.callActivity("E1_SayHello", "London")); return output; });
  • 21. 5. オーケストレーター関数を作成 • function.json を以下の JavaScript に置き換えます。 { "bindings": [ { "name": "context", "type": "orchestrationTrigger", "direction": "in" } ] }
  • 22. Orchestration Client (HttpStart) Orchestrator (OrchestratorFunction) Activity Function (E1_SayHello) { "bindings": [ { "authLevel": "anonymous", "name": "req", "type": "httpTrigger", "direction": "in", "route": "orchestrators/{functionName}", "methods": ["get", "post"] }, { "name": "starter", "type": "orchestrationClient", "direction": ”in" } ] } const df = require("durable-functions"); module.exports = async function (context, req) { const client = df.getClient(context); const instanceId = await client.startNew(req.params.functionName, undefined, req.body); context.log(`Started orchestration with ID = '${instanceId}'.`); return client.createCheckStatusResponse(context.bindingData.req, instanceId); }; const df = require("durable-functions"); module.exports = df.orchestrator(function*(context){ context.log("Starting chain sample"); const output = []; output.push(yield context.df.callActivity("E1_SayHello", "Tokyo")); output.push(yield context.df.callActivity("E1_SayHello", "Seattle")); output.push(yield context.df.callActivity("E1_SayHello", "London")); return output; }); { "bindings": [ { "name": "context", "type": "orchestrationTrigger", "direction": "in" } ] } index.js function.json
  • 23. 6. アクティビティ関数を作成 • 前の手順を繰り返し、HTTP Trigger Templateを使用して 2 つ目の関数を作成しま す。 今回は関数に 「 E1_SayHello 」 と名前を付けます。 • index.js を以下の JavaScript に置き換えます。 module.exports = async function(context) { return `Hello ${context.bindings.name}!`; };
  • 24. 6. アクティビティ関数を作成 • function.json を以下の JavaScript に置き換えます。 { "bindings": [ { "name": "name", "type": "activityTrigger", "direction": "in" } ] }
  • 25. Orchestration Client (HttpStart) Orchestrator (OrchestratorFunction) Activity Function (E1_SayHello) { "bindings": [ { "authLevel": "anonymous", "name": "req", "type": "httpTrigger", "direction": "in", "route": "orchestrators/{functionName}", "methods": ["get", "post"] }, { "name": "starter", "type": "orchestrationClient", "direction": ”in" } ] } const df = require("durable-functions"); module.exports = async function (context, req) { const client = df.getClient(context); const instanceId = await client.startNew(req.params.functionName, undefined, req.body); context.log(`Started orchestration with ID = '${instanceId}'.`); return client.createCheckStatusResponse(context.bindingData.req, instanceId); }; const df = require("durable-functions"); module.exports = df.orchestrator(function*(context){ context.log("Starting chain sample"); const output = []; output.push(yield context.df.callActivity("E1_SayHello", "Tokyo")); output.push(yield context.df.callActivity("E1_SayHello", "Seattle")); output.push(yield context.df.callActivity("E1_SayHello", "London")); return output; }); { "bindings": [ { "name": "context", "type": "orchestrationTrigger", "direction": "in" } ] } module.exports = async function(context) { return `Hello ${context.bindings.name}!`; }; { "bindings": [ { "name": "name", "type": "activityTrigger", "direction": "in" } ] } index.js function.json
  • 26. 7. Azure へのサインイン • [Azure: Functions] 領域で、[Sign in to Azure...](Azure にサインインする...) を選択し ます。 ※Azure アカウントがない場合は無償アカウントを作成して下さい https://azure.microsoft.com/ja-jp/free/
  • 27. 8. Azure にプロジェクトを発行 • [Azure: Functions] 領域で、[Deploy to Function App](関数アプリにデプロイ) アイコ ンを選択します。
  • 28. 8. Azure にプロジェクトを発行 • [サブスクリプションを選択] してから、 [+ Create New Function App in Azure](+ Azure で新しい Function App を作成) を選択します。
  • 29. 8. Azure にプロジェクトを発行 • 「Deploy」を選択します。
  • 30. 9. Azure で関数をテスト • ブラウザでオーケストラーの情報を確認します。 https://<function名>.azurewebsites.net/api/orchestrators/OrchestratorFunction 出力結果例: { "id": "a42bfdf91f9a49da9c9558e2ef5c7a65", "statusQueryGetUri": "https://decode- horike.azurewebsites.net/runtime/webhooks/durabletask/instances/a42bfdf91f9a49da9c9558e2ef5c7a65?taskHub =DurableFunctionsHub&connection=Storage&code=BId08/uK/2jAhDKF3bNjgNPzJGdGfcalR3dlm6PJyate/aG/rtHZ VA==", "sendEventPostUri": "https://decode- horike.azurewebsites.net/runtime/webhooks/durabletask/instances/a42bfdf91f9a49da9c9558e2ef5c7a65/raiseEve nt/{eventName}?taskHub=DurableFunctionsHub&connection=Storage&code=BId08/uK/2jAhDKF3bNjgNPzJGdGfc alR3dlm6PJyate/aG/rtHZVA==", ・・・・
  • 31. 9. Azure で関数をテスト • 前ページのstatusQueryGetUri をブラウザのURLにコピペし、オーケストラーの状態を 確認します。 出力結果例: { "instanceId": "6fa01dd927a245229cff60e9596d01ee", "runtimeStatus": "Completed", "input": null, "customStatus": null, "output": [ "Hello Tokyo!", "Hello Seattle!", "Hello London!" ], "createdTime": "2019-05-28T14:10:02Z", "lastUpdatedTime": "2019-05-28T14:10:02Z" }
  • 32. Orchestration Client (HttpStart) Orchestrator (OrchestratorFunction) Activity Function (E1_SayHello) { "bindings": [ { "authLevel": "anonymous", "name": "req", "type": "httpTrigger", "direction": "in", "route": "orchestrators/{functionName}", "methods": ["get", "post"] }, { "name": "starter", "type": "orchestrationClient", "direction": ”in" } ] } const df = require("durable-functions"); module.exports = async function (context, req) { const client = df.getClient(context); const instanceId = await client.startNew(req.params.functionName, undefined, req.body); context.log(`Started orchestration with ID = '${instanceId}'.`); return client.createCheckStatusResponse(context.bindingData.req, instanceId); }; const df = require("durable-functions"); module.exports = df.orchestrator(function*(context){ context.log("Starting chain sample"); const output = []; output.push(yield context.df.callActivity("E1_SayHello", "Tokyo")); output.push(yield context.df.callActivity("E1_SayHello", "Seattle")); output.push(yield context.df.callActivity("E1_SayHello", "London")); return output; }); { "bindings": [ { "name": "context", "type": "orchestrationTrigger", "direction": "in" } ] } module.exports = async function(context) { return `Hello ${context.bindings.name}!`; }; { "bindings": [ { "name": "name", "type": "activityTrigger", "direction": "in" } ] } index.js function.json
  • 35. チュートリアル • 今回のタッチアンドトライは公式のチュートリアルをベースにしています。 JavaScript で最初の Durable Functions を作成する https://docs.microsoft.com/ja-jp/azure/azure-functions/durable/quickstart-js-vscode
  • 36. Functions Appの前処理 • Durable Functions ExtensionをPortalからInstallします。 • 「Durable Functions HTTP starter」をクリックし「Install」を作成します。 • Installが終わり次第「Cancel」します。
  • 37. ローカル開発環境 • ローカルでの開発、テストを行うにはセットアップが必要です Azure Functions V2 を Mac+VSCode で動かすまでの手順 https://qiita.com/miyake/items/83aac5524be91e3811ee
  • 38. Functionsがサポートするバインディング Type 1.x 2.x1 トリガー 入力 Output Blob Storage ✔ ✔ ✔ ✔ ✔ Cosmos DB ✔ ✔ ✔ ✔ ✔ Event Grid ✔ ✔ ✔ Event Hubs ✔ ✔ ✔ ✔ HTTP と Webhooks ✔ ✔ ✔ ✔ Microsoft Graph Excel テーブル ✔ ✔ ✔ Microsoft Graph OneDrive ファイル ✔ ✔ ✔ Microsoft Graph Outlook メール ✔ ✔ Microsoft Graph Events ✔ ✔ ✔ ✔ Microsoft Graph Auth トークン ✔ ✔ Mobile Apps ✔ ✔ ✔ Notification Hubs ✔ ✔ Queue Storage ✔ ✔ ✔ ✔ SendGrid ✔ ✔ ✔ Service Bus ✔ ✔ ✔ ✔ SignalR ✔ ✔ ✔ Table Storage ✔ ✔ ✔ ✔ Timer ✔ ✔ ✔ Twilio ✔ ✔ ✔ https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-triggers-bindings#supported-bindings