AWS CDK v2.250.0 がリリースされました。このバージョンでは、S3 Files(S3 バケットをファイルシステムとしてマウントする新機能)と Lambda を統合する L1 コンストラクト、MediaPackageV2 への機能追加、EKS v2 の KubectlProvider におけるセキュリティグループ指定のバグ修正などが含まれています。また、EMR の L1 リソース定義において破壊的変更が発生しています。
新機能
S3 Files: Lambda L1 統合 (#37547)
S3 Files は、S3 と EFS を組み合わせて S3 バケットを高性能なファイルシステムとしてアクセスできるようにする新しい機能です。本リリースでは、L1 コンストラクト(aws-s3files モジュール)が追加され、さらに Lambda Function から S3 Files のファイルシステムをマウントするための統合メソッドが lambda.FileSystem に追加されました。
追加された API:
FileSystem.fromS3FilesAccessPoint(ap: IAccessPointRef, mountPath: string): FileSystem
このメソッドは、S3 Files のアクセスポイントとマウントパスを指定するだけで、関連するファイルシステム・マウントターゲット・セキュリティグループ・IAM ポリシーをコンストラクトツリーから自動的に解決してくれます。内部的には新しい AccessPointReflection クラスがコンストラクトツリーを走査し、以下を自動的に設定します。
- アクセスポイントに紐づく
CfnFileSystem - 関連するすべての
CfnMountTargetリソース(DependsOnとして追加) - マウントターゲットのセキュリティグループ(
Connectionsに配線)
IAM 権限(自動付与):
- アクセスポイント ARN への
s3files:ClientMount - ファイルシステム ARN への
s3files:ClientMount+s3files:ClientWrite
使用例:
import * as cdk from 'aws-cdk-lib';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as s3files from 'aws-cdk-lib/aws-s3files';
import * as iam from 'aws-cdk-lib/aws-iam';
const vpc = new ec2.Vpc(this, 'VPC');
const bucket = new s3.Bucket(this, 'MyBucket');
const sg = new ec2.SecurityGroup(this, 'SG', { vpc });
// S3 Files のために S3 バケットにアクセスできる IAM ロール
const s3filesRole = new iam.Role(this, 'S3FilesRole', {
assumedBy: new iam.ServicePrincipal('s3files.amazonaws.com'),
});
// L1: S3 Files ファイルシステムを定義
const fileSystem = new s3files.CfnFileSystem(this, 'FileSystem', {
bucket: bucket.bucketArn, // バックエンドとなる S3 バケットの ARN
roleArn: s3filesRole.roleArn, // S3 Files がバケットにアクセスするためのロール ARN
});
// 各プライベートサブネットにマウントターゲットを作成
vpc.privateSubnets.forEach((subnet, i) =>
new s3files.CfnMountTarget(this, `MountTarget${i}`, {
fileSystemId: fileSystem.attrFileSystemId, // 上記で作成したファイルシステム ID
subnetId: subnet.subnetId, // マウント先のサブネット
securityGroups: [sg.securityGroupId], // マウントターゲットに紐づけるセキュリティグループ
}),
);
// アクセスポイントを作成(Lambda からマウントする単位)
const accessPoint = new s3files.CfnAccessPoint(this, 'AccessPoint', {
fileSystemId: fileSystem.ref,
posixUser: { uid: '1000', gid: '1000' }, // POSIX ユーザー情報
rootDirectory: {
path: '/lambda', // アクセスポイントから見たルートパス
creationInfo: {
ownerUid: '1000',
ownerGid: '1000',
permissions: '755', // ディレクトリの POSIX パーミッション
},
},
});
// Lambda Function に S3 Files をマウント
new lambda.Function(this, 'MyFunction', {
runtime: lambda.Runtime.NODEJS_20_X,
handler: 'index.handler',
code: lambda.Code.fromAsset('lambda'),
vpc,
// 新機能: S3 Files アクセスポイントを指定するだけで、関連リソースが自動解決される
filesystem: lambda.FileSystem.fromS3FilesAccessPoint(accessPoint, '/mnt/s3files'),
});
fromS3FilesAccessPoint を使うことで、DependsOn の手動設定やセキュリティグループの ingress 設定を明示的に書かなくて済むのが大きな利点です。
MediaPackageV2: リージョン属性と ARN インポート、命名バリデーション追加 (#37526)
MediaPackageV2 のリソースに以下の機能が追加されました。
region属性の追加: リソースにリージョン属性が追加され、クロスリージョン参照が可能になりました(インポートされたチャンネルで特に有用)。from***Arn()インポート関数の追加: ARN からのリソースインポートが可能になりました。- マニフェスト名のユニーク性バリデーション: ランタイムでマニフェスト名の重複を検出するバリデーションが追加されました。
これらは主に MediaLive からの出力先として MediaPackageV2 チャンネルをクロスリージョンで参照するユースケースで役立ちます(MediaPackageOutputDestinationSettings の MediaPackageRegionName 参照)。
import * as mediapackagev2 from 'aws-cdk-lib/aws-mediapackagev2';
// ARN からチャンネルグループをインポート
const channelGroup = mediapackagev2.CfnChannelGroup.fromCfnChannelGroupArn(
this,
'ImportedChannelGroup',
'arn:aws:mediapackagev2:us-west-2:123456789012:channelGroup/my-group',
);
// 新属性: リージョン情報にアクセスできる(クロスリージョン参照で有用)
const region = channelGroup.attrRegion;
L1 CloudFormation リソース定義の更新 (#37582)
@aws-cdk/aws-service-spec の最新変更を反映し、多数のサービスの L1 リソース定義が更新されました。主な追加・更新:
- AppStream:
AWS::AppStream::FleetにDisableIMDSV1プロパティが追加 - ARCRegionSwitch:
AWS::ARCRegionSwitch::Planの ARN テンプレートが更新 - BcmPricingCalculator: 新サービスの追加(
BillScenarioなど) - その他多数のサービスで属性・プロパティの更新
バグ修正
EKS v2: KubectlProviderOptions の securityGroup(s) が尊重されない問題 (#37247)
KubectlProviderOptions に securityGroup を指定しても、その値が無視され、常にクラスタのセキュリティグループが kubectl ハンドラー(Lambda)に適用されてしまう問題が修正されました(#36653 の解決)。
原因:
cluster.tsがsecurityGroupをKubectlProviderコンストラクタに渡していなかった。kubectl-provider.tsがprops.securityGroupの有無に関わらず、常にprops.cluster.clusterSecurityGroupにフォールバックしていた。
修正内容:
- セキュリティグループの解決優先度が以下のように整理されました:
securityGroups(新規追加: 配列プロパティ) — 最優先securityGroup(既存: 単一プロパティ) — 後方互換のフォールバックclusterSecurityGroup— デフォルト(既存の振る舞いを維持)
- 新規プロパティ
securityGroups?: ec2.ISecurityGroup[]がKubectlProviderOptionsに追加され、複数のセキュリティグループを指定できるようになりました(lambda.Functionと一貫した API)。 securityGroupとsecurityGroupsを同時に指定した場合、Annotations.of(this).addWarningV2により警告が発行されます。
修正後の正しい使い方:
import * as eks from '@aws-cdk/aws-eks-v2-alpha';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
const vpc = new ec2.Vpc(this, 'VPC');
const sg1 = new ec2.SecurityGroup(this, 'SG1', { vpc });
const sg2 = new ec2.SecurityGroup(this, 'SG2', { vpc });
// パターン1: 複数のセキュリティグループを指定(推奨)
const cluster1 = new eks.Cluster(this, 'Cluster1', {
version: eks.KubernetesVersion.V1_31,
kubectlProviderOptions: {
// 新プロパティ: 複数のセキュリティグループを配列で指定できる
securityGroups: [sg1, sg2],
},
});
// パターン2: 単一のセキュリティグループを指定(後方互換)
const cluster2 = new eks.Cluster(this, 'Cluster2', {
version: eks.KubernetesVersion.V1_31,
kubectlProviderOptions: {
// 既存プロパティ: 単一のセキュリティグループ
securityGroup: sg1,
},
});
// パターン3: どちらも指定しない場合はクラスタのセキュリティグループがデフォルトで適用
const cluster3 = new eks.Cluster(this, 'Cluster3', {
version: eks.KubernetesVersion.V1_31,
// kubectlProviderOptions を指定しない、または securityGroup(s) を指定しない
});
影響範囲: 従来バージョンで securityGroup を指定していたユーザーは、これまで意図せずクラスタのセキュリティグループが kubectl ハンドラーに適用されていました。本リリース適用後は、指定したセキュリティグループが正しく反映されます。セキュリティグループの構成によっては、kubectl ハンドラーの挙動(特に VPC 内のリソースへのアクセス)が変わる可能性があるため、動作確認を推奨します。
Lambda NodeJS: プロジェクトルート外のエントリパスで Docker バンドル時のエラーが不明瞭 (#37572)
aws-lambda-nodejs で、ハンドラーのエントリパスがプロジェクトルート外にある場合、Docker コンテナ内でのバンドル時にエントリポイントがマウント済みパスの外にあるため失敗していましたが、エラーメッセージが不明瞭でした。
本修正により、この構成ミスを事前に検出し、明確なエラーメッセージを表示するバリデーションが追加されました。ローカルバンドル(bundling.forceDockerBundling: false かつローカルに esbuild がインストールされている場合)では引き続きプロジェクトルート外のエントリも扱えますが、Docker バンドルを使う場合はエントリがプロジェクトルート以下にある必要があります。
修正後の正しい構成:
import * as lambda from 'aws-cdk-lib/aws-lambda-nodejs';
// 正しい構成: entry はプロジェクトルート(cdk.json のあるディレクトリ)以下にある
new lambda.NodejsFunction(this, 'MyFunction', {
entry: 'src/handlers/index.ts', // プロジェクトルート以下のパス
handler: 'handler',
});
// Docker バンドルを強制する場合も同様にプロジェクトルート以下のパスを指定
new lambda.NodejsFunction(this, 'MyDockerFunction', {
entry: 'src/handlers/index.ts',
handler: 'handler',
bundling: {
forceDockerBundling: true, // Docker バンドルを強制
},
});
プロジェクトルート外のファイルを Lambda にバンドルしたい場合は、まずプロジェクト内にコピーするか、forceDockerBundling: false でローカルバンドルを利用してください。
破壊的変更
EMR: AWS::EMR::Cluster の一部プロパティ・型の削除
L1 リソースは CloudFormation の公開リソーススキーマから自動生成されているため、まれに過去の型と非互換の変更が入ることがあります。本リリースでは、EMR クラスタで以下が削除されました。
AWS::EMR::Cluster:MonitoringConfigurationプロパティを削除AWS::EMR::Cluster:CloudWatchLogConfiguration型を削除AWS::EMR::Cluster:EMRConfiguration型を削除AWS::EMR::Cluster:MonitoringConfiguration型を削除
移行方法: CfnCluster でこれらのプロパティ・型を利用していたコードはコンパイルエラーとなります。現時点では CloudFormation 側で該当プロパティがサポートされていないため、該当箇所を削除する必要があります。モニタリング要件が残る場合は、別途 CloudWatch Logs などを通じた構成に切り替えてください。
Alpha モジュール (2.250.0-alpha.0)
本リリースのリリースノートには Alpha モジュール固有の変更点は列挙されていません(セクションヘッダのみ)。Alpha モジュールは stable と同じバージョン番号で併せてリリースされるため、上記の EKS v2 修正(@aws-cdk/aws-eks-v2-alpha)はアルファモジュールにも反映されます。その他のアルファモジュールは、各モジュール固有の変更がない場合でも依存関係の更新が行われています。
まとめ
AWS CDK v2.250.0 では、S3 Files と Lambda の統合 L1 コンストラクトという新機能が追加され、S3 バケットを高性能なファイルシステムとして Lambda から直接マウントできるようになりました。lambda.FileSystem.fromS3FilesAccessPoint を使うことで、関連リソース(マウントターゲット・セキュリティグループ・IAM 権限)を明示的に管理する必要なく簡潔に記述できます。
また、EKS v2 の KubectlProviderOptions で securityGroup が無視される長年の問題が修正され、新たに securityGroups(配列)プロパティも利用可能になりました。従来 securityGroup を指定していた場合、本リリース以降は指定値が正しく適用されるようになるため、動作の差分に注意してアップグレードしてください。
EMR の L1 リソースでは一部のプロパティ・型が削除されているため、該当機能を利用していた場合はコード修正が必要です。