Azure Functions を使用してコードを作成し、Azure Logic Apps のワークフローから呼び出す
適用対象: Azure Logic Apps (従量課金プラン + Standard)
特定のジョブを実行するコードをロジック アプリのワークフロー内から実行したい場合、Azure Functions を使用して独自の関数を作成することができます。 このサービスを利用して Node.js、C#、および F# 関数を作成できるので、完全なアプリやコードを実行するためのインフラストラクチャを構築する必要はありません。 Azure Functions は、クラウド内でサーバーレス コンピューティングを実現します。たとえば、次のようなタスクを実行する場合に役立ちます。
- Node.js または C# で、関数を使用してロジック アプリの動作を拡張します。
- ロジック アプリのワークフローで計算を実行します。
- ロジック アプリのワークフローのフィールドで高度な書式設定や計算を行います。
この攻略ガイドでは、ロジック アプリのワークフローから Azure 関数を呼び出す方法について説明します。 Azure Functions を使用せずにコード スニペットを実行するには、インライン コードの追加と実行に関するページを確認してください。 関数の内部からロジック アプリのワークフローを呼び出してトリガーするには、呼び出し可能なエンドポイントを提供するトリガーを使用してワークフローを開始する必要があります。 たとえば、HTTP、Request、Azure Queues、または Event Grid トリガーでワークフローを開始できます。 関数の内部から、トリガーの URL に HTTP POST 要求を送信し、そのワークフローで処理するペイロードを含めます。 詳細については、ロジック アプリのワークフローの呼び出し、トリガー、または入れ子化に関するページを参照してください。
制限事項
従量課金ロジック アプリのワークフローからは関数を直接作成できますが、Standard ロジック アプリのワークフローからは作成できません。 ただし、他の方法で関数を作成することができます。 詳細については、「ロジック アプリのワークフロー内から関数を作成する」を参照してください。
マネージド ID と Microsoft Entra 認証を使用した Azure 関数の呼び出しの認証をサポートしているのは、従量課金ワークフローのみです。 Standard ワークフローは、現時点では関数呼び出しの認証を有効にする方法に関するセクションではサポートされていません。
Azure Logic Apps は、デプロイ スロットが有効な状態での Azure Functions の使用をサポートしません。 このシナリオがうまく機能する場合もありますが、その動作は予測不能で、ワークフローから Azure 関数を呼び出そうとしたときに承認の問題が生じるおそれがあります。
前提条件
Azure アカウントとサブスクリプション。 サブスクリプションをお持ちでない場合には、無料の Azure アカウントにサインアップしてください。
Azure 関数アプリ リソース。これは、Azure Functions を使用して作成できる関数と、使用する関数のコンテナーです。
関数アプリを持っていない場合は、まず関数アプリを作成します。 次に、Azure portal で Azure Functions を使用してロジック アプリのワークフローの外部で関数を作成するか、デザイナーでロジック アプリのワークフローの内部から関数を作成することができます。
ロジック アプリのリソースを使用する場合、既存または新規の関数アプリと関数の両方に同じ要件が適用されます。
関数アプリのリソースとロジック アプリのリソースは、同じ Azure サブスクリプションを使用する必要があります。
新しい関数アプリでは、ランタイム スタックとして .NET または JavaScript を使用する必要があります。 既存の関数アプリに新しい関数を追加する場合は、C# または JavaScript のいずれかを選択できます。
自分の関数では、HTTP トリガー テンプレートを使用します。
HTTP トリガー テンプレートは、ロジック アプリのワークフローから
application/json
型のコンテンツを受け入れることができます。 ワークフローに関数を追加すると、このテンプレートからお使いの Azure サブスクリプション内に作成されたカスタム関数がワークフロー デザイナーに表示されます。OpenAPI 定義 (Swagger ファイル) を定義済みでない限り、自分の関数でカスタム ルートが使用されることはありません。
自分の関数に対して OpenAPI 定義を定義している場合、関数パラメーターを操作するときに、ワークフロー デザイナーによって豊富なエクスペリエンスが提供されます。 OpenAPI 定義を含む関数をロジック アプリのワークフローが見つけてアクセスできるようにするには、後述する手順に従って関数アプリを設定します。
この攻略ガイドの例に従うには、従量課金ロジック アプリ リソースと、最初の手順としてトリガーを持つワークフローが必要です。 シナリオには任意のトリガーを使用できますが、この例では、[新しい電子メールが届いたとき] という名前の Office 365 Outlook トリガーを使用します。
OpenAPI の記述がある関数を検索する
ワークフロー デザイナーで関数アプリを操作するときに豊富なエクスペリエンスを利用するには、自分の関数に対して、Swagger ファイルとも呼ばれる OpenAPI 定義を生成します。 お使いのロジック アプリで Swagger の記述を含む関数を検索して使用できるように、関数アプリを設定するために、次の手順を実行します。
Azure portal で、関数アプリを開きます。 関数アプリがアクティブに実行されていることを確認します。
次の手順に従い、関数アプリに対してクロスオリジン リソース共有 (CORS) を設定して、すべてのオリジンが許可されるようにします。
関数アプリのリソース メニューの [API] で、[CORS] を選択します。
[CORS] でアスタリスク (
*
) ワイルドカード文字を追加しますが、リスト内の他のすべてのオリジンは削除して、 [保存] を選択します。
HTTP 要求の内部でプロパティ値にアクセスする
Webhook 関数は、入力として HTTP 要求を受け取り、それらの要求を他の関数に渡すことができます。 たとえば、Azure Logic Apps には DateTime 値を変換する関数がありますが、この基本的なサンプル JavaScript 関数は、関数に渡された要求オブジェクト内のプロパティにアクセスしてそのプロパティ値を操作する方法を示しています。 オブジェクト内のプロパティにアクセスするために、この例ではドット (.) 演算子を使用しています。
function convertToDateString(request, response){
var data = request.body;
response = {
body: data.date.ToDateString();
}
}
この関数の内部で何が起きるかを、次に示します。
関数は
data
変数を作成し、request
オブジェクト内のbody
オブジェクトをその変数に割り当てます。 この関数はドット (.) 演算子を使用して、request
オブジェクト内のbody
オブジェクトを参照します。var data = request.body;
これで、この関数は
data
変数を介してdate
プロパティにアクセスし、ToDateString()
関数を呼び出すことによってそのプロパティ値を DateTime 型から DateString 型に変換することができます。 関数は、関数の応答のbody
プロパティを介して、結果も返します。body: data.date.ToDateString();
これで Azure に関数を作成したので、ロジック アプリに関数を追加する手順に従ってください。
ロジック アプリのワークフロー内から関数を作成する (従量課金ワークフローのみ)
ワークフロー デザイナーで、組み込みの Azure Functions アクションを使用して、従量課金ワークフローから関数を直接作成できますが、この方法を使用できるのは、JavaScript で記述された関数の場合のみです。 その他の言語の場合は、Azure portal の Azure Functions 機能を使用して関数を作成できます。 ただし、Azure で関数を作成する前に、関数のコンテナーである関数アプリ リソースをあらかじめ用意しておく必要があります。 関数アプリを持っていない場合は、まず関数アプリを作成します。 詳細については、「Azure Portal で初めての関数を作成する」を参照してください。
現在、Standard ワークフローではワークフロー内から関数を作成するためのこのオプションはサポートされていませんが、次の方法で関数を作成し、Call an Azure function という名前のAzure Functions 操作を使用して Standard ロジック アプリ ワークフローからその関数を呼び出すことができます。
Azure portal で、従量課金ロジック アプリとワークフローをデザイナーで開きます。
デザイナーで、次の一般的な手順に従い、[Azure 関数を選択する] という名前の Azure Functions アクションを追加します。
表示される関数アプリの一覧から、目的の関数アプリを選びます。 表示されたアクションの一覧から、[新しい関数を作成する] という名前のアクションを選びます。
関数定義エディターで、関数を定義します。
[関数名] ボックスで関数の名前を指定します。
[コード] ボックスで、自分のコードを関数テンプレートに追加します。関数の実行が終了した後でロジック アプリに返される応答とペイロードも含めます。 完了したら、[作成] を選択します。次に例を示します。
テンプレートのコードでは、
context
オブジェクトは、以降のステップでワークフローが Request Body プロパティ経由で送信するメッセージを参照します。 関数の内部からcontext
オブジェクトのプロパティにアクセスするには、次の構文を使用します。context.body.<property-name>
たとえば、
context
オブジェクト内のcontent
プロパティを参照するには、次の構文を使用します。context.body.content
また、テンプレート コードには、
input
変数が含まれます。この変数は、お使いの関数が該当の値に対する操作を実行できるように、data
パラメーターからの値を格納します。 また、JavaScript 関数の中で、data
変数はcontext.body
のショートカットです。注意
この場合の
body
プロパティはcontext
オブジェクトに適用され、アクションの出力からの Body トークンと同じではありません。お使いの関数にも渡すことができます。[要求本文] ボックスで、関数の入力を指定します。書式は JavaScript Object Notation (JSON) オブジェクトにする必要があります。
この入力は、ロジック アプリが関数に送信するコンテキスト オブジェクトまたはメッセージです。 [要求本文] フィールドをクリックすると、動的コンテンツの一覧が表示され、前のステップからの出力のトークンを選択できます。 この例では、コンテキスト ペイロードが、メール トリガーからの From トークンの値を保持する
content
という名前のプロパティを含んでいることを示しています。ここで、コンテキスト オブジェクトは文字列としてキャストされないため、オブジェクトのコンテンツは JSON ペイロードに直接追加されます。 ただし、コンテキスト オブジェクトが文字列、JSON オブジェクト、または JSON 配列を渡す JSON トークンでない場合は、エラーが発生します。 そのため、この例で代わりに Received Time トークンを使用した場合は、次のように、二重引用符を追加することで、コンテキスト オブジェクトを文字列としてキャストできます。
使用するメソッド、要求ヘッダー、クエリ パラメーター、認証などのその他の詳細を指定するには、 [新しいパラメーターの追加] の一覧を開き、目的のオプションを選択します。 認証については、選択した関数によってオプションが異なります。 詳細については、「関数の認証を有効にする」を参照してください。
既存の関数をロジック アプリ ワークフローに追加する (従量課金ワークフロー + Standard ワークフロー)
ロジック アプリ ワークフローから既存の関数を呼び出すには、デザイナーで他のアクションと同様に関数を追加します。
Azure portal で、従量課金ロジック アプリのワークフローをデザイナーで開きます。
デザイナーで、次の一般的な手順に従い、[Azure 関数を選択する] という名前の Azure Functions アクションを追加します。
関数アプリの一覧で、関数アプリを選択します。 表示された関数の一覧から、目的の関数を選びます。
API 定義 (Swagger 記述) を持ち、ロジック アプリが探してアクセスできるように設定された関数の場合は、 [Swagger アクション] を選択することができます。
[要求本文] ボックスで、関数の入力を指定します。書式は JavaScript Object Notation (JSON) オブジェクトにする必要があります。
この入力は、ロジック アプリが関数に送信するコンテキスト オブジェクトまたはメッセージです。 [要求本文] フィールドをクリックすると、動的コンテンツの一覧が表示され、前のステップからの出力のトークンを選択できます。 この例では、コンテキスト ペイロードが、メール トリガーからの From トークンの値を保持する
content
という名前のプロパティを含んでいることを示しています。ここで、コンテキスト オブジェクトは文字列としてキャストされないため、オブジェクトのコンテンツは JSON ペイロードに直接追加されます。 ただし、コンテキスト オブジェクトが文字列、JSON オブジェクト、または JSON 配列を渡す JSON トークンでない場合は、エラーが発生します。 そのため、この例で代わりに Received Time トークンを使用した場合は、二重引用符を追加することで、コンテキスト オブジェクトを文字列としてキャストできます。
使用するメソッド、要求ヘッダー、クエリ パラメーター、認証などのその他の詳細を指定するには、 [新しいパラメーターの追加] の一覧を開き、目的のオプションを選択します。 認証については、選択した関数によってオプションが異なります。 詳細については、「関数の認証を有効にする」を参照してください。
関数呼び出しの認証を有効にする (従量課金ワークフローのみ)
従量課金ワークフローでは、マネージド ID (旧称マネージド サービス ID または MSI) を使って、関数呼び出しの認証を行い、Microsoft Entra ID によって保護されたリソースにアクセスできます。 このマネージド ID を使用すれば、サインインしたり、資格情報やシークレットを提供したりしなくてもアクセスを認証できます。 この ID は、ユーザーの代わりに Azure で管理されます。ユーザーがシークレットを提供したりローテーションしたりする必要がないため、資格情報の保護に役立ちます。 システムによって割り当てられる ID か、ユーザーが割り当てる手動作成 ID を、ロジック アプリのリソース レベルで設定できます。 ワークフローから呼び出される関数で、同じ ID を認証に使用できます。
Note
現在、マネージド ID と Microsoft Entra 認証を使用した Azure 関数呼び出しの認証をサポートしているのは、従量課金ワークフローのみです。 現在、Azure Functions コネクタを使用する場合、Standard ワークフローにはこのサポートは含まれていません。
詳細については、次のドキュメントを確認してください。
従量課金ロジック アプリのマネージド ID を使用できるように関数アプリと関数を設定するには、次の大まかな手順に従います。
匿名認証用に関数を設定する (従量課金ワークフローのみ)
従量課金ロジック アプリのマネージド ID を関数で使用するには、関数の認証レベルを匿名に設定する必要があります。 設定していないと、ワークフローで BadRequest エラーがスローされます。
Azure portal で、お使いの関数アプリを探して選択します。
次の手順では、FabrikamFunctionApp という名前の関数アプリの例を使用します。
関数アプリのリソース メニューの [開発ツール] で、[高度なツール]>[Go] を選択します。
[Kudu Services] ページが開いたら、Kudu Web サイトのタイトル バーで、[デバッグ コンソール] メニューから [CMD] を選択します。
次のページが表示されたら、フォルダーの一覧から [site]>[wwwroot]><自分の関数> の順に選択します。
次の手順では、FabrikamAzureFunction という名前の関数の例を使用します。
編集のために function.json ファイルを開きます。
bindings オブジェクトで、authLevel プロパティが存在するかどうかを確認します。 プロパティが存在する場合、プロパティの値を anonymous に設定します。 存在しない場合、そのプロパティを追加し、値を設定します。
完了したら、設定を保存します。 次のセクションに進みます。
Microsoft Entra 認証を設定するために必要な値を調べる (従量課金ワークフローのみ)
Microsoft Entra 認証を使うように関数アプリを設定する前に、このセクションの手順に従い、次の値を調べて保存する必要があります。
ロジック アプリのマネージド ID のオブジェクト ID を特定する
従量課金ロジック アプリでそのマネージド ID が有効になったら、ロジック アプリ メニューの [設定] で [ID] を選択してから、[システム割り当て] または [ユーザー割り当て] のどちらかをクリックします。
システム割り当て
システム割り当て ID の場合、ID のオブジェクト ID をコピーします。次に例を示します。
ユーザー割り当て済み
ユーザー割り当て ID の場合、ID を選んでクライアント ID を調べます。次はその例です。
マネージド ID の [概要] ペインで、ID のクライアント ID を調べることができます。次はその例です。
Microsoft Entra ID のテナント ID を調べる
Microsoft Entra のテナント ID を調べるには、Get-AzureAccount という名前の PowerShell コマンドを実行するか、Azure portal で次の手順のようにします。
Azure portal で Microsoft Entra テナントを開きます。 この手順ではサンプル テナントとして Fabrikam を使用します。
Microsoft Entra テナントのメニューで、[管理] の下の [プロパティ] を選びます。
後で使用するためにテナント ID をコピーして保存します。次に例を示します。
関数アプリのアプリ登録を作成する (従量課金ワークフローのみ)
従量課金ロジック アプリのマネージド ID のオブジェクト ID と Microsoft Entra ID のテナント ID がわかったら、アプリの登録を作成して、Microsoft Entra 認証を使うように関数アプリを設定できます。
Azure portal で、関数アプリを開きます。
関数アプリ メニューの [設定] で、[認証] を選択し、[ID プロバイダーの追加] を選択します。
[ID プロバイダーの追加] ペインの [基本] で、[ID プロバイダー] の一覧から [Microsoft] を選択します。
[アプリの登録] の [アプリの登録の種類] で、[既存アプリの登録の詳細を提供します] を選択し、以前に保存した値を入力します。
プロパティ 必要 値 説明 アプリケーション (クライアント) ID はい <object-ID> このアプリの登録に使用する一意の識別子。 このシナリオでは、ロジック アプリのマネージド ID に由来するオブジェクト ID を使用します。 クライアント シークレット 省略可能ですが、指定することをお勧めします。 <client-secret> トークンを要求するときにアプリがその身元を証明するために使用するシークレット値。 クライアント シークレットが作成され、MICROSOFT_PROVIDER_AUTHENTICATION_SECRET という名前のスロット固定アプリケーション設定としてアプリの構成に格納されます。 Key Vault 参照を使用するように後からこの設定を更新すると、代わりに Azure Key Vault でシークレットを管理できます。
- クライアント シークレット値を指定した場合、サインイン操作ではハイブリッド フローが使用され、アクセス トークンと更新トークンの両方が返されます。
- クライアント シークレットを指定しない場合、サインイン操作では OAuth 2.0 の暗黙的な許可フローが使用され、ID トークンのみが返されます。
これらのトークンはプロバイダーによって送信され、EasyAuth トークン ストアに格納されます。発行者の URL No <authentication-endpoint-URL>/<Azure-AD-tenant-ID>/v2.0 この URL は、ユーザーを正しい Microsoft Entra テナントにリダイレクトし、適切なトークン署名キーとトークン発行者クレームの値を特定するための適切なメタデータをダウンロードします。 Azure AD v1 を使用するアプリでは、URL から /v2.0 を省略します。
このシナリオでは、次の URL を使用します:https://sts.windows.net/
<Azure-AD-tenant-ID>許可されるトークン対象ユーザー No <application-ID-URI> 関数アプリのアプリケーション ID URI (リソース ID)。 クラウドまたはサーバー アプリで Web アプリからの認証トークンを許可する場合、Web アプリのアプリケーション ID URI を追加します。 構成されたクライアント ID は、常に、許可された対象ユーザーであると暗黙的に見なされます。
このシナリオでは、値はhttps://management.azure.com
です。 後で、マネージド ID を使用するようにワークフローで関数アクションを設定するときに、Audience プロパティで同じ URI を使用できます。重要: アプリケーション ID の URI (リソース ID) は、必要な末尾のスラッシュも含めて、Microsoft Entra ID で求められる値と正確に一致する必要があります。
この時点で、バージョンは次の例のようになります。
ID プロバイダーを使用して関数アプリをセットアップするのが初めての場合、App Service 認証設定のセクションも表示されます。 これらのオプションは、認証されていない要求に対して関数アプリがどのように応答するかを決定します。 既定の選択では、新しい ID プロバイダーを使用してログインするために、すべての要求がリダイレクトされます。 [認証設定] の横にある [編集] を選択して、この動作を今すぐカスタマイズするか、後でメインの [認証] ページからこれらの設定を調整することができます。 これらのオプションの詳細については、認証フローにおける Azure App Service と Azure Functions での認証と認可に関するページを参照してください。
それ以外の場合は、次の手順に進むことができます。
アプリの登録の作成を完了するには、[追加] を選択します。
完了すると、[認証] ページに、アプリ登録用の ID プロバイダーとアプリ ID (クライアント ID) が一覧表示されるようになります。 関数アプリで、このアプリ登録を認証に使用できるようになりました。
関数のアプリ ID (クライアント ID) は、ワークフローの後半の Audience プロパティの箇所で使用するので、コピーしておきます。
デザイナーに戻り、組み込みの Azure Functions アクションを使用して、マネージド ID によってアクセスを認証するための手順に従います。