Azure Function EntityFrameWork Core LineBot

Azure Function & EF Core & LintBot 實例 -2

陳勇勳 2020/03/13 01:06:04
1241

在上篇 Azure Function & EF Core Azure & LineBot 實例 -1  (連結) 一文中介紹

Azure Function專案基本建立方式與 EntityFrameWork Core的結合

本篇文章將介紹如何將 Azure Function 專案從 VS上發佈至 Azure Server 與 結合 LineBot 後進行遠端偵錯方式

首先擁有一個Azure Server帳號是必須的,可自行前往 Azure Portal 申請

=====================================================================================

發佈 Azure Function Solution 至 Azure Server 函數應用程式

從 VS (Visual Studio) 發佈 Azure Function 專案至 Azure Server 大致上有兩種方式

1. 直接從 VS 的"發佈"功能中設定 "函數應用程式" 並進行發佈

2. 先行於 Azure Server 上建立 "函數應用程式" ,再透過發佈設定檔進行發佈 (範例採用)

我個人傾向使用第2點方式,原因在於使用"發佈"精靈方式,鏈接的URL預設為:http 

然而有些第三方服務只支援 https ,透過設定檔方式可自行將 http 修改為 https發佈後續會介紹.

 

STEP 1 建立 Azure Server 函數應用程式

Azure Server 找到"函數應用程式" , 選擇 "建立"

 

依照介面精靈指示一步步設定 (擁有訂用帳戶後,必須再自行設定資源群組)

補充:

函數應用程式名稱: 唯一值,此 Azure Function Url的依據(可自行設定,通過驗證即可)

 

補充:

 

儲存體帳戶: 請自行建立 (參考介紹: Azure Storage)

 

完成建立後,等待一段時間,按下 "重新整理" 即可看到剛剛建立的 "函數應用程式"

 

點擊剛建立的 "函數應用程式" 進入詳細介面,點擊 "取得發行設定檔" ,下一步驟會介紹如何將預設Url 從 http 修改為 https

 

STEP 2 從 VS 發佈 Azure Function 至 Azure Server 函數應用程式

打開剛剛下載的 "發行設定檔" 並修改 destinationAppUrl 值,將 http => https 進行變更

可以發現 "網站 URL" 會變成 https開頭網址 ,完成後進行發佈即可

 

發佈完成後,回到 "函數應用程式" 介面可發現 "函式"列表下方多了 HeavenPost 字樣

這個就是 Azure Function 專案中所設定 [FunctionName] 方法的對應

補充:

 

 

點擊函式列表下的方法,可以進去更詳細的設定介面

函式詳細介面中,點擊 "</> 取得函數 URL " 

function.json (介紹連結

 

URL: 代表外部執行此 function 的呼叫路徑 , 後續進行 LineBot 設定時會使用到 

 

為何將 http 變更成 https ?

 

前文提到,某些第三方串接只支援 https (如圖)

 

設定 LineBot 環境參數與 Azure 遠端偵錯方式

STEP 1 LineBot環境設定

在這假設已經申請好一個 LineBot Application (尚未擁有 Line Developer帳號的請自行 google "linebot 申請")

 

前往指定的LineBot Application,點選上方 "Channel settings" 找到 Webhook URL

將前面 "</> 取得函數URL"的值貼上,按下Update

 

按下 "Verify"按鈕,如果下方出現 "Success" 恭喜你,這就代表 Webhook 跟Azure Function API已經串接成功

補充:

串接失敗會顯示什麼? 我要如何查看從Linebot發送的資訊進行遠端偵錯動作?

當 webhook跟設定的 URL API 溝通失敗 (可能是5xx開頭錯誤) , 一律都會顯示此錯誤

因此要找出真正錯誤原因,就得從Azure Server上面著手

 

STEP 2 例外狀況檢測與排除

伺服器錯誤百百種,在無法由本機偵錯情況下,就需要套過Azure Console給我們的資訊去嘗試

透過Azure Function 測試介面執行結果,顯示錯誤為

Value cannot be null

Parameter name:connectionString

從 connectionString 字眼,我個人大致可猜出可能是連線相關環境沒設定好

 

平台功能 => 設定,進入到應用程式參數設定介面

 

在此會發現 localhost.setting.json 有設定 "SqlConnectionString"屬性,似乎沒有吃進來,自行補上SqlConnectionString 值與屬性

 

完成後 (如圖)

 

再次執行測試,回傳 Hello MATT 字眼, 狀態為 200

 

STEP 3 從 Visual Studio 對 Azure Function 進行遠端偵錯方式

從STEP 2 排除錯誤狀況,可以發現一件事,針對錯誤訊息採取假設性除錯方式,實在有點不科學或許有人會問 ...

怎不叫出除蟲好夥伴中斷點呢?

在這個範例中, Azure Function Solution 是從 Azure Server 執行,因此正常來說只能從 Azure Console 去查看資訊

其次 Linebot 進行呼叫Azure Function 基本上也只能針對發佈於 Server的 API 動作

結合以上兩種限制,似乎好夥伴只能 Say Good Bye?!

以上是我當初開發時,侷限性的思考

 

有沒有方法可以當 LineBot 執行 webhook 呼叫時,轉向到 Localhost ?

有沒有方法當Azure Function 被呼叫時, 可以從用中斷點查看執行狀況?

果然事在人為,怕的就是懂得不夠多

1. 使用 ngrok 反向代理套件 (此方式適合尚未發佈於 Azure Server 時與 Linebot 串接偵錯使用) 套件連結

安裝完 ngrok 套件後,於 cmd 視窗下執行 ngrok http 你的port-host-header="你的 localhost:port"

等待轉向網址產生之後(紅框),將轉向好的網址設定到 Linebot 的 Webhook Url 即可

 

Linebot 顯示Success 就代表成功 (設定成功後執行專案,使用中斷點情況,請自行嘗試,這就不另外描述)

 

2. 使用 VS 附加偵錯工具 - Attach To Process (此方式適合 Azure Function已發佈於 Azure Server 上,欲進行偵錯動作時)

使用 remote debugger Azure Function 必須符合兩個條件

     A. 發佈的專案必須設定成 Debug模式 , 預設為: release

     B. Azure Application 遠端偵錯功能必須開啟

假設以上兩個條件都已經設定完成 (不知如何設定,參考連結部分有提供)

 

連線目標: 請於發佈設定檔中,找尋 destinationAppUrl 將值貼上(請自行去掉 https://),最後帶入 port 4022 

附加至: 選擇 受控(CoreCLR) 程式碼

處理序: 選擇 w3wp.exe 

完成後點擊"附加"按鈕,靜待一段時間等程式運行完成.

 

 

對 LineBot發送訊息後,VS中斷點執行偵錯狀態

 

==================================================總結:

兩篇文章主要介紹 Azure Function & EF Core & Linebot結合方式

其餘很多設定與概念,無法在一篇文章中塞入,只能請閱讀者自行摸索

例如: Azure Server 各個功能環境設定 、Line Bot 環境參數概念...等

三個個不同應用的混合,當初也是抱持著或許可以的想法嘗試 

踩爆的地雷多到數不清 ......

過程中參考了不少文件 (也看了不少過期文件 Orz...)

這邊只列出與本篇實際應用相關的 

在兩篇文章中我個人最有價值的就是偵錯技巧這個部分

畢竟東西一但上了 Server 就不像在本機端可以輕易偵錯 (只能買乖乖保佑...?!)

所以學習各種 Server 偵錯技巧,可以節省不少摸蟲時間.

最後,感謝您的閱讀.

 

參考連結:

Azure Server:

Azure Function 官方文件

https://docs.microsoft.com/zh-tw/azure/azure-functions/

 

Azure Function 環境與定價策略文件

https://docs.microsoft.com/en-us/azure/azure-functions/functions-scale

 

Azure Function 遠端偵錯:

http://dontcodetired.com/blog/post/Remote-Debugging-Azure-Functions-V2-The-breakpoint-will-not-currently-be-hit-No-symbols-have-been-loaded-for-this-document

https://www.locktar.nl/uncategorized/azure-remote-debugging-manually-in-visual-studio-2017/

 

 

 

陳勇勳