概要
AWS CDK v2.212.0 では、AWS API Gateway v2(WebSocket API)向けの重要な新機能として、UsagePlan と ApiKey のL2コンストラクトサポートが追加されました。これにより、WebSocket APIに対してもレート制限やクォータ管理が可能になります。また、API GatewayのStep Functions統合におけるエラーレスポンスのバグ修正や、S3デプロイメントでのトークン解決の問題修正など、複数の重要なバグ修正も含まれています。
新機能
WebSocket API向けUsagePlanとApiKeyのサポート
PR: #35060
従来、UsagePlanとApiKeyは REST API(API Gateway v1)でのみサポートされていましたが、今回のリリースで WebSocket API(API Gateway v2) でも利用可能になりました。これにより、WebSocket APIに対してもレート制限、バースト制限、クォータ管理が実装できるようになります。
UsagePlanの作成
UsagePlanを使用することで、APIへのアクセス制限を設定できます:
import * as apigwv2 from 'aws-cdk-lib/aws-apigatewayv2';
const usagePlan = new apigwv2.UsagePlan(this, 'MyUsagePlan', {
usagePlanName: 'WebSocketBasicPlan', // 使用量プラン名
description: 'Basic usage plan for WebSocket API', // プランの説明
// スロットリング設定(リクエストレート制限)
throttle: {
rateLimit: 10, // 1秒あたりの平均リクエスト数
burstLimit: 2, // 瞬間的なバーストリクエスト数
},
// クォータ設定(期間あたりの最大リクエスト数)
quota: {
limit: 10000, // 最大リクエスト数
period: apigwv2.Period.MONTH, // 期間(DAY, WEEK, MONTH)
offset: 0, // 初期期間のオフセット(デフォルト: 0)
},
});
UsagePlanとWebSocket Stageの関連付け
UsagePlanを特定のWebSocket APIステージに関連付けます:
const api = new apigwv2.WebSocketApi(this, 'MyWebSocketApi', {
routeSelectionExpression: '$request.body.action',
});
const stage = new apigwv2.WebSocketStage(this, 'ProductionStage', {
webSocketApi: api,
stageName: 'prod',
autoDeploy: true,
});
// UsagePlanにステージを追加
usagePlan.addApiStage({
api: api, // WebSocket API
stage: stage, // 関連付けるステージ
});
ApiKeyの作成と管理
APIキーを作成してクライアントアクセスを管理できます:
// 自動生成される名前と値
const autoGeneratedKey = new apigwv2.ApiKey(this, 'AutoKey', {
description: 'Auto-generated API key',
enabled: true, // APIキーを有効化(デフォルト: true)
});
// カスタム名と値を指定
const customKey = new apigwv2.ApiKey(this, 'CustomKey', {
apiKeyName: 'MyWebSocketApiKey', // カスタム名
value: 'MyApiKeyThatIsAtLeast20Characters', // カスタム値(20文字以上)
description: 'Custom API key for partner integration',
enabled: true,
customerId: 'customer-12345', // AWS Marketplace顧客ID(オプション)
generateDistinctId: false, // 個別IDの生成(デフォルト: false)
});
// UsagePlanにApiKeyを関連付け
usagePlan.addApiKey(customKey);
複数のApiKeyの管理
1つのUsagePlanに複数のApiKeyを関連付けることができます。CloudFormationの論理IDを明示的に指定することで、デプロイ間での一貫性を保つことができます:
declare const usagePlan: apigwv2.UsagePlan;
const apiKey1 = new apigwv2.ApiKey(this, 'ApiKey1');
const apiKey2 = new apigwv2.ApiKey(this, 'ApiKey2');
// CloudFormation論理IDを明示的に指定
usagePlan.addApiKey(apiKey1, {
overrideLogicalId: 'FirstApiKey',
});
usagePlan.addApiKey(apiKey2, {
overrideLogicalId: 'SecondApiKey',
});
RateLimitedApiKeyによる簡単なレート制限
単一のAPIキーに対してレート制限を設定する場合、RateLimitedApiKeyを使用することで簡単に実装できます:
declare const api: apigwv2.WebSocketApi;
declare const stage: apigwv2.WebSocketStage;
const rateLimitedKey = new apigwv2.RateLimitedApiKey(this, 'RateLimitedKey', {
apiKeyName: 'PremiumCustomerKey',
customerId: 'premium-customer-123',
// このAPIキーが適用されるステージ
apiStages: [{
api: api,
stage: stage,
}],
// クォータ設定
quota: {
limit: 50000, // 月間50,000リクエスト
period: apigwv2.Period.MONTH,
},
// スロットリング設定
throttle: {
rateLimit: 100, // 1秒あたり100リクエスト
burstLimit: 200, // バースト最大200リクエスト
},
});
IAM権限の付与
ApiKeyに対するIAM権限を簡単に付与できます:
import * as iam from 'aws-cdk-lib/aws-iam';
const user = new iam.User(this, 'ApiUser');
const apiKey = new apigwv2.ApiKey(this, 'MyApiKey');
// 読み取り権限を付与
apiKey.grantRead(user);
// 書き込み権限を付与
apiKey.grantWrite(user);
// 読み書き両方の権限を付与
apiKey.grantReadWrite(user);
既存リソースのインポート
既存のUsagePlanやApiKeyをインポートして使用することもできます:
// 既存のUsagePlanをインポート
const importedUsagePlan = apigwv2.UsagePlan.fromUsagePlanId(
this,
'ImportedUsagePlan',
'usage-plan-id-12345'
);
// 既存のApiKeyをインポート
const importedApiKey = apigwv2.ApiKey.fromApiKeyId(
this,
'ImportedApiKey',
'api-key-id-67890'
);
// インポートしたWebSocket APIステージの使用
declare const webSocketApi: apigwv2.IWebSocketApi;
const importedStage = apigwv2.WebSocketStage.fromWebSocketStageAttributes(
this,
'ImportedStage',
{
stageName: 'prod',
api: webSocketApi,
}
);
// インポートしたリソースを使用してUsagePlanを作成
const usagePlan = new apigwv2.UsagePlan(this, 'UsagePlanForImported', {
apiStages: [{ api: webSocketApi, stage: importedStage }],
});
const apiKey = new apigwv2.ApiKey(this, 'NewApiKey');
usagePlan.addApiKey(apiKey);
L1リソースの更新
PR: #35256
最新のCloudFormationリソース定義に基づいて、L1コンストラクト(CfnXxx)が更新されました。
バグ修正
API Gateway: Step Functions統合のエラーレスポンス修正
API GatewayのStep Functions統合において、エラーレスポンスの無効なJSON構造が500エラーを引き起こす問題が修正されました。これにより、Step Functionsからのエラーレスポンスが正しく処理されるようになりました。
影響: API Gateway + Step Functions統合を使用しているアプリケーションで、エラーハンドリングが改善されます。
aws-cdk-lib: Feature Flagレポートの不要なフラグ表示を修正
PR: #35227
Feature Flagレポートに不要なフラグが含まれていた問題が修正されました。これにより、実際に関連するFeature Flagのみが表示されるようになります。
影響: cdk diffやcdk deploy時のFeature Flag表示がより明確になります。
S3 Deployment: Source.jsonDataでのトークン解決の問題修正
Source.jsonData内のリストトークンが正しく解決されない問題が修正されました。これにより、動的な値を含むJSONデータを正しくS3にデプロイできるようになります。
import * as s3deploy from 'aws-cdk-lib/aws-s3-deployment';
import * as s3 from 'aws-cdk-lib/aws-s3';
declare const bucket: s3.Bucket;
declare const dynamicList: string[];
// リストトークンが正しく解決されるようになりました
new s3deploy.BucketDeployment(this, 'DeployConfig', {
sources: [
s3deploy.Source.jsonData('config.json', {
items: dynamicList, // トークン化されたリストが正しく処理される
}),
],
destinationBucket: bucket,
});
影響: CDKトークンを含むJSONデータのS3デプロイメントが正しく動作します。
Signer: SigningProfileNameの引き渡しエラー修正
CfnSigningProfileにsigningProfileNameが正しく渡されない問題が修正されました。
影響: AWS Signerを使用したコード署名プロファイルが正しく作成されます。
L1リソースの変更
CloudFormationスキーマの更新に伴い、以下のL1リソースに破壊的変更が含まれています:
AWS RDS
- AWS::RDS::DBInstance:
StatusInfosプロパティが削除されました
AWS SageMaker
- AWS::SageMaker::Domain:
SingleSignOnApplicationArnプロパティが削除されました
AWS CloudFront
- AWS::CloudFront::Function:
Nameプロパティが不変(immutable)に変更されました
これらの変更は、CloudFormationの実際の動作をより正確に反映するためのものです。
リバート(取り消し)
ECS/Fargateサービスのドキュメント変更の取り消し
ECSとFargateサービスに関する新しいAZリバランシングのデフォルト値に関するドキュメント変更が取り消されました。
Alphaモジュール
このリリースには、バージョン 2.212.0-alpha.0 のAlphaモジュールが含まれています。Alphaモジュールは実験的な機能であり、今後のリリースで破壊的変更が行われる可能性があります。
まとめ
AWS CDK v2.212.0 は、WebSocket API向けのUsagePlanとApiKeyサポートという重要な新機能を追加しました。これにより、WebSocket APIに対してもREST APIと同様の使用量管理とレート制限が実装できるようになります。
また、API Gateway + Step Functions統合のエラーハンドリング改善や、S3 Deploymentでのトークン解決の問題修正など、複数の重要なバグ修正が含まれており、既存のアプリケーションの安定性が向上します。
L1リソースの変更については、CloudFormationスキーマの更新に伴うものであり、より正確なリソース定義が提供されています。該当するプロパティを使用している場合は、デプロイ前に影響を確認することをお勧めします。
WebSocket APIを使用しているアプリケーションで使用量管理が必要な場合、このリリースのUsagePlanとApiKey機能を活用することで、簡単にレート制限とクォータ管理を実装できます。