概要
AWS CDK v2.234.0では、ECSのManagedInstancesCapacityProviderでEC2インスタンスプロファイルが自動作成されるようになりました。また、RDSオプショングループにnameプロパティが追加され、Step FunctionsのEcsRunTaskタスクでFargateおよびEC2起動タイプのキャパシティプロバイダー戦略が設定可能になりました。Syntheticsでは新しいPuppeteerランタイム12.0/13.0がサポートされています。
新機能
ECS: ManagedInstancesCapacityProviderでEC2インスタンスプロファイルを自動作成 (#35796)
ManagedInstancesCapacityProviderコンストラクトでec2InstanceProfileプロパティがオプションになりました。指定しない場合、必要な権限を持つインスタンスプロファイルが自動的に作成されます。
使用例
import * as ecs from 'aws-cdk-lib/aws-ecs';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
const vpc = new ec2.Vpc(this, 'Vpc');
const cluster = new ecs.Cluster(this, 'Cluster', {
vpc,
});
// EC2インスタンスプロファイルを自動作成(オプショナルに)
const capacityProvider = new ecs.ManagedInstancesCapacityProvider(
this,
'ManagedInstances',
{
cluster,
// ec2InstanceProfile を省略すると自動作成される
// 自動作成されるロールには以下の権限が付与される:
// - ECSクラスターへの登録
// - ECRからのイメージプル
// - CloudWatch Logsへのログ送信
// - ECSエージェントエンドポイントへのアクセス
}
);
// カスタムインスタンスプロファイルを使用する場合
const instanceRole = new iam.Role(this, 'InstanceRole', {
assumedBy: new iam.ServicePrincipal('ec2.amazonaws.com'),
// 注意: ロール名は "ecsInstanceRole" プレフィックスが必要
roleName: 'ecsInstanceRoleCustom',
managedPolicies: [
iam.ManagedPolicy.fromAwsManagedPolicyName(
'service-role/AmazonEC2ContainerServiceforEC2Role'
),
],
});
const instanceProfile = new iam.InstanceProfile(this, 'InstanceProfile', {
role: instanceRole,
});
const capacityProviderWithCustomProfile = new ecs.ManagedInstancesCapacityProvider(
this,
'ManagedInstancesCustom',
{
cluster,
ec2InstanceProfile: instanceProfile, // カスタムプロファイルを指定
}
);
自動作成されるロールの権限
自動作成されるインスタンスプロファイルのロールには、AmazonECSInstanceRolePolicyForManagedInstancesマネージドポリシーのスコープダウン版が付与されます:
- ECSクラスターへのコンテナインスタンス登録
- Amazon ECRからのコンテナイメージプル
- CloudWatch Logsへのログ送信
- ECSエージェントエンドポイントへのアクセス
注意: AWS側の制限により、自動作成されるロール名はecsInstanceRoleプレフィックスで始まる必要があります。
RDS: オプショングループにname属性を追加 (#36319)
RDSのOptionGroupコンストラクトにoptionGroupNameプロパティが追加されました。これにより、オプショングループに明示的な名前を設定できます。
使用例
import * as rds from 'aws-cdk-lib/aws-rds';
const optionGroup = new rds.OptionGroup(this, 'OptionGroup', {
engine: rds.DatabaseInstanceEngine.oracleSe2({
version: rds.OracleEngineVersion.VER_19_0_0_0_2024_04_R1,
}),
optionGroupName: 'my-oracle-option-group', // オプショングループ名を明示的に指定
configurations: [
{
name: 'SQLT',
settings: {
LICENSE_PACK: 'N',
},
},
],
});
const instance = new rds.DatabaseInstance(this, 'Instance', {
engine: rds.DatabaseInstanceEngine.oracleSe2({
version: rds.OracleEngineVersion.VER_19_0_0_0_2024_04_R1,
}),
vpc,
optionGroup, // カスタム名を持つオプショングループを使用
});
Step Functions Tasks: EcsRunTaskでキャパシティプロバイダー戦略をサポート (#35465)
Step FunctionsのEcsRunTaskタスクで、FargateおよびEC2起動タイプでキャパシティプロバイダー戦略を設定できるようになりました。これまではlaunchTypeのみ指定可能でしたが、クラスターオートスケーリングを使用する場合に必要なcapacityProviderStrategyが設定可能になりました。
使用例
import * as sfn from 'aws-cdk-lib/aws-stepfunctions';
import * as tasks from 'aws-cdk-lib/aws-stepfunctions-tasks';
import * as ecs from 'aws-cdk-lib/aws-ecs';
const cluster = new ecs.Cluster(this, 'Cluster', { vpc });
const taskDefinition = new ecs.FargateTaskDefinition(this, 'TaskDef');
taskDefinition.addContainer('Container', {
image: ecs.ContainerImage.fromRegistry('amazon/amazon-ecs-sample'),
memoryLimitMiB: 512,
});
// カスタムキャパシティプロバイダー戦略を使用(Fargate)
const runTaskWithCapacityProvider = new tasks.EcsRunTask(
this,
'RunWithCapacityProvider',
{
cluster,
taskDefinition,
launchTarget: new tasks.EcsFargateLaunchTarget({
// カスタムキャパシティプロバイダー戦略を指定
capacityProviderOptions: tasks.CapacityProviderOptions.custom({
strategies: [
{
capacityProvider: 'FARGATE_SPOT', // Fargate Spotを優先
weight: 2, // 重み: 2
base: 1, // 最小1タスクはこのプロバイダーで実行
},
{
capacityProvider: 'FARGATE', // 通常のFargateをフォールバック
weight: 1, // 重み: 1
},
],
}),
}),
}
);
// クラスターのデフォルトキャパシティプロバイダー戦略を使用
const runTaskWithDefaultStrategy = new tasks.EcsRunTask(
this,
'RunWithDefaultStrategy',
{
cluster,
taskDefinition,
launchTarget: new tasks.EcsFargateLaunchTarget({
// クラスターのデフォルト戦略を使用
capacityProviderOptions: tasks.CapacityProviderOptions.useClusterDefault(),
}),
}
);
// 従来のlaunchType指定(デフォルト動作)
const runTaskWithLaunchType = new tasks.EcsRunTask(
this,
'RunWithLaunchType',
{
cluster,
taskDefinition,
launchTarget: new tasks.EcsFargateLaunchTarget({
// capacityProviderOptionsを省略するとLaunchType: FARGATEが使用される
}),
}
);
// EC2起動タイプでのキャパシティプロバイダー戦略
const ec2TaskDefinition = new ecs.Ec2TaskDefinition(this, 'Ec2TaskDef');
ec2TaskDefinition.addContainer('Container', {
image: ecs.ContainerImage.fromRegistry('amazon/amazon-ecs-sample'),
memoryLimitMiB: 512,
});
const runEc2TaskWithCapacityProvider = new tasks.EcsRunTask(
this,
'RunEc2WithCapacityProvider',
{
cluster,
taskDefinition: ec2TaskDefinition,
launchTarget: new tasks.EcsEc2LaunchTarget({
capacityProviderOptions: tasks.CapacityProviderOptions.custom({
strategies: [
{
capacityProvider: 'my-capacity-provider', // カスタムキャパシティプロバイダー
weight: 1,
},
],
}),
}),
}
);
CapacityProviderOptionsの種類
| メソッド | 説明 |
|---|---|
CapacityProviderOptions.noCapacityProvider() | 従来のLaunchType(EC2またはFARGATE)を使用(デフォルト) |
CapacityProviderOptions.custom({ strategies }) | カスタムキャパシティプロバイダー戦略を指定 |
CapacityProviderOptions.useClusterDefault() | クラスターのデフォルトキャパシティプロバイダー戦略を使用 |
Synthetics: Puppeteer 12.0/13.0 ランタイムを追加 (#36562)
CloudWatch Syntheticsで新しいPuppeteerランタイムがサポートされました。
使用例
import * as synthetics from 'aws-cdk-lib/aws-synthetics';
// Puppeteer 12.0 ランタイムを使用
const canary12 = new synthetics.Canary(this, 'Canary12', {
schedule: synthetics.Schedule.rate(cdk.Duration.minutes(5)),
test: synthetics.Test.custom({
code: synthetics.Code.fromAsset('canary'),
handler: 'index.handler',
}),
runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_12_0, // Puppeteer 12.0
});
// Puppeteer 13.0 ランタイムを使用
const canary13 = new synthetics.Canary(this, 'Canary13', {
schedule: synthetics.Schedule.rate(cdk.Duration.minutes(5)),
test: synthetics.Test.custom({
code: synthetics.Code.fromAsset('canary'),
handler: 'index.handler',
}),
runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_13_0, // Puppeteer 13.0(最新)
});
利用可能なPuppeteerランタイム
SYNTHETICS_NODEJS_PUPPETEER_10_0SYNTHETICS_NODEJS_PUPPETEER_11_0SYNTHETICS_NODEJS_PUPPETEER_12_0- 新規追加SYNTHETICS_NODEJS_PUPPETEER_13_0- 新規追加
Alphaモジュール (2.234.0-alpha.0)
MSK Alpha: Kafka v3.9でExpressブローカーをサポート (#36450)
Amazon MSK(Managed Streaming for Apache Kafka)でKafka v3.9を使用する場合にExpressブローカーがサポートされるようになりました。
使用例
import * as msk from '@aws-cdk/aws-msk-alpha';
const cluster = new msk.Cluster(this, 'Cluster', {
clusterName: 'my-cluster',
kafkaVersion: msk.KafkaVersion.V3_9_0, // Kafka v3.9を指定
vpc,
brokerType: msk.BrokerType.EXPRESS, // Expressブローカーを使用
numberOfBrokerNodes: 2,
});
ExpressブローカーはKRaft(Kafka Raft)をサポートし、ZooKeeperなしでKafkaクラスターを運用できます。
ElastiCache Alpha: serverlessCacheNameまたはuserGroupIdが未指定時のデプロイ失敗を修正 (#36459)
ServerlessCacheまたはUserGroupで名前やIDを明示的に指定しない場合、自動生成される名前がAWS ElastiCacheの40文字制限を超えてデプロイに失敗する問題が修正されました。
修正後の動作
import * as elasticache from '@aws-cdk/aws-elasticache-alpha';
// serverlessCacheNameを省略しても40文字以内の名前が自動生成される
const cache = new elasticache.ServerlessCache(this, 'Cache', {
vpc,
engine: elasticache.Engine.VALKEY,
// serverlessCacheName を省略 - 自動生成される名前は40文字以内に制限
});
// userGroupIdを省略しても40文字以内のIDが自動生成される
const userGroup = new elasticache.UserGroup(this, 'UserGroup', {
// userGroupId を省略 - 自動生成されるIDは40文字以内に制限
});
ElastiCache Alpha: ServerlessCacheのセキュリティグループがデフォルトエンドポイントポートを使用しない問題を修正 (#35738)
ServerlessCacheのconnections.allowToDefaultPort()を使用した際に、CloudFormationテンプレートでFromPortとToPortがnullになる問題が修正されました。
修正後の動作
import * as elasticache from '@aws-cdk/aws-elasticache-alpha';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
const cache = new elasticache.ServerlessCache(this, 'ServerlessCache', {
vpc,
engine: elasticache.Engine.VALKEY,
});
const securityGroup = new ec2.SecurityGroup(this, 'SecurityGroup', {
vpc,
});
// 修正後: エンドポイントポートが正しく参照される
securityGroup.connections.allowToDefaultPort(cache);
// CloudFormationテンプレートでFromPort/ToPortが
// { "Fn::GetAtt": ["Cache", "Endpoint.Port"] } として正しく設定される
バグ修正
CloudWatch: MathExpressionでプロパティがトークンの場合にバリデーションをスキップ (#36487)
MathExpressionクラスで、プロパティがトークン(${Token}を含む値)の場合に英数字チェックのバリデーションエラーが発生する問題が修正されました。
修正後の動作
import * as cloudwatch from 'aws-cdk-lib/aws-cloudwatch';
import * as cdk from 'aws-cdk-lib';
// トークンを含むIDでもエラーにならない
const mathExpression = new cloudwatch.MathExpression({
expression: 'm1 + m2',
usingMetrics: {
m1: metric1,
m2: metric2,
},
// トークンを含むIDを指定してもバリデーションエラーにならない
id: cdk.Lazy.string({ produce: () => 'validAlphanumericId' }),
});
Core: App.of() が不正な値を返す問題を修正 (#36475)
App.of()メソッドが以下の問題を持っていました:
- AppとStageの両方が階層に存在する場合、AppではなくStageを返していた
- App自体に対して呼び出すとundefinedを返していた
修正後の動作
import * as cdk from 'aws-cdk-lib';
const app = new cdk.App();
const stage = new cdk.Stage(app, 'Stage');
const stack = new cdk.Stack(stage, 'Stack');
// 修正後: 正しくAppを返す
const appFromStack = cdk.App.of(stack); // app を返す(以前は stage を返していた)
// 修正後: App自体に対しても正しく動作
const appFromApp = cdk.App.of(app); // app を返す(以前は undefined を返していた)
Core: arnForXxxx() ヘルパーが参照リソースの環境を無視する問題を修正 (#36599)
CfnXxxxクラスのarnForXxxx()ヘルパーメソッドが、ARNから参照されたリソースの環境(アカウント/リージョン)を無視してスタックの環境を使用していた問題が修正されました。
修正後の動作
import * as cdk from 'aws-cdk-lib';
import * as s3 from 'aws-cdk-lib/aws-s3';
const stack = new cdk.Stack(app, 'Stack', {
env: { account: '111111111111', region: 'us-east-1' },
});
// 異なるアカウントのリソースをARNから参照
const bucket = s3.Bucket.fromBucketArn(
stack,
'ImportedBucket',
'arn:aws:s3:::my-bucket-222222222222'
);
// 修正後: 参照元リソースのアカウント/リージョンが正しく使用される
// 以前は常にスタックのアカウント(111111111111)が使用されていた
Core: { Ref } のスキーマとCloudFormation間の非互換性を考慮 (#36493)
Cloud Control APIのスキーマとCloudFormationの{ Ref }の動作の違いを考慮した修正が行われました。
EC2: 新リージョンeusc-de-east-1のECR・API GatewayサービスでVPCエンドポイントサービス名プレフィックスを修正 (#36471)
AWS European Sovereign Cloudの新リージョンeusc-de-east-1で、ECR、API Gateway、Security HubサービスのVPCエンドポイントサービス名プレフィックスがeu.amazonawsである必要がある問題に対応しました。
修正後の動作
import * as ec2 from 'aws-cdk-lib/aws-ec2';
// eusc-de-east-1リージョンのスタック
const stack = new cdk.Stack(app, 'Stack', {
env: { region: 'eusc-de-east-1' },
});
const vpc = new ec2.Vpc(stack, 'Vpc');
// 修正後: eu.amazonaws.eusc-de-east-1.ecr.dkr が使用される
// 以前は com.amazonaws.eusc-de-east-1.ecr.dkr でエラーになっていた
vpc.addInterfaceEndpoint('EcrEndpoint', {
service: ec2.InterfaceVpcEndpointAwsService.ECR_DOCKER,
});
// 対象サービス: ecr.dkr, ecr.api, execute-api, securityhub
Lambda: キャパシティプロバイダーにトークン解決バリデーションを追加 (#36275)
Lambdaのキャパシティプロバイダー関連の検証で、未解決のトークンが考慮されていなかった問題が修正されました。トークンを含む値の場合、CloudFormationでの解決を待つようになりました。
破壊的変更
Batch: JobQueue.computeEnvironmentsの型保証の緩和 (#36522)
JobQueueのcomputeEnvironmentsプロパティ(public readonly computeEnvironments: OrderedComputeEnvironment[])のcomputeEnvironmentメンバーの型保証が緩和されました。このプロパティは本来公開されるべきではなく、使用は稀と想定されています。
Backup: BackupPlanRule.propsの型保証の緩和 (#36415)
BackupPlanRuleのpropsプロパティ(public readonly props: BackupPlanRuleProps)のbackupVaultメンバーの型保証が緩和されました。このプロパティは本来公開されるべきではなく、使用は稀と想定されています。
L1リソースの変更
CloudFormationリソーススキーマの更新に伴い、以下のL1リソースに破壊的変更があります:
aws-securityhub:
AWS::SecurityHub::ConnectorV2:Provider.JiraCloud.AuthStatus属性が削除AWS::SecurityHub::ConnectorV2:Provider.JiraCloud.AuthUrl属性が削除AWS::SecurityHub::ConnectorV2:Provider.JiraCloud.CloudId属性が削除AWS::SecurityHub::ConnectorV2:Provider.JiraCloud.Domain属性が削除AWS::SecurityHub::ConnectorV2:Provider.ServiceNow.AuthStatus属性が削除AWS::SecurityHub::ConnectorV2:JiraCloud型が削除され、JiraCloudProviderConfigurationに置換AWS::SecurityHub::ConnectorV2:ServiceNow型が削除され、ServiceNowProviderConfigurationに置換
aws-ssm:
AWS::SSM::MaintenanceWindowTarget:Id属性が削除
まとめ
AWS CDK v2.234.0では、ECSのManagedInstancesCapacityProviderでEC2インスタンスプロファイルが自動作成されるようになり、設定の手間が大幅に軽減されました。Step FunctionsのEcsRunTaskでキャパシティプロバイダー戦略が設定可能になったことで、Fargate SpotやEC2オートスケーリングとの統合がより柔軟になっています。
Syntheticsでは最新のPuppeteerランタイム12.0/13.0がサポートされ、CloudWatch Syntheticsカナリアで最新のブラウザ自動化機能が利用可能になりました。
Alphaモジュールでは、MSKでKafka v3.9のExpressブローカーがサポートされ、KRaftによるZooKeeperレスなKafkaクラスター運用が可能になっています。
破壊的変更として、BatchとBackupの内部プロパティの型保証緩和、およびSecurityHubとSSMのL1リソース変更があります。SecurityHubのConnectorV2を使用している場合は、JiraCloudとServiceNowの設定型の変更に注意が必要です。