概要
AWS CDK v2.188.0では、CodePipelineに新しいアクション(ECR Build/Publish、Inspector Scan)が追加され、CI/CDワークフローが強化されました。また、Cognitoでv3.0 Pre Token Generation Triggerのサポート、EventBridge TargetsでのAPI Gateway v2 HttpApiのサポート、Firehose/CloudWatch Logsの機能拡張、RDSでのEngine Lifecycle Supportなど、多数の新機能が追加されています。
新機能
CodePipeline: Pipeline Service RoleをActionのデフォルトRoleとして使用可能に (PR #33961, #33991)
CodePipelineでは、従来各アクションに対して個別のIAMロールが自動生成されていましたが、新しいusePipelineRoleForActionsプロパティにより、Pipeline Service Roleをアクションのデフォルトロールとして使用できるようになりました。これにより、不要なIAMロールの作成を抑制し、リソース管理をシンプル化できます。
この機能は、L2コンストラクト(aws-codepipeline)およびL3コンストラクト(pipelinesモジュール)の両方でサポートされています。
import * as codepipeline from 'aws-cdk-lib/aws-codepipeline';
import * as codepipeline_actions from 'aws-cdk-lib/aws-codepipeline-actions';
const sourceOutput = new codepipeline.Artifact();
const buildOutput = new codepipeline.Artifact();
const pipeline = new codepipeline.Pipeline(this, 'Pipeline', {
// Pipeline Service Roleをアクションのデフォルトロールとして使用
usePipelineRoleForActions: true, // デフォルト: false(各アクションに個別のロールを作成)
});
pipeline.addStage({
stageName: 'Source',
actions: [
new codepipeline_actions.CodeStarConnectionsSourceAction({
actionName: 'Source',
owner: 'myorg',
repo: 'myrepo',
output: sourceOutput,
connectionArn: 'arn:aws:codestar-connections:us-east-1:123456789012:connection/xxx',
// このアクションはPipeline Service Roleを使用(個別のロールは作成されない)
}),
],
});
pipeline.addStage({
stageName: 'Build',
actions: [
new codepipeline_actions.CodeBuildAction({
actionName: 'Build',
project: new codebuild.Project(this, 'BuildProject', {
// ...
}),
input: sourceOutput,
outputs: [buildOutput],
// このアクションもPipeline Service Roleを使用
}),
],
});
Pipelinesモジュール(L3)でも同様に使用できます:
import * as pipelines from 'aws-cdk-lib/pipelines';
const pipeline = new pipelines.CodePipeline(this, 'Pipeline', {
synth: new pipelines.ShellStep('Synth', {
input: pipelines.CodePipelineSource.connection('myorg/myrepo', 'main', {
connectionArn: 'arn:aws:codestar-connections:us-east-1:123456789012:connection/xxx',
}),
commands: ['npm ci', 'npm run build', 'npx cdk synth'],
}),
// Pipeline Service Roleをアクションのデフォルトロールとして使用
usePipelineRoleForActions: true, // デフォルト: false
});
CodePipeline Actions: ECR Build and Publishアクションのサポート (PR #33375)
AWS CodePipelineの新しいビルドアクション「ECR Build and Publish」がサポートされました。このアクションは、Dockerfileからコンテナイメージをビルドし、Amazon ECR(Private/Public)に直接プッシュできる機能を提供します。
import * as codepipeline from 'aws-cdk-lib/aws-codepipeline';
import * as codepipeline_actions from 'aws-cdk-lib/aws-codepipeline-actions';
import * as ecr from 'aws-cdk-lib/aws-ecr';
const sourceOutput = new codepipeline.Artifact();
// ECRリポジトリ(Private)
const ecrRepository = new ecr.Repository(this, 'Repository', {
repositoryName: 'my-app',
});
const pipeline = new codepipeline.Pipeline(this, 'Pipeline', {
pipelineType: codepipeline.PipelineType.V2,
});
pipeline.addStage({
stageName: 'Source',
actions: [
new codepipeline_actions.CodeStarConnectionsSourceAction({
actionName: 'Source',
owner: 'myorg',
repo: 'myrepo',
output: sourceOutput,
connectionArn: 'arn:aws:codestar-connections:us-east-1:123456789012:connection/xxx',
}),
],
});
pipeline.addStage({
stageName: 'Build',
actions: [
new codepipeline_actions.ECRBuildAndPublishAction({
actionName: 'BuildAndPublish',
// ソースアーティファクトの指定
input: sourceOutput,
// ECRリポジトリの指定(Private)
repository: ecrRepository,
// イメージタグ(デフォルト: 'latest')
imageTag: 'v1.0.0',
// Dockerfileのパス(デフォルト: 'Dockerfile')
dockerfilePath: 'docker/Dockerfile',
// ビルドコンテキストのパス(デフォルト: '.')
buildContext: '.',
// ビルド引数
buildArgs: {
NODE_ENV: 'production',
API_URL: 'https://api.example.com',
},
}),
],
});
ECR Publicリポジトリへのプッシュも可能です:
import * as ecr_public from 'aws-cdk-lib/aws-ecr-public';
// ECRリポジトリ(Public)
const publicRepository = ecr_public.Repository.fromRepositoryArn(
this,
'PublicRepository',
'arn:aws:ecr-public::123456789012:repository/my-public-app'
);
new codepipeline_actions.ECRBuildAndPublishAction({
actionName: 'BuildAndPublishToPublic',
input: sourceOutput,
// Public リポジトリを指定
repository: publicRepository,
imageTag: 'latest',
});
CodePipeline Actions: Inspector Scanアクションのサポート (PR #33378)
AWS CodePipelineに、Amazon Inspector Scanアクションが追加されました。これにより、ECRイメージのセキュリティスキャンとソースコードのスキャンをパイプライン内で実行できます。
ECRイメージスキャン
import * as codepipeline from 'aws-cdk-lib/aws-codepipeline';
import * as codepipeline_actions from 'aws-cdk-lib/aws-codepipeline-actions';
import * as ecr from 'aws-cdk-lib/aws-ecr';
const sourceOutput = new codepipeline.Artifact();
const scanOutput = new codepipeline.Artifact();
const ecrRepository = ecr.Repository.fromRepositoryName(
this,
'Repository',
'my-app'
);
pipeline.addStage({
stageName: 'Scan',
actions: [
new codepipeline_actions.InspectorEcrImageScanAction({
actionName: 'EcrImageScan',
// スキャンするイメージの情報を含む入力アーティファクト
input: sourceOutput,
// スキャン結果の出力先
output: scanOutput,
// ECRリポジトリ
repository: ecrRepository,
// イメージタグ
imageTag: 'latest',
}),
],
});
ソースコードスキャン
new codepipeline_actions.InspectorSourceCodeScanAction({
actionName: 'SourceCodeScan',
// スキャンするソースコードの入力アーティファクト
input: sourceOutput,
// スキャン結果の出力先
output: scanOutput,
});
Cognito: v3.0 Pre Token Generation Triggerのサポート (PR #33778)
Cognito User PoolでPre Token Generation Trigger v3.0がサポートされました。このバージョンは、Machine-to-Machine(M2M)のClient Credentials Grantsに対応しています。
import * as cognito from 'aws-cdk-lib/aws-cognito';
import * as lambda from 'aws-cdk-lib/aws-lambda';
const preTokenGenerationFn = new lambda.Function(this, 'PreTokenGeneration', {
runtime: lambda.Runtime.NODEJS_20_X,
handler: 'index.handler',
code: lambda.Code.fromAsset('lambda'),
});
const userPool = new cognito.UserPool(this, 'UserPool', {
// Pre Token Generation Trigger v3.0の設定(M2M対応)
lambdaTriggers: {
preTokenGeneration: preTokenGenerationFn,
preTokenGenerationConfig: {
// v3.0を指定(デフォルト: V1_0)
lambdaVersion: cognito.LambdaVersion.V3_0,
},
},
});
Lambda関数のサンプル(v3.0):
// Pre Token Generation Trigger v3.0 (M2M対応)
exports.handler = async (event) => {
console.log('Event:', JSON.stringify(event, null, 2));
// v3.0では、クレームのカスタマイズが可能
return {
claimsOverrideDetails: {
claimsToAddOrOverride: {
'custom:tenant': 'tenant-123',
'custom:role': 'admin',
},
claimsToSuppress: ['email_verified'],
},
};
};
EventBridge Targets: API Gateway v2 HttpApiのサポート (PR #33864)
EventBridge RulesのターゲットとしてAPI Gateway v2(HTTP API)がサポートされました。これにより、EventBridgeイベントをHTTP APIエンドポイントに直接ルーティングできます。
import * as events from 'aws-cdk-lib/aws-events';
import * as targets from 'aws-cdk-lib/aws-events-targets';
import * as apigwv2 from 'aws-cdk-lib/aws-apigatewayv2';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import { HttpLambdaIntegration } from 'aws-cdk-lib/aws-apigatewayv2-integrations';
// Lambda関数の作成
const handlerFn = new lambda.Function(this, 'Handler', {
runtime: lambda.Runtime.NODEJS_20_X,
handler: 'index.handler',
code: lambda.Code.fromAsset('lambda'),
});
// HTTP APIの作成
const httpApi = new apigwv2.HttpApi(this, 'HttpApi');
httpApi.addRoutes({
path: '/webhook',
methods: [apigwv2.HttpMethod.POST],
integration: new HttpLambdaIntegration('Integration', handlerFn),
});
// EventBridge Ruleの作成
const rule = new events.Rule(this, 'Rule', {
eventPattern: {
source: ['aws.s3'],
detailType: ['Object Created'],
},
});
// HTTP APIをターゲットとして追加
rule.addTarget(
new targets.ApiGatewayv2(httpApi, {
// ステージを指定(デフォルト: $default)
stage: '$default',
// パスを指定
path: '/webhook',
// HTTPメソッドを指定(デフォルト: POST)
method: apigwv2.HttpMethod.POST,
// ヘッダーパラメータ
headerParameters: {
'X-Event-Source': events.RuleTargetInput.fromText('EventBridge'),
},
// クエリパラメータ
queryStringParameters: {
environment: events.RuleTargetInput.fromText('production'),
},
})
);
Kinesis Firehose: S3ファイル拡張子フォーマットのサポート (PR #33776)
Kinesis Firehoseで、S3に保存するファイルの拡張子をカスタマイズできるようになりました。デフォルトでは拡張子なしで保存されますが、.json、.parquetなどの拡張子を指定できます。
import * as firehose from 'aws-cdk-lib/aws-kinesisfirehose';
import * as destinations from 'aws-cdk-lib/aws-kinesisfirehose-destinations';
import * as s3 from 'aws-cdk-lib/aws-s3';
const bucket = new s3.Bucket(this, 'Bucket');
const stream = new firehose.DeliveryStream(this, 'DeliveryStream', {
destination: new destinations.S3Bucket(bucket, {
// S3に保存するファイルの拡張子を指定(デフォルト: なし)
fileExtension: '.json', // '.json', '.parquet', '.csv', など
// データフォーマット
dataFormatConversionConfiguration: {
// JSON形式で保存
outputFormatConfiguration: {
serializer: {
orcSerDe: {},
},
},
},
// 圧縮形式
compression: destinations.Compression.GZIP,
// バッファサイズ(MB)
bufferingSize: cdk.Size.mebibytes(5),
// バッファ間隔(秒)
bufferingInterval: cdk.Duration.seconds(300),
}),
});
この機能により、S3に保存されるファイルが適切な拡張子を持つため、ファイル管理やAthenaでのクエリが容易になります。
CloudWatch Logs Destinations: Firehoseデスティネーションのサポート (PR #33683)
CloudWatch Logsのサブスクリプションフィルターで、Amazon Data Firehoseをデスティネーションとして使用できるようになりました。これにより、ログデータをS3、Redshift、OpenSearchなどに自動的にストリーミングできます。
import * as logs from 'aws-cdk-lib/aws-logs';
import * as firehose from 'aws-cdk-lib/aws-kinesisfirehose';
import * as destinations from 'aws-cdk-lib/aws-logs-destinations';
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as firehose_destinations from 'aws-cdk-lib/aws-kinesisfirehose-destinations';
// S3バケットの作成
const bucket = new s3.Bucket(this, 'LogBucket');
// Firehose Delivery Streamの作成
const deliveryStream = new firehose.DeliveryStream(this, 'DeliveryStream', {
destination: new firehose_destinations.S3Bucket(bucket, {
fileExtension: '.json',
compression: firehose_destinations.Compression.GZIP,
}),
});
// CloudWatch Logsロググループ
const logGroup = new logs.LogGroup(this, 'LogGroup', {
logGroupName: '/aws/lambda/my-function',
retention: logs.RetentionDays.ONE_WEEK,
});
// サブスクリプションフィルターでFirehoseをデスティネーションとして設定
new logs.SubscriptionFilter(this, 'SubscriptionFilter', {
logGroup,
// Firehoseデスティネーション
destination: new destinations.FirehoseDestination(deliveryStream),
// フィルターパターン(すべてのログイベント)
filterPattern: logs.FilterPattern.allEvents(),
});
これにより、Lambda関数のログを自動的にS3にアーカイブしたり、ログ分析パイプラインを構築したりできます。
RDS: Engine Lifecycle Supportの設定 (PR #33902)
RDSデータベースクラスターで、Engine Lifecycle Support(Extended Support)を設定できるようになりました。これにより、標準サポート期間が終了したエンジンバージョンの延長サポートを有効化できます。
import * as rds from 'aws-cdk-lib/aws-rds';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
const vpc = new ec2.Vpc(this, 'Vpc');
const cluster = new rds.DatabaseCluster(this, 'Cluster', {
engine: rds.DatabaseClusterEngine.auroraMysql({
version: rds.AuroraMysqlEngineVersion.VER_5_7_44,
}),
instanceProps: {
vpc,
instanceType: ec2.InstanceType.of(ec2.InstanceClass.T3, ec2.InstanceSize.MEDIUM),
},
// Engine Lifecycle Supportを指定
engineLifecycleSupport: rds.EngineLifecycleSupport.OPEN_SOURCE_RDS_EXTENDED_SUPPORT,
// または
// engineLifecycleSupport: rds.EngineLifecycleSupport.OPEN_SOURCE_RDS_EXTENDED_SUPPORT_DISABLED,
});
利用可能なオプション:
OPEN_SOURCE_RDS_EXTENDED_SUPPORT: 延長サポートを有効化(追加料金が発生)OPEN_SOURCE_RDS_EXTENDED_SUPPORT_DISABLED: 延長サポートを無効化(デフォルト)
Alphaモジュールの新機能
EC2: Mail ManagerのVPCエンドポイントをサポート (PR #33996)
EC2 AlphaモジュールでAmazon SES Mail ManagerのVPCエンドポイントがサポートされました。
import * as ec2 from '@aws-cdk/aws-ec2-alpha';
const vpc = new ec2.Vpc(this, 'Vpc');
// Mail Manager VPCエンドポイントの作成
vpc.addInterfaceEndpoint('MailManagerEndpoint', {
service: ec2.InterfaceVpcEndpointAwsService.MAIL_MANAGER,
});
EKS v2 Alpha: 新しいNodegroup AMIタイプの追加 (PR #34025)
EKS v2 Alphaモジュールで、新しいNodegroup AMIタイプがサポートされました。
バグ修正
CloudFormation Include: AutoScalingRollingUpdateのMinActiveInstancesPercentをパース (PR #33852)
cloudformation-includeモジュールで、AutoScalingRollingUpdateポリシーのMinActiveInstancesPercentプロパティが正しくパースされるようになりました。
ECR Assets: Docker 27.4+の出力フォーマットに対応 (PR #33967)
TarballImageAssetがDocker 27.4以降の新しい出力フォーマットに対応しました。
EKS: updateVersionで複数の更新タイプを同時に指定できない問題を修正 (PR #33975)
EKSクラスターのupdateVersionで、複数の更新タイプ(例: VersionとPlatformVersion)を同時に指定できないように検証が追加されました。
IAM: OrganizationPrincipalのIDバリデーションを追加 (PR #33968)
OrganizationPrincipalで、無効なOrganization IDが指定された場合にエラーを出力するバリデーションが追加されました。
Lambda: EventSourceMappingで無限リトライを許可 (PR #34009)
Lambda EventSourceMappingで、retryAttempts = -1を指定することで無限リトライが可能になりました。
import * as lambda from 'aws-cdk-lib/aws-lambda';
import { SqsEventSource } from 'aws-cdk-lib/aws-lambda-event-sources';
import * as sqs from 'aws-cdk-lib/aws-sqs';
const queue = new sqs.Queue(this, 'Queue');
const fn = new lambda.Function(this, 'Function', {
runtime: lambda.Runtime.NODEJS_20_X,
handler: 'index.handler',
code: lambda.Code.fromAsset('lambda'),
events: [
new SqsEventSource(queue, {
// 無限リトライを有効化(デフォルト: 3回)
retryAttempts: -1,
}),
],
});
Pipelines: 同じアセット表示名を3回以上使用できない問題を修正 (PR #34017)
Pipelinesモジュールで、同じアセット表示名を3回以上使用できない問題が修正されました。
Step Functions Tasks: JSONataを使用する際のassociateWithParentを修正 (PR #33972)
Step Functions TasksでJSONataを使用する際のassociateWithParentの動作が修正されました。
S3: BucketNotificationsがある場合にAspectでタグを追加できない問題を修正 (PR #33979)
S3バケットにBucketNotificationsコンストラクトがある場合に、カスタムAspectでタグを追加できない問題が修正されました。
CloudFormation L1リソースの更新
L1 CloudFormationリソース定義が更新されました:
まとめ
AWS CDK v2.188.0は、CodePipelineに新しいアクション(ECR Build/Publish、Inspector Scan)を追加し、CI/CDワークフローの機能を大幅に強化しました。また、Cognitoのv3.0 Pre Token Generation Trigger、EventBridge TargetsでのHTTP APIサポート、Firehose/CloudWatch Logsの機能拡張など、多数の新機能が追加されています。これらの機能により、より柔軟でセキュアなインフラストラクチャの構築が可能になります。