使用 Azure Functions 從 Azure Logic Apps 中的工作流程建立並執行您自己的程式碼

當您想要在邏輯應用程式工作流程中執行執行特定作業的程式碼時,可以使用 Azure Functions建立函式。 此服務可協助您建立 Node.js、C# 和 F# 和函式,而不需要組建完整的應用程式或基礎結構來執行程式碼。 您也可以 從 Azure 函數內部呼叫邏輯應用程式工作流程。 Azure Functions 提供雲端中的無伺服器運算,並可用於執行某些工作,例如:

  • 使用 Node.js 或 C# 中的函式來擴充邏輯應用程式的行為。
  • 在邏輯應用程式工作流程中執行計算。
  • 在邏輯應用程式工作流程中套用 advanced 格式或計算欄位。

若要在不使用 Azure Functions 的情況下執行程式碼片段,請瞭解如何 新增和執行內嵌程式碼

注意

Azure Logic Apps 不支援在啟用部署位置的情況下使用 Azure Functions。 雖然此案例有時可以運作,但這種行為無法預期,而且可能會在您的工作流程嘗試呼叫 Azure 函式時產生授權問題。

Prerequisites

  • Azure 訂用帳戶。 如果您沒有 Azure 訂用帳戶,請先註冊免費的 Azure 帳戶

  • 函數應用程式,這是使用 Azure Functions 建立之函式的容器,以及您所建立的函式。

    如果您沒有函式應用程式,請先建立該函式應用程式。 然後,您可以在 Azure 入口網站中的邏輯應用程式外部,或從工作流程設計工具中的 邏輯應用程式內部 建立函數。

  • 使用邏輯應用程式時,無論是現有或新的函數應用程式和函式,也都要符合相同的需求:

    • 您的函數應用程式和邏輯應用程式必須使用相同的 Azure 訂用帳戶。

    • 新的函數應用程式必須使用 .NET 或 JavaScript 作為執行階段堆疊。 當您將新的函式新增至現有的函數應用程式時,您可以選取 C# 或 JavaScript。

    • 您的函式會使用 HTTP 觸發程序 範本。

      HTTP 觸發程序範本可以接受內容中有來自邏輯應用程式的 application/json 類型。 當您將函式新增至邏輯應用程式時,工作流程設計工具會顯示在您的 Azure 訂用帳戶內從這個範本建立的自訂函數。

    • 除非您已定義 OpenAPI 定義 (先前稱為 Swagger 檔案),否則您的函式不會使用自訂路由。

    • 如果您有函式的 OpenAPI 定義,則工作流程設計工具會在您使用函式參數時提供更豐富的體驗。 邏輯應用程式若要尋找和存取具有 OpenAPI 定義的函式,必須先遵循下列步驟來設定函式應用程式

  • 您要在其中新增函式的邏輯應用程式,並包括作為邏輯應用程式中第一個步驟的觸發程序

    邏輯應用程式必須以觸發程序開頭,您才能新增動作來執行函式。 如果您不熟悉邏輯應用程式,請檢閱什麼是 Azure Logic Apps快速入門:建立第一個邏輯應用程式

尋找具有 OpenAPI 描述的函式

若要在工作流程設計工具中使用函式參數時取得更豐富的體驗,請針對您的函 式產生 OpenAPI 定義(之前稱為 Swagger檔案)。 若要設定函式應用程式,讓邏輯應用程式可以尋找和使用具有 Swagger 描述的函式,請遵循下列步驟:

  1. 請確定函數應用程式正在執行。

  2. 在函數應用程式中,請遵循下列步驟來設定跨原始資源共用 (CORS),以允許所有來源:

    1. 從 [函數應用程式] 清單中,選取您的函數應用程式。 在右窗格中,選取 [平台功能] > [CORS]。

      選取您的函式應用程式 > [平台功能] > [CORS]

    2. 在 [CORS] 下,加上星號 ( * ) 萬用字元,但移除清單中的其他所有來源,然後選取 [儲存]。

      將 "CORS* 設為萬用字元 "*"

存取 HTTP 要求內的屬性值

Webhook 函式可以透過輸入接受 HTTP 要求,並將這些要求傳遞給其他函式。 例如,雖然 Logic Apps 有會轉換日期時間值的函式,但這個基本範例 JavaScript 函式會說明如何存取傳遞給函式的要求物件內所含的屬性,並對該屬性值執行作業。 為了存取物件內的屬性,這個範例使用點 (.) 運算子

function convertToDateString(request, response){
   var data = request.body;
   response = {
      body: data.date.ToDateString();
   }
}

以下是此函式內部的運作情形:

  1. 函式會建立 data 變數,並將 request 物件內的 body 物件指派給該變數。 此函式會使用點 (.) 運算子來參考 request 物件內的 body 物件:

    var data = request.body;
    
  2. 此函式現在可以透過 data 變數存取 date 屬性,並藉由呼叫 ToDateString() 函式將該屬性值從 DateTime 類型轉換為 DateString 類型。 此函式也會透過函式回應中的 body 屬性傳回結果:

    body: data.date.ToDateString();
    

現在您已在 Azure 中建立函式,接下來請遵循將函式 新增至邏輯應用程式的步驟。

在邏輯應用程式內部建立函式

您可以使用工作流程設計工具中內建的 Azure Functions 動作,直接從邏輯應用程式的工作流程建立函式,但您只能將此方法用於以 JavaScript 撰寫的函式。 若為其他語言,您可以透過 Azure 入口網站中的 Azure Functions 體驗來建立函數。 如需詳細資訊,請參閱在 Azure 入口網站中建立您的第一個函式

不過,在 Azure 中建立函式之前,您必須已經有函數應用程式,這是您函式的容器。 如果您沒有函式應用程式,請先建立該函式應用程式。 請參閱在 Azure 入口網站中建立您的第一個函式

  1. Azure 入口網站中,在設計工具中開啟邏輯應用程式。

  2. 若要建立並新增函式,請遵循適用於您案例的步驟:

    • 在邏輯應用程式工作流程的最後一個步驟中,選取 [新增步驟]。

    • 在邏輯應用程式工作流程的現有步驟之間,將滑鼠移到箭號上,選取加號 (+),然後選取 [新增動作]。

  3. 在搜尋方塊中,輸入 azure functions。 從動作清單中,選取名為 [選擇 Azure 函數] 的動作,例如:

    在 Azure 入口網站中尋找函數。

  4. 從函式應用程式清單中,選取您的函式應用程式。 開啟 [動作] 清單之後,請選取此動作: 建立新 的函式。

    選取函式應用程式

  5. 在函式定義編輯器中,定義您的函式:

    1. 在 [函式名稱] 方塊中,為您的函式提供名稱。

    2. 在 [程式碼] 方塊中,將程式碼新增至函式範本,包括當函式執行完成後要傳回給邏輯應用程式的回應和承載。 當您完成時,選取 [建立]。

    例如:

    定義函式

    在範本的程式碼中,context 物件代表邏輯應用程式透過 要求本文 (位於後面的步驟中) 欄位傳送的訊息。 若要從您的函式內存取 context 物件的屬性,請使用此語法:

    context.body.<property-name>

    例如,若要參考 context 物件內的 content 屬性,請使用此語法:

    context.body.content

    範本程式碼也包含 input 變數,其中儲存著來自 data 參數的值,因此函式可以根據該值執行作業。 在 JavaScript 函數中,data 變數也是 context.body 的捷徑。

    注意

    這裡的 body 屬性適用於 context 物件,與動作輸出中可能也會傳遞給函式的 本文 權杖不同。

  6. 在 [要求本文] 方塊中,提供函式的輸入 (必須以 JavaScript 物件標記法 (JSON) 物件進行格式化)。

    此輸入是邏輯應用程式傳送給函式的「內容物件」或訊息。 當您在 [要求本文] 欄位內按一下時,動態內容清單會隨即出現,讓您可以選取前面步驟中的輸出權杖。 此範例指定內容承載包含名為 content 的屬性,而此屬性具有電子郵件觸發程序中的 寄件者 權杖值。

    「要求本文」範例 - 內容物件承載

    在此處,內容物件不會轉換為字串,所以物件內容會直接新增至 JSON 承載。 不過,如果內容物件不是傳遞字串、JSON 物件或 JSON 陣列的 JSON 權杖,您就會收到錯誤。 因此,如果此範例改為使用 接收時間 權仗,則您可以將內容物件加上雙引號,以轉換為字串。

    將物件轉換為字串

  7. 若要指定其他詳細資料,例如要使用的方法、要求標頭、查詢參數或驗證,請開啟 [新增參數] 清單,然後選取您想要的選項。 在驗證方面,選項會隨著您選取的函式而有所不同。 請參閱 啟用功能的驗證

在邏輯應用程式中新增現有函式

若要從邏輯應用程式呼叫現有的函式,您可以在工作流程設計工具中加入像是其他任何動作一樣的函式。

  1. Azure 入口網站中,在設計工具中開啟邏輯應用程式。

  2. 在您要新增函式的步驟下方,選取 [新增步驟]。

  3. 在 [選擇動作] 底下的搜尋方塊中,輸入 azure functions。 從動作清單中,選取名為 [選擇 Azure 函數] 的動作,例如:

    在 Azure 中尋找函式。

  4. 從函式應用程式清單中,選取您的函式應用程式。 函式清單出現後,選取您的函式。

    選取您的函數應用程式和函式

    如果函式有 API 定義 (Swagger 描述),而且設定為可讓邏輯應用程式尋找和存取這些函式,您可以選取 [Swagger 動作]。

    選取您的函數應用程式、「Swagger 動作」和您的函式

  5. 在 [要求本文] 方塊中,提供函式的輸入 (必須以 JavaScript 物件標記法 (JSON) 物件進行格式化)。

    此輸入是邏輯應用程式傳送給函式的「內容物件」或訊息。 當您按一下 [要求本文] 欄位時,動態內容清單隨即出現,讓您選取先前步驟中的輸出權杖。 此範例指定內容承載包含名為 content 的屬性,而此屬性具有電子郵件觸發程序中的 寄件者 權杖值。

    「要求本文」範例 - 內容物件承載

    在此處,內容物件不會轉換為字串,所以物件內容會直接新增至 JSON 承載。 不過,如果內容物件不是傳遞字串、JSON 物件或 JSON 陣列的 JSON 權杖,您就會收到錯誤。 因此,如果此範例改為使用 接收時間 權仗,則您可以在內容物件上加上雙引號,將內容物件轉換為字串:

    將物件轉換為字串

  6. 若要指定其他詳細資料,例如要使用的方法、要求標頭、查詢參數或驗證,請開啟 [新增參數] 清單,然後選取您想要的選項。 在驗證方面,選項會隨著您選取的函式而有所不同。 請參閱 在函數中啟用驗證

從函式呼叫邏輯應用程式

當您想要從函式內觸發邏輯應用程式時,邏輯應用程式必須以提供可呼叫端點的觸發程式為開頭。 例如,您可以使用 HTTP要求Azure 佇列事件方格 觸發程序來起始邏輯應用程式。 在函式內部,將 HTTP POST 要求傳送給該觸發程序的 URL,並包含您想要讓該邏輯應用程式處理的承載。 如需詳細資訊,請參閱呼叫、觸發或巢狀邏輯應用程式

啟用函數驗證

如果您想要輕鬆地驗證由 Azure Active Directory (Azure AD) 所保護之資源的存取權,您的邏輯應用程式可以使用受控識別 (先前稱為「受控服務識別」或「MSI) 」,而不需登入並提供認證或秘密。 Azure 會為您管理此身分識別,並協助保護您的認證,因為您不需要提供或輪替使用祕密。 深入了解支援使用受控識別進行 Azure AD 驗證的 Azure 服務

如果您將邏輯應用程式設定為使用系統指派的身分識別,或手動建立的使用者指派身分識別,則邏輯應用程式中的函式也可以使用相同的身分識別進行驗證。 如需邏輯應用程式中函式之驗證支援的詳細資訊,請參閱 將驗證新增至輸出呼叫

若要對您的函式設定和使用受控識別,請遵循下列步驟:

  1. 在邏輯應用程式上啟用受控識別,並設定該身分識別對目標資源的存取權。 請參閱 在 Azure Logic Apps 中使用受控識別來驗證對 Azure 資源的存取

  2. 依照下列步驟,在您的函式和函數應用程式中啟用驗證:

在函式中設定匿名驗證

若要在您的函式中使用邏輯應用程式的受控識別,您必須將函數的驗證層級設定為匿名。 否則,邏輯應用程式會擲回 "BadRequest" 錯誤。

  1. Azure 入口網站中,尋找並選取您的函數應用程式。 這些步驟使用 "FabrikamFunctionApp" 作為範例函數應用程式。

  2. 在 [函數應用程式] 窗格中,選取 [平台功能]。 在 [開發工具] 下,選取 [進階工具 (Kudu)]。

    開啟 Kudu 的進階工具

  3. 在 Kudu 網站的標題列上,從 [偵錯主控台] 功能表中選取 [CMD]。

    從 [偵錯主控台] 功能表中,選取 [CMD] 選項

  4. 下一個頁面出現之後,從資料夾清單中,選取 [site] > [wwwroot] > your-function。 這些步驟使用 "FabrikamAzureFunction" 作為範例函式。

    選取 [site] > [wwwroot] > 您的函式

  5. 開啟 function.json 檔案進行編輯。

    針對 "function. json" 檔案按一下編輯

  6. bindings 物件中,檢查 authLevel 屬性是否存在。 如果屬性存在,請將屬性值設定為 anonymous。 否則,請新增該屬性並設定值。

    新增 "authLevel" 屬性並設定為 "anonymous"

  7. 完成時,請儲存設定,然後繼續到下一節。

設定函數應用程式的 Azure AD 驗證

開始這項工作之前,請先找出這些值並放在一旁,供稍後使用:

  • 針對系統指派的身分識別而產生的物件識別碼,代表您的邏輯應用程式

    • 若要產生此物件識別碼,請啟用系統指派給邏輯應用程式的身分識別

    • 否則,若要尋找此物件識別碼,請在設計工具中開啟邏輯應用程式。 在邏輯應用程式功能表的 [設定] 下,選取 [身分識別] > [系統指派]。

  • Azure Active Directory (Azure AD) 中租用戶的目錄識別碼

    若要取得您租使用者的目錄識別碼,您可以執行 Get-AzureAccount PowerShell 命令。 或者,在 Azure 入口網站中執行下列步驟:

    1. Azure 入口網站中,尋找並選取您的函數應用程式。

    2. 尋找並選取您的 Azure AD 租用戶。 這些步驟使用 "Fabrikam" 作為範例租戶用。

    3. 在租用戶功能表的 [管理] 下,選取 [屬性]。

    4. 複製租用戶的目錄識別碼 (舉例來說),並儲存該識別碼供稍後使用。

      尋找並複製 Azure AD 租用戶的目錄識別碼

  • 資源識別碼,代表您想要存取的目標資源

    重要

    資源識別碼必須完全符合 Azure AD 預期的值,包括任何必要的尾端斜線。

    您稍後將函式動作設定為使用系統指派的身分識別時,此資源識別碼就是您在 [對象] 屬性中使用的同一個值。

現在,您可以開始為函數應用程式設定 Azure AD 驗證。

  1. Azure 入口網站中,尋找並選取您的函數應用程式。

  2. 在 [函數應用程式] 窗格中,選取 [平台功能]。 在 [網路] 下,選取 [驗證/授權]。

    檢視驗證和授權設定

  3. 將 [App Service 驗證] 設定改為 [開啟]。 從 [當要求未經驗證時所要採取的動作] 清單中,選取 [使用 Azure Active Directory 登入]。 在 [驗證提供者] 底下,選取 [Azure Active Directory]。

    啟用透過 Azure AD 進行驗證

  4. 在 [Azure Active Directory 設定] 窗格上,請遵循下列步驟:

    1. 將 [管理模式] 設定為 [進階]。

    2. 在 [用戶端識別碼] 屬性中,輸入物件識別碼,代表系統指派給邏輯應用程式的身分識別。

    3. 在 [簽發者 URL] 屬性中,輸入 https://sts.windows.net/ URL,並附加 Azure AD 租用戶的目錄識別碼。

      https://sts.windows.net/<Azure-AD-tenant-directory-ID>

    4. 在 [允許的權杖對象] 屬性中,輸入資源識別碼,代表您想要存取的目標資源。

      您稍後將函式動作設定為使用系統指派的身分識別時,此資源識別碼就是您在 [對象] 屬性中使用的同一個值。

    此時,您的版本看起來類似此範例:

    Azure Active Directory 驗證設定

  5. 完成後,選取 [確定]。

  6. 返回設計工具並遵循步驟, 以使用受控識別來驗證存取權

後續步驟