cdk v2がstableになったのでバージョンを上げてみた

当記事は、半年以上前に投稿されたものです。そのため、古い技術や情報をもとに書かれている可能性があります。参照する際は十分に注意していただければです。

はじめに

先日、cdk v2 が stable になりました emoji-tada と言うことで、早速自身がちょこちょこ書いている cdk を 1.78.0 から 2.0.0 に上げてみました。 今のところ大きな問題が起きていないので、却って不安になっています emoji-sweat_drops

前提条件

  • mac ユーザー
  • typescript で cdk を管理

変更内容

詳しくはコチラの公式記事を見ていただければです。

私的に気になったアップデート点を抜粋します。

  • コアライブラリと安定したコンストラクトライブラリ(各サービスごとのパッケージ)が aws-cdk-lib に統合されました

    • 今までそれぞれのサービスごとにパッケージをインストールしていましたが、それが aws-cdk-lib をインストールするだけで良くなりました
  • 新しい実験的な(Experimental)なコンストラクトライブラリは、aws-cdk-lib ではなく ex. @aws-cdk/aws-amplify-alpha のような別パッケージとして管理されるようになりました

    • Experimental は suffix として alpha と付くようです
    • v1.x では同じパッケージ内で破壊的な変更が加わる可能性があり、それを気づかずに使ってしまうことがありましたが、v2 からは安定板にならない限り、aws-cdk-lib には統合されないようになりました
  • v1.x と既存のコンストラクトライブラリで廃止されたプロパティ、メソッド、type は、v2 の API からは完全に削除されています
  • デプロイ時にモダンブートストラップスタックを使用しないといけないようです

    • v1 のデフォルトであったレガシーブートストラップスタックはサポートされなくなりました
    • そのため、バージョンを上げる際には cdk bootstrap を行う必要があります

注意点

  • 基本的な要件は v1 と同時ですが、typescript の場合は、3.8 以上が必要です
  • CDK v2 は v2 もしくはそれより最新の CDK Toolkit(aws-cdk) が必要です
  • v1 を v2 を並行して利用することはできません
  • v1 は 2022/06/01 までメンテナンスされ、2023/06/01 には EOL されてしまいます

バージョン更新

詳しくは公式のコチラの手順も合わせて読んで頂ければです。

全てではないですが、今回私が変更したサンプルを示します。

@aws-cdk/aws-apigateway などの各サービスごとに別れていたパッケージが aws-cdk-lib に集約されています。

// package.json

// old
"devDependencies": {
  "aws-cdk": "1.78.0",
  "@aws-cdk/aws-apigateway": "1.78.0",
  "@aws-cdk/aws-certificatemanager": "1.78.0",
  .
  .
  .
}
// ↓
// new
"devDependencies": {
  "aws-cdk": "2.0.0",
  "aws-cdk-lib": "2.0.0",
  "constructs": "^10.0.0",
  .
  .
  .
}

lib 側(stack を記述しているディレクトリ)で記述しているパッケージのインポートを修正します

  • coreaws-cdk-lib に移動しています
  • サービスごとのパッケージも core から呼び出します
// lib/iam.ts
// stackを記述しているファイル

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

// ↓

// new
import { App, Stack, aws_iam as iam } from "aws-cdk-lib"

遭遇したエラー

バージョンアップ後に、cdk deploy をかけると下記のようなエラーが出ます。 公式でも言及されていますが、v1 から v2 に上がる際に cdk bootstrap をする必要があります。

❌  MyStack failed: Error: MyStack: SSM parameter /cdk-bootstrap/hnb659fds/version not found. Has the environment been bootstrapped? Please run 'cdk bootstrap' (see https://docs.aws.amazon.com/cdk/latest/guide/bootstrapping.html)
    at CloudFormationDeployments.validateBootstrapStackVersion (.../aws-cdk/lib/api/cloudformation-deployments.ts:323:13)
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
MyStack: SSM parameter /cdk-bootstrap/hnb659fds/version not found. Has the environment been bootstrapped? Please run 'cdk bootstrap' (see https://docs.aws.amazon.com/cdk/latest/guide/bootstrapping.html)

ちなみに私は github actions 上で oidc を使って cdk deploy を回しているのですが、その際にデプロイ用のロールに対して ssm:GetParameter が足りないと怒られたので、雑に AmazonSSMFullAccess の managedPolicy をデプロイロールに割り当てています。 要調査なのですが、一旦これで通しています emoji-sweat_drops

example-stack failed: Error: example-stack: User: arn:aws:sts::00000000000:assumed-role/example-deploy/token-file-web-identity is not authorized to perform: ssm:GetParameter on resource: arn:aws:ssm:ap-northeast-1:00000000000:parameter/cdk-bootstrap/xxxxxxxx/version because no identity-based policy allows the ssm:GetParameter action

おわりに

ほとんど v2 の恩恵は受けない構成なのですが、こまめにアップデートをかけないと、とてもしんどい思いをすると本職で経験しているのでサッと今回はやってみました。 本職の方では v2 に上げれるのだろうか… emoji-sweat_drops


Canji

クラウド周りをちょこまかしたい注意散漫人間。個人開発を楽しんでいたあの頃。