(圖說:當年積體電路 (IC) 將一些常用、重複使用的電路整理起來,進而縮小尺寸,站在前人的肩膀上,帶動了時代進步。現在的 AWS CDK 也做了類似的整理。圖片來源:Image by Gerd Altmann from Pixabay。)
記錄一下把玩 AWS CDK 過程中遇到的開發現場。
起因
遇到狀況的時候是在想要加入現有的 ALB (ELBv2) 資源(後來發現跟哪一種資源無關),現場遇到的錯誤訊息:
Argument of type 'this' is not assignable to parameter of type 'Construct'.
Type 'SharedLoadBalancerStack' is not assignable to type 'Construct'.
Property 'onValidate' is protected but type 'Construct' is not a class derived from 'Construct'.
內容大綱
出事現場原始碼:
|
|
暫時對策
將 this
改成 scope
後發現兩個 Construct
載入的 @aws-cdk/core
源頭不相同。但仍無法解決問題。
確認真因
找到 CDK 之父 eladb 曾經在這張 GitHub issue 裡面提到要檢查/確保 package.json
裡面的各個 @aws-cdk/xxx
套件版本要對齊、相同。
回頭看了當時出事現場的 AWS CDK 專案目錄的 package.json
節錄片段,長這樣:
|
|
後來回顧時間軸歷史紀錄,這種狀況發生在:
- 專案使用的 CDK 還沒升級(本例中還在使用 v1.50.0),
- 但官方已發行新版本(本例時間點官方推出了 v1.51.0),
- 於專案開發期間進行了
npm install @aws-cdk/xxx
(本例中的@aws-cdk/aws-elasticloadbalancingv2
取得了 v1.51.0,而@aws-cdk/core
還在 v1.50.0), - 所以安裝進來的某個新套件會比專案手上的 CDK 版本兩者版本沒有同步。
嗯嗯,其實跟 AWS CDK 沒太大關係,是自己太久沒複習 node/npm 環境。
解決方法
- 將同一個 AWS CDK 專案中的
package.json
所使用的@aws-cdk/xxx
套件版本同步成相同版本號碼。