はじめに

AWS CDKのデプロイをする際に以下のエラーが発生して、頭を悩ましていたので私が解消した方法を書き残します。
どなたかの参考になれば幸いです。

$ This CDK CLI is not compatible with the CDK library used by your application. Please upgrade the CLI to the latest version.
$ (Cloud assembly schema version mismatch: Maximum schema version supported is 36.0.0, but found 36.3.0)

前提

とあるプロジェクトにて一部のリソースをAWS CDKで管理していました。
開発当初はローカル環境からデプロイを実行していましたが、CI/CD環境が整ってからはCodePipeline & CodeBuildによるデプロイ実行に切り替える運用で進めていました。
今回はローカル環境ではデプロイエラーが発生せず、CI/CD環境ではデプロイエラーが発生していました。
ちなみにデプロイを実行しているCDKのディレクトリ構成は次のような構成でした。

(Repository root)/
 ┣ cdk-settings/
   ┣ bin/
   ┣ lib/
   ┣ test/
   ┣ cdk.json
   ┣ jest.config.js
   ┣ package-lock.json
   ┣ package.json
   ┗ tsconfig.json
 ┣ package-lock.json
 ┗ package.json

  • cdk-settings配下にCDKのコードを配置
  • Repository rootの直下のpackage.jsonにてCDKを管理

まずは原因調査

同様のエラーを検索するとグローバルにインストールしたCDKとローカルにインストールしたCDKのバージョン不一致が原因であるといったようなことがよく見られました。
ただ、今回の環境はCodeBuild上で発生しているエラーで、そもそもグローバルにCDKをインストールなどしていない状態でしたので、どこのバージョンのことを指しているエラーなのか判断つきませんでした。

ローカル環境でのエラー確認

今一度ローカル環境で同じエラーが発生しないか、確認のためにGitリポジトリからまっさらなディレクトリにコードをCloneしてきてCDKのデプロイを試してみました。すると、同じエラーが発生しました。
そこでおもむろにcdk-settings配下でCDKのバージョン確認をしてみたところ、以下のようになりました。

$ cd cdk-settings
$ npx cdk --version
$ 2.144.0

あれ、、ここで私はあることに気づきます。
開発当初はその時点で最新のCDKバージョンである、2.144.0で進めていたのですが、とある事情で開発途中で 2.158.0 にアップデートの対応をしていました。どうやらその対応がうまく適用できていないようだ、ということにここで初めて気がつきました。
どうなってるのだろう、ということで、Repository rootにて同様にCDKのバージョンを確認してみました。

$ cd cdk-settings
$ npx cdk --version
$ 2.158.0

なんかズレてます・・・

エラーの原因

ここでRepository root直下のpackage.jsonとcdk-settings配下のpackage.jsonを見比べてみます。

Repository root直下のpackage.json

{
  "name": "xxx-cdk-stacks",
  "version": "1.0.0",
 〜〜
  "dependencies": {
    "aws-cdk": "^2.158.0"
  }
}

cdk-settings直下のpackage.json

{
  "name": "cdk-settings",
  "version": "0.1.0",
 〜〜
  "devDependencies": {
 〜〜
    "aws-cdk": "2.144.0", ← ココがおかしい
 〜〜
  },
  "dependencies": {
    "aws-cdk-lib": "2.158.0",
 〜〜
  }
}

cdk-settings直下のバージョンがズレていますね。
手動で書き換えていたのでただの修正漏れだったようです・・・

修正して確認へ

対応した時点でCDKの最新バージョンが 2.160.0 に上がっていたので、ついでに全てを最新バージョンにアップしました。
修正したコードをコミットしてCI/CD環境に通してみると、無事にデプロイに成功しました!

ローカル環境は成功していたのでは?

原因が分かったのでスッキリしたのですが、そもそも当初はローカル環境ではデプロイが成功していたはずだったんですが、これはどういうことだったんでしょうか。
デプロイが成功していたディレクトリで再度CDKのバージョンを確認してみると、Repository root直下でもcdk-settings配下でも 2.144.0 となっていました。
つまり、バージョンアップしたタイミングでpackage.jsonの記述だけ書き換えて実際のライブラリバージョンを更新していなかったようでした。
ホント本番リリースする前に発見することができて助かりました。

まとめ

  • CDKのバージョンはコード内も全て統一しておかないとエラーになるケースがあります
  • 当たり前の話ですが、package.jsonを更新した際は関連するモジュールの更新も実施するクセをつけておきましょう