概要
AWS CDK v2.214.1 は、L1(CloudFormation)とL2(高レベル)コンストラクト間の相互運用性を大幅に向上させる、新しいReferenceインターフェースパターンを導入した実験的なリリースです。このリリースでは、IBucketRef、IInstanceRef、IKeyRef などの新しいインターフェースが追加され、L1リソースを直接L2 APIで使用できるようになります。
新機能
Reference インターフェース(IXxxRef)の導入
背景
従来のCDKでは、L2コンストラクト(IBucket、IInstance など)が要求される箇所で、L1コンストラクト(CfnBucket、CfnInstance など)を直接使用することができませんでした。これにより、L1リソースを使用する場合でも、L2でラップする必要があり、開発の柔軟性が制限されていました。
新しいアーキテクチャ
このリリースでは、L1レベルで実装可能な最小限のインターフェース IXxxRef を導入しました:
- 命名規則:
IBucketRef、IInstanceRef、IKeyRefなど - 実装: L1の
CfnBucketがIBucketRefを実装 - 継承: L2の
IBucketはIBucketRefを継承 - 利点: L2の便利メソッドを含まず、L1で簡単に実装可能
対応サービス(v2.214.1時点)
この機能は以下のサービスで導入されています:
- Amazon S3 (
IBucketRef) - AWS IAM (
IRoleRef,IUserRef,IGroupRef) - Amazon EC2 (
IInstanceRef,IVpcRef,ISecurityGroupRef) - AWS KMS (
IKeyRef) - Amazon CloudFront (
IDistributionRef,IFunctionRef)
使用例
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import { Construct } from 'constructs';
import { Stack, StackProps } from 'aws-cdk-lib';
export class MyStack extends Stack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);
// L1 リソースを直接作成
const cfnBucket = new s3.CfnBucket(this, 'MyCfnBucket', {
bucketName: 'my-raw-cfn-bucket',
versioningConfiguration: {
status: 'Enabled',
},
});
// Lambda 関数を作成
const fn = new lambda.Function(this, 'MyFunction', {
runtime: lambda.Runtime.NODEJS_20_X,
handler: 'index.handler',
code: lambda.Code.fromInline(`
exports.handler = async (event) => {
console.log('Bucket:', process.env.BUCKET_NAME);
};
`),
environment: {
// ✨ 新機能: IBucketRef を要求する API で L1 の CfnBucket を直接使用可能
// 従来は L2 の Bucket でラップする必要があった
BUCKET_NAME: cfnBucket.bucketName,
},
});
// 以前の方法(L2でラップ)は不要に
// const l2Bucket = s3.Bucket.fromBucketAttributes(this, 'WrappedBucket', {
// bucketName: cfnBucket.bucketName,
// bucketArn: cfnBucket.attrArn,
// });
}
}
より実践的な例:EC2インスタンスとセキュリティグループ
import * as ec2 from 'aws-cdk-lib/aws-ec2';
import { Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';
export class MyStack extends Stack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);
// L1 でセキュリティグループを作成
const cfnSecurityGroup = new ec2.CfnSecurityGroup(this, 'MySG', {
groupDescription: 'Security group created at L1',
vpcId: 'vpc-12345678',
securityGroupIngress: [
{
ipProtocol: 'tcp',
fromPort: 80,
toPort: 80,
cidrIp: '0.0.0.0/0',
},
],
});
// L2 VPC
const vpc = ec2.Vpc.fromLookup(this, 'MyVpc', {
vpcId: 'vpc-12345678',
});
// L2 インスタンスで L1 セキュリティグループを直接使用
const instance = new ec2.Instance(this, 'MyInstance', {
vpc,
instanceType: ec2.InstanceType.of(
ec2.InstanceClass.T3,
ec2.InstanceSize.MICRO
),
machineImage: ec2.MachineImage.latestAmazonLinux2(),
// ✨ 新機能: ISecurityGroupRef を要求するため、L1 の CfnSecurityGroup を直接渡せる
securityGroup: cfnSecurityGroup as any, // 実験的機能のため型アサーションが必要
});
}
}
重要な注意事項
この機能は**実験的(Experimental)**であり、以下の点に注意してください:
- API が変更される可能性: 将来のリリースで
BucketReference構造体に{ account; region }が追加される可能性があります - ロールバックの可能性: この変更が完全にロールバックされ、導入されたインターフェースが削除される可能性があります
- 自分のコードでの使用は控える: 現時点では
IBucketRefなどを直接参照するコードを書かないでください - 型アサーションが必要な場合: 一部のAPIでは型の互換性のため
as anyが必要な場合があります
独自の IBucket 実装を持つ場合
もし独自のクラスで IBucket を実装している場合、新しく追加された bucketRef プロパティを実装する必要があります:
import * as s3 from 'aws-cdk-lib/aws-s3';
export class MyBucketClass implements s3.IBucket {
private readonly wrappedBucket: s3.IBucket;
constructor(wrappedBucket: s3.IBucket) {
this.wrappedBucket = wrappedBucket;
}
// ✨ 新規要件: bucketRef プロパティを実装
// 内部的にラップしている Bucket または CfnBucket から値をコピー
public get bucketRef(): s3.BucketReference {
return this.wrappedBucket.bucketRef;
}
// 他の IBucket メソッドの実装...
public get bucketArn(): string {
return this.wrappedBucket.bucketArn;
}
public get bucketName(): string {
return this.wrappedBucket.bucketName;
}
// ... その他のプロパティとメソッド
}
関連リンク
Alphaモジュール
このリリースには、Alphaモジュール(v2.214.1-alpha.0)に関する機能追加や変更はありません。
まとめ
AWS CDK v2.214.1 は、L1とL2コンストラクト間の相互運用性を向上させる画期的な実験的機能を導入したリリースです。新しい Reference インターフェース(IXxxRef)パターンにより、開発者はL1とL2を自由に選択して使用できるようになり、CDKの柔軟性が大幅に向上します。
この機能はまだ実験的段階であり、API が変更される可能性があるため、プロダクション環境での採用は慎重に検討してください。ただし、将来的にはCDKの表現力を向上させ、完全なL2を実装する前にL1に段階的な機能拡張を追加できるようにすることを目指しています。
フィードバックは GitHub issue tracker または CDK Slack で受け付けています。