AWS CDK 開發現場: Argument of type 'this' is not assignable to parameter of type 'Construct'.

(圖說:當年積體電路 (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'.


出事現場原始碼:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import * as cdk from '@aws-cdk/core';
import * as elbv2 from'@aws-cdk/aws-elasticloadbalancingv2';
import { CfnOutput } from '@aws-cdk/core';

/**
 * Shared ALB
 */
export class SharedLoadBalancerStack extends cdk.Stack {
  public readonly targetGroup: elbv2.ApplicationTargetGroup;

  constructor(scope: cdk.Construct, id: string, props: cdk.StackProps = {}) {
      super(scope, id, props);

      const loadBalancer = elbv2.ApplicationLoadBalancer.fromApplicationLoadBalancerAttributes(this, 'LoadBalancer', {
        loadBalancerArn: ''
      });
  }
}

暫時對策

this 改成 scope 後發現兩個 Construct 載入的 @aws-cdk/core 源頭不相同。但仍無法解決問題。

確認真因

找到 CDK 之父 eladb 曾經在這張 GitHub issue 裡面提到要檢查/確保 package.json 裡面的各個 @aws-cdk/xxx 套件版本要對齊、相同。

回頭看了當時出事現場的 AWS CDK 專案目錄的 package.json 節錄片段,長這樣:

1
2
3
4
5
6
7
  "dependencies": {
    "@aws-cdk/aws-ec2": "^1.50.0",
    "@aws-cdk/aws-ecs": "^1.50.0",
    "@aws-cdk/aws-elasticloadbalancingv2": "^1.51.0",
    "@aws-cdk/core": "1.50.0",
    "source-map-support": "^0.5.16"
  }

後來回顧時間軸歷史紀錄,這種狀況發生在:

  • 專案使用的 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 套件版本同步成相同版本號碼。

參考資料

Loading comments…