diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/aws-cdk-aws-apigatewayv2-http-stage.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/aws-cdk-aws-apigatewayv2-http-stage.assets.json index 54d26fb516d85..e8e4030e9bda3 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/aws-cdk-aws-apigatewayv2-http-stage.assets.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/aws-cdk-aws-apigatewayv2-http-stage.assets.json @@ -1,7 +1,7 @@ { - "version": "36.0.0", + "version": "39.0.0", "files": { - "d0e21994eba50227669b2052acb6e237940781e64fc7baad9c2946a2c56d4b8d": { + "8a139312fcbabd6668985694bc84920a0266fbf9ed13095c117cdf1f87b97373": { "source": { "path": "aws-cdk-aws-apigatewayv2-http-stage.template.json", "packaging": "file" @@ -9,7 +9,7 @@ "destinations": { "current_account-current_region": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "d0e21994eba50227669b2052acb6e237940781e64fc7baad9c2946a2c56d4b8d.json", + "objectKey": "8a139312fcbabd6668985694bc84920a0266fbf9ed13095c117cdf1f87b97373.json", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" } } diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/aws-cdk-aws-apigatewayv2-http-stage.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/aws-cdk-aws-apigatewayv2-http-stage.template.json index e684ea62ef5e0..823f4be372aa4 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/aws-cdk-aws-apigatewayv2-http-stage.template.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/aws-cdk-aws-apigatewayv2-http-stage.template.json @@ -14,6 +14,7 @@ "Ref": "HttpApiF5A9A8A7" }, "DefaultRouteSettings": { + "DetailedMetricsEnabled": true, "ThrottlingBurstLimit": 1000, "ThrottlingRateLimit": 1000 }, diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/cdk.out index 1f0068d32659a..91e1a8b9901d5 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/cdk.out +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/cdk.out @@ -1 +1 @@ -{"version":"36.0.0"} \ No newline at end of file +{"version":"39.0.0"} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/integ.json index 6f3b6b3048bfd..108cff4a7691e 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/integ.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/integ.json @@ -1,5 +1,5 @@ { - "version": "36.0.0", + "version": "39.0.0", "testCases": { "integ.stage": { "stacks": [ diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/manifest.json index 7619a5e497d6c..927b2f8f0c83e 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/manifest.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/manifest.json @@ -1,5 +1,5 @@ { - "version": "36.0.0", + "version": "39.0.0", "artifacts": { "aws-cdk-aws-apigatewayv2-http-stage.assets": { "type": "cdk:asset-manifest", @@ -18,7 +18,7 @@ "validateOnSynth": false, "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", - "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/d0e21994eba50227669b2052acb6e237940781e64fc7baad9c2946a2c56d4b8d.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/8a139312fcbabd6668985694bc84920a0266fbf9ed13095c117cdf1f87b97373.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ @@ -34,12 +34,24 @@ "aws-cdk-aws-apigatewayv2-http-stage.assets" ], "metadata": { + "/aws-cdk-aws-apigatewayv2-http-stage/HttpApi": [ + { + "type": "aws:cdk:analytics:construct", + "data": "*" + } + ], "/aws-cdk-aws-apigatewayv2-http-stage/HttpApi/Resource": [ { "type": "aws:cdk:logicalId", "data": "HttpApiF5A9A8A7" } ], + "/aws-cdk-aws-apigatewayv2-http-stage/HttpStageWithProperties": [ + { + "type": "aws:cdk:analytics:construct", + "data": "*" + } + ], "/aws-cdk-aws-apigatewayv2-http-stage/HttpStageWithProperties/Resource": [ { "type": "aws:cdk:logicalId", diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/tree.json index d51fb3fce8033..df35f6d3e5382 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/tree.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/tree.json @@ -23,14 +23,17 @@ } }, "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.3.0" + "fqn": "aws-cdk-lib.aws_apigatewayv2.CfnApi", + "version": "0.0.0" } } }, "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.3.0" + "fqn": "aws-cdk-lib.aws_apigatewayv2.HttpApi", + "version": "0.0.0", + "metadata": [ + "*" + ] } }, "HttpStageWithProperties": { @@ -48,43 +51,47 @@ }, "defaultRouteSettings": { "throttlingBurstLimit": 1000, - "throttlingRateLimit": 1000 + "throttlingRateLimit": 1000, + "detailedMetricsEnabled": true }, "description": "My Stage", "stageName": "$default" } }, "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.3.0" + "fqn": "aws-cdk-lib.aws_apigatewayv2.CfnStage", + "version": "0.0.0" } } }, "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.3.0" + "fqn": "aws-cdk-lib.aws_apigatewayv2.HttpStage", + "version": "0.0.0", + "metadata": [ + "*" + ] } }, "BootstrapVersion": { "id": "BootstrapVersion", "path": "aws-cdk-aws-apigatewayv2-http-stage/BootstrapVersion", "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.3.0" + "fqn": "aws-cdk-lib.CfnParameter", + "version": "0.0.0" } }, "CheckBootstrapVersion": { "id": "CheckBootstrapVersion", "path": "aws-cdk-aws-apigatewayv2-http-stage/CheckBootstrapVersion", "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.3.0" + "fqn": "aws-cdk-lib.CfnRule", + "version": "0.0.0" } } }, "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.3.0" + "fqn": "aws-cdk-lib.Stack", + "version": "0.0.0" } }, "Tree": { @@ -92,13 +99,13 @@ "path": "Tree", "constructInfo": { "fqn": "constructs.Construct", - "version": "10.3.0" + "version": "10.4.2" } } }, "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.3.0" + "fqn": "aws-cdk-lib.App", + "version": "0.0.0" } } } \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.ts b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.ts index bf3bec4e11a04..7c745d8dfa603 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.ts +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.ts @@ -12,6 +12,7 @@ new apigw.HttpStage(stack, 'HttpStageWithProperties', { rateLimit: 1000, burstLimit: 1000, }, + detailedMetricsEnabled: true, description: 'My Stage', }); diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/aws-cdk-aws-apigatewayv2-websocket-stage.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/aws-cdk-aws-apigatewayv2-websocket-stage.assets.json index 772dd4683f795..b4cf64f990680 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/aws-cdk-aws-apigatewayv2-websocket-stage.assets.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/aws-cdk-aws-apigatewayv2-websocket-stage.assets.json @@ -1,7 +1,7 @@ { - "version": "36.0.0", + "version": "39.0.0", "files": { - "02efbccda911967e201733b39679d97db7a1c0b2ee2c60da90fb7fe7b4352502": { + "f395ca0d527831a9bb9efb9f8596f28402b0cdf892c286ff1597977eb5faf167": { "source": { "path": "aws-cdk-aws-apigatewayv2-websocket-stage.template.json", "packaging": "file" @@ -9,7 +9,7 @@ "destinations": { "current_account-current_region": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "02efbccda911967e201733b39679d97db7a1c0b2ee2c60da90fb7fe7b4352502.json", + "objectKey": "f395ca0d527831a9bb9efb9f8596f28402b0cdf892c286ff1597977eb5faf167.json", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" } } diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/aws-cdk-aws-apigatewayv2-websocket-stage.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/aws-cdk-aws-apigatewayv2-websocket-stage.template.json index 03da37384007b..b78d128d2f6ef 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/aws-cdk-aws-apigatewayv2-websocket-stage.template.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/aws-cdk-aws-apigatewayv2-websocket-stage.template.json @@ -15,6 +15,7 @@ "Ref": "WebSocketApi34BCF99B" }, "DefaultRouteSettings": { + "DetailedMetricsEnabled": true, "ThrottlingBurstLimit": 1000, "ThrottlingRateLimit": 1000 }, diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/cdk.out index 1f0068d32659a..91e1a8b9901d5 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/cdk.out +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/cdk.out @@ -1 +1 @@ -{"version":"36.0.0"} \ No newline at end of file +{"version":"39.0.0"} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/integ.json index d35c639b2cf4c..3ef55a716e8b4 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/integ.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/integ.json @@ -1,5 +1,5 @@ { - "version": "36.0.0", + "version": "39.0.0", "testCases": { "integ.stage": { "stacks": [ diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/manifest.json index a42e23755bdcf..2a898abd94486 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/manifest.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/manifest.json @@ -1,5 +1,5 @@ { - "version": "36.0.0", + "version": "39.0.0", "artifacts": { "aws-cdk-aws-apigatewayv2-websocket-stage.assets": { "type": "cdk:asset-manifest", @@ -18,7 +18,7 @@ "validateOnSynth": false, "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", - "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/02efbccda911967e201733b39679d97db7a1c0b2ee2c60da90fb7fe7b4352502.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/f395ca0d527831a9bb9efb9f8596f28402b0cdf892c286ff1597977eb5faf167.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ @@ -34,12 +34,24 @@ "aws-cdk-aws-apigatewayv2-websocket-stage.assets" ], "metadata": { + "/aws-cdk-aws-apigatewayv2-websocket-stage/WebSocketApi": [ + { + "type": "aws:cdk:analytics:construct", + "data": "*" + } + ], "/aws-cdk-aws-apigatewayv2-websocket-stage/WebSocketApi/Resource": [ { "type": "aws:cdk:logicalId", "data": "WebSocketApi34BCF99B" } ], + "/aws-cdk-aws-apigatewayv2-websocket-stage/WebSocketStage": [ + { + "type": "aws:cdk:analytics:construct", + "data": "*" + } + ], "/aws-cdk-aws-apigatewayv2-websocket-stage/WebSocketStage/Resource": [ { "type": "aws:cdk:logicalId", diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/tree.json index c1e47bf0a01af..c4156995352eb 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/tree.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/tree.json @@ -24,14 +24,17 @@ } }, "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.3.0" + "fqn": "aws-cdk-lib.aws_apigatewayv2.CfnApi", + "version": "0.0.0" } } }, "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.3.0" + "fqn": "aws-cdk-lib.aws_apigatewayv2.WebSocketApi", + "version": "0.0.0", + "metadata": [ + "*" + ] } }, "WebSocketStage": { @@ -49,43 +52,47 @@ }, "defaultRouteSettings": { "throttlingBurstLimit": 1000, - "throttlingRateLimit": 1000 + "throttlingRateLimit": 1000, + "detailedMetricsEnabled": true }, "description": "My Stage", "stageName": "dev" } }, "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.3.0" + "fqn": "aws-cdk-lib.aws_apigatewayv2.CfnStage", + "version": "0.0.0" } } }, "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.3.0" + "fqn": "aws-cdk-lib.aws_apigatewayv2.WebSocketStage", + "version": "0.0.0", + "metadata": [ + "*" + ] } }, "BootstrapVersion": { "id": "BootstrapVersion", "path": "aws-cdk-aws-apigatewayv2-websocket-stage/BootstrapVersion", "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.3.0" + "fqn": "aws-cdk-lib.CfnParameter", + "version": "0.0.0" } }, "CheckBootstrapVersion": { "id": "CheckBootstrapVersion", "path": "aws-cdk-aws-apigatewayv2-websocket-stage/CheckBootstrapVersion", "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.3.0" + "fqn": "aws-cdk-lib.CfnRule", + "version": "0.0.0" } } }, "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.3.0" + "fqn": "aws-cdk-lib.Stack", + "version": "0.0.0" } }, "Tree": { @@ -93,13 +100,13 @@ "path": "Tree", "constructInfo": { "fqn": "constructs.Construct", - "version": "10.3.0" + "version": "10.4.2" } } }, "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.3.0" + "fqn": "aws-cdk-lib.App", + "version": "0.0.0" } } } \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.ts b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.ts index ecfff658d5f4b..1193a619fcd62 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.ts +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.ts @@ -13,6 +13,7 @@ new apigw.WebSocketStage(stack, 'WebSocketStage', { rateLimit: 1000, burstLimit: 1000, }, + detailedMetricsEnabled: true, description: 'My Stage', }); diff --git a/packages/aws-cdk-lib/aws-apigatewayv2/README.md b/packages/aws-cdk-lib/aws-apigatewayv2/README.md index 90eae4cc7a05e..fe0fb367cf9b8 100644 --- a/packages/aws-cdk-lib/aws-apigatewayv2/README.md +++ b/packages/aws-cdk-lib/aws-apigatewayv2/README.md @@ -475,3 +475,22 @@ const webSocketApi = new apigwv2.WebSocketApi(this, 'mywsapi',{ apiKeySelectionExpression: apigwv2.WebSocketApiKeySelectionExpression.HEADER_X_API_KEY, }); ``` + +## Common Config +Common config for both HTTP API and WebSocket API + +### Route Settings +Represents a collection of route settings. + +```ts +declare const api: apigwv2.HttpApi; + +new apigwv2.HttpStage(this, 'Stage', { + httpApi: api, + throttle: { + rateLimit: 1000, + burstLimit: 1000, + }, + detailedMetricsEnabled: true, +}); +``` diff --git a/packages/aws-cdk-lib/aws-apigatewayv2/lib/common/stage.ts b/packages/aws-cdk-lib/aws-apigatewayv2/lib/common/stage.ts index 3eca733715514..be436d2332d33 100644 --- a/packages/aws-cdk-lib/aws-apigatewayv2/lib/common/stage.ts +++ b/packages/aws-cdk-lib/aws-apigatewayv2/lib/common/stage.ts @@ -73,6 +73,13 @@ export interface StageOptions { * @default - no description */ readonly description?: string; + + /** + * Specifies whether detailed metrics are enabled. + * + * @default false + */ + readonly detailedMetricsEnabled?: boolean; } /** diff --git a/packages/aws-cdk-lib/aws-apigatewayv2/lib/http/stage.ts b/packages/aws-cdk-lib/aws-apigatewayv2/lib/http/stage.ts index 4c4fafb9d7d76..85fbcd595a16c 100644 --- a/packages/aws-cdk-lib/aws-apigatewayv2/lib/http/stage.ts +++ b/packages/aws-cdk-lib/aws-apigatewayv2/lib/http/stage.ts @@ -171,10 +171,11 @@ export class HttpStage extends HttpStageBase { apiId: props.httpApi.apiId, stageName: this.physicalName, autoDeploy: props.autoDeploy, - defaultRouteSettings: !props.throttle ? undefined : { + defaultRouteSettings: props.throttle || props.detailedMetricsEnabled ? { throttlingBurstLimit: props.throttle?.burstLimit, throttlingRateLimit: props.throttle?.rateLimit, - }, + detailedMetricsEnabled: props.detailedMetricsEnabled, + } : undefined, description: props.description, }); diff --git a/packages/aws-cdk-lib/aws-apigatewayv2/lib/websocket/stage.ts b/packages/aws-cdk-lib/aws-apigatewayv2/lib/websocket/stage.ts index 1db7bf126427f..82c53670783a4 100644 --- a/packages/aws-cdk-lib/aws-apigatewayv2/lib/websocket/stage.ts +++ b/packages/aws-cdk-lib/aws-apigatewayv2/lib/websocket/stage.ts @@ -95,10 +95,11 @@ export class WebSocketStage extends StageBase implements IWebSocketStage { apiId: props.webSocketApi.apiId, stageName: this.physicalName, autoDeploy: props.autoDeploy, - defaultRouteSettings: !props.throttle ? undefined : { + defaultRouteSettings: props.throttle || props.detailedMetricsEnabled ? { throttlingBurstLimit: props.throttle?.burstLimit, throttlingRateLimit: props.throttle?.rateLimit, - }, + detailedMetricsEnabled: props.detailedMetricsEnabled, + } : undefined, description: props.description, }); diff --git a/packages/aws-cdk-lib/aws-apigatewayv2/test/http/stage.test.ts b/packages/aws-cdk-lib/aws-apigatewayv2/test/http/stage.test.ts index 357b4617f11ba..e18c374bc7c32 100644 --- a/packages/aws-cdk-lib/aws-apigatewayv2/test/http/stage.test.ts +++ b/packages/aws-cdk-lib/aws-apigatewayv2/test/http/stage.test.ts @@ -4,13 +4,18 @@ import { Metric } from '../../../aws-cloudwatch'; import { Stack } from '../../../core'; import { DomainName, HttpApi, HttpStage } from '../../lib'; +let stack: Stack; +let api: HttpApi; + +beforeEach(() => { + stack = new Stack(); + api = new HttpApi(stack, 'Api', { + createDefaultStage: false, + }); +}); + describe('HttpStage', () => { test('default', () => { - const stack = new Stack(); - const api = new HttpApi(stack, 'Api', { - createDefaultStage: false, - }); - new HttpStage(stack, 'Stage', { httpApi: api, }); @@ -22,11 +27,6 @@ describe('HttpStage', () => { }); test('import', () => { - const stack = new Stack(); - const api = new HttpApi(stack, 'Api', { - createDefaultStage: false, - }); - const stage = new HttpStage(stack, 'Stage', { httpApi: api, }); @@ -40,11 +40,6 @@ describe('HttpStage', () => { }); test('url returns the correct path', () => { - const stack = new Stack(); - const api = new HttpApi(stack, 'Api', { - createDefaultStage: false, - }); - const defaultStage = new HttpStage(stack, 'DefaultStage', { httpApi: api, }); @@ -60,10 +55,6 @@ describe('HttpStage', () => { test('get metric', () => { // GIVEN - const stack = new Stack(); - const api = new HttpApi(stack, 'test-api', { - createDefaultStage: false, - }); const stage = new HttpStage(stack, 'Stage', { httpApi: api, }); @@ -86,10 +77,6 @@ describe('HttpStage', () => { test('Exercise metrics', () => { // GIVEN - const stack = new Stack(); - const api = new HttpApi(stack, 'test-api', { - createDefaultStage: false, - }); const stage = new HttpStage(stack, 'Stage', { httpApi: api, }); @@ -123,11 +110,6 @@ describe('HttpStage with domain mapping', () => { const certArn = 'arn:aws:acm:us-east-1:111111111111:certificate'; test('domainUrl returns the correct path', () => { - const stack = new Stack(); - const api = new HttpApi(stack, 'Api', { - createDefaultStage: false, - }); - const dn = new DomainName(stack, 'DN', { domainName, certificate: Certificate.fromCertificateArn(stack, 'cert', certArn), @@ -148,11 +130,6 @@ describe('HttpStage with domain mapping', () => { }); test('domainUrl throws error if domainMapping is not configured', () => { - const stack = new Stack(); - const api = new HttpApi(stack, 'Api', { - createDefaultStage: false, - }); - const stage = new HttpStage(stack, 'DefaultStage', { httpApi: api, }); @@ -165,12 +142,44 @@ describe('HttpStage with domain mapping', () => { }); test('correctly sets throttle settings', () => { - // GIVEN - const stack = new Stack(); - const api = new HttpApi(stack, 'Api', { - createDefaultStage: false, + // WHEN + new HttpStage(stack, 'DefaultStage', { + httpApi: api, + throttle: { + burstLimit: 1000, + rateLimit: 1000, + }, + }); + + // THEN + Template.fromStack(stack).hasResourceProperties('AWS::ApiGatewayV2::Stage', { + ApiId: stack.resolve(api.apiId), + StageName: '$default', + DefaultRouteSettings: { + ThrottlingBurstLimit: 1000, + ThrottlingRateLimit: 1000, + }, + }); + }); + + test('correctly sets details metrics settings', () => { + // WHEN + new HttpStage(stack, 'DefaultStage', { + httpApi: api, + detailedMetricsEnabled: true, }); + // THEN + Template.fromStack(stack).hasResourceProperties('AWS::ApiGatewayV2::Stage', { + ApiId: stack.resolve(api.apiId), + StageName: '$default', + DefaultRouteSettings: { + DetailedMetricsEnabled: true, + }, + }); + }); + + test('correctly sets route settings', () => { // WHEN new HttpStage(stack, 'DefaultStage', { httpApi: api, @@ -178,6 +187,7 @@ describe('HttpStage with domain mapping', () => { burstLimit: 1000, rateLimit: 1000, }, + detailedMetricsEnabled: true, }); // THEN @@ -187,17 +197,12 @@ describe('HttpStage with domain mapping', () => { DefaultRouteSettings: { ThrottlingBurstLimit: 1000, ThrottlingRateLimit: 1000, + DetailedMetricsEnabled: true, }, }); }); test('specify description', () => { - // GIVEN - const stack = new Stack(); - const api = new HttpApi(stack, 'Api', { - createDefaultStage: false, - }); - // WHEN new HttpStage(stack, 'DefaultStage', { httpApi: api, diff --git a/packages/aws-cdk-lib/aws-apigatewayv2/test/websocket/stage.test.ts b/packages/aws-cdk-lib/aws-apigatewayv2/test/websocket/stage.test.ts index 549f7c02b2c91..10535d3e59d27 100644 --- a/packages/aws-cdk-lib/aws-apigatewayv2/test/websocket/stage.test.ts +++ b/packages/aws-cdk-lib/aws-apigatewayv2/test/websocket/stage.test.ts @@ -3,12 +3,16 @@ import { User } from '../../../aws-iam'; import { Stack } from '../../../core'; import { WebSocketApi, WebSocketStage } from '../../lib'; +let stack: Stack; +let api: WebSocketApi; + +beforeEach(() => { + stack = new Stack(); + api = new WebSocketApi(stack, 'Api'); +}); + describe('WebSocketStage', () => { test('default', () => { - // GIVEN - const stack = new Stack(); - const api = new WebSocketApi(stack, 'Api'); - // WHEN const defaultStage = new WebSocketStage(stack, 'Stage', { webSocketApi: api, @@ -24,10 +28,6 @@ describe('WebSocketStage', () => { }); test('import', () => { - // GIVEN - const stack = new Stack(); - const api = new WebSocketApi(stack, 'Api'); - // WHEN const stage = new WebSocketStage(stack, 'Stage', { webSocketApi: api, @@ -46,10 +46,6 @@ describe('WebSocketStage', () => { }); test('callback URL', () => { - // GIVEN - const stack = new Stack(); - const api = new WebSocketApi(stack, 'Api'); - // WHEN const defaultStage = new WebSocketStage(stack, 'Stage', { webSocketApi: api, @@ -64,8 +60,6 @@ describe('WebSocketStage', () => { describe('grantManageConnections', () => { test('adds an IAM policy to the principal', () => { // GIVEN - const stack = new Stack(); - const api = new WebSocketApi(stack, 'Api'); const defaultStage = new WebSocketStage(stack, 'Stage', { webSocketApi: api, stageName: 'dev', @@ -109,10 +103,46 @@ describe('WebSocketStage', () => { }); test('correctly sets throttle settings', () => { - // GIVEN - const stack = new Stack(); - const api = new WebSocketApi(stack, 'Api'); + // WHEN + new WebSocketStage(stack, 'DefaultStage', { + webSocketApi: api, + stageName: 'dev', + throttle: { + burstLimit: 1000, + rateLimit: 1000, + }, + }); + + // THEN + Template.fromStack(stack).hasResourceProperties('AWS::ApiGatewayV2::Stage', { + ApiId: stack.resolve(api.apiId), + StageName: 'dev', + DefaultRouteSettings: { + ThrottlingBurstLimit: 1000, + ThrottlingRateLimit: 1000, + }, + }); + }); + test('correctly sets details metrics settings', () => { + // WHEN + new WebSocketStage(stack, 'DefaultStage', { + webSocketApi: api, + stageName: 'dev', + detailedMetricsEnabled: true, + }); + + // THEN + Template.fromStack(stack).hasResourceProperties('AWS::ApiGatewayV2::Stage', { + ApiId: stack.resolve(api.apiId), + StageName: 'dev', + DefaultRouteSettings: { + DetailedMetricsEnabled: true, + }, + }); + }); + + test('correctly sets route settings', () => { // WHEN new WebSocketStage(stack, 'DefaultStage', { webSocketApi: api, @@ -121,6 +151,7 @@ describe('WebSocketStage', () => { burstLimit: 1000, rateLimit: 1000, }, + detailedMetricsEnabled: true, }); // THEN @@ -130,15 +161,12 @@ describe('WebSocketStage', () => { DefaultRouteSettings: { ThrottlingBurstLimit: 1000, ThrottlingRateLimit: 1000, + DetailedMetricsEnabled: true, }, }); }); test('specify description', () => { - // GIVEN - const stack = new Stack(); - const api = new WebSocketApi(stack, 'Api'); - // WHEN new WebSocketStage(stack, 'DefaultStage', { webSocketApi: api,