概要
AWS CDK v2.200.0では、IAMでネイティブCloudFormationリソースを使用したOIDCプロバイダーコンストラクトの追加、EC2 PrefixListの接続ピアとしての使用サポート、Lambda関数タグのログループへの伝播、SNS Amazon Data Firehoseサブスクリプション、Step FunctionsのRedriveExecution権限付与API、S3レプリケーション権限の付与メソッドなど、多数の新機能が追加されました。
新機能
IAM: OidcProviderNativeコンストラクトの追加 (PR #28634)
ネイティブCloudFormationリソース(AWS::IAM::OIDCProvider)を使用した新しいOidcProviderNativeコンストラクトが追加されました。既存のOpenIdConnectProviderはLambdaベースのカスタムリソースを使用していますが、新しいOidcProviderNativeはCloudFormationネイティブリソースを使用するため、より安定したデプロイが可能です。
既存のOpenIdConnectProviderは非推奨となり、今後はOidcProviderNativeの使用が推奨されます。
import * as iam from 'aws-cdk-lib/aws-iam';
// OIDCプロバイダーの作成
const provider = new iam.OidcProviderNative(this, 'Provider', {
// OIDCプロバイダーの名前(オプション)
oidcProviderName: 'MyProvider',
// OIDCプロバイダーのURL(必須)
url: 'https://oidc.eks.us-east-1.amazonaws.com/id/EXAMPLE',
// クライアントID(オプション)
clientIds: ['foo', 'bar'],
// サーバー証明書のサムプリント(必須)
// CloudFormationネイティブリソースでは少なくとも1つのサムプリントが必要
thumbprints: [
'aa00aa1122aa00aa1122aa00aa1122aa00aa1122',
'aa00aa1122aa00aa1122aa00aa1122aa00aa1111',
],
});
// OIDCプロバイダーのARNを取得
const providerArn = provider.oidcProviderArn;
// OIDCプロバイダーのIssuerを取得
const providerIssuer = provider.oidcProviderIssuer;
// 最小構成のOIDCプロバイダー
const minimal = new iam.OidcProviderNative(this, 'Minimal', {
url: 'https://oidc.eks.us-east-1.amazonaws.com/id/EXAMPLE2',
// 最低1つのサムプリントが必須
thumbprints: ['aa00aa1122aa00aa1122aa00aa1122aa00aa1122'],
});
// OIDCプロバイダーを使用したロールの作成
const role = new iam.Role(this, 'Role', {
assumedBy: new iam.FederatedPrincipal(
provider.oidcProviderArn,
{
StringEquals: {
[`${provider.oidcProviderIssuer}:aud`]: 'foo',
},
},
'sts:AssumeRoleWithWebIdentity'
),
});
EC2: PrefixListをIPeerとして使用可能に (PR #33617)
EC2のPrefixListがIPeerインターフェースを実装し、セキュリティグループの接続ピアとして直接使用できるようになりました。これにより、より簡潔なコードでセキュリティグループルールを定義できます。
import * as ec2 from 'aws-cdk-lib/aws-ec2';
const vpc = new ec2.Vpc(this, 'Vpc');
// Prefix Listの作成
const prefixList = new ec2.PrefixList(this, 'PrefixList', {
maxEntries: 10,
entries: [
{ cidr: '10.0.0.0/16', description: 'VPC CIDR' },
{ cidr: '172.16.0.0/12', description: 'Private Network' },
],
});
const instance = new ec2.Instance(this, 'Instance', {
vpc,
instanceType: ec2.InstanceType.of(
ec2.InstanceClass.T3,
ec2.InstanceSize.MICRO
),
machineImage: ec2.MachineImage.latestAmazonLinux2023(),
});
// 以前の書き方: 冗長なprefixListの繰り返し
// instance.connections.allowFrom(
// ec2.Peer.prefixList(prefixList.prefixListId),
// ec2.Port.tcp(443)
// );
// 新しい書き方: PrefixListを直接使用
instance.connections.allowFrom(
prefixList, // IPeerとして直接使用可能
ec2.Port.tcp(443),
'Allow HTTPS from Prefix List'
);
// セキュリティグループでも使用可能
const securityGroup = new ec2.SecurityGroup(this, 'SecurityGroup', { vpc });
securityGroup.addIngressRule(
prefixList, // IPeerとして直接使用
ec2.Port.tcp(22),
'Allow SSH from Prefix List'
);
Lambda: 関数タグのログループへの伝播 (PR #34556)
Lambda関数に設定されたタグをCloudWatch Logsのログループに伝播できるようになりました。これにより、タグベースのコスト配分やリソース管理がより容易になります。
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as cdk from 'aws-cdk-lib';
const myFunction = new lambda.Function(this, 'MyFunction', {
runtime: lambda.Runtime.NODEJS_20_X,
handler: 'index.handler',
code: lambda.Code.fromAsset('lambda'),
// 関数にタグを設定
tags: {
Environment: 'Production',
Application: 'MyApp',
CostCenter: 'Engineering',
},
// タグをログループに伝播(デフォルト: false)
logGroupTagPropagation: true,
});
// または、既存の関数にタグを追加
cdk.Tags.of(myFunction).add('Team', 'Backend');
// この場合、ログループにも以下のタグが自動的に設定されます:
// - Environment: Production
// - Application: MyApp
// - CostCenter: Engineering
// - Team: Backend
S3: grantReplicationPermissionメソッドの追加 (PR #34138)
S3バケットのレプリケーション用IAMロールに必要な権限を付与するgrantReplicationPermissionメソッドが追加されました。これにより、カスタムレプリケーションロールを使用する場合の権限設定が簡素化されます。
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as iam from 'aws-cdk-lib/aws-iam';
const sourceBucket = new s3.Bucket(this, 'SourceBucket', {
versioned: true,
});
const destinationBucket = new s3.Bucket(this, 'DestinationBucket', {
versioned: true,
});
// カスタムレプリケーションロールの作成
const replicationRole = new iam.Role(this, 'ReplicationRole', {
assumedBy: new iam.ServicePrincipal('s3.amazonaws.com'),
});
// レプリケーション権限の付与(新機能)
sourceBucket.grantReplicationPermission(replicationRole, destinationBucket);
// レプリケーション設定
sourceBucket.addReplicationConfiguration({
role: replicationRole,
rules: [
{
id: 'ReplicateAll',
status: s3.ReplicationRuleStatus.ENABLED,
destination: {
bucket: destinationBucket,
},
},
],
});
// 以前は、以下のような手動での権限設定が必要でした:
// replicationRole.addToPolicy(new iam.PolicyStatement({
// actions: ['s3:GetReplicationConfiguration', 's3:ListBucket'],
// resources: [sourceBucket.bucketArn],
// }));
// replicationRole.addToPolicy(new iam.PolicyStatement({
// actions: ['s3:GetObjectVersionForReplication', 's3:GetObjectVersionAcl'],
// resources: [`${sourceBucket.bucketArn}/*`],
// }));
// replicationRole.addToPolicy(new iam.PolicyStatement({
// actions: ['s3:ReplicateObject', 's3:ReplicateDelete'],
// resources: [`${destinationBucket.bucketArn}/*`],
// }));
SNS: Amazon Data Firehoseサブスクリプションのサポート (PR #33811)
SNSトピックのサブスクライバーとしてAmazon Data FirehoseデリバリーストリームをサポートするFirehoseSubscriptionが追加されました。これにより、SNSメッセージをS3、Redshift、OpenSearchなどに直接配信できます。
import * as sns from 'aws-cdk-lib/aws-sns';
import * as subs from 'aws-cdk-lib/aws-sns-subscriptions';
import * as firehose from 'aws-cdk-lib/aws-kinesisfirehose';
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as sqs from 'aws-cdk-lib/aws-sqs';
import * as cdk from 'aws-cdk-lib';
const topic = new sns.Topic(this, 'Topic');
// Firehoseの配信先バケット
const bucket = new s3.Bucket(this, 'Bucket', {
removalPolicy: cdk.RemovalPolicy.DESTROY,
autoDeleteObjects: true,
});
// Firehoseデリバリーストリームの作成
const deliveryStream = new firehose.DeliveryStream(this, 'DeliveryStream', {
destination: new firehose.S3Bucket(bucket, {
// バッファリング間隔(秒)
bufferingInterval: cdk.Duration.seconds(60),
// バッファリングサイズ(MB)
bufferingSize: cdk.Size.mebibytes(5),
loggingConfig: { logging: false },
}),
});
// デッドレターキュー(オプション)
const deadLetterQueue = new sqs.Queue(this, 'DeadLetterQueue', {
retentionPeriod: cdk.Duration.days(14),
});
// FirehoseサブスクリプションをSNSトピックに追加
topic.addSubscription(new subs.FirehoseSubscription(deliveryStream, {
// SNSメタデータを除去してメッセージのみを配信
rawMessageDelivery: true,
// 配信失敗時のデッドレターキュー
deadLetterQueue,
// カスタムロールの指定(オプション)
// role: customRole,
}));
// SNSメッセージは自動的にFirehose経由でS3に配信される
Step Functions: RedriveExecution権限付与APIの追加 (PR #34554)
Step Functionsステートマシンの実行を再実行するための権限を付与するgrantRedriveExecutionメソッドが追加されました。これは、分散マップやエラーハンドリングで特に有用です。
import * as sfn from 'aws-cdk-lib/aws-stepfunctions';
import * as tasks from 'aws-cdk-lib/aws-stepfunctions-tasks';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as iam from 'aws-cdk-lib/aws-iam';
// Lambda関数の作成
const processFunction = new lambda.Function(this, 'ProcessFunction', {
runtime: lambda.Runtime.NODEJS_20_X,
handler: 'index.handler',
code: lambda.Code.fromAsset('lambda'),
});
// ステートマシンの定義
const definition = new tasks.LambdaInvoke(this, 'ProcessTask', {
lambdaFunction: processFunction,
});
const stateMachine = new sfn.StateMachine(this, 'StateMachine', {
definitionBody: sfn.DefinitionBody.fromChainable(definition),
});
// 再実行を行うロールまたはユーザー
const redriveRole = new iam.Role(this, 'RedriveRole', {
assumedBy: new iam.AccountPrincipal(this.account),
});
// RedriveExecution権限の付与(新機能)
stateMachine.grantRedriveExecution(redriveRole);
// これにより、以下のIAM権限が付与されます:
// - states:RedriveExecution: 失敗した実行を再実行
// - states:DescribeExecution: 実行状態の確認
// - states:GetExecutionHistory: 実行履歴の取得
// 分散マップでの使用例
const map = new sfn.Map(this, 'DistributedMap', {
maxConcurrency: 10,
itemsPath: sfn.JsonPath.stringAt('$.items'),
});
map.itemProcessor(definition);
const mapStateMachine = new sfn.StateMachine(this, 'MapStateMachine', {
definitionBody: sfn.DefinitionBody.fromChainable(map),
});
// マップ実行の再実行権限を付与
mapStateMachine.grantRedriveExecution(redriveRole);
ValidationErrorの導入によるエラーハンドリングの改善
複数のモジュールで、型付けされていないエラーの代わりにValidationErrorをスローするように改善されました。これにより、エラーハンドリングがより予測可能になり、TypeScriptの型システムを活用できます。
対象モジュール:
custom-resources(PR #33392)iam(PR #34579)lambda(PR #34577)region-info(PR #33384)secretsmanager(PR #34580)servicecatalog(PR #34581)
import { ValidationError } from 'aws-cdk-lib';
import * as lambda from 'aws-cdk-lib/aws-lambda';
try {
const fn = new lambda.Function(this, 'Function', {
runtime: lambda.Runtime.NODEJS_20_X,
handler: 'index.handler',
code: lambda.Code.fromAsset('lambda'),
timeout: cdk.Duration.seconds(-1), // 無効な値
});
} catch (error) {
if (error instanceof ValidationError) {
// ValidationErrorとして適切に処理
console.error('Validation failed:', error.message);
}
}
Alphaモジュールの新機能
MSK: Kafka 4.0のサポート (PR #34501)
Amazon MSKでApache Kafka 4.0がサポートされました。Kafka 4.0はKRaft(Apache Kafka Raft)のみをサポートし、ZooKeeperは使用しません。
import * as msk from '@aws-cdk/aws-msk-alpha';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
const vpc = new ec2.Vpc(this, 'Vpc');
// Kafka 4.0クラスターの作成
const cluster = new msk.Cluster(this, 'Cluster', {
clusterName: 'MyKafka40Cluster',
// Kafka 4.0を指定(KRaftモード)
kafkaVersion: msk.KafkaVersion.V4_0_0,
vpc,
// Kafka 4.0ではZooKeeperは使用されない(KRaftのみ)
});
// 既存バージョンも引き続き利用可能
const kafka37Cluster = new msk.Cluster(this, 'Kafka37Cluster', {
clusterName: 'MyKafka37Cluster',
kafkaVersion: msk.KafkaVersion.V3_7_0,
vpc,
});
バグ修正
EC2: ブロックデバイスのスループットプロパティのバリデーション (PR #34571)
EC2インスタンスのブロックデバイスで、スループットプロパティのバリデーションが追加されました。これにより、無効な設定値による実行時エラーを防ぐことができます。
ELBv2: minimumCapacityUnitの最大値の修正 (PR #34586)
Application Load BalancerのminimumCapacityUnitプロパティの最大値が正しく設定されるように修正されました。
CloudFormation L1リソースの更新
L1 CloudFormationリソース定義が最新のCloudFormation仕様に更新されました (PR #34594)。
まとめ
AWS CDK v2.200.0は、IAMのOIDCプロバイダーのネイティブCloudFormationサポート、EC2 PrefixListの使いやすさの向上、Lambda関数タグのログループへの伝播、SNS Firehoseサブスクリプション、Step Functions RedriveExecution権限付与など、多数の実用的な新機能を提供しています。特にValidationErrorの導入により、エラーハンドリングがより型安全になり、開発者体験が向上しています。Alphaモジュールでは、MSKでのKafka 4.0サポートが追加され、最新のKafka機能を活用できるようになりました。