[小ネタ]CDKデプロイで”error TS2345: Argument of type ‘~~’ is not assignable to parameter of type ‘~~’.”というエラーを解決した話

CDKのエラーを解決したお話です。
2023.05.19

皆さん、こんにちは!

クルトンです。

今回はTypescriptでCDKを触っていて遭遇した、エラーを解決するお話です。

どういうエラー?

こちらがエラーの内容になります。

error TS2345: Argument of type 'import("ファイルパス").App' is not assignable to parameter of type 'import("ファイルパス").App'.
  Type 'App' is missing the following properties from type 'App': onValidate, onPrepare, onSynthesize, validate, and 2 more.

そしてエラーの該当箇所がこちらのコードになります。

import * as cdk from "@aws-cdk/core";
import * as lambda from "@aws-cdk/aws-lambda";
import * as iam from "@aws-cdk/aws-iam";

export class MyStack extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

6行目のcdk.Appでエラーが出ていました。皆さんは、上記コードでどこを直せば良いか分かりますか?

解決方法

早速解決方法についてです。

次のコードをご覧ください。

import * as cdk from "aws-cdk-lib";
import * as lambda from "aws-cdk-lib/aws-lambda";
import * as iam from "aws-cdk-lib/aws-iam";

export class CdkManipulateS3Stack extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

エラーを解決するには、@aws-cdkではなくaws-cdk-libを使う必要がありました。

なぜエラーが発生したのか

バージョンの違いによりエラーが出ていました。

  • @aws-cdk
    • CDKのバージョン1系の書き方
  • aws-cdk-lib
    • CDKのバージョン2系の書き方

package.jsonを確認してみると、バージョンが"2.79.1"でした。しかし、コード上での書き方はバージョン1系の書き方で、そこでエラーが発生していたようです。

当たり前な話ではありますが、バージョンの違いによって動作が異なる場合があるので、使っているものをしっかり確認しておく事は大事ですね……。

ちなみに

CDKのバージョン1のサポートは2023年6月1日に終了するとのアナウンスが書かれていました。バージョン2の書き方をしていくように、心がけていく方が良さそうです。

終わりに

今回はCDKのお話でした。

チュートリアルやブログなどで書き方を見ていると、バージョン1系のものを目にしました。 もしかすると同じエラーに遭遇する人がいるかもしれないと考え、今回のブログを書きました。 少しでもお役に立てたならば幸いです。

今回はここまで。

それでは、また!

参考サイト