AWS CDKのV2がGAとなりました。
開発中のプロジェクトのバージョンを更新するための変更部分を書いておきます。
参考資料
こちらの内容を主に参考にして、壁にぶつかったら調べる形で更新しました。
Experimental construct librariesがAWS CDK v2で利用可能になりました | Amazon Web Services ブログ
PyPiパッケージ更新
V1ではコンポーネント毎に aws-cdk.aws_ec2
のように細かく分かれていたPyPiパッケージが 一つの aws-cdk-lib
で事足りるようになったのがV2の大きな改善点となります。
例えばV1でPythonのCDKテンプレートの通り setup.py
に以下のように書く必要があり、新しいコンポーネント使う場合にimport漏れが発生するのがあるあるでした。
CDK_VERSION = "1.128.0" setuptools.setup( # ---省略 install_requires=[ f"aws-cdk.core=={CDK_VERSION}", f"aws-cdk.aws_iam=={CDK_VERSION}", f"aws-cdk.aws_rds=={CDK_VERSION}", f"aws-cdk.aws_batch=={CDK_VERSION}", f"aws-cdk.aws_ecs=={CDK_VERSION}", f"aws-cdk.aws_ecr=={CDK_VERSION}", # ---コンポーネント毎のインポートが続く---
V2の場合は基本的にはこれが aws-cdk-lib
のインポートで事足りるようになります。
CDK_VERSION = "2.0.0" setuptools.setup( # ---省略 install_requires=[ f"aws-cdk-lib=={CDK_VERSION}" ],
基本的にはと言ったのはL2のConstructorを使う場合などは、aws-cdk-lib
に含まれていないものもあります。そういったものは別途インポートしてあげる必要があります。
この当たりは上記の参考URLにも記載があります。
新しいサービス (またはコアモジュール) のためにL2コンストラクトが初めて作成されたときに、新しいアルファモジュールを作成します。アルファモジュールが安定した後は、aws-cdk-libに移され、AWS CDKのメジャーバージョン内での後方互換性が保証されます。AWS CloudFormation (L1) クラスは常に安定していると定義されているため、CloudFormationが利用可能になったその日から aws-cdk-lib に含まれます。例えばaws-cdk-libに含まれるaws-amplifyモジュールはCloudFormationが利用可能になったその日からL1クラスを含み、一方で独立してリリースされた@aws-cdk/aws-amplify-alphaモジュールは実験的なL2コンストラクトを含みます。
アルファモジュールは、aws-cdk-lib/名前空間の下にある安定したモジュールと明確に区別するために、@aws-cdk/名前空間の下に-alphaの修飾子を付けてリリースされていることがわかります。v2のAPIリファレンスには、これらの名前空間も含まれています。
実験的なL2コンストラクトライブラリが安定していると宣言されaws-cdk-libに移されると、以後アルファモジュールの新しいリリースはありません(例: @aws-cdk/aws-amplify-alpha)。以前のバージョンは保存されます。前述の例では、安定したコンストラクトはaws-cdk-lib/aws-amplifyモジュールに移されます。
例えば2021/12/03時点ではbatchのL2 Constructorを使いたい場合などは、以下のように aws-cdk.aws-batch-alpha==2.0.0rc24
をインストールしてあげる必要があります。
CDK_VERSION = "2.0.0" setuptools.setup( # ---省略 install_requires=[ f"aws-cdk-lib=={CDK_VERSION}", "aws-cdk.aws-batch-alpha==2.0.0rc24", ],
bootstrapが大きく異なる
cdk bootstrap
コマンドで作成される CDKToolkit
スタックの内容が大きく異なります。
V1のリソース
V1ではS3 Bucket程度です。
論理名 | リソースタイプ |
---|---|
StagingBucket | AWS::S3::Bucket |
StagingBucketPolicy | AWS::S3::BucketPolicy |
V2のリソース
大量のリソースが作られます。
論理名 | リソースタイプ |
---|---|
CdkBootstrapVersion | AWS::SSM::Parameter |
CloudFormationExecutionRole | AWS::IAM::Role |
ContainerAssetsRepository | AWS::ECR::Repository |
DeploymentActionRole | AWS::IAM::Role |
FilePublishingRole | AWS::IAM::Role |
FilePublishingRoleDefaultPolicy | AWS::IAM::Policy |
ImagePublishingRole | AWS::IAM::Role |
ImagePublishingRoleDefaultPolicy | AWS::IAM::Policy |
LookupRole | AWS::IAM::Role |
StagingBucket | AWS::S3::Bucket |
StagingBucketPolicy | AWS::S3::BucketPolicy |
import文の変更
V1で推奨通り、以下のように cdk
で core
をimportしている場合を考えます。
from aws_cdk import ( core as cdk, aws_iam as iam, aws_ec2 as ec2, )
V2ではconstructsが別モジュールに切り出されています。
$ pip show constructs Name: constructs Version: 10.0.9 Summary: A programming model for software-defined state Home-page: https://github.com/aws/constructs Author: Amazon Web Services Author-email: None License: Apache-2.0 Location: /home/xxxx Requires: jsii, publication Required-by: aws-cdk-lib
つまりaws_cdk.core
は aws_cdk
と constructs
に分割されたことになるので、別々にimportが必要です。
これに伴い少しコード側も変更が必要です。
import constructs import aws_cdk as cdk from aws_cdk import ( aws_iam as iam, aws_ec2 as ec2, )
上で書いたように -alpha
のモジュールを使う場合は aws_batch_alpha
など _alpha
付きのモジュールからインポートが必要です。
import constructs import aws_cdk as cdk from aws_cdk import ( aws_iam as iam, aws_ec2 as ec2, aws_batch_alpha as batch, )