web-dev-qa-db-ja.com

Azure関数で別の関数を呼び出す方法

次の3つの関数を作成しました

  1. データベースにユーザーを作成する
  2. データベースからユーザーを取得する
  3. ユーザーを処理する

[3]関数では、[2]関数を呼び出して、以下のようにAzure関数のURLを使用してユーザーを取得します。

https://hdidownload.azurewebsites.net/api/getusers

上記のフルパスなしで別のAzure関数でAzure関数を呼び出す他の方法はありますか?

18
Galet

実際にHTTP呼び出しを行わずに、あるHTTP関数を他の関数から呼び出すためのFunction Appsには組み込みのものはありません。

単純な使用例では、完全なURLによる呼び出しに固執します。

より高度なワークフローについては、 Durable Functions 、特に Function Chaining をご覧ください。

12
Mikhail Shilkov

以前の回答はすべて有効ですが、コメントでも言及されたように、今年の初め(2018年第1四半期)、Durable Functionsの概念が導入されました。要するに、耐久機能:

...サーバーレス環境でステートフル関数を記述できます。拡張機能は、状態、チェックポイント、および再起動を管理します。

これは事実上、複数の機能を一緒にチェーンすることもできることを意味します。必要な場合は、関数A => B => Cから流れるときに状態を管理します。

Function AppにDurable Functions Extensionをインストールすることで機能します。これにより、たとえばC#で(擬似コード)のようなことができるいくつかの新しいコンテキストバインディングが利用可能になります。

[FunctionName("ExpensiveDurableSequence")]
public static async Task<List<string>> Run(
    [OrchestrationTrigger] DurableOrchestrationTrigger context)
{
    var response = new List<Order>();

    // Call external function 1 
    var token = await context.CallActivityAsync<string>("GetDbToken", "i-am-root");

    // Call external function 2
    response.Add(await context.CallActivityAsync<IEnumerable<Order>>("GetOrdersFromDb", token));

    return response;
}

[FunctionName("GetDbToken")]
public static string GetDbToken([ActivityTrigger] string username)
{
    // do expensive remote api magic here
    return token;
}

[FunctionaName("GetOrdersFromDb")]
public static IEnumerable<Order> GetOrdersFromDb([ActivityTrigger] string apikey)
{
    // do expensive db magic here
    return orders;
}

ここにいくつかの素晴らしい側面があります:

  • メインシーケンスは、次々に実行される2つの追加機能をチェーンします。
  • 外部関数が実行されると、メインシーケンスはput to sleep;これは、外部機能の処理がビジー状態になると、2回請求されないことを意味します

これにより、複数の機能を相互に連続して実行する(例:関数チェーン)か、複数の機能を並行して実行し、すべてが完了するのを待つ(ファンアウト/ファンイン)ことができます。

これに関する追加の背景参照:

7
Juliën

耐久関数があることは知っていますが、通常の静的メソッドのように関数を呼び出します。

public static class Helloworld
{
    [FunctionName("Helloworld")]
    public static string Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)] HttpRequest req, ILogger log)
    {
        return "Hello World";
    }

}

public static class HelloWorldCall
{
    [FunctionName("HelloWorldCall")]
    public static string Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)] HttpRequest req, ILogger log)
    {
        var caller = Helloworld.Run(req, log);
        return caller;
    }

}
2
Juan Mitchell

直接行うことはできませんが、2つのオプションがあります。

  1. 別の関数のパブリックURLにHTTPリクエストを送信します。
  2. メッセージをAzureキューに入れ、他のAzure Functionに処理させます。 (マイクロソフトはこのソリューションを推奨しています)

最初のオプションについては、C#では次のようにできます。

static HttpClient client = new HttpClient();
[FunctionName("RequestImageProcessing")]
public static async Task RequestImageProcessing([HttpTrigger(WebHookType = "genericJson")]
    HttpRequestMessage req)
{

        string anotherFunctionSecret = ConfigurationManager.AppSettings
            ["AnotherFunction_secret"];
        // anotherFunctionUri is another Azure Function's 
        // public URL, which should provide the secret code stored in app settings 
        // with key 'AnotherFunction_secret'
        Uri anotherFunctionUri = new Uri(req.RequestUri.AbsoluteUri.Replace(
            req.RequestUri.PathAndQuery, 
            $"/api/AnotherFunction?code={anotherFunctionSecret}"));

        var responseFromAnotherFunction = await client.GetAsync(anotherFunctionUri);
        // process the response

}

[FunctionName("AnotherFunction")]
public static async Task AnotherFunction([HttpTrigger(WebHookType = "genericJson")]
HttpRequestMessage req)
{
    await Worker.DoWorkAsync();
}
1
Artemious

良いソースが見つかりませんでした。以下を実行しましたが、うまくいきました。

以下の形式のURLで他の関数を呼び出すには:

https://my-functn-app-1.azurewebsites.net/some-path-here1?code=123412somecodehereemiii888ii88k123m123l123k1l23k1l3==

Node.jsでは、次のように呼び出しました。

let request_options = {
        method: 'GET',
        Host: 'my-functn-app-1.azurewebsites.net',
        path: '/path1/path2?&q1=v1&q2=v2&code=123412somecodehereemiii888ii88k123m123l123k1l23k1l3',
        headers: {
            'Content-Type': 'application/json'
        }
};
require('https')
    .request(
         request_options,
         function (res) {
               // do something here
         });

問題なく働いた。
他のプログラミング言語でも同様に機能するはずです。
お役に立てれば。