AWS CDK PythonのバージョンをV1からV2にアップデートした

AWS CDKのV2がGAとなりました。

aws.amazon.com

開発中のプロジェクトのバージョンを更新するための変更部分を書いておきます。

参考資料

こちらの内容を主に参考にして、壁にぶつかったら調べる形で更新しました。

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で推奨通り、以下のように cdkcore を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.coreaws_cdkconstructs に分割されたことになるので、別々に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,
)