开发函数计算的正确姿势 —— Fun validate 语法校验排错指南
1. 前言
首先介紹下在本文出現的幾個比較重要的概念:
函數計算(Function Compute): 函數計算是一個事件驅動的服務,通過函數計算,用戶無需管理服務器等運行情況,只需編寫代碼并上傳。函數計算準備計算資源,并以彈性伸縮的方式運行用戶代碼,而用戶只需根據實際代碼運行所消耗的資源進行付費。
Fun: Fun 是一個用于支持 Serverless 應用部署的工具,能幫助您便捷地管理函數計算、API 網關、日志服務等資源。它通過一個資源配置文件(template.yml),協助您進行開發、構建、部署操作。
template.yml: template.yml 用于定義 serverless 應用的模型。無論是使用 fun local 還是 fun deploy 等功能,都是通過解析 tempalte.yml 的內容,構建出用戶定義的云資源模型,進而實現本地云資源的運行調試以及發布等功能。
template.yml 所描述的 Serverless 模型,是 Fun 所有功能的基石。template.yml 的正確性對后續能夠順利使用 Fun 的各項功能無疑是非常關鍵的。為了幫助用戶更快速的修正 template.yml 中錯誤的描述,我們在 Fun 2.14.0 優化了語法校驗的錯誤信息,可以達到更精準定位報錯并修復的目的。
下面我們就通過一個示例,學習如何根據報錯信息糾正 template.yml 中的錯誤語法描述。
備注:請確保 Fun 工具版本在?2.14.0+
2. 錯誤的 template.yml 示例
?
ROSTemplateFormatVersion: '2015-09-01' Transform: 'Aliyun::Serverless-2018-04-03' Resources:local-http-demo:Type: 'Aliyun::Serverless::InvalidService'Properties:Description: 'local invoke demo'nodejs8:Type: 'Aliyun::Serverless::InvalidFunction'Properties:Handler: index.handlerCodeUri: nodejs8/Description: 'http trigger demo with nodejs8!'Events:http-test:Type: HTTPProperties:AuthType: ANONYMOUSMethod: ['GET', 'POST', 'PUT']在上面的示例中,我們原意是想要描述一個叫做?local-http-demo 的服務,并在服務下定義了一個名為?nodejs8 的函數,同時為該函數配置一個匿名的 HTTP 觸發器,支持 GET、POST、PUT 的 HTTP 請求。
但遺憾的是,上面的示例描述有幾處比較隱蔽的問題。下面,我們就動手實踐,看如何發現上面示例中包含的錯誤語法描述并將其修正。
3. 語法錯誤發現并修復
3.1 修復第一個錯誤
我們可以執行 fun validate 對 tempalte.yml 進行校驗(其他的命令比如 deploy、local 等也會隱式的執行 fun validate,保證在語法描述正確的情況下才執行指定的功能)。
當執行完 fun validate 后,會看到錯誤信息:
[{"keyword": "enum","dataPath": "/Resources/local-http-demo/Type","params": {"allowedValues": ["Aliyun::Serverless::Service","Aliyun::Serverless::TableStore","Aliyun::Serverless::Api","Aliyun::Serverless::Log","Aliyun::Serverless::CustomDomain","Aliyun::Serverless::MNSTopic"]},"message": "should be equal to one of the allowed values"} ]錯誤信息會以 json 的格式輸出,其中的 message 就是我們的本次的錯誤原因,dataPath 是遇到的錯誤在 template.yml 中的具體位置,params 中的內容是對 message 的進一步的補充。
按照我們剛才的解釋,大概就可以明白,/Resources/local-http-demo/Type?這個資源定義出了問題,原因是這個值應該是?Aliyun::Serverless::Service、Aliyun::Serverless::TableStore、Aliyun::Serverless::Api、Aliyun::Serverless::Log、Aliyun::Serverless::CustomDomain、Aliyun::Serverless::MNSTopic?中的一個。
再看下我們的描述(限于篇幅只列出了 template.yml 的部分內容):
Resources:local-http-demo:Type: 'Aliyun::Serverless::InvalidService'很明顯,我們描述的?Aliyun::Serverless::InvalidService?并不在上面允許的值中。
我們將其修改正確,也就是把?Aliyun::Serverless::InvalidService?修改為?Aliyun::Serverless::Service?即可。
Resources:local-http-demo: - Type: 'Aliyun::Serverless::InvalidService' + Type: 'Aliyun::Serverless::Service'3.2 重新進行語法校驗并修復
通常情況下,我們建議的方式是修復完一個問題,就重新使用 fun validate 進行校驗。
我們將上面問題修復后,重新執行 fun validate 后,可以發現,依舊有報錯:
[{"keyword": "const","dataPath": "/Resources/local-http-demo/nodejs8/Type","params": {"allowedValue": "Aliyun::Serverless::Function"},"message": "should be equal to constant"},{"keyword": "required","dataPath": "/Resources/local-http-demo/nodejs8/Properties","params": {"missingProperty": "Runtime"},"message": "should have required property 'Runtime'"},{"keyword": "additionalProperties","dataPath": "/Resources/local-http-demo/nodejs8/Events/http-test/Properties","params": {"additionalProperty": "Method"},"message": "should NOT have additional properties"},{"keyword": "required","dataPath": "/Resources/local-http-demo/nodejs8/Events/http-test/Properties","params": {"missingProperty": "Methods"},"message": "should have required property 'Methods'"} ]這一次與上一次不同,同時出現了 4 個報錯。但具體的修復步驟與上一步是一致的,即先找到第一個問題進行修復就可以了。
第一個報錯如下:
{"keyword": "const","dataPath": "/Resources/local-http-demo/nodejs8/Type","params": {"allowedValue": "Aliyun::Serverless::Function"},"message": "should be equal to constant" }這個和我們剛才修過的問題是一樣的,意思就是?/Resources/local-http-demo/nodejs8/Type?的定義不對,這個值只被允許設定為?Aliyun::Serverless::Function?。
我們按照提示的將其修正(限于篇幅只列出了 template.yml 的部分內容):
Resources:local-http-demo:nodejs8: - Type: 'Aliyun::Serverless::InvalidFunction' + Type: 'Aliyun::Serverless::Function'這時候,我們可以重新執行下 fun validate,然后再挑選第一個進行修復,我們這里限于篇幅,就繼續挑選下一個報錯進行修復了。
{"keyword": "required", "dataPath": "/Resources/local-http-demo/nodejs8/Properties","params": {"missingProperty": "Runtime"},"message": "should have required property 'Runtime'" }這里 message 的含義是,缺少了必要的屬性?Runtime,檢查下我們的規范文檔對?Function 資源的描述,可以發現,Runtime?確實是必選的。
我們按照提示的將其修正(限于篇幅只列出了 template.yml 的部分內容):
Resources:local-http-demo:Type: 'Aliyun::Serverless::Service'nodejs8:Type: 'Aliyun::Serverless::Function'Properties: + Runtime: nodejs8最后的兩個錯誤,我們可以一起看:
{"keyword": "additionalProperties","dataPath": "/Resources/local-http-demo/nodejs8/Events/http-test/Properties","params": {"additionalProperty": "Method"},"message": "should NOT have additional properties" }, {"keyword": "required","dataPath": "/Resources/local-http-demo/nodejs8/Events/http-test/Properties","params": {"missingProperty": "Methods"},"message": "should have required property 'Methods'" }這兩個的錯誤含義是,我們在?/Resources/local-http-demo/nodejs8/Events/http-test/Properties這個路徑下,定義了一個不被允許的屬性?Method,并且同樣是在這個路徑下,缺少了一個必選的屬性?Methods。結合這兩個報錯,我們就可以判斷出,我們將 Methods 錯寫成了 Method。
我們按照提示的將其修正(限于篇幅只列出了 template.yml 的部分內容):
Resources:local-http-demo:nodejs8:Events:http-test:Properties:AuthType: ANONYMOUS - Method: ['GET', 'POST', 'PUT'] + Methods: ['GET', 'POST', 'PUT']當將所有的錯誤修復完成后,我們再重新執行 fun validate,即可發現,我們的所有錯誤都被修正啦。
接下來,我們就使用這個 template.yml 完成后續的 fun local、fun deploy 等功能就可以了。
3.3 修改記錄匯總
我們將上面所有的改錯記錄記錄如下:
ROSTemplateFormatVersion: '2015-09-01' Transform: 'Aliyun::Serverless-2018-04-03' Resources:local-http-demo: - Type: 'Aliyun::Serverless::InvalidService' + Type: 'Aliyun::Serverless::Service'Properties:Description: 'local invoke demo'nodejs8: - Type: 'Aliyun::Serverless::InvalidFunction' + Type: 'Aliyun::Serverless::Function'Properties:Handler: index.handlerCodeUri: nodejs8/Description: 'http trigger demo with nodejs8!' + Runtime: nodejs8Events:http-test:Type: HTTPProperties:AuthType: ANONYMOUS - Method: ['GET', 'POST', 'PUT'] + Methods: ['GET', 'POST', 'PUT']4. 總結
雖然 Fun 的規范文檔描述的比較詳細了,而且在 Fun 的 repo 首頁,我們給出了非常多的示例文章,但依舊存在很大可能性會遇到各種各樣的類似上面示例的書寫錯誤。
因此,Fun 提供了比較強大的語法校驗功能,并通過精準的報錯信息,讓用戶可以方便的將其修正。
原文鏈接
本文為云棲社區原創內容,未經允許不得轉載。
總結
以上是生活随笔為你收集整理的开发函数计算的正确姿势 —— Fun validate 语法校验排错指南的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于阿里云的 Node.js 稳定性实践
- 下一篇: 瞧!公务员的工作还可以这样干