Repository: open-constructs/aws-cdk-library (language: python)

Issue:
fsx: L2 construct for the FSx for NetApp ONTAP file system
**Is your feature request related to a problem? Please describe.**
Cloudformation supports for creating [FSx for NetApp ONTAP file system](https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/what-is-fsx-ontap.html).
We can create this by using L1 construct `CfnFileSystem` with `OntapConfiguration` props but it is difficult to specify appropriate parameters because there are so many regulations.

**Would you be willing to help with a PR?**
- [x] Yes, absolutely
- [ ] Yes, with some guidance
- [ ] Unfortunately no time :'-(

## Describe the solution you'd like
Add `OntapFileSystem` L2 construct.

## Describe alternatives you've considered
Using L1 construct.

## Additional context
I want use `aws-cdk-lib` v2.147.0 or more.


Discussion / hints:

Fix patch:
diff --git a/API.md b/API.md
index 7d4397a..00afabc 100644
--- a/API.md
+++ b/API.md
@@ -832,6 +832,294 @@ The namespace name.
 ---
 
 
+### OntapFileSystem <a name="OntapFileSystem" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem"></a>
+
+The FSx for NetApp ONTAP File System implementation of IFileSystem.
+
+> [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html)
+
+#### Initializers <a name="Initializers" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.Initializer"></a>
+
+```typescript
+import { aws_fsx } from '@open-constructs/aws-cdk'
+
+new aws_fsx.OntapFileSystem(scope: Construct, id: string, props: OntapFileSystemProps)
+```
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.Initializer.parameter.scope">scope</a></code> | <code>constructs.Construct</code> | *No description.* |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.Initializer.parameter.id">id</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.Initializer.parameter.props">props</a></code> | <code>@open-constructs/aws-cdk.aws_fsx.OntapFileSystemProps</code> | *No description.* |
+
+---
+
+##### `scope`<sup>Required</sup> <a name="scope" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.Initializer.parameter.scope"></a>
+
+- *Type:* constructs.Construct
+
+---
+
+##### `id`<sup>Required</sup> <a name="id" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.Initializer.parameter.id"></a>
+
+- *Type:* string
+
+---
+
+##### `props`<sup>Required</sup> <a name="props" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.Initializer.parameter.props"></a>
+
+- *Type:* @open-constructs/aws-cdk.aws_fsx.OntapFileSystemProps
+
+---
+
+#### Methods <a name="Methods" id="Methods"></a>
+
+| **Name** | **Description** |
+| --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.toString">toString</a></code> | Returns a string representation of this construct. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.applyRemovalPolicy">applyRemovalPolicy</a></code> | Apply the given removal policy to this resource. |
+
+---
+
+##### `toString` <a name="toString" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.toString"></a>
+
+```typescript
+public toString(): string
+```
+
+Returns a string representation of this construct.
+
+##### `applyRemovalPolicy` <a name="applyRemovalPolicy" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.applyRemovalPolicy"></a>
+
+```typescript
+public applyRemovalPolicy(policy: RemovalPolicy): void
+```
+
+Apply the given removal policy to this resource.
+
+The Removal Policy controls what happens to this resource when it stops
+being managed by CloudFormation, either because you've removed it from the
+CDK application or because you've made a change that requires the resource
+to be replaced.
+
+The resource can be deleted (`RemovalPolicy.DESTROY`), or left in your AWS
+account for data recovery and cleanup later (`RemovalPolicy.RETAIN`).
+
+###### `policy`<sup>Required</sup> <a name="policy" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.applyRemovalPolicy.parameter.policy"></a>
+
+- *Type:* aws-cdk-lib.RemovalPolicy
+
+---
+
+#### Static Functions <a name="Static Functions" id="Static Functions"></a>
+
+| **Name** | **Description** |
+| --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.isConstruct">isConstruct</a></code> | Checks if `x` is a construct. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.isOwnedResource">isOwnedResource</a></code> | Returns true if the construct was created by CDK, and false otherwise. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.isResource">isResource</a></code> | Check whether the given construct is a Resource. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.fromOntapFileSystemAttributes">fromOntapFileSystemAttributes</a></code> | Import an existing FSx for NetApp ONTAP file system from the given properties. |
+
+---
+
+##### `isConstruct` <a name="isConstruct" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.isConstruct"></a>
+
+```typescript
+import { aws_fsx } from '@open-constructs/aws-cdk'
+
+aws_fsx.OntapFileSystem.isConstruct(x: any)
+```
+
+Checks if `x` is a construct.
+
+Use this method instead of `instanceof` to properly detect `Construct`
+instances, even when the construct library is symlinked.
+
+Explanation: in JavaScript, multiple copies of the `constructs` library on
+disk are seen as independent, completely different libraries. As a
+consequence, the class `Construct` in each copy of the `constructs` library
+is seen as a different class, and an instance of one class will not test as
+`instanceof` the other class. `npm install` will not create installations
+like this, but users may manually symlink construct libraries together or
+use a monorepo tool: in those cases, multiple copies of the `constructs`
+library can be accidentally installed, and `instanceof` will behave
+unpredictably. It is safest to avoid using `instanceof`, and using
+this type-testing method instead.
+
+###### `x`<sup>Required</sup> <a name="x" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.isConstruct.parameter.x"></a>
+
+- *Type:* any
+
+Any object.
+
+---
+
+##### `isOwnedResource` <a name="isOwnedResource" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.isOwnedResource"></a>
+
+```typescript
+import { aws_fsx } from '@open-constructs/aws-cdk'
+
+aws_fsx.OntapFileSystem.isOwnedResource(construct: IConstruct)
+```
+
+Returns true if the construct was created by CDK, and false otherwise.
+
+###### `construct`<sup>Required</sup> <a name="construct" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.isOwnedResource.parameter.construct"></a>
+
+- *Type:* constructs.IConstruct
+
+---
+
+##### `isResource` <a name="isResource" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.isResource"></a>
+
+```typescript
+import { aws_fsx } from '@open-constructs/aws-cdk'
+
+aws_fsx.OntapFileSystem.isResource(construct: IConstruct)
+```
+
+Check whether the given construct is a Resource.
+
+###### `construct`<sup>Required</sup> <a name="construct" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.isResource.parameter.construct"></a>
+
+- *Type:* constructs.IConstruct
+
+---
+
+##### `fromOntapFileSystemAttributes` <a name="fromOntapFileSystemAttributes" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.fromOntapFileSystemAttributes"></a>
+
+```typescript
+import { aws_fsx } from '@open-constructs/aws-cdk'
+
+aws_fsx.OntapFileSystem.fromOntapFileSystemAttributes(scope: Construct, id: string, attrs: FileSystemAttributes)
+```
+
+Import an existing FSx for NetApp ONTAP file system from the given properties.
+
+###### `scope`<sup>Required</sup> <a name="scope" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.fromOntapFileSystemAttributes.parameter.scope"></a>
+
+- *Type:* constructs.Construct
+
+---
+
+###### `id`<sup>Required</sup> <a name="id" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.fromOntapFileSystemAttributes.parameter.id"></a>
+
+- *Type:* string
+
+---
+
+###### `attrs`<sup>Required</sup> <a name="attrs" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.fromOntapFileSystemAttributes.parameter.attrs"></a>
+
+- *Type:* aws-cdk-lib.aws_fsx.FileSystemAttributes
+
+---
+
+#### Properties <a name="Properties" id="Properties"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.node">node</a></code> | <code>constructs.Node</code> | The tree node. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.env">env</a></code> | <code>aws-cdk-lib.ResourceEnvironment</code> | The environment this resource belongs to. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.stack">stack</a></code> | <code>aws-cdk-lib.Stack</code> | The stack in which this resource is defined. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.connections">connections</a></code> | <code>aws-cdk-lib.aws_ec2.Connections</code> | The security groups/rules used to allow network connections to the file system. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.dnsName">dnsName</a></code> | <code>string</code> | The management endpoint DNS name assigned to this file system. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.fileSystemId">fileSystemId</a></code> | <code>string</code> | The ID that AWS assigns to the file system. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.interClusterDnsName">interClusterDnsName</a></code> | <code>string</code> | The inter cluster endpoint DNS name assigned to this file system. |
+
+---
+
+##### `node`<sup>Required</sup> <a name="node" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.node"></a>
+
+```typescript
+public readonly node: Node;
+```
+
+- *Type:* constructs.Node
+
+The tree node.
+
+---
+
+##### `env`<sup>Required</sup> <a name="env" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.env"></a>
+
+```typescript
+public readonly env: ResourceEnvironment;
+```
+
+- *Type:* aws-cdk-lib.ResourceEnvironment
+
+The environment this resource belongs to.
+
+For resources that are created and managed by the CDK
+(generally, those created by creating new class instances like Role, Bucket, etc.),
+this is always the same as the environment of the stack they belong to;
+however, for imported resources
+(those obtained from static methods like fromRoleArn, fromBucketName, etc.),
+that might be different than the stack they were imported into.
+
+---
+
+##### `stack`<sup>Required</sup> <a name="stack" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.stack"></a>
+
+```typescript
+public readonly stack: Stack;
+```
+
+- *Type:* aws-cdk-lib.Stack
+
+The stack in which this resource is defined.
+
+---
+
+##### `connections`<sup>Required</sup> <a name="connections" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.connections"></a>
+
+```typescript
+public readonly connections: Connections;
+```
+
+- *Type:* aws-cdk-lib.aws_ec2.Connections
+
+The security groups/rules used to allow network connections to the file system.
+
+---
+
+##### `dnsName`<sup>Required</sup> <a name="dnsName" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.dnsName"></a>
+
+```typescript
+public readonly dnsName: string;
+```
+
+- *Type:* string
+
+The management endpoint DNS name assigned to this file system.
+
+---
+
+##### `fileSystemId`<sup>Required</sup> <a name="fileSystemId" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.fileSystemId"></a>
+
+```typescript
+public readonly fileSystemId: string;
+```
+
+- *Type:* string
+
+The ID that AWS assigns to the file system.
+
+---
+
+##### `interClusterDnsName`<sup>Required</sup> <a name="interClusterDnsName" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystem.property.interClusterDnsName"></a>
+
+```typescript
+public readonly interClusterDnsName: string;
+```
+
+- *Type:* string
+
+The inter cluster endpoint DNS name assigned to this file system.
+
+---
+
+
 ### Workgroup <a name="Workgroup" id="@open-constructs/aws-cdk.aws_redshiftserverless.Workgroup"></a>
 
 - *Implements:* @open-constructs/aws-cdk.aws_redshiftserverless.IWorkgroup
@@ -1266,71 +1554,116 @@ The granularity of the line items in the report.
 
 ---
 
-### InstanceConnectEndpointAttributes <a name="InstanceConnectEndpointAttributes" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpointAttributes"></a>
+### DailyAutomaticBackupStartTimeProps <a name="DailyAutomaticBackupStartTimeProps" id="@open-constructs/aws-cdk.aws_fsx.DailyAutomaticBackupStartTimeProps"></a>
 
-Attributes for importing an EC2 Instance Connect Endpoint.
+Properties required for setting up a daily automatic backup time.
 
-#### Initializer <a name="Initializer" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpointAttributes.Initializer"></a>
+#### Initializer <a name="Initializer" id="@open-constructs/aws-cdk.aws_fsx.DailyAutomaticBackupStartTimeProps.Initializer"></a>
 
 ```typescript
-import { aws_ec2 } from '@open-constructs/aws-cdk'
+import { aws_fsx } from '@open-constructs/aws-cdk'
 
-const instanceConnectEndpointAttributes: aws_ec2.InstanceConnectEndpointAttributes = { ... }
+const dailyAutomaticBackupStartTimeProps: aws_fsx.DailyAutomaticBackupStartTimeProps = { ... }
 ```
 
 #### Properties <a name="Properties" id="Properties"></a>
 
 | **Name** | **Type** | **Description** |
 | --- | --- | --- |
-| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpointAttributes.property.instanceConnectEndpointId">instanceConnectEndpointId</a></code> | <code>string</code> | The ID of the EC2 Instance Connect Endpoint. |
-| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpointAttributes.property.securityGroups">securityGroups</a></code> | <code>aws-cdk-lib.aws_ec2.ISecurityGroup[]</code> | The security groups associated with the EC2 Instance Connect Endpoint. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.DailyAutomaticBackupStartTimeProps.property.hour">hour</a></code> | <code>number</code> | The hour of the day (from 0-23) for automatic backup starts. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.DailyAutomaticBackupStartTimeProps.property.minute">minute</a></code> | <code>number</code> | The minute of the hour (from 0-59) for automatic backup starts. |
 
 ---
 
-##### `instanceConnectEndpointId`<sup>Required</sup> <a name="instanceConnectEndpointId" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpointAttributes.property.instanceConnectEndpointId"></a>
+##### `hour`<sup>Required</sup> <a name="hour" id="@open-constructs/aws-cdk.aws_fsx.DailyAutomaticBackupStartTimeProps.property.hour"></a>
 
 ```typescript
-public readonly instanceConnectEndpointId: string;
+public readonly hour: number;
 ```
 
-- *Type:* string
+- *Type:* number
 
-The ID of the EC2 Instance Connect Endpoint.
+The hour of the day (from 0-23) for automatic backup starts.
 
 ---
 
-##### `securityGroups`<sup>Required</sup> <a name="securityGroups" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpointAttributes.property.securityGroups"></a>
+##### `minute`<sup>Required</sup> <a name="minute" id="@open-constructs/aws-cdk.aws_fsx.DailyAutomaticBackupStartTimeProps.property.minute"></a>
 
 ```typescript
-public readonly securityGroups: ISecurityGroup[];
+public readonly minute: number;
 ```
 
-- *Type:* aws-cdk-lib.aws_ec2.ISecurityGroup[]
+- *Type:* number
 
-The security groups associated with the EC2 Instance Connect Endpoint.
+The minute of the hour (from 0-59) for automatic backup starts.
 
 ---
 
-### InstanceConnectEndpointProps <a name="InstanceConnectEndpointProps" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpointProps"></a>
+### InstanceConnectEndpointAttributes <a name="InstanceConnectEndpointAttributes" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpointAttributes"></a>
 
-Properties for defining an EC2 Instance Connect Endpoint.
+Attributes for importing an EC2 Instance Connect Endpoint.
 
-#### Initializer <a name="Initializer" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpointProps.Initializer"></a>
+#### Initializer <a name="Initializer" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpointAttributes.Initializer"></a>
 
 ```typescript
 import { aws_ec2 } from '@open-constructs/aws-cdk'
 
-const instanceConnectEndpointProps: aws_ec2.InstanceConnectEndpointProps = { ... }
+const instanceConnectEndpointAttributes: aws_ec2.InstanceConnectEndpointAttributes = { ... }
 ```
 
 #### Properties <a name="Properties" id="Properties"></a>
 
 | **Name** | **Type** | **Description** |
 | --- | --- | --- |
-| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpointProps.property.vpc">vpc</a></code> | <code>aws-cdk-lib.aws_ec2.IVpc</code> | The VPC in which the EC2 Instance Connect Endpoint is created. |
-| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpointProps.property.clientToken">clientToken</a></code> | <code>string</code> | Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. |
-| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpointProps.property.preserveClientIp">preserveClientIp</a></code> | <code>boolean</code> | Indicates whether your client's IP address is preserved as the source. |
-| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpointProps.property.securityGroups">securityGroups</a></code> | <code>aws-cdk-lib.aws_ec2.ISecurityGroup[]</code> | The security groups to associate with the EC2 Instance Connect Endpoint. |
+| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpointAttributes.property.instanceConnectEndpointId">instanceConnectEndpointId</a></code> | <code>string</code> | The ID of the EC2 Instance Connect Endpoint. |
+| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpointAttributes.property.securityGroups">securityGroups</a></code> | <code>aws-cdk-lib.aws_ec2.ISecurityGroup[]</code> | The security groups associated with the EC2 Instance Connect Endpoint. |
+
+---
+
+##### `instanceConnectEndpointId`<sup>Required</sup> <a name="instanceConnectEndpointId" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpointAttributes.property.instanceConnectEndpointId"></a>
+
+```typescript
+public readonly instanceConnectEndpointId: string;
+```
+
+- *Type:* string
+
+The ID of the EC2 Instance Connect Endpoint.
+
+---
+
+##### `securityGroups`<sup>Required</sup> <a name="securityGroups" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpointAttributes.property.securityGroups"></a>
+
+```typescript
+public readonly securityGroups: ISecurityGroup[];
+```
+
+- *Type:* aws-cdk-lib.aws_ec2.ISecurityGroup[]
+
+The security groups associated with the EC2 Instance Connect Endpoint.
+
+---
+
+### InstanceConnectEndpointProps <a name="InstanceConnectEndpointProps" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpointProps"></a>
+
+Properties for defining an EC2 Instance Connect Endpoint.
+
+#### Initializer <a name="Initializer" id="@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpointProps.Initializer"></a>
+
+```typescript
+import { aws_ec2 } from '@open-constructs/aws-cdk'
+
+const instanceConnectEndpointProps: aws_ec2.InstanceConnectEndpointProps = { ... }
+```
+
+#### Properties <a name="Properties" id="Properties"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpointProps.property.vpc">vpc</a></code> | <code>aws-cdk-lib.aws_ec2.IVpc</code> | The VPC in which the EC2 Instance Connect Endpoint is created. |
+| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpointProps.property.clientToken">clientToken</a></code> | <code>string</code> | Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. |
+| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpointProps.property.preserveClientIp">preserveClientIp</a></code> | <code>boolean</code> | Indicates whether your client's IP address is preserved as the source. |
+| <code><a href="#@open-constructs/aws-cdk.aws_ec2.InstanceConnectEndpointProps.property.securityGroups">securityGroups</a></code> | <code>aws-cdk-lib.aws_ec2.ISecurityGroup[]</code> | The security groups to associate with the EC2 Instance Connect Endpoint. |
 
 ---
 
@@ -1388,6 +1721,64 @@ The security groups to associate with the EC2 Instance Connect Endpoint.
 
 ---
 
+### MaintenanceTimeProps <a name="MaintenanceTimeProps" id="@open-constructs/aws-cdk.aws_fsx.MaintenanceTimeProps"></a>
+
+Properties required for setting up a weekly maintenance time.
+
+#### Initializer <a name="Initializer" id="@open-constructs/aws-cdk.aws_fsx.MaintenanceTimeProps.Initializer"></a>
+
+```typescript
+import { aws_fsx } from '@open-constructs/aws-cdk'
+
+const maintenanceTimeProps: aws_fsx.MaintenanceTimeProps = { ... }
+```
+
+#### Properties <a name="Properties" id="Properties"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.MaintenanceTimeProps.property.day">day</a></code> | <code>aws-cdk-lib.aws_fsx.Weekday</code> | The day of the week for maintenance to be performed. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.MaintenanceTimeProps.property.hour">hour</a></code> | <code>number</code> | The hour of the day (from 0-23) for maintenance to be performed. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.MaintenanceTimeProps.property.minute">minute</a></code> | <code>number</code> | The minute of the hour (from 0-59) for maintenance to be performed. |
+
+---
+
+##### `day`<sup>Required</sup> <a name="day" id="@open-constructs/aws-cdk.aws_fsx.MaintenanceTimeProps.property.day"></a>
+
+```typescript
+public readonly day: Weekday;
+```
+
+- *Type:* aws-cdk-lib.aws_fsx.Weekday
+
+The day of the week for maintenance to be performed.
+
+---
+
+##### `hour`<sup>Required</sup> <a name="hour" id="@open-constructs/aws-cdk.aws_fsx.MaintenanceTimeProps.property.hour"></a>
+
+```typescript
+public readonly hour: number;
+```
+
+- *Type:* number
+
+The hour of the day (from 0-23) for maintenance to be performed.
+
+---
+
+##### `minute`<sup>Required</sup> <a name="minute" id="@open-constructs/aws-cdk.aws_fsx.MaintenanceTimeProps.property.minute"></a>
+
+```typescript
+public readonly minute: number;
+```
+
+- *Type:* number
+
+The minute of the hour (from 0-59) for maintenance to be performed.
+
+---
+
 ### NamespaceAttributes <a name="NamespaceAttributes" id="@open-constructs/aws-cdk.aws_redshiftserverless.NamespaceAttributes"></a>
 
 Attributes for importing a Redshift Serverless Namespace.
@@ -1602,120 +1993,259 @@ The namespace name.
 
 ---
 
-### WorkgroupAttributes <a name="WorkgroupAttributes" id="@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupAttributes"></a>
+### OntapConfiguration <a name="OntapConfiguration" id="@open-constructs/aws-cdk.aws_fsx.OntapConfiguration"></a>
 
-Attributes for importing a Redshift Serverless Workgroup.
+The configuration for the Amazon FSx for NetApp ONTAP file system.
 
-#### Initializer <a name="Initializer" id="@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupAttributes.Initializer"></a>
+> [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-ontapconfiguration.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-ontapconfiguration.html)
+
+#### Initializer <a name="Initializer" id="@open-constructs/aws-cdk.aws_fsx.OntapConfiguration.Initializer"></a>
 
 ```typescript
-import { aws_redshiftserverless } from '@open-constructs/aws-cdk'
+import { aws_fsx } from '@open-constructs/aws-cdk'
 
-const workgroupAttributes: aws_redshiftserverless.WorkgroupAttributes = { ... }
+const ontapConfiguration: aws_fsx.OntapConfiguration = { ... }
 ```
 
 #### Properties <a name="Properties" id="Properties"></a>
 
 | **Name** | **Type** | **Description** |
 | --- | --- | --- |
-| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupAttributes.property.endpointAddress">endpointAddress</a></code> | <code>string</code> | The workgroup endpoint address. |
-| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupAttributes.property.port">port</a></code> | <code>number</code> | The workgroup port. |
-| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupAttributes.property.securityGroups">securityGroups</a></code> | <code>aws-cdk-lib.aws_ec2.ISecurityGroup[]</code> | The security groups associated with the Redshift Serverless Workgroup. |
-| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupAttributes.property.workgroupId">workgroupId</a></code> | <code>string</code> | The workgroup id. |
-| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupAttributes.property.workgroupName">workgroupName</a></code> | <code>string</code> | The workgroup name. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapConfiguration.property.automaticBackupRetention">automaticBackupRetention</a></code> | <code>aws-cdk-lib.Duration</code> | The number of days to retain automatic backups. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapConfiguration.property.dailyAutomaticBackupStartTime">dailyAutomaticBackupStartTime</a></code> | <code>@open-constructs/aws-cdk.aws_fsx.DailyAutomaticBackupStartTime</code> | Start time for 30-minute daily automatic backup window in Coordinated Universal Time (UTC). |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapConfiguration.property.deploymentType">deploymentType</a></code> | <code>@open-constructs/aws-cdk.aws_fsx.OntapDeploymentType</code> | The FSx for ONTAP file system deployment type to use in creating the file system. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapConfiguration.property.diskIops">diskIops</a></code> | <code>number</code> | The total number of SSD IOPS provisioned for the file system. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapConfiguration.property.endpointIpAddressRange">endpointIpAddressRange</a></code> | <code>string</code> | The IP address range in which the endpoints to access your file system will be created. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapConfiguration.property.fsxAdminPassword">fsxAdminPassword</a></code> | <code>aws-cdk-lib.SecretValue</code> | The ONTAP administrative password for the `fsxadmin` user with which you administer your file system using the NetApp ONTAP CLI and REST API. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapConfiguration.property.haPairs">haPairs</a></code> | <code>number</code> | How many high-availability (HA) pairs of file servers will power your file system. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapConfiguration.property.preferredSubnet">preferredSubnet</a></code> | <code>aws-cdk-lib.aws_ec2.ISubnet</code> | The subnet in which you want the preferred file server to be located. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapConfiguration.property.routeTables">routeTables</a></code> | <code>aws-cdk-lib.aws_ec2.IRouteTable[]</code> | The route tables in which Amazon FSx creates the rules for routing traffic to the correct file server. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapConfiguration.property.throughputCapacityPerHaPair">throughputCapacityPerHaPair</a></code> | <code>@open-constructs/aws-cdk.aws_fsx.ThroughputCapacityPerHaPair</code> | The throughput capacity per HA pair for the file system. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapConfiguration.property.weeklyMaintenanceStartTime">weeklyMaintenanceStartTime</a></code> | <code>@open-constructs/aws-cdk.aws_fsx.MaintenanceTime</code> | The preferred day and time to perform weekly maintenance. |
 
 ---
 
-##### `endpointAddress`<sup>Required</sup> <a name="endpointAddress" id="@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupAttributes.property.endpointAddress"></a>
+##### `automaticBackupRetention`<sup>Optional</sup> <a name="automaticBackupRetention" id="@open-constructs/aws-cdk.aws_fsx.OntapConfiguration.property.automaticBackupRetention"></a>
 
 ```typescript
-public readonly endpointAddress: string;
+public readonly automaticBackupRetention: Duration;
+```
+
+- *Type:* aws-cdk-lib.Duration
+- *Default:* 30 days
+
+The number of days to retain automatic backups.
+
+Setting this property to 0 disables automatic backups.
+You can retain automatic backups for a maximum of 90 days.
+
+---
+
+##### `dailyAutomaticBackupStartTime`<sup>Optional</sup> <a name="dailyAutomaticBackupStartTime" id="@open-constructs/aws-cdk.aws_fsx.OntapConfiguration.property.dailyAutomaticBackupStartTime"></a>
+
+```typescript
+public readonly dailyAutomaticBackupStartTime: DailyAutomaticBackupStartTime;
+```
+
+- *Type:* @open-constructs/aws-cdk.aws_fsx.DailyAutomaticBackupStartTime
+- *Default:* no backup window
+
+Start time for 30-minute daily automatic backup window in Coordinated Universal Time (UTC).
+
+---
+
+##### `deploymentType`<sup>Optional</sup> <a name="deploymentType" id="@open-constructs/aws-cdk.aws_fsx.OntapConfiguration.property.deploymentType"></a>
+
+```typescript
+public readonly deploymentType: OntapDeploymentType;
+```
+
+- *Type:* @open-constructs/aws-cdk.aws_fsx.OntapDeploymentType
+- *Default:* OntapDeploymentType.MULTI_AZ_2
+
+The FSx for ONTAP file system deployment type to use in creating the file system.
+
+---
+
+##### `diskIops`<sup>Optional</sup> <a name="diskIops" id="@open-constructs/aws-cdk.aws_fsx.OntapConfiguration.property.diskIops"></a>
+
+```typescript
+public readonly diskIops: number;
+```
+
+- *Type:* number
+- *Default:* 3 IOPS * GB of storage capacity * HAPairs
+
+The total number of SSD IOPS provisioned for the file system.
+
+The minimum and maximum values for this property depend on the value of HAPairs and StorageCapacity.
+The minimum value is calculated as StorageCapacity * 3 * HAPairs (3 IOPS per GB of StorageCapacity).
+The maximum value is calculated as 200,000 * HAPairs.
+
+---
+
+##### `endpointIpAddressRange`<sup>Optional</sup> <a name="endpointIpAddressRange" id="@open-constructs/aws-cdk.aws_fsx.OntapConfiguration.property.endpointIpAddressRange"></a>
+
+```typescript
+public readonly endpointIpAddressRange: string;
 ```
 
 - *Type:* string
+- *Default:* an unused IP address range from the 198.19.* range
 
-The workgroup endpoint address.
+The IP address range in which the endpoints to access your file system will be created.
+
+You can have overlapping endpoint IP addresses for file systems deployed in the same VPC/route tables, as long as they don't overlap with any subnet.
 
 ---
 
-##### `port`<sup>Required</sup> <a name="port" id="@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupAttributes.property.port"></a>
+##### `fsxAdminPassword`<sup>Optional</sup> <a name="fsxAdminPassword" id="@open-constructs/aws-cdk.aws_fsx.OntapConfiguration.property.fsxAdminPassword"></a>
 
 ```typescript
-public readonly port: number;
+public readonly fsxAdminPassword: SecretValue;
+```
+
+- *Type:* aws-cdk-lib.SecretValue
+- *Default:* do not set an admin password
+
+The ONTAP administrative password for the `fsxadmin` user with which you administer your file system using the NetApp ONTAP CLI and REST API.
+
+If you don't specify a password, Amazon FSx will not set one. In that case, the user will not be able to log in.
+
+You can change the admin password at any time through the management console.
+
+---
+
+##### `haPairs`<sup>Optional</sup> <a name="haPairs" id="@open-constructs/aws-cdk.aws_fsx.OntapConfiguration.property.haPairs"></a>
+
+```typescript
+public readonly haPairs: number;
 ```
 
 - *Type:* number
+- *Default:* 1
 
-The workgroup port.
+How many high-availability (HA) pairs of file servers will power your file system.
+
+First-generation file systems are powered by 1 HA pair.
+Second-generation multi-AZ file systems are powered by 1 HA pair.
+Second generation single-AZ file systems are powered by up to 12 HA pairs.
+
+The value of this property affects the values of `storageCapacity`, `iops`, and `throughputCapacity`.
+
+Block storage protocol support (iSCSI and NVMe over TCP) is disabled on file systems with more than 6 HA pairs.
+
+> [https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/supported-fsx-clients.html#using-block-storage](https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/supported-fsx-clients.html#using-block-storage)
 
 ---
 
-##### `securityGroups`<sup>Required</sup> <a name="securityGroups" id="@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupAttributes.property.securityGroups"></a>
+##### `preferredSubnet`<sup>Optional</sup> <a name="preferredSubnet" id="@open-constructs/aws-cdk.aws_fsx.OntapConfiguration.property.preferredSubnet"></a>
 
 ```typescript
-public readonly securityGroups: ISecurityGroup[];
+public readonly preferredSubnet: ISubnet;
 ```
 
-- *Type:* aws-cdk-lib.aws_ec2.ISecurityGroup[]
+- *Type:* aws-cdk-lib.aws_ec2.ISubnet
+- *Default:* no default value (This value is not used for single-AZ file systems, but it is required for multi-AZ file systems)
 
-The security groups associated with the Redshift Serverless Workgroup.
+The subnet in which you want the preferred file server to be located.
+
+This value is required when `deploymentType` is set to `MULTI_AZ_1` or `MULTI_AZ_2`.
 
 ---
 
-##### `workgroupId`<sup>Required</sup> <a name="workgroupId" id="@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupAttributes.property.workgroupId"></a>
+##### `routeTables`<sup>Optional</sup> <a name="routeTables" id="@open-constructs/aws-cdk.aws_fsx.OntapConfiguration.property.routeTables"></a>
 
 ```typescript
-public readonly workgroupId: string;
+public readonly routeTables: IRouteTable[];
 ```
 
-- *Type:* string
+- *Type:* aws-cdk-lib.aws_ec2.IRouteTable[]
+- *Default:* Amazon FSx selects your VPC's default route table.
 
-The workgroup id.
+The route tables in which Amazon FSx creates the rules for routing traffic to the correct file server.
+
+You should specify all virtual private cloud (VPC) route tables associated with the subnets in which your clients are located.
+
+Amazon FSx manages VPC route tables for Multi-AZ file systems using tag-based authentication.
+These route tables are tagged with Key: AmazonFSx; Value: ManagedByAmazonFSx.
+
+> [https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/unable-to-access.html#vpc-route-tables-not-tagged](https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/unable-to-access.html#vpc-route-tables-not-tagged)
 
 ---
 
-##### `workgroupName`<sup>Required</sup> <a name="workgroupName" id="@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupAttributes.property.workgroupName"></a>
+##### `throughputCapacityPerHaPair`<sup>Optional</sup> <a name="throughputCapacityPerHaPair" id="@open-constructs/aws-cdk.aws_fsx.OntapConfiguration.property.throughputCapacityPerHaPair"></a>
 
 ```typescript
-public readonly workgroupName: string;
+public readonly throughputCapacityPerHaPair: ThroughputCapacityPerHaPair;
 ```
 
-- *Type:* string
+- *Type:* @open-constructs/aws-cdk.aws_fsx.ThroughputCapacityPerHaPair
+- *Default:* Amazon FSx determines the throughput capacity based on the storage capacity
 
-The workgroup name.
+The throughput capacity per HA pair for the file system.
+
+> [https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/managing-throughput-capacity.html](https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/managing-throughput-capacity.html)
 
 ---
 
-### WorkgroupProps <a name="WorkgroupProps" id="@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps"></a>
+##### `weeklyMaintenanceStartTime`<sup>Optional</sup> <a name="weeklyMaintenanceStartTime" id="@open-constructs/aws-cdk.aws_fsx.OntapConfiguration.property.weeklyMaintenanceStartTime"></a>
 
-Properties for defining a Redshift Serverless Workgroup.
+```typescript
+public readonly weeklyMaintenanceStartTime: MaintenanceTime;
+```
 
-#### Initializer <a name="Initializer" id="@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.Initializer"></a>
+- *Type:* @open-constructs/aws-cdk.aws_fsx.MaintenanceTime
+- *Default:* automatically set by Amazon FSx
+
+The preferred day and time to perform weekly maintenance.
+
+---
+
+### OntapFileSystemProps <a name="OntapFileSystemProps" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystemProps"></a>
+
+Properties specific to the NetApp ONTAP version of the FSx file system.
+
+#### Initializer <a name="Initializer" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystemProps.Initializer"></a>
 
 ```typescript
-import { aws_redshiftserverless } from '@open-constructs/aws-cdk'
+import { aws_fsx } from '@open-constructs/aws-cdk'
 
-const workgroupProps: aws_redshiftserverless.WorkgroupProps = { ... }
+const ontapFileSystemProps: aws_fsx.OntapFileSystemProps = { ... }
 ```
 
 #### Properties <a name="Properties" id="Properties"></a>
 
 | **Name** | **Type** | **Description** |
 | --- | --- | --- |
-| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.vpc">vpc</a></code> | <code>aws-cdk-lib.aws_ec2.IVpc</code> | The VPC to place the workgroup in. |
-| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.baseCapacity">baseCapacity</a></code> | <code>number</code> | The base compute capacity of the workgroup in Redshift Processing Units (RPUs). |
-| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.configParameters">configParameters</a></code> | <code>{[ key: string ]: string}</code> | A list of parameters to set for finer control over a database. |
-| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.enhancedVpcRouting">enhancedVpcRouting</a></code> | <code>boolean</code> | The value that specifies whether to enable enhanced virtual private cloud (VPC) routing, which forces Amazon Redshift Serverless to route traffic through your VPC. |
-| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.namespace">namespace</a></code> | <code>@open-constructs/aws-cdk.aws_redshiftserverless.INamespace</code> | The namespace the workgroup is associated with. |
-| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.port">port</a></code> | <code>number</code> | The custom port to use when connecting to a workgroup. |
-| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.publiclyAccessible">publiclyAccessible</a></code> | <code>boolean</code> | A value that specifies whether the workgroup can be accessible from a public network. |
-| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.securityGroups">securityGroups</a></code> | <code>aws-cdk-lib.aws_ec2.ISecurityGroup[]</code> | The security groups to associate with the workgroup. |
-| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.vpcSubnets">vpcSubnets</a></code> | <code>aws-cdk-lib.aws_ec2.SubnetSelection</code> | Where to place the workgroup within the VPC. |
-| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.workgroupName">workgroupName</a></code> | <code>string</code> | The workgroup name. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystemProps.property.storageCapacityGiB">storageCapacityGiB</a></code> | <code>number</code> | The storage capacity of the file system being created. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystemProps.property.vpc">vpc</a></code> | <code>aws-cdk-lib.aws_ec2.IVpc</code> | The VPC to launch the file system in. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystemProps.property.backupId">backupId</a></code> | <code>string</code> | The ID of the backup. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystemProps.property.kmsKey">kmsKey</a></code> | <code>aws-cdk-lib.aws_kms.IKey</code> | The KMS key used for encryption to protect your data at rest. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystemProps.property.removalPolicy">removalPolicy</a></code> | <code>aws-cdk-lib.RemovalPolicy</code> | Policy to apply when the file system is removed from the stack. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystemProps.property.securityGroup">securityGroup</a></code> | <code>aws-cdk-lib.aws_ec2.ISecurityGroup</code> | Security Group to assign to this file system. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystemProps.property.ontapConfiguration">ontapConfiguration</a></code> | <code>@open-constructs/aws-cdk.aws_fsx.OntapConfiguration</code> | Additional configuration for FSx specific to NetApp ONTAP. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapFileSystemProps.property.vpcSubnets">vpcSubnets</a></code> | <code>aws-cdk-lib.aws_ec2.ISubnet[]</code> | The subnet that the file system will be accessible from. |
 
 ---
 
-##### `vpc`<sup>Required</sup> <a name="vpc" id="@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.vpc"></a>
+##### `storageCapacityGiB`<sup>Required</sup> <a name="storageCapacityGiB" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystemProps.property.storageCapacityGiB"></a>
+
+```typescript
+public readonly storageCapacityGiB: number;
+```
+
+- *Type:* number
+
+The storage capacity of the file system being created.
+
+For Windows file systems, valid values are 32 GiB to 65,536 GiB.
+For SCRATCH_1 deployment types, valid values are 1,200, 2,400, 3,600, then continuing in increments of 3,600 GiB.
+For SCRATCH_2 and PERSISTENT_1 types, valid values are 1,200, 2,400, then continuing in increments of 2,400 GiB.
+
+---
+
+##### `vpc`<sup>Required</sup> <a name="vpc" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystemProps.property.vpc"></a>
 
 ```typescript
 public readonly vpc: IVpc;
@@ -1723,234 +2253,1146 @@ public readonly vpc: IVpc;
 
 - *Type:* aws-cdk-lib.aws_ec2.IVpc
 
-The VPC to place the workgroup in.
+The VPC to launch the file system in.
+
+---
+
+##### `backupId`<sup>Optional</sup> <a name="backupId" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystemProps.property.backupId"></a>
+
+```typescript
+public readonly backupId: string;
+```
+
+- *Type:* string
+- *Default:* no backup will be used.
+
+The ID of the backup.
+
+Specifies the backup to use if you're creating a file system from an existing backup.
+
+---
+
+##### `kmsKey`<sup>Optional</sup> <a name="kmsKey" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystemProps.property.kmsKey"></a>
+
+```typescript
+public readonly kmsKey: IKey;
+```
+
+- *Type:* aws-cdk-lib.aws_kms.IKey
+- *Default:* the aws/fsx default KMS key for the AWS account being deployed into.
+
+The KMS key used for encryption to protect your data at rest.
+
+---
+
+##### `removalPolicy`<sup>Optional</sup> <a name="removalPolicy" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystemProps.property.removalPolicy"></a>
+
+```typescript
+public readonly removalPolicy: RemovalPolicy;
+```
+
+- *Type:* aws-cdk-lib.RemovalPolicy
+- *Default:* RemovalPolicy.RETAIN
+
+Policy to apply when the file system is removed from the stack.
+
+---
+
+##### `securityGroup`<sup>Optional</sup> <a name="securityGroup" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystemProps.property.securityGroup"></a>
+
+```typescript
+public readonly securityGroup: ISecurityGroup;
+```
+
+- *Type:* aws-cdk-lib.aws_ec2.ISecurityGroup
+- *Default:* creates new security group which allows all outbound traffic.
+
+Security Group to assign to this file system.
+
+---
+
+##### `ontapConfiguration`<sup>Required</sup> <a name="ontapConfiguration" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystemProps.property.ontapConfiguration"></a>
+
+```typescript
+public readonly ontapConfiguration: OntapConfiguration;
+```
+
+- *Type:* @open-constructs/aws-cdk.aws_fsx.OntapConfiguration
+
+Additional configuration for FSx specific to NetApp ONTAP.
+
+---
+
+##### `vpcSubnets`<sup>Required</sup> <a name="vpcSubnets" id="@open-constructs/aws-cdk.aws_fsx.OntapFileSystemProps.property.vpcSubnets"></a>
+
+```typescript
+public readonly vpcSubnets: ISubnet[];
+```
+
+- *Type:* aws-cdk-lib.aws_ec2.ISubnet[]
+
+The subnet that the file system will be accessible from.
+
+For MULTI_AZ_1 deployment types,
+provide exactly two subnets, one for the preferred file server and one for the standby file server.
+
+Specify one of these subnets as the preferred subnet using `OntapConfiguration.preferredSubnet` property for multi-AZ file system.
+
+---
+
+### WorkgroupAttributes <a name="WorkgroupAttributes" id="@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupAttributes"></a>
+
+Attributes for importing a Redshift Serverless Workgroup.
+
+#### Initializer <a name="Initializer" id="@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupAttributes.Initializer"></a>
+
+```typescript
+import { aws_redshiftserverless } from '@open-constructs/aws-cdk'
+
+const workgroupAttributes: aws_redshiftserverless.WorkgroupAttributes = { ... }
+```
+
+#### Properties <a name="Properties" id="Properties"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupAttributes.property.endpointAddress">endpointAddress</a></code> | <code>string</code> | The workgroup endpoint address. |
+| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupAttributes.property.port">port</a></code> | <code>number</code> | The workgroup port. |
+| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupAttributes.property.securityGroups">securityGroups</a></code> | <code>aws-cdk-lib.aws_ec2.ISecurityGroup[]</code> | The security groups associated with the Redshift Serverless Workgroup. |
+| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupAttributes.property.workgroupId">workgroupId</a></code> | <code>string</code> | The workgroup id. |
+| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupAttributes.property.workgroupName">workgroupName</a></code> | <code>string</code> | The workgroup name. |
+
+---
+
+##### `endpointAddress`<sup>Required</sup> <a name="endpointAddress" id="@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupAttributes.property.endpointAddress"></a>
+
+```typescript
+public readonly endpointAddress: string;
+```
+
+- *Type:* string
+
+The workgroup endpoint address.
+
+---
+
+##### `port`<sup>Required</sup> <a name="port" id="@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupAttributes.property.port"></a>
+
+```typescript
+public readonly port: number;
+```
+
+- *Type:* number
+
+The workgroup port.
+
+---
+
+##### `securityGroups`<sup>Required</sup> <a name="securityGroups" id="@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupAttributes.property.securityGroups"></a>
+
+```typescript
+public readonly securityGroups: ISecurityGroup[];
+```
+
+- *Type:* aws-cdk-lib.aws_ec2.ISecurityGroup[]
+
+The security groups associated with the Redshift Serverless Workgroup.
+
+---
+
+##### `workgroupId`<sup>Required</sup> <a name="workgroupId" id="@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupAttributes.property.workgroupId"></a>
+
+```typescript
+public readonly workgroupId: string;
+```
+
+- *Type:* string
+
+The workgroup id.
+
+---
+
+##### `workgroupName`<sup>Required</sup> <a name="workgroupName" id="@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupAttributes.property.workgroupName"></a>
+
+```typescript
+public readonly workgroupName: string;
+```
+
+- *Type:* string
+
+The workgroup name.
+
+---
+
+### WorkgroupProps <a name="WorkgroupProps" id="@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps"></a>
+
+Properties for defining a Redshift Serverless Workgroup.
+
+#### Initializer <a name="Initializer" id="@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.Initializer"></a>
+
+```typescript
+import { aws_redshiftserverless } from '@open-constructs/aws-cdk'
+
+const workgroupProps: aws_redshiftserverless.WorkgroupProps = { ... }
+```
+
+#### Properties <a name="Properties" id="Properties"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.vpc">vpc</a></code> | <code>aws-cdk-lib.aws_ec2.IVpc</code> | The VPC to place the workgroup in. |
+| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.baseCapacity">baseCapacity</a></code> | <code>number</code> | The base compute capacity of the workgroup in Redshift Processing Units (RPUs). |
+| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.configParameters">configParameters</a></code> | <code>{[ key: string ]: string}</code> | A list of parameters to set for finer control over a database. |
+| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.enhancedVpcRouting">enhancedVpcRouting</a></code> | <code>boolean</code> | The value that specifies whether to enable enhanced virtual private cloud (VPC) routing, which forces Amazon Redshift Serverless to route traffic through your VPC. |
+| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.namespace">namespace</a></code> | <code>@open-constructs/aws-cdk.aws_redshiftserverless.INamespace</code> | The namespace the workgroup is associated with. |
+| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.port">port</a></code> | <code>number</code> | The custom port to use when connecting to a workgroup. |
+| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.publiclyAccessible">publiclyAccessible</a></code> | <code>boolean</code> | A value that specifies whether the workgroup can be accessible from a public network. |
+| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.securityGroups">securityGroups</a></code> | <code>aws-cdk-lib.aws_ec2.ISecurityGroup[]</code> | The security groups to associate with the workgroup. |
+| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.vpcSubnets">vpcSubnets</a></code> | <code>aws-cdk-lib.aws_ec2.SubnetSelection</code> | Where to place the workgroup within the VPC. |
+| <code><a href="#@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.workgroupName">workgroupName</a></code> | <code>string</code> | The workgroup name. |
+
+---
+
+##### `vpc`<sup>Required</sup> <a name="vpc" id="@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.vpc"></a>
+
+```typescript
+public readonly vpc: IVpc;
+```
+
+- *Type:* aws-cdk-lib.aws_ec2.IVpc
+
+The VPC to place the workgroup in.
+
+`vpc` must have at least 3 subnets, and they must span across 3 Availability Zones.
+
+---
+
+##### `baseCapacity`<sup>Optional</sup> <a name="baseCapacity" id="@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.baseCapacity"></a>
+
+```typescript
+public readonly baseCapacity: number;
+```
+
+- *Type:* number
+- *Default:* 128
+
+The base compute capacity of the workgroup in Redshift Processing Units (RPUs).
+
+You can adjust the base capacity setting from 8 RPUs to 512 RPUs in units of 8.
+Also you can increment or decrement RPUs in units of 32 when setting a base capacity between 512-1024.
+
+> [https://docs.aws.amazon.com/redshift/latest/mgmt/serverless-capacity.html](https://docs.aws.amazon.com/redshift/latest/mgmt/serverless-capacity.html)
+
+---
+
+##### `configParameters`<sup>Optional</sup> <a name="configParameters" id="@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.configParameters"></a>
+
+```typescript
+public readonly configParameters: {[ key: string ]: string};
+```
+
+- *Type:* {[ key: string ]: string}
+- *Default:* no config parameters
+
+A list of parameters to set for finer control over a database.
+
+> [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshiftserverless-workgroup.html#cfn-redshiftserverless-workgroup-configparameters](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshiftserverless-workgroup.html#cfn-redshiftserverless-workgroup-configparameters)
+
+---
+
+##### `enhancedVpcRouting`<sup>Optional</sup> <a name="enhancedVpcRouting" id="@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.enhancedVpcRouting"></a>
+
+```typescript
+public readonly enhancedVpcRouting: boolean;
+```
+
+- *Type:* boolean
+- *Default:* false
+
+The value that specifies whether to enable enhanced virtual private cloud (VPC) routing, which forces Amazon Redshift Serverless to route traffic through your VPC.
+
+---
+
+##### `namespace`<sup>Optional</sup> <a name="namespace" id="@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.namespace"></a>
+
+```typescript
+public readonly namespace: INamespace;
+```
+
+- *Type:* @open-constructs/aws-cdk.aws_redshiftserverless.INamespace
+- *Default:* the workgroup is not associated with any namespace
+
+The namespace the workgroup is associated with.
+
+---
+
+##### `port`<sup>Optional</sup> <a name="port" id="@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.port"></a>
+
+```typescript
+public readonly port: number;
+```
+
+- *Type:* number
+- *Default:* 5439
+
+The custom port to use when connecting to a workgroup.
+
+Valid port ranges are 5431-5455 and 8191-8215.
+
+---
+
+##### `publiclyAccessible`<sup>Optional</sup> <a name="publiclyAccessible" id="@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.publiclyAccessible"></a>
+
+```typescript
+public readonly publiclyAccessible: boolean;
+```
+
+- *Type:* boolean
+- *Default:* false
+
+A value that specifies whether the workgroup can be accessible from a public network.
+
+---
+
+##### `securityGroups`<sup>Optional</sup> <a name="securityGroups" id="@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.securityGroups"></a>
+
+```typescript
+public readonly securityGroups: ISecurityGroup[];
+```
+
+- *Type:* aws-cdk-lib.aws_ec2.ISecurityGroup[]
+- *Default:* a new security group is created
+
+The security groups to associate with the workgroup.
+
+---
+
+##### `vpcSubnets`<sup>Optional</sup> <a name="vpcSubnets" id="@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.vpcSubnets"></a>
+
+```typescript
+public readonly vpcSubnets: SubnetSelection;
+```
+
+- *Type:* aws-cdk-lib.aws_ec2.SubnetSelection
+- *Default:* private subnets
+
+Where to place the workgroup within the VPC.
+
+---
+
+##### `workgroupName`<sup>Optional</sup> <a name="workgroupName" id="@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.workgroupName"></a>
+
+```typescript
+public readonly workgroupName: string;
+```
+
+- *Type:* string
+- *Default:* auto generate
+
+The workgroup name.
+
+\`workgroupName\` must be between 3 and 64 characters long, contain only lowercase letters, numbers, and hyphens.
+
+---
+
+## Classes <a name="Classes" id="Classes"></a>
+
+### CurFormat <a name="CurFormat" id="@open-constructs/aws-cdk.aws_cur.CurFormat"></a>
+
+Enum for the possible formats of a cost report.
+
+#### Initializers <a name="Initializers" id="@open-constructs/aws-cdk.aws_cur.CurFormat.Initializer"></a>
+
+```typescript
+import { aws_cur } from '@open-constructs/aws-cdk'
+
+new aws_cur.CurFormat(compression: string, format: string)
+```
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_cur.CurFormat.Initializer.parameter.compression">compression</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#@open-constructs/aws-cdk.aws_cur.CurFormat.Initializer.parameter.format">format</a></code> | <code>string</code> | *No description.* |
+
+---
+
+##### `compression`<sup>Required</sup> <a name="compression" id="@open-constructs/aws-cdk.aws_cur.CurFormat.Initializer.parameter.compression"></a>
+
+- *Type:* string
+
+---
+
+##### `format`<sup>Required</sup> <a name="format" id="@open-constructs/aws-cdk.aws_cur.CurFormat.Initializer.parameter.format"></a>
+
+- *Type:* string
+
+---
+
+
+#### Static Functions <a name="Static Functions" id="Static Functions"></a>
+
+| **Name** | **Description** |
+| --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_cur.CurFormat.for">for</a></code> | Returns a CurFormat instance for the given compression and format string values. |
+
+---
+
+##### `for` <a name="for" id="@open-constructs/aws-cdk.aws_cur.CurFormat.for"></a>
+
+```typescript
+import { aws_cur } from '@open-constructs/aws-cdk'
+
+aws_cur.CurFormat.for(compression: string, format: string)
+```
+
+Returns a CurFormat instance for the given compression and format string values.
+
+###### `compression`<sup>Required</sup> <a name="compression" id="@open-constructs/aws-cdk.aws_cur.CurFormat.for.parameter.compression"></a>
+
+- *Type:* string
+
+The compression string value.
+
+---
+
+###### `format`<sup>Required</sup> <a name="format" id="@open-constructs/aws-cdk.aws_cur.CurFormat.for.parameter.format"></a>
+
+- *Type:* string
+
+The format string value.
+
+---
+
+#### Properties <a name="Properties" id="Properties"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_cur.CurFormat.property.compression">compression</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#@open-constructs/aws-cdk.aws_cur.CurFormat.property.format">format</a></code> | <code>string</code> | *No description.* |
+
+---
+
+##### `compression`<sup>Required</sup> <a name="compression" id="@open-constructs/aws-cdk.aws_cur.CurFormat.property.compression"></a>
+
+```typescript
+public readonly compression: string;
+```
+
+- *Type:* string
+
+---
+
+##### `format`<sup>Required</sup> <a name="format" id="@open-constructs/aws-cdk.aws_cur.CurFormat.property.format"></a>
+
+```typescript
+public readonly format: string;
+```
+
+- *Type:* string
+
+---
+
+#### Constants <a name="Constants" id="Constants"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_cur.CurFormat.property.PARQUET">PARQUET</a></code> | <code>@open-constructs/aws-cdk.aws_cur.CurFormat</code> | Parquet format. |
+| <code><a href="#@open-constructs/aws-cdk.aws_cur.CurFormat.property.TEXT_OR_CSV">TEXT_OR_CSV</a></code> | <code>@open-constructs/aws-cdk.aws_cur.CurFormat</code> | GZIP compressed text or CSV format. |
+
+---
+
+##### `PARQUET`<sup>Required</sup> <a name="PARQUET" id="@open-constructs/aws-cdk.aws_cur.CurFormat.property.PARQUET"></a>
+
+```typescript
+public readonly PARQUET: CurFormat;
+```
+
+- *Type:* @open-constructs/aws-cdk.aws_cur.CurFormat
+
+Parquet format.
+
+---
+
+##### `TEXT_OR_CSV`<sup>Required</sup> <a name="TEXT_OR_CSV" id="@open-constructs/aws-cdk.aws_cur.CurFormat.property.TEXT_OR_CSV"></a>
+
+```typescript
+public readonly TEXT_OR_CSV: CurFormat;
+```
+
+- *Type:* @open-constructs/aws-cdk.aws_cur.CurFormat
+
+GZIP compressed text or CSV format.
+
+---
+
+### DailyAutomaticBackupStartTime <a name="DailyAutomaticBackupStartTime" id="@open-constructs/aws-cdk.aws_fsx.DailyAutomaticBackupStartTime"></a>
+
+Class for scheduling a daily automatic backup time.
+
+#### Initializers <a name="Initializers" id="@open-constructs/aws-cdk.aws_fsx.DailyAutomaticBackupStartTime.Initializer"></a>
+
+```typescript
+import { aws_fsx } from '@open-constructs/aws-cdk'
+
+new aws_fsx.DailyAutomaticBackupStartTime(props: DailyAutomaticBackupStartTimeProps)
+```
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.DailyAutomaticBackupStartTime.Initializer.parameter.props">props</a></code> | <code>@open-constructs/aws-cdk.aws_fsx.DailyAutomaticBackupStartTimeProps</code> | *No description.* |
+
+---
+
+##### `props`<sup>Required</sup> <a name="props" id="@open-constructs/aws-cdk.aws_fsx.DailyAutomaticBackupStartTime.Initializer.parameter.props"></a>
+
+- *Type:* @open-constructs/aws-cdk.aws_fsx.DailyAutomaticBackupStartTimeProps
+
+---
+
+#### Methods <a name="Methods" id="Methods"></a>
+
+| **Name** | **Description** |
+| --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.DailyAutomaticBackupStartTime.toTimestamp">toTimestamp</a></code> | Converts an hour, and minute into HH:MM string. |
+
+---
+
+##### `toTimestamp` <a name="toTimestamp" id="@open-constructs/aws-cdk.aws_fsx.DailyAutomaticBackupStartTime.toTimestamp"></a>
+
+```typescript
+public toTimestamp(): string
+```
+
+Converts an hour, and minute into HH:MM string.
+
+
+
+
+### MaintenanceTime <a name="MaintenanceTime" id="@open-constructs/aws-cdk.aws_fsx.MaintenanceTime"></a>
+
+Class for scheduling a weekly maintenance time.
+
+#### Initializers <a name="Initializers" id="@open-constructs/aws-cdk.aws_fsx.MaintenanceTime.Initializer"></a>
+
+```typescript
+import { aws_fsx } from '@open-constructs/aws-cdk'
+
+new aws_fsx.MaintenanceTime(props: MaintenanceTimeProps)
+```
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.MaintenanceTime.Initializer.parameter.props">props</a></code> | <code>@open-constructs/aws-cdk.aws_fsx.MaintenanceTimeProps</code> | *No description.* |
+
+---
+
+##### `props`<sup>Required</sup> <a name="props" id="@open-constructs/aws-cdk.aws_fsx.MaintenanceTime.Initializer.parameter.props"></a>
+
+- *Type:* @open-constructs/aws-cdk.aws_fsx.MaintenanceTimeProps
+
+---
+
+#### Methods <a name="Methods" id="Methods"></a>
+
+| **Name** | **Description** |
+| --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.MaintenanceTime.toTimestamp">toTimestamp</a></code> | Converts a day, hour, and minute into a timestamp as used by FSx for Lustre's weeklyMaintenanceStartTime field. |
+
+---
+
+##### `toTimestamp` <a name="toTimestamp" id="@open-constructs/aws-cdk.aws_fsx.MaintenanceTime.toTimestamp"></a>
+
+```typescript
+public toTimestamp(): string
+```
+
+Converts a day, hour, and minute into a timestamp as used by FSx for Lustre's weeklyMaintenanceStartTime field.
+
+
+
+
+### MultiAz1ThroughputCapacityPerHaPair <a name="MultiAz1ThroughputCapacityPerHaPair" id="@open-constructs/aws-cdk.aws_fsx.MultiAz1ThroughputCapacityPerHaPair"></a>
+
+The throughput capacity for the Multi-AZ 1 deployment type.
+
+#### Initializers <a name="Initializers" id="@open-constructs/aws-cdk.aws_fsx.MultiAz1ThroughputCapacityPerHaPair.Initializer"></a>
+
+```typescript
+import { aws_fsx } from '@open-constructs/aws-cdk'
+
+new aws_fsx.MultiAz1ThroughputCapacityPerHaPair(capacity: number)
+```
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.MultiAz1ThroughputCapacityPerHaPair.Initializer.parameter.capacity">capacity</a></code> | <code>number</code> | *No description.* |
+
+---
+
+##### `capacity`<sup>Required</sup> <a name="capacity" id="@open-constructs/aws-cdk.aws_fsx.MultiAz1ThroughputCapacityPerHaPair.Initializer.parameter.capacity"></a>
+
+- *Type:* number
+
+---
+
+
+
+#### Properties <a name="Properties" id="Properties"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.MultiAz1ThroughputCapacityPerHaPair.property.capacity">capacity</a></code> | <code>number</code> | *No description.* |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.MultiAz1ThroughputCapacityPerHaPair.property.deploymentType">deploymentType</a></code> | <code>@open-constructs/aws-cdk.aws_fsx.OntapDeploymentType</code> | The deployment type of the throughput capacity. |
+
+---
+
+##### `capacity`<sup>Required</sup> <a name="capacity" id="@open-constructs/aws-cdk.aws_fsx.MultiAz1ThroughputCapacityPerHaPair.property.capacity"></a>
+
+```typescript
+public readonly capacity: number;
+```
+
+- *Type:* number
+
+---
+
+##### `deploymentType`<sup>Required</sup> <a name="deploymentType" id="@open-constructs/aws-cdk.aws_fsx.MultiAz1ThroughputCapacityPerHaPair.property.deploymentType"></a>
+
+```typescript
+public readonly deploymentType: OntapDeploymentType;
+```
+
+- *Type:* @open-constructs/aws-cdk.aws_fsx.OntapDeploymentType
+
+The deployment type of the throughput capacity.
+
+---
+
+#### Constants <a name="Constants" id="Constants"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.MultiAz1ThroughputCapacityPerHaPair.property.MB_PER_SEC_1024">MB_PER_SEC_1024</a></code> | <code>@open-constructs/aws-cdk.aws_fsx.MultiAz1ThroughputCapacityPerHaPair</code> | The throughput capacity of 1024 MBps per HA pair. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.MultiAz1ThroughputCapacityPerHaPair.property.MB_PER_SEC_128">MB_PER_SEC_128</a></code> | <code>@open-constructs/aws-cdk.aws_fsx.MultiAz1ThroughputCapacityPerHaPair</code> | The throughput capacity of 128 MBps per HA pair. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.MultiAz1ThroughputCapacityPerHaPair.property.MB_PER_SEC_2048">MB_PER_SEC_2048</a></code> | <code>@open-constructs/aws-cdk.aws_fsx.MultiAz1ThroughputCapacityPerHaPair</code> | The throughput capacity of 2048 MBps per HA pair. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.MultiAz1ThroughputCapacityPerHaPair.property.MB_PER_SEC_256">MB_PER_SEC_256</a></code> | <code>@open-constructs/aws-cdk.aws_fsx.MultiAz1ThroughputCapacityPerHaPair</code> | The throughput capacity of 256 MBps per HA pair. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.MultiAz1ThroughputCapacityPerHaPair.property.MB_PER_SEC_4096">MB_PER_SEC_4096</a></code> | <code>@open-constructs/aws-cdk.aws_fsx.MultiAz1ThroughputCapacityPerHaPair</code> | The throughput capacity of 4096 MBps per HA pair. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.MultiAz1ThroughputCapacityPerHaPair.property.MB_PER_SEC_512">MB_PER_SEC_512</a></code> | <code>@open-constructs/aws-cdk.aws_fsx.MultiAz1ThroughputCapacityPerHaPair</code> | The throughput capacity of 512 MBps per HA pair. |
+
+---
+
+##### `MB_PER_SEC_1024`<sup>Required</sup> <a name="MB_PER_SEC_1024" id="@open-constructs/aws-cdk.aws_fsx.MultiAz1ThroughputCapacityPerHaPair.property.MB_PER_SEC_1024"></a>
+
+```typescript
+public readonly MB_PER_SEC_1024: MultiAz1ThroughputCapacityPerHaPair;
+```
+
+- *Type:* @open-constructs/aws-cdk.aws_fsx.MultiAz1ThroughputCapacityPerHaPair
+
+The throughput capacity of 1024 MBps per HA pair.
+
+---
+
+##### `MB_PER_SEC_128`<sup>Required</sup> <a name="MB_PER_SEC_128" id="@open-constructs/aws-cdk.aws_fsx.MultiAz1ThroughputCapacityPerHaPair.property.MB_PER_SEC_128"></a>
+
+```typescript
+public readonly MB_PER_SEC_128: MultiAz1ThroughputCapacityPerHaPair;
+```
+
+- *Type:* @open-constructs/aws-cdk.aws_fsx.MultiAz1ThroughputCapacityPerHaPair
+
+The throughput capacity of 128 MBps per HA pair.
+
+---
+
+##### `MB_PER_SEC_2048`<sup>Required</sup> <a name="MB_PER_SEC_2048" id="@open-constructs/aws-cdk.aws_fsx.MultiAz1ThroughputCapacityPerHaPair.property.MB_PER_SEC_2048"></a>
+
+```typescript
+public readonly MB_PER_SEC_2048: MultiAz1ThroughputCapacityPerHaPair;
+```
+
+- *Type:* @open-constructs/aws-cdk.aws_fsx.MultiAz1ThroughputCapacityPerHaPair
+
+The throughput capacity of 2048 MBps per HA pair.
+
+---
+
+##### `MB_PER_SEC_256`<sup>Required</sup> <a name="MB_PER_SEC_256" id="@open-constructs/aws-cdk.aws_fsx.MultiAz1ThroughputCapacityPerHaPair.property.MB_PER_SEC_256"></a>
+
+```typescript
+public readonly MB_PER_SEC_256: MultiAz1ThroughputCapacityPerHaPair;
+```
+
+- *Type:* @open-constructs/aws-cdk.aws_fsx.MultiAz1ThroughputCapacityPerHaPair
+
+The throughput capacity of 256 MBps per HA pair.
+
+---
+
+##### `MB_PER_SEC_4096`<sup>Required</sup> <a name="MB_PER_SEC_4096" id="@open-constructs/aws-cdk.aws_fsx.MultiAz1ThroughputCapacityPerHaPair.property.MB_PER_SEC_4096"></a>
+
+```typescript
+public readonly MB_PER_SEC_4096: MultiAz1ThroughputCapacityPerHaPair;
+```
+
+- *Type:* @open-constructs/aws-cdk.aws_fsx.MultiAz1ThroughputCapacityPerHaPair
+
+The throughput capacity of 4096 MBps per HA pair.
+
+---
+
+##### `MB_PER_SEC_512`<sup>Required</sup> <a name="MB_PER_SEC_512" id="@open-constructs/aws-cdk.aws_fsx.MultiAz1ThroughputCapacityPerHaPair.property.MB_PER_SEC_512"></a>
+
+```typescript
+public readonly MB_PER_SEC_512: MultiAz1ThroughputCapacityPerHaPair;
+```
+
+- *Type:* @open-constructs/aws-cdk.aws_fsx.MultiAz1ThroughputCapacityPerHaPair
+
+The throughput capacity of 512 MBps per HA pair.
+
+---
+
+### MultiAz2ThroughputCapacityPerHaPair <a name="MultiAz2ThroughputCapacityPerHaPair" id="@open-constructs/aws-cdk.aws_fsx.MultiAz2ThroughputCapacityPerHaPair"></a>
+
+The throughput capacity for the Multi-AZ 2 deployment type.
+
+#### Initializers <a name="Initializers" id="@open-constructs/aws-cdk.aws_fsx.MultiAz2ThroughputCapacityPerHaPair.Initializer"></a>
+
+```typescript
+import { aws_fsx } from '@open-constructs/aws-cdk'
+
+new aws_fsx.MultiAz2ThroughputCapacityPerHaPair(capacity: number)
+```
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.MultiAz2ThroughputCapacityPerHaPair.Initializer.parameter.capacity">capacity</a></code> | <code>number</code> | *No description.* |
+
+---
+
+##### `capacity`<sup>Required</sup> <a name="capacity" id="@open-constructs/aws-cdk.aws_fsx.MultiAz2ThroughputCapacityPerHaPair.Initializer.parameter.capacity"></a>
+
+- *Type:* number
+
+---
+
+
+
+#### Properties <a name="Properties" id="Properties"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.MultiAz2ThroughputCapacityPerHaPair.property.capacity">capacity</a></code> | <code>number</code> | *No description.* |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.MultiAz2ThroughputCapacityPerHaPair.property.deploymentType">deploymentType</a></code> | <code>@open-constructs/aws-cdk.aws_fsx.OntapDeploymentType</code> | The deployment type of the throughput capacity. |
+
+---
+
+##### `capacity`<sup>Required</sup> <a name="capacity" id="@open-constructs/aws-cdk.aws_fsx.MultiAz2ThroughputCapacityPerHaPair.property.capacity"></a>
+
+```typescript
+public readonly capacity: number;
+```
+
+- *Type:* number
+
+---
+
+##### `deploymentType`<sup>Required</sup> <a name="deploymentType" id="@open-constructs/aws-cdk.aws_fsx.MultiAz2ThroughputCapacityPerHaPair.property.deploymentType"></a>
+
+```typescript
+public readonly deploymentType: OntapDeploymentType;
+```
+
+- *Type:* @open-constructs/aws-cdk.aws_fsx.OntapDeploymentType
+
+The deployment type of the throughput capacity.
+
+---
+
+#### Constants <a name="Constants" id="Constants"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.MultiAz2ThroughputCapacityPerHaPair.property.MB_PER_SEC_1536">MB_PER_SEC_1536</a></code> | <code>@open-constructs/aws-cdk.aws_fsx.MultiAz2ThroughputCapacityPerHaPair</code> | The throughput capacity of 1536 MBps per HA pair. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.MultiAz2ThroughputCapacityPerHaPair.property.MB_PER_SEC_3072">MB_PER_SEC_3072</a></code> | <code>@open-constructs/aws-cdk.aws_fsx.MultiAz2ThroughputCapacityPerHaPair</code> | The throughput capacity of 3072 MBps per HA pair. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.MultiAz2ThroughputCapacityPerHaPair.property.MB_PER_SEC_384">MB_PER_SEC_384</a></code> | <code>@open-constructs/aws-cdk.aws_fsx.MultiAz2ThroughputCapacityPerHaPair</code> | The throughput capacity of 384 MBps per HA pair. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.MultiAz2ThroughputCapacityPerHaPair.property.MB_PER_SEC_6144">MB_PER_SEC_6144</a></code> | <code>@open-constructs/aws-cdk.aws_fsx.MultiAz2ThroughputCapacityPerHaPair</code> | The throughput capacity of 6144 MBps per HA pair. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.MultiAz2ThroughputCapacityPerHaPair.property.MB_PER_SEC_768">MB_PER_SEC_768</a></code> | <code>@open-constructs/aws-cdk.aws_fsx.MultiAz2ThroughputCapacityPerHaPair</code> | The throughput capacity of 768 MBps per HA pair. |
+
+---
+
+##### `MB_PER_SEC_1536`<sup>Required</sup> <a name="MB_PER_SEC_1536" id="@open-constructs/aws-cdk.aws_fsx.MultiAz2ThroughputCapacityPerHaPair.property.MB_PER_SEC_1536"></a>
+
+```typescript
+public readonly MB_PER_SEC_1536: MultiAz2ThroughputCapacityPerHaPair;
+```
+
+- *Type:* @open-constructs/aws-cdk.aws_fsx.MultiAz2ThroughputCapacityPerHaPair
+
+The throughput capacity of 1536 MBps per HA pair.
+
+---
+
+##### `MB_PER_SEC_3072`<sup>Required</sup> <a name="MB_PER_SEC_3072" id="@open-constructs/aws-cdk.aws_fsx.MultiAz2ThroughputCapacityPerHaPair.property.MB_PER_SEC_3072"></a>
+
+```typescript
+public readonly MB_PER_SEC_3072: MultiAz2ThroughputCapacityPerHaPair;
+```
+
+- *Type:* @open-constructs/aws-cdk.aws_fsx.MultiAz2ThroughputCapacityPerHaPair
+
+The throughput capacity of 3072 MBps per HA pair.
+
+---
+
+##### `MB_PER_SEC_384`<sup>Required</sup> <a name="MB_PER_SEC_384" id="@open-constructs/aws-cdk.aws_fsx.MultiAz2ThroughputCapacityPerHaPair.property.MB_PER_SEC_384"></a>
+
+```typescript
+public readonly MB_PER_SEC_384: MultiAz2ThroughputCapacityPerHaPair;
+```
+
+- *Type:* @open-constructs/aws-cdk.aws_fsx.MultiAz2ThroughputCapacityPerHaPair
+
+The throughput capacity of 384 MBps per HA pair.
+
+---
+
+##### `MB_PER_SEC_6144`<sup>Required</sup> <a name="MB_PER_SEC_6144" id="@open-constructs/aws-cdk.aws_fsx.MultiAz2ThroughputCapacityPerHaPair.property.MB_PER_SEC_6144"></a>
+
+```typescript
+public readonly MB_PER_SEC_6144: MultiAz2ThroughputCapacityPerHaPair;
+```
+
+- *Type:* @open-constructs/aws-cdk.aws_fsx.MultiAz2ThroughputCapacityPerHaPair
+
+The throughput capacity of 6144 MBps per HA pair.
+
+---
+
+##### `MB_PER_SEC_768`<sup>Required</sup> <a name="MB_PER_SEC_768" id="@open-constructs/aws-cdk.aws_fsx.MultiAz2ThroughputCapacityPerHaPair.property.MB_PER_SEC_768"></a>
+
+```typescript
+public readonly MB_PER_SEC_768: MultiAz2ThroughputCapacityPerHaPair;
+```
+
+- *Type:* @open-constructs/aws-cdk.aws_fsx.MultiAz2ThroughputCapacityPerHaPair
+
+The throughput capacity of 768 MBps per HA pair.
+
+---
+
+### ReportGranularity <a name="ReportGranularity" id="@open-constructs/aws-cdk.aws_cur.ReportGranularity"></a>
+
+Enum for the possible granularities of a cost report.
+
+#### Initializers <a name="Initializers" id="@open-constructs/aws-cdk.aws_cur.ReportGranularity.Initializer"></a>
+
+```typescript
+import { aws_cur } from '@open-constructs/aws-cdk'
+
+new aws_cur.ReportGranularity(value: string)
+```
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_cur.ReportGranularity.Initializer.parameter.value">value</a></code> | <code>string</code> | *No description.* |
+
+---
+
+##### `value`<sup>Required</sup> <a name="value" id="@open-constructs/aws-cdk.aws_cur.ReportGranularity.Initializer.parameter.value"></a>
+
+- *Type:* string
+
+---
+
+
+#### Static Functions <a name="Static Functions" id="Static Functions"></a>
+
+| **Name** | **Description** |
+| --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_cur.ReportGranularity.for">for</a></code> | Returns a ReportGranularity instance for the given granularity string value. |
+
+---
+
+##### `for` <a name="for" id="@open-constructs/aws-cdk.aws_cur.ReportGranularity.for"></a>
+
+```typescript
+import { aws_cur } from '@open-constructs/aws-cdk'
+
+aws_cur.ReportGranularity.for(granularity: string)
+```
+
+Returns a ReportGranularity instance for the given granularity string value.
+
+###### `granularity`<sup>Required</sup> <a name="granularity" id="@open-constructs/aws-cdk.aws_cur.ReportGranularity.for.parameter.granularity"></a>
+
+- *Type:* string
+
+The granularity string value to create an instance for.
+
+---
+
+#### Properties <a name="Properties" id="Properties"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_cur.ReportGranularity.property.value">value</a></code> | <code>string</code> | *No description.* |
+
+---
+
+##### `value`<sup>Required</sup> <a name="value" id="@open-constructs/aws-cdk.aws_cur.ReportGranularity.property.value"></a>
+
+```typescript
+public readonly value: string;
+```
+
+- *Type:* string
+
+---
+
+#### Constants <a name="Constants" id="Constants"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_cur.ReportGranularity.property.DAILY">DAILY</a></code> | <code>@open-constructs/aws-cdk.aws_cur.ReportGranularity</code> | Daily granularity. |
+| <code><a href="#@open-constructs/aws-cdk.aws_cur.ReportGranularity.property.HOURLY">HOURLY</a></code> | <code>@open-constructs/aws-cdk.aws_cur.ReportGranularity</code> | Hourly granularity. |
+| <code><a href="#@open-constructs/aws-cdk.aws_cur.ReportGranularity.property.MONTHLY">MONTHLY</a></code> | <code>@open-constructs/aws-cdk.aws_cur.ReportGranularity</code> | Weekly granularity. |
+
+---
+
+##### `DAILY`<sup>Required</sup> <a name="DAILY" id="@open-constructs/aws-cdk.aws_cur.ReportGranularity.property.DAILY"></a>
+
+```typescript
+public readonly DAILY: ReportGranularity;
+```
+
+- *Type:* @open-constructs/aws-cdk.aws_cur.ReportGranularity
+
+Daily granularity.
+
+---
+
+##### `HOURLY`<sup>Required</sup> <a name="HOURLY" id="@open-constructs/aws-cdk.aws_cur.ReportGranularity.property.HOURLY"></a>
+
+```typescript
+public readonly HOURLY: ReportGranularity;
+```
+
+- *Type:* @open-constructs/aws-cdk.aws_cur.ReportGranularity
 
-`vpc` must have at least 3 subnets, and they must span across 3 Availability Zones.
+Hourly granularity.
 
 ---
 
-##### `baseCapacity`<sup>Optional</sup> <a name="baseCapacity" id="@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.baseCapacity"></a>
+##### `MONTHLY`<sup>Required</sup> <a name="MONTHLY" id="@open-constructs/aws-cdk.aws_cur.ReportGranularity.property.MONTHLY"></a>
 
 ```typescript
-public readonly baseCapacity: number;
+public readonly MONTHLY: ReportGranularity;
 ```
 
-- *Type:* number
-- *Default:* 128
+- *Type:* @open-constructs/aws-cdk.aws_cur.ReportGranularity
 
-The base compute capacity of the workgroup in Redshift Processing Units (RPUs).
+Weekly granularity.
 
-You can adjust the base capacity setting from 8 RPUs to 512 RPUs in units of 8.
-Also you can increment or decrement RPUs in units of 32 when setting a base capacity between 512-1024.
+---
 
-> [https://docs.aws.amazon.com/redshift/latest/mgmt/serverless-capacity.html](https://docs.aws.amazon.com/redshift/latest/mgmt/serverless-capacity.html)
+### SingleAz1ThroughputCapacityPerHaPair <a name="SingleAz1ThroughputCapacityPerHaPair" id="@open-constructs/aws-cdk.aws_fsx.SingleAz1ThroughputCapacityPerHaPair"></a>
 
----
+The throughput capacity for the Single-AZ 1 deployment type.
 
-##### `configParameters`<sup>Optional</sup> <a name="configParameters" id="@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.configParameters"></a>
+#### Initializers <a name="Initializers" id="@open-constructs/aws-cdk.aws_fsx.SingleAz1ThroughputCapacityPerHaPair.Initializer"></a>
 
 ```typescript
-public readonly configParameters: {[ key: string ]: string};
+import { aws_fsx } from '@open-constructs/aws-cdk'
+
+new aws_fsx.SingleAz1ThroughputCapacityPerHaPair(capacity: number)
 ```
 
-- *Type:* {[ key: string ]: string}
-- *Default:* no config parameters
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.SingleAz1ThroughputCapacityPerHaPair.Initializer.parameter.capacity">capacity</a></code> | <code>number</code> | *No description.* |
 
-A list of parameters to set for finer control over a database.
+---
 
-> [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshiftserverless-workgroup.html#cfn-redshiftserverless-workgroup-configparameters](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-redshiftserverless-workgroup.html#cfn-redshiftserverless-workgroup-configparameters)
+##### `capacity`<sup>Required</sup> <a name="capacity" id="@open-constructs/aws-cdk.aws_fsx.SingleAz1ThroughputCapacityPerHaPair.Initializer.parameter.capacity"></a>
+
+- *Type:* number
 
 ---
 
-##### `enhancedVpcRouting`<sup>Optional</sup> <a name="enhancedVpcRouting" id="@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.enhancedVpcRouting"></a>
 
-```typescript
-public readonly enhancedVpcRouting: boolean;
-```
 
-- *Type:* boolean
-- *Default:* false
+#### Properties <a name="Properties" id="Properties"></a>
 
-The value that specifies whether to enable enhanced virtual private cloud (VPC) routing, which forces Amazon Redshift Serverless to route traffic through your VPC.
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.SingleAz1ThroughputCapacityPerHaPair.property.capacity">capacity</a></code> | <code>number</code> | *No description.* |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.SingleAz1ThroughputCapacityPerHaPair.property.deploymentType">deploymentType</a></code> | <code>@open-constructs/aws-cdk.aws_fsx.OntapDeploymentType</code> | The deployment type of the throughput capacity. |
 
 ---
 
-##### `namespace`<sup>Optional</sup> <a name="namespace" id="@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.namespace"></a>
+##### `capacity`<sup>Required</sup> <a name="capacity" id="@open-constructs/aws-cdk.aws_fsx.SingleAz1ThroughputCapacityPerHaPair.property.capacity"></a>
 
 ```typescript
-public readonly namespace: INamespace;
+public readonly capacity: number;
 ```
 
-- *Type:* @open-constructs/aws-cdk.aws_redshiftserverless.INamespace
-- *Default:* the workgroup is not associated with any namespace
-
-The namespace the workgroup is associated with.
+- *Type:* number
 
 ---
 
-##### `port`<sup>Optional</sup> <a name="port" id="@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.port"></a>
+##### `deploymentType`<sup>Required</sup> <a name="deploymentType" id="@open-constructs/aws-cdk.aws_fsx.SingleAz1ThroughputCapacityPerHaPair.property.deploymentType"></a>
 
 ```typescript
-public readonly port: number;
+public readonly deploymentType: OntapDeploymentType;
 ```
 
-- *Type:* number
-- *Default:* 5439
+- *Type:* @open-constructs/aws-cdk.aws_fsx.OntapDeploymentType
 
-The custom port to use when connecting to a workgroup.
+The deployment type of the throughput capacity.
 
-Valid port ranges are 5431-5455 and 8191-8215.
+---
+
+#### Constants <a name="Constants" id="Constants"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.SingleAz1ThroughputCapacityPerHaPair.property.MB_PER_SEC_1024">MB_PER_SEC_1024</a></code> | <code>@open-constructs/aws-cdk.aws_fsx.SingleAz1ThroughputCapacityPerHaPair</code> | The throughput capacity of 1024 MBps per HA pair. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.SingleAz1ThroughputCapacityPerHaPair.property.MB_PER_SEC_128">MB_PER_SEC_128</a></code> | <code>@open-constructs/aws-cdk.aws_fsx.SingleAz1ThroughputCapacityPerHaPair</code> | The throughput capacity of 128 MBps per HA pair. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.SingleAz1ThroughputCapacityPerHaPair.property.MB_PER_SEC_2048">MB_PER_SEC_2048</a></code> | <code>@open-constructs/aws-cdk.aws_fsx.SingleAz1ThroughputCapacityPerHaPair</code> | The throughput capacity of 2048 MBps per HA pair. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.SingleAz1ThroughputCapacityPerHaPair.property.MB_PER_SEC_256">MB_PER_SEC_256</a></code> | <code>@open-constructs/aws-cdk.aws_fsx.SingleAz1ThroughputCapacityPerHaPair</code> | The throughput capacity of 256 MBps per HA pair. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.SingleAz1ThroughputCapacityPerHaPair.property.MB_PER_SEC_4096">MB_PER_SEC_4096</a></code> | <code>@open-constructs/aws-cdk.aws_fsx.SingleAz1ThroughputCapacityPerHaPair</code> | The throughput capacity of 4096 MBps per HA pair. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.SingleAz1ThroughputCapacityPerHaPair.property.MB_PER_SEC_512">MB_PER_SEC_512</a></code> | <code>@open-constructs/aws-cdk.aws_fsx.SingleAz1ThroughputCapacityPerHaPair</code> | The throughput capacity of 512 MBps per HA pair. |
 
 ---
 
-##### `publiclyAccessible`<sup>Optional</sup> <a name="publiclyAccessible" id="@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.publiclyAccessible"></a>
+##### `MB_PER_SEC_1024`<sup>Required</sup> <a name="MB_PER_SEC_1024" id="@open-constructs/aws-cdk.aws_fsx.SingleAz1ThroughputCapacityPerHaPair.property.MB_PER_SEC_1024"></a>
 
 ```typescript
-public readonly publiclyAccessible: boolean;
+public readonly MB_PER_SEC_1024: SingleAz1ThroughputCapacityPerHaPair;
 ```
 
-- *Type:* boolean
-- *Default:* false
+- *Type:* @open-constructs/aws-cdk.aws_fsx.SingleAz1ThroughputCapacityPerHaPair
 
-A value that specifies whether the workgroup can be accessible from a public network.
+The throughput capacity of 1024 MBps per HA pair.
 
 ---
 
-##### `securityGroups`<sup>Optional</sup> <a name="securityGroups" id="@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.securityGroups"></a>
+##### `MB_PER_SEC_128`<sup>Required</sup> <a name="MB_PER_SEC_128" id="@open-constructs/aws-cdk.aws_fsx.SingleAz1ThroughputCapacityPerHaPair.property.MB_PER_SEC_128"></a>
 
 ```typescript
-public readonly securityGroups: ISecurityGroup[];
+public readonly MB_PER_SEC_128: SingleAz1ThroughputCapacityPerHaPair;
 ```
 
-- *Type:* aws-cdk-lib.aws_ec2.ISecurityGroup[]
-- *Default:* a new security group is created
+- *Type:* @open-constructs/aws-cdk.aws_fsx.SingleAz1ThroughputCapacityPerHaPair
 
-The security groups to associate with the workgroup.
+The throughput capacity of 128 MBps per HA pair.
 
 ---
 
-##### `vpcSubnets`<sup>Optional</sup> <a name="vpcSubnets" id="@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.vpcSubnets"></a>
+##### `MB_PER_SEC_2048`<sup>Required</sup> <a name="MB_PER_SEC_2048" id="@open-constructs/aws-cdk.aws_fsx.SingleAz1ThroughputCapacityPerHaPair.property.MB_PER_SEC_2048"></a>
 
 ```typescript
-public readonly vpcSubnets: SubnetSelection;
+public readonly MB_PER_SEC_2048: SingleAz1ThroughputCapacityPerHaPair;
 ```
 
-- *Type:* aws-cdk-lib.aws_ec2.SubnetSelection
-- *Default:* private subnets
+- *Type:* @open-constructs/aws-cdk.aws_fsx.SingleAz1ThroughputCapacityPerHaPair
 
-Where to place the workgroup within the VPC.
+The throughput capacity of 2048 MBps per HA pair.
 
 ---
 
-##### `workgroupName`<sup>Optional</sup> <a name="workgroupName" id="@open-constructs/aws-cdk.aws_redshiftserverless.WorkgroupProps.property.workgroupName"></a>
+##### `MB_PER_SEC_256`<sup>Required</sup> <a name="MB_PER_SEC_256" id="@open-constructs/aws-cdk.aws_fsx.SingleAz1ThroughputCapacityPerHaPair.property.MB_PER_SEC_256"></a>
 
 ```typescript
-public readonly workgroupName: string;
+public readonly MB_PER_SEC_256: SingleAz1ThroughputCapacityPerHaPair;
 ```
 
-- *Type:* string
-- *Default:* auto generate
-
-The workgroup name.
+- *Type:* @open-constructs/aws-cdk.aws_fsx.SingleAz1ThroughputCapacityPerHaPair
 
-\`workgroupName\` must be between 3 and 64 characters long, contain only lowercase letters, numbers, and hyphens.
+The throughput capacity of 256 MBps per HA pair.
 
 ---
 
-## Classes <a name="Classes" id="Classes"></a>
-
-### CurFormat <a name="CurFormat" id="@open-constructs/aws-cdk.aws_cur.CurFormat"></a>
-
-Enum for the possible formats of a cost report.
-
-#### Initializers <a name="Initializers" id="@open-constructs/aws-cdk.aws_cur.CurFormat.Initializer"></a>
+##### `MB_PER_SEC_4096`<sup>Required</sup> <a name="MB_PER_SEC_4096" id="@open-constructs/aws-cdk.aws_fsx.SingleAz1ThroughputCapacityPerHaPair.property.MB_PER_SEC_4096"></a>
 
 ```typescript
-import { aws_cur } from '@open-constructs/aws-cdk'
-
-new aws_cur.CurFormat(compression: string, format: string)
+public readonly MB_PER_SEC_4096: SingleAz1ThroughputCapacityPerHaPair;
 ```
 
-| **Name** | **Type** | **Description** |
-| --- | --- | --- |
-| <code><a href="#@open-constructs/aws-cdk.aws_cur.CurFormat.Initializer.parameter.compression">compression</a></code> | <code>string</code> | *No description.* |
-| <code><a href="#@open-constructs/aws-cdk.aws_cur.CurFormat.Initializer.parameter.format">format</a></code> | <code>string</code> | *No description.* |
-
----
-
-##### `compression`<sup>Required</sup> <a name="compression" id="@open-constructs/aws-cdk.aws_cur.CurFormat.Initializer.parameter.compression"></a>
+- *Type:* @open-constructs/aws-cdk.aws_fsx.SingleAz1ThroughputCapacityPerHaPair
 
-- *Type:* string
+The throughput capacity of 4096 MBps per HA pair.
 
 ---
 
-##### `format`<sup>Required</sup> <a name="format" id="@open-constructs/aws-cdk.aws_cur.CurFormat.Initializer.parameter.format"></a>
+##### `MB_PER_SEC_512`<sup>Required</sup> <a name="MB_PER_SEC_512" id="@open-constructs/aws-cdk.aws_fsx.SingleAz1ThroughputCapacityPerHaPair.property.MB_PER_SEC_512"></a>
 
-- *Type:* string
+```typescript
+public readonly MB_PER_SEC_512: SingleAz1ThroughputCapacityPerHaPair;
+```
 
----
+- *Type:* @open-constructs/aws-cdk.aws_fsx.SingleAz1ThroughputCapacityPerHaPair
 
+The throughput capacity of 512 MBps per HA pair.
 
-#### Static Functions <a name="Static Functions" id="Static Functions"></a>
+---
 
-| **Name** | **Description** |
-| --- | --- |
-| <code><a href="#@open-constructs/aws-cdk.aws_cur.CurFormat.for">for</a></code> | Returns a CurFormat instance for the given compression and format string values. |
+### SingleAz2ThroughputCapacityPerHaPair <a name="SingleAz2ThroughputCapacityPerHaPair" id="@open-constructs/aws-cdk.aws_fsx.SingleAz2ThroughputCapacityPerHaPair"></a>
 
----
+The throughput capacity for the Single-AZ 2 deployment type.
 
-##### `for` <a name="for" id="@open-constructs/aws-cdk.aws_cur.CurFormat.for"></a>
+#### Initializers <a name="Initializers" id="@open-constructs/aws-cdk.aws_fsx.SingleAz2ThroughputCapacityPerHaPair.Initializer"></a>
 
 ```typescript
-import { aws_cur } from '@open-constructs/aws-cdk'
+import { aws_fsx } from '@open-constructs/aws-cdk'
 
-aws_cur.CurFormat.for(compression: string, format: string)
+new aws_fsx.SingleAz2ThroughputCapacityPerHaPair(capacity: number)
 ```
 
-Returns a CurFormat instance for the given compression and format string values.
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.SingleAz2ThroughputCapacityPerHaPair.Initializer.parameter.capacity">capacity</a></code> | <code>number</code> | *No description.* |
 
-###### `compression`<sup>Required</sup> <a name="compression" id="@open-constructs/aws-cdk.aws_cur.CurFormat.for.parameter.compression"></a>
+---
 
-- *Type:* string
+##### `capacity`<sup>Required</sup> <a name="capacity" id="@open-constructs/aws-cdk.aws_fsx.SingleAz2ThroughputCapacityPerHaPair.Initializer.parameter.capacity"></a>
 
-The compression string value.
+- *Type:* number
 
 ---
 
-###### `format`<sup>Required</sup> <a name="format" id="@open-constructs/aws-cdk.aws_cur.CurFormat.for.parameter.format"></a>
-
-- *Type:* string
-
-The format string value.
 
----
 
 #### Properties <a name="Properties" id="Properties"></a>
 
 | **Name** | **Type** | **Description** |
 | --- | --- | --- |
-| <code><a href="#@open-constructs/aws-cdk.aws_cur.CurFormat.property.compression">compression</a></code> | <code>string</code> | *No description.* |
-| <code><a href="#@open-constructs/aws-cdk.aws_cur.CurFormat.property.format">format</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.SingleAz2ThroughputCapacityPerHaPair.property.capacity">capacity</a></code> | <code>number</code> | *No description.* |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.SingleAz2ThroughputCapacityPerHaPair.property.deploymentType">deploymentType</a></code> | <code>@open-constructs/aws-cdk.aws_fsx.OntapDeploymentType</code> | The deployment type of the throughput capacity. |
 
 ---
 
-##### `compression`<sup>Required</sup> <a name="compression" id="@open-constructs/aws-cdk.aws_cur.CurFormat.property.compression"></a>
+##### `capacity`<sup>Required</sup> <a name="capacity" id="@open-constructs/aws-cdk.aws_fsx.SingleAz2ThroughputCapacityPerHaPair.property.capacity"></a>
 
 ```typescript
-public readonly compression: string;
+public readonly capacity: number;
 ```
 
-- *Type:* string
+- *Type:* number
 
 ---
 
-##### `format`<sup>Required</sup> <a name="format" id="@open-constructs/aws-cdk.aws_cur.CurFormat.property.format"></a>
+##### `deploymentType`<sup>Required</sup> <a name="deploymentType" id="@open-constructs/aws-cdk.aws_fsx.SingleAz2ThroughputCapacityPerHaPair.property.deploymentType"></a>
 
 ```typescript
-public readonly format: string;
+public readonly deploymentType: OntapDeploymentType;
 ```
 
-- *Type:* string
+- *Type:* @open-constructs/aws-cdk.aws_fsx.OntapDeploymentType
+
+The deployment type of the throughput capacity.
 
 ---
 
@@ -1958,149 +3400,105 @@ public readonly format: string;
 
 | **Name** | **Type** | **Description** |
 | --- | --- | --- |
-| <code><a href="#@open-constructs/aws-cdk.aws_cur.CurFormat.property.PARQUET">PARQUET</a></code> | <code>@open-constructs/aws-cdk.aws_cur.CurFormat</code> | Parquet format. |
-| <code><a href="#@open-constructs/aws-cdk.aws_cur.CurFormat.property.TEXT_OR_CSV">TEXT_OR_CSV</a></code> | <code>@open-constructs/aws-cdk.aws_cur.CurFormat</code> | GZIP compressed text or CSV format. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.SingleAz2ThroughputCapacityPerHaPair.property.MB_PER_SEC_1536">MB_PER_SEC_1536</a></code> | <code>@open-constructs/aws-cdk.aws_fsx.SingleAz2ThroughputCapacityPerHaPair</code> | The throughput capacity of 1536 MBps per HA pair. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.SingleAz2ThroughputCapacityPerHaPair.property.MB_PER_SEC_3072">MB_PER_SEC_3072</a></code> | <code>@open-constructs/aws-cdk.aws_fsx.SingleAz2ThroughputCapacityPerHaPair</code> | The throughput capacity of 3072 MBps per HA pair. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.SingleAz2ThroughputCapacityPerHaPair.property.MB_PER_SEC_6144">MB_PER_SEC_6144</a></code> | <code>@open-constructs/aws-cdk.aws_fsx.SingleAz2ThroughputCapacityPerHaPair</code> | The throughput capacity of 6144 MBps per HA pair. |
 
 ---
 
-##### `PARQUET`<sup>Required</sup> <a name="PARQUET" id="@open-constructs/aws-cdk.aws_cur.CurFormat.property.PARQUET"></a>
+##### `MB_PER_SEC_1536`<sup>Required</sup> <a name="MB_PER_SEC_1536" id="@open-constructs/aws-cdk.aws_fsx.SingleAz2ThroughputCapacityPerHaPair.property.MB_PER_SEC_1536"></a>
 
 ```typescript
-public readonly PARQUET: CurFormat;
+public readonly MB_PER_SEC_1536: SingleAz2ThroughputCapacityPerHaPair;
 ```
 
-- *Type:* @open-constructs/aws-cdk.aws_cur.CurFormat
+- *Type:* @open-constructs/aws-cdk.aws_fsx.SingleAz2ThroughputCapacityPerHaPair
 
-Parquet format.
+The throughput capacity of 1536 MBps per HA pair.
 
 ---
 
-##### `TEXT_OR_CSV`<sup>Required</sup> <a name="TEXT_OR_CSV" id="@open-constructs/aws-cdk.aws_cur.CurFormat.property.TEXT_OR_CSV"></a>
+##### `MB_PER_SEC_3072`<sup>Required</sup> <a name="MB_PER_SEC_3072" id="@open-constructs/aws-cdk.aws_fsx.SingleAz2ThroughputCapacityPerHaPair.property.MB_PER_SEC_3072"></a>
 
 ```typescript
-public readonly TEXT_OR_CSV: CurFormat;
+public readonly MB_PER_SEC_3072: SingleAz2ThroughputCapacityPerHaPair;
 ```
 
-- *Type:* @open-constructs/aws-cdk.aws_cur.CurFormat
+- *Type:* @open-constructs/aws-cdk.aws_fsx.SingleAz2ThroughputCapacityPerHaPair
 
-GZIP compressed text or CSV format.
+The throughput capacity of 3072 MBps per HA pair.
 
 ---
 
-### ReportGranularity <a name="ReportGranularity" id="@open-constructs/aws-cdk.aws_cur.ReportGranularity"></a>
-
-Enum for the possible granularities of a cost report.
-
-#### Initializers <a name="Initializers" id="@open-constructs/aws-cdk.aws_cur.ReportGranularity.Initializer"></a>
+##### `MB_PER_SEC_6144`<sup>Required</sup> <a name="MB_PER_SEC_6144" id="@open-constructs/aws-cdk.aws_fsx.SingleAz2ThroughputCapacityPerHaPair.property.MB_PER_SEC_6144"></a>
 
 ```typescript
-import { aws_cur } from '@open-constructs/aws-cdk'
-
-new aws_cur.ReportGranularity(value: string)
+public readonly MB_PER_SEC_6144: SingleAz2ThroughputCapacityPerHaPair;
 ```
 
-| **Name** | **Type** | **Description** |
-| --- | --- | --- |
-| <code><a href="#@open-constructs/aws-cdk.aws_cur.ReportGranularity.Initializer.parameter.value">value</a></code> | <code>string</code> | *No description.* |
-
----
-
-##### `value`<sup>Required</sup> <a name="value" id="@open-constructs/aws-cdk.aws_cur.ReportGranularity.Initializer.parameter.value"></a>
+- *Type:* @open-constructs/aws-cdk.aws_fsx.SingleAz2ThroughputCapacityPerHaPair
 
-- *Type:* string
+The throughput capacity of 6144 MBps per HA pair.
 
 ---
 
+### ThroughputCapacityPerHaPair <a name="ThroughputCapacityPerHaPair" id="@open-constructs/aws-cdk.aws_fsx.ThroughputCapacityPerHaPair"></a>
 
-#### Static Functions <a name="Static Functions" id="Static Functions"></a>
-
-| **Name** | **Description** |
-| --- | --- |
-| <code><a href="#@open-constructs/aws-cdk.aws_cur.ReportGranularity.for">for</a></code> | Returns a ReportGranularity instance for the given granularity string value. |
-
----
+The throughput capacity per HA pair for an Amazon FSx for NetApp ONTAP file system.
 
-##### `for` <a name="for" id="@open-constructs/aws-cdk.aws_cur.ReportGranularity.for"></a>
+#### Initializers <a name="Initializers" id="@open-constructs/aws-cdk.aws_fsx.ThroughputCapacityPerHaPair.Initializer"></a>
 
 ```typescript
-import { aws_cur } from '@open-constructs/aws-cdk'
+import { aws_fsx } from '@open-constructs/aws-cdk'
 
-aws_cur.ReportGranularity.for(granularity: string)
+new aws_fsx.ThroughputCapacityPerHaPair(capacity: number)
 ```
 
-Returns a ReportGranularity instance for the given granularity string value.
-
-###### `granularity`<sup>Required</sup> <a name="granularity" id="@open-constructs/aws-cdk.aws_cur.ReportGranularity.for.parameter.granularity"></a>
-
-- *Type:* string
-
-The granularity string value to create an instance for.
-
----
-
-#### Properties <a name="Properties" id="Properties"></a>
-
 | **Name** | **Type** | **Description** |
 | --- | --- | --- |
-| <code><a href="#@open-constructs/aws-cdk.aws_cur.ReportGranularity.property.value">value</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.ThroughputCapacityPerHaPair.Initializer.parameter.capacity">capacity</a></code> | <code>number</code> | *No description.* |
 
 ---
 
-##### `value`<sup>Required</sup> <a name="value" id="@open-constructs/aws-cdk.aws_cur.ReportGranularity.property.value"></a>
-
-```typescript
-public readonly value: string;
-```
+##### `capacity`<sup>Required</sup> <a name="capacity" id="@open-constructs/aws-cdk.aws_fsx.ThroughputCapacityPerHaPair.Initializer.parameter.capacity"></a>
 
-- *Type:* string
+- *Type:* number
 
 ---
 
-#### Constants <a name="Constants" id="Constants"></a>
+
+
+#### Properties <a name="Properties" id="Properties"></a>
 
 | **Name** | **Type** | **Description** |
 | --- | --- | --- |
-| <code><a href="#@open-constructs/aws-cdk.aws_cur.ReportGranularity.property.DAILY">DAILY</a></code> | <code>@open-constructs/aws-cdk.aws_cur.ReportGranularity</code> | Daily granularity. |
-| <code><a href="#@open-constructs/aws-cdk.aws_cur.ReportGranularity.property.HOURLY">HOURLY</a></code> | <code>@open-constructs/aws-cdk.aws_cur.ReportGranularity</code> | Hourly granularity. |
-| <code><a href="#@open-constructs/aws-cdk.aws_cur.ReportGranularity.property.MONTHLY">MONTHLY</a></code> | <code>@open-constructs/aws-cdk.aws_cur.ReportGranularity</code> | Weekly granularity. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.ThroughputCapacityPerHaPair.property.capacity">capacity</a></code> | <code>number</code> | *No description.* |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.ThroughputCapacityPerHaPair.property.deploymentType">deploymentType</a></code> | <code>@open-constructs/aws-cdk.aws_fsx.OntapDeploymentType</code> | The deployment type of the throughput capacity. |
 
 ---
 
-##### `DAILY`<sup>Required</sup> <a name="DAILY" id="@open-constructs/aws-cdk.aws_cur.ReportGranularity.property.DAILY"></a>
+##### `capacity`<sup>Required</sup> <a name="capacity" id="@open-constructs/aws-cdk.aws_fsx.ThroughputCapacityPerHaPair.property.capacity"></a>
 
 ```typescript
-public readonly DAILY: ReportGranularity;
+public readonly capacity: number;
 ```
 
-- *Type:* @open-constructs/aws-cdk.aws_cur.ReportGranularity
-
-Daily granularity.
+- *Type:* number
 
 ---
 
-##### `HOURLY`<sup>Required</sup> <a name="HOURLY" id="@open-constructs/aws-cdk.aws_cur.ReportGranularity.property.HOURLY"></a>
+##### `deploymentType`<sup>Required</sup> <a name="deploymentType" id="@open-constructs/aws-cdk.aws_fsx.ThroughputCapacityPerHaPair.property.deploymentType"></a>
 
 ```typescript
-public readonly HOURLY: ReportGranularity;
+public readonly deploymentType: OntapDeploymentType;
 ```
 
-- *Type:* @open-constructs/aws-cdk.aws_cur.ReportGranularity
+- *Type:* @open-constructs/aws-cdk.aws_fsx.OntapDeploymentType
 
-Hourly granularity.
+The deployment type of the throughput capacity.
 
 ---
 
-##### `MONTHLY`<sup>Required</sup> <a name="MONTHLY" id="@open-constructs/aws-cdk.aws_cur.ReportGranularity.property.MONTHLY"></a>
-
-```typescript
-public readonly MONTHLY: ReportGranularity;
-```
-
-- *Type:* @open-constructs/aws-cdk.aws_cur.ReportGranularity
-
-Weekly granularity.
-
----
 
 ## Protocols <a name="Protocols" id="Protocols"></a>
 
@@ -2469,3 +3867,54 @@ User activity log.
 
 ---
 
+
+### OntapDeploymentType <a name="OntapDeploymentType" id="@open-constructs/aws-cdk.aws_fsx.OntapDeploymentType"></a>
+
+The different kinds of file system deployments used by NetApp ONTAP.
+
+#### Members <a name="Members" id="Members"></a>
+
+| **Name** | **Description** |
+| --- | --- |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapDeploymentType.MULTI_AZ_1">MULTI_AZ_1</a></code> | A high availability file system configured for Multi-AZ redundancy to tolerate temporary Availability Zone (AZ) unavailability. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapDeploymentType.MULTI_AZ_2">MULTI_AZ_2</a></code> | A high availability file system configured for Multi-AZ redundancy to tolerate temporary AZ unavailability. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapDeploymentType.SINGLE_AZ_1">SINGLE_AZ_1</a></code> | A file system configured for Single-AZ redundancy. |
+| <code><a href="#@open-constructs/aws-cdk.aws_fsx.OntapDeploymentType.SINGLE_AZ_2">SINGLE_AZ_2</a></code> | A file system configured with multiple high-availability (HA) pairs for Single-AZ redundancy. |
+
+---
+
+##### `MULTI_AZ_1` <a name="MULTI_AZ_1" id="@open-constructs/aws-cdk.aws_fsx.OntapDeploymentType.MULTI_AZ_1"></a>
+
+A high availability file system configured for Multi-AZ redundancy to tolerate temporary Availability Zone (AZ) unavailability.
+
+This is a first-generation FSx for ONTAP file system.
+
+---
+
+
+##### `MULTI_AZ_2` <a name="MULTI_AZ_2" id="@open-constructs/aws-cdk.aws_fsx.OntapDeploymentType.MULTI_AZ_2"></a>
+
+A high availability file system configured for Multi-AZ redundancy to tolerate temporary AZ unavailability.
+
+This is a second-generation FSx for ONTAP file system.
+
+---
+
+
+##### `SINGLE_AZ_1` <a name="SINGLE_AZ_1" id="@open-constructs/aws-cdk.aws_fsx.OntapDeploymentType.SINGLE_AZ_1"></a>
+
+A file system configured for Single-AZ redundancy.
+
+This is a first-generation FSx for ONTAP file system.
+
+---
+
+
+##### `SINGLE_AZ_2` <a name="SINGLE_AZ_2" id="@open-constructs/aws-cdk.aws_fsx.OntapDeploymentType.SINGLE_AZ_2"></a>
+
+A file system configured with multiple high-availability (HA) pairs for Single-AZ redundancy.
+
+This is a second-generation FSx for ONTAP file system.
+
+---
+
diff --git a/package-lock.json b/package-lock.json
index 5b3f367..348e99f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -2856,9 +2856,9 @@
       }
     },
     "node_modules/commit-and-tag-version": {
-      "version": "12.4.3",
-      "resolved": "https://registry.npmjs.org/commit-and-tag-version/-/commit-and-tag-version-12.4.3.tgz",
-      "integrity": "sha512-q+DaQ4QmvDjU3QBUfZmiH3CCL5Jf3saJ0I9dI1hL9equA4ZosoOkg3eya5q0qAc5T0eow+gF0DfKZskRbm4Shw==",
+      "version": "12.4.4",
+      "resolved": "https://registry.npmjs.org/commit-and-tag-version/-/commit-and-tag-version-12.4.4.tgz",
+      "integrity": "sha512-sK+69usdfluwRO6DtXs8wpRvyM9OAuV6y8kTgMj+ncRG3KrXeKjNcxFsWnnwH/KZU9k8ErKu5uQ1ptX6/pPk7A==",
       "dev": true,
       "dependencies": {
         "chalk": "^2.4.2",
@@ -6326,12 +6326,12 @@
       }
     },
     "node_modules/jsdom": {
-      "version": "25.0.0",
-      "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-25.0.0.tgz",
-      "integrity": "sha512-OhoFVT59T7aEq75TVw9xxEfkXgacpqAhQaYgP9y/fDqWQCMB/b1H66RfmPm/MaeaAIU9nDwMOVTlPN51+ao6CQ==",
+      "version": "25.0.1",
+      "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-25.0.1.tgz",
+      "integrity": "sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==",
       "dev": true,
       "dependencies": {
-        "cssstyle": "^4.0.1",
+        "cssstyle": "^4.1.0",
         "data-urls": "^5.0.0",
         "decimal.js": "^10.4.3",
         "form-data": "^4.0.0",
@@ -6344,7 +6344,7 @@
         "rrweb-cssom": "^0.7.1",
         "saxes": "^6.0.0",
         "symbol-tree": "^3.2.4",
-        "tough-cookie": "^4.1.4",
+        "tough-cookie": "^5.0.0",
         "w3c-xmlserializer": "^5.0.0",
         "webidl-conversions": "^7.0.0",
         "whatwg-encoding": "^3.1.1",
@@ -7246,9 +7246,9 @@
       }
     },
     "node_modules/nwsapi": {
-      "version": "2.2.12",
-      "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.12.tgz",
-      "integrity": "sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==",
+      "version": "2.2.13",
+      "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.13.tgz",
+      "integrity": "sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==",
       "dev": true
     },
     "node_modules/object-inspect": {
@@ -8504,12 +8504,6 @@
         "node": ">= 6"
       }
     },
-    "node_modules/psl": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
-      "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==",
-      "dev": true
-    },
     "node_modules/punycode": {
       "version": "2.3.1",
       "dev": true,
@@ -8533,12 +8527,6 @@
       ],
       "license": "MIT"
     },
-    "node_modules/querystringify": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
-      "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
-      "dev": true
-    },
     "node_modules/queue-microtask": {
       "version": "1.2.3",
       "dev": true,
@@ -8718,12 +8706,6 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/requires-port": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
-      "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
-      "dev": true
-    },
     "node_modules/resolve": {
       "version": "1.22.8",
       "dev": true,
@@ -9485,6 +9467,24 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/tldts": {
+      "version": "6.1.48",
+      "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.48.tgz",
+      "integrity": "sha512-SPbnh1zaSzi/OsmHb1vrPNnYuwJbdWjwo5TbBYYMlTtH3/1DSb41t8bcSxkwDmmbG2q6VLPVvQc7Yf23T+1EEw==",
+      "dev": true,
+      "dependencies": {
+        "tldts-core": "^6.1.48"
+      },
+      "bin": {
+        "tldts": "bin/cli.js"
+      }
+    },
+    "node_modules/tldts-core": {
+      "version": "6.1.48",
+      "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.48.tgz",
+      "integrity": "sha512-3gD9iKn/n2UuFH1uilBviK9gvTNT6iYwdqrj1Vr5mh8FuelvpRNaYVH4pNYqUgOGU4aAdL9X35eLuuj0gRsx+A==",
+      "dev": true
+    },
     "node_modules/tmpl": {
       "version": "1.0.5",
       "dev": true,
@@ -9510,27 +9510,15 @@
       }
     },
     "node_modules/tough-cookie": {
-      "version": "4.1.4",
-      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz",
-      "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.0.0.tgz",
+      "integrity": "sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==",
       "dev": true,
       "dependencies": {
-        "psl": "^1.1.33",
-        "punycode": "^2.1.1",
-        "universalify": "^0.2.0",
-        "url-parse": "^1.5.3"
+        "tldts": "^6.1.32"
       },
       "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/tough-cookie/node_modules/universalify": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
-      "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
-      "dev": true,
-      "engines": {
-        "node": ">= 4.0.0"
+        "node": ">=16"
       }
     },
     "node_modules/tr46": {
@@ -9884,16 +9872,6 @@
         "punycode": "^2.1.0"
       }
     },
-    "node_modules/url-parse": {
-      "version": "1.5.10",
-      "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
-      "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
-      "dev": true,
-      "dependencies": {
-        "querystringify": "^2.1.1",
-        "requires-port": "^1.0.0"
-      }
-    },
     "node_modules/util-deprecate": {
       "version": "1.0.2",
       "dev": true,
diff --git a/src/aws-fsx/README.md b/src/aws-fsx/README.md
new file mode 100644
index 0000000..d91185f
--- /dev/null
+++ b/src/aws-fsx/README.md
@@ -0,0 +1,227 @@
+Constructs for the AWS FSx service
+
+# Fsx for NetApp ONTAP File System CDK Construct
+
+The `OntapFileSystem` construct facilitates the creation and management of [Amazon FSx for NetApp ONTAP](https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/what-is-fsx-ontap.html) file systems within AWS CDK applications.
+
+## Basic Usage for FSx for NetApp ONTAP
+
+Setup required properties and create:
+
+```ts
+declare const vpc: ec2.Vpc;
+
+const fileSystem = new OntapFileSystem(this, 'FsxOntapFileSystem', {
+  ontapConfiguration: {
+    deploymentType: OntapDeploymentType.SINGLE_AZ_2,
+  },
+  storageCapacityGiB: 1200,
+  vpc,
+  vpcSubnet: vpc.privateSubnets,
+});
+```
+
+### Connecting to FSx for NetApp ONTAP
+
+To control who can access the file system, use the `.connections` attribute.
+
+This example allows an EC2 instance to connect to a file system on port 2049:
+
+```ts
+declare const fileSystem: OntapFileSystem;
+declare const instance: ec2.Instance;
+
+fileSystem.connections.allowFrom(instance, ec2.Port.tcp(2049));
+```
+
+### Deployment Type
+
+The `OntapFileSystem` construct supports the following deployment types:
+
+- `SINGLE_AZ_1`:  A file system configured for Single-AZ redundancy. This is a first-generation FSx for ONTAP file system.
+- `SINGLE_AZ_2`: A file system configured with multiple high-availability (HA) pairs for Single-AZ redundancy. This is a second-generation FSx for ONTAP file system.
+- `MULTI_AZ_1`:  A high availability file system configured for Multi-AZ redundancy to tolerate temporary Availability Zone (AZ) unavailability.  This is a first-generation FSx for ONTAP file system.
+- `MULTI_AZ_2`: A high availability file system configured for Multi-AZ redundancy to tolerate temporary AZ unavailability. This is a second-generation FSx for ONTAP file system.
+
+Only `SINGLE_AZ_2` allows setting HA pairs to a value other than 1.
+
+### Backup
+
+With FSx for ONTAP, you can protect your data by taking automatic daily backups and user-initiated backups of the volumes on your file system.
+Creating regular backups for your volumes is a best practice that helps support your data retention and compliance needs.
+
+You can restore volume backups to any existing FSx for ONTAP file system you have access to that is in the same AWS Region where the backup is stored.
+Working with Amazon FSx backups makes it is easy to create, view, restore, and delete backups of your volumes.
+
+To enable automatic backups, set the `automaticBackupRetention` property to a non-zero value in the `ontapConfiguration`:
+
+```ts
+declare const vpc: ec2.Vpc;
+
+const fileSystem = new OntapFileSystem(this, 'FsxOntapFileSystem', {
+  ontapConfiguration: {
+    deploymentType: OntapDeploymentType.SINGLE_AZ_2,
+    // Enable automatic backups and set the retention period to 3 days
+    automaticBackupRetention: cdk.Duration.days(3),
+    // Set the backup window to 1:00 AM UTC
+    dailyAutomaticBackupStartTime: new fsx.DailyAutomaticBackupStartTime({
+      hour: 1,
+      minute: 0,
+    }),
+  },
+  storageCapacityGiB: 1200,
+  vpc,
+  vpcSubnet: vpc.privateSubnets,
+});
+```
+
+### File system storage capacity and IOPS
+
+When you create an FSx for ONTAP file system, you specify the storage capacity of the SSD tier.
+
+For second-generation Single-AZ file systems,
+the storage capacity that you specify is spread evenly among the storage pools of each high-availability (HA) pair;
+these storage pools are called aggregates.
+
+For each GiB of SSD storage that you provision,
+Amazon FSx automatically provisions 3 SSD input/output operations per second (IOPS) for the file system,
+up to a maximum of 160,000 SSD IOPS per file system.
+
+For second-generation Single-AZ file systems, your SSD IOPS are spread evenly across each of your file system's aggregates.
+You have the option to specify a level of provisioned SSD IOPS above the automatic 3 SSD IOPS per GiB.
+
+For more information, see [File system storage capacity and IOPS](https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/storage-capacity-and-IOPS.html).
+
+To specify the storage capacity and level of provisioned SSD IOPS, set the `storageCapacityGiB` in the `OntapFileSystemProps` and `diskIops` property in the `ontapConfiguration`:
+
+```ts
+declare const vpc: ec2.Vpc;
+
+const fileSystem = new OntapFileSystem(this, 'FsxOntapFileSystem', {
+  ontapConfiguration: {
+    deploymentType: OntapDeploymentType.SINGLE_AZ_2,
+    // Set the level of provisioned SSD IOPS to 12,288
+    diskIops: 12288,
+    haPairs: 2,
+  },
+  // Set the storage capacity to 2 TiB
+  storageCapacityGiB: 2048,
+  vpc,
+  vpcSubnet: vpc.privateSubnets,
+});
+```
+
+**Note**:
+
+- The storage capacity has a minimum and maximum value based on the HA pairs. The minimum value is `1,024 * haPairs` GiB and the maximum value is smaller one between `524,288 * haPairs` and `1,048,576` GiB.
+- The level of provisioned SSD IOPS has a minimum and maximum value based on the storage capacity. The minimum value is `3 * storageCapacityGiB * haPairs` IOPS and the maximum value is `200,000 * haPairs` IOPS.
+
+### Multi-AZ file systems
+
+Multi-AZ file systems support all the availability and durability features of Single-AZ file systems.
+In addition, they are designed to provide continuous availability to data even when an Availability Zone is unavailable.
+
+Multi-AZ deployments have a single HA pair of file servers,
+the standby file server is deployed in a different Availability Zone from the active file server in the same AWS Region.
+Any changes written to your file system are synchronously replicated across Availability Zones to the standby.
+
+To create a Multi-AZ file system, set the `deploymentType` to `MULTI_AZ_X` and specify `endpointIpAddressRange`, `routeTables` and `preferredSubnet` in the `ontapConfiguration`:
+
+```ts
+declare const vpc: ec2.Vpc;
+
+const fileSystem = new OntapFileSystem(this, 'FsxOntapFileSystem', {
+  ontapConfiguration: {
+    deploymentType: OntapDeploymentType.MULTI_AZ_2,
+    // The IP address range in which the endpoints to access your file system will be created.
+    endpointIpAddressRange: '192.168.39.0/24',
+    // The route tables in which Amazon FSx creates the rules for routing traffic to the correct file server.
+    // You should specify all virtual private cloud (VPC) route tables associated with the subnets in which your clients are located.
+    routeTables: [vpc.privateSubnets.routeTable],
+    // The subnet in which you want the preferred file server to be located.
+    preferredSubnet: vpc.privateSubnets[0],
+  },
+  storageCapacityGiB: 1200,
+  vpc,
+  vpcSubnet: vpc.privateSubnets,
+});
+```
+
+**Note**:
+
+- `preferredSubnet` must be the part of the `vpcSubnet`.
+- Amazon FSx manages VPC route tables for Multi-AZ file systems using tag-based authentication. These route tables are tagged with Key: `AmazonFSx`; Value: `ManagedByAmazonFSx`.
+
+### Throughput Capacity
+
+FSx for ONTAP configures throughput capacity when you create the file system.
+You can modify your file system's throughput capacity at any time.
+
+Keep in mind that your file system requires a specific configuration to achieve the maximum amount of throughput capacity.
+
+For more information, see [Managing throughput capacity](https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/managing-throughput-capacity.html).
+
+To specify the throughput capacity, set the `throughputCapacityPreHaPair` property in the `ontapConfiguration`.
+
+This example sets the throughput capacity to 1536 MiB/s per HA pair:
+
+```ts
+declare const vpc: ec2.Vpc;
+
+const fileSystem = new OntapFileSystem(this, 'FsxOntapFileSystem', {
+  ontapConfiguration: {
+    deploymentType: OntapDeploymentType.SINGLE_AZ_2,
+    haPairs: 4,
+    // Set the total throughput capacity to 6144 MiB/s
+    throughputCapacity: SingleAz2ThroughputCapacityPerHaPair.MB_PER_SEC_1536,
+  },
+  storageCapacityGiB: 4096,
+  vpc,
+  vpcSubnet: vpc.privateSubnets,
+});
+```
+
+### Maintenance Window
+
+As a fully-managed service, FSx for ONTAP regularly performs maintenance on and updates to your file system.
+This maintenance has no impact for most workloads.
+
+For workloads that are performance-sensitive,
+on rare occasions you may notice a brief (<60 seconds) impact on performance when maintenance is occurring;
+Amazon FSx enables you to use the maintenance window to control when any such potential maintenance activity occurs.
+
+To set the maintenance window, specify the `maintenanceWindow` property in the `ontapConfiguration`:
+
+```ts
+declare const vpc: ec2.Vpc;
+
+const fileSystem = new OntapFileSystem(this, 'FsxOntapFileSystem', {
+  ontapConfiguration: {
+    deploymentType: OntapDeploymentType.SINGLE_AZ_2,
+    // Set the weekly maintenance window to SUNDAY 1:00 AM UTC
+    weeklyMaintenanceStartTime: new MaintenanceTime({
+      day: fsx.Weekday.SUNDAY,
+      hour: 1,
+      minute: 0,
+    }),
+  },
+  storageCapacityGiB: 1200,
+  vpc,
+  vpcSubnet: vpc.privateSubnets,
+});
+```
+
+### Import an existing file system
+
+To import an existing FSx for ONTAP file system, use the `OntapFileSystem.fromOntapFileSystemAttributes` method:
+
+```ts
+declare const existingFileSystem: fsx.IFileSystemBase;
+declare const vpc: ec2.Vpc;
+
+const fileSystem = OntapFileSystem.fromOntapFileSystemAttributes(this, 'FsxOntapFileSystem', {
+  dnsName: existingFileSystem.dnsName,
+  fileSystemId: existingFileSystem.fileSystemId,
+  securityGroup: existingFileSystem.securityGroup,
+});
+```
diff --git a/src/aws-fsx/daily-automatic-backup-start-time.ts b/src/aws-fsx/daily-automatic-backup-start-time.ts
new file mode 100644
index 0000000..7f768b8
--- /dev/null
+++ b/src/aws-fsx/daily-automatic-backup-start-time.ts
@@ -0,0 +1,68 @@
+/**
+ * Properties required for setting up a daily automatic backup time.
+ */
+export interface DailyAutomaticBackupStartTimeProps {
+  /**
+   * The hour of the day (from 0-23) for automatic backup starts.
+   */
+  readonly hour: number;
+  /**
+   * The minute of the hour (from 0-59) for automatic backup starts.
+   */
+  readonly minute: number;
+}
+
+/**
+ * Class for scheduling a daily automatic backup time.
+ */
+export class DailyAutomaticBackupStartTime {
+  /**
+   * The start hour of the automatic backup time in Coordinated Universal Time (UTC), using 24-hour time.
+   * For example, 17 refers to 5:00 P.M. UTC.
+   *
+   * @default - 22
+   */
+  private readonly hour: string;
+  /**
+   * The start minute of the automatic backup time, in UTC.
+   *
+   * @default - 0
+   */
+  private readonly minute: string;
+
+  constructor(props: DailyAutomaticBackupStartTimeProps) {
+    this.validate(props.hour, props.minute);
+
+    this.hour = this.getTwoDigitString(props.hour);
+    this.minute = this.getTwoDigitString(props.minute);
+  }
+  /**
+   * Converts an hour, and minute into HH:MM string.
+   */
+  public toTimestamp(): string {
+    return `${this.hour}:${this.minute}`;
+  }
+
+  /**
+   * Pad an integer so that it always contains at least 2 digits. Assumes the number is a positive integer.
+   */
+  private getTwoDigitString(n: number): string {
+    const numberString = n.toString();
+    if (numberString.length === 1) {
+      return `0${n}`;
+    }
+    return numberString;
+  }
+
+  /**
+   * Validation needed for the values of the daily automatic backup time.
+   */
+  private validate(hour: number, minute: number) {
+    if (!Number.isInteger(hour) || hour < 0 || hour > 23) {
+      throw new Error(`dailyAutomaticBackupStartTime hour must be an integer between 0 and 24. received: ${hour}`);
+    }
+    if (!Number.isInteger(minute) || minute < 0 || minute > 59) {
+      throw new Error(`dailyAutomaticBackupStartTime minute must be an integer between 0 and 59. received: ${minute}`);
+    }
+  }
+}
diff --git a/src/aws-fsx/index.ts b/src/aws-fsx/index.ts
new file mode 100644
index 0000000..1e63bbf
--- /dev/null
+++ b/src/aws-fsx/index.ts
@@ -0,0 +1,3 @@
+export * from './daily-automatic-backup-start-time';
+export * from './maintenance-time';
+export * from './ontap-file-system';
diff --git a/src/aws-fsx/maintenance-time.ts b/src/aws-fsx/maintenance-time.ts
new file mode 100644
index 0000000..ee2a9f9
--- /dev/null
+++ b/src/aws-fsx/maintenance-time.ts
@@ -0,0 +1,74 @@
+import { aws_fsx } from 'aws-cdk-lib';
+
+/**
+ * Properties required for setting up a weekly maintenance time
+ */
+export interface MaintenanceTimeProps {
+  /**
+   * The day of the week for maintenance to be performed.
+   */
+  readonly day: aws_fsx.Weekday;
+  /**
+   * The hour of the day (from 0-23) for maintenance to be performed.
+   */
+  readonly hour: number;
+  /**
+   * The minute of the hour (from 0-59) for maintenance to be performed.
+   */
+  readonly minute: number;
+}
+
+/**
+ * Class for scheduling a weekly maintenance time.
+ */
+export class MaintenanceTime {
+  /**
+   * The day of the week for maintenance to be performed.
+   */
+  private readonly day: aws_fsx.Weekday;
+  /**
+   * The hour of the day (from 00-23) for maintenance to be performed.
+   */
+  private readonly hour: string;
+  /**
+   * The minute of the hour (from 00-59) for maintenance to be performed.
+   */
+  private readonly minute: string;
+
+  constructor(props: MaintenanceTimeProps) {
+    this.validate(props.hour, props.minute);
+
+    this.day = props.day;
+    this.hour = this.getTwoDigitString(props.hour);
+    this.minute = this.getTwoDigitString(props.minute);
+  }
+  /**
+   * Converts a day, hour, and minute into a timestamp as used by FSx for Lustre's weeklyMaintenanceStartTime field.
+   */
+  public toTimestamp(): string {
+    return `${this.day.valueOf()}:${this.hour}:${this.minute}`;
+  }
+
+  /**
+   * Pad an integer so that it always contains at least 2 digits. Assumes the number is a positive integer.
+   */
+  private getTwoDigitString(n: number): string {
+    const numberString = n.toString();
+    if (numberString.length === 1) {
+      return `0${n}`;
+    }
+    return numberString;
+  }
+
+  /**
+   * Validation needed for the values of the maintenance time.
+   */
+  private validate(hour: number, minute: number) {
+    if (!Number.isInteger(hour) || hour < 0 || hour > 23) {
+      throw new Error('Maintenance time hour must be an integer between 0 and 23');
+    }
+    if (!Number.isInteger(minute) || minute < 0 || minute > 59) {
+      throw new Error('Maintenance time minute must be an integer between 0 and 59');
+    }
+  }
+}
diff --git a/src/aws-fsx/ontap-file-system.ts b/src/aws-fsx/ontap-file-system.ts
new file mode 100644
index 0000000..41975a4
--- /dev/null
+++ b/src/aws-fsx/ontap-file-system.ts
@@ -0,0 +1,619 @@
+import { Aws, Duration, SecretValue, Token, aws_ec2, aws_fsx } from 'aws-cdk-lib';
+import { Construct } from 'constructs';
+import { DailyAutomaticBackupStartTime } from './daily-automatic-backup-start-time';
+import { MaintenanceTime } from './maintenance-time';
+
+/**
+ * The different kinds of file system deployments used by NetApp ONTAP.
+ */
+export enum OntapDeploymentType {
+  /**
+   * A high availability file system configured for Multi-AZ redundancy to tolerate temporary Availability Zone (AZ) unavailability.
+   * This is a first-generation FSx for ONTAP file system.
+   */
+  MULTI_AZ_1 = 'MULTI_AZ_1',
+
+  /**
+   * A high availability file system configured for Multi-AZ redundancy to tolerate temporary AZ unavailability.
+   * This is a second-generation FSx for ONTAP file system.
+   */
+  MULTI_AZ_2 = 'MULTI_AZ_2',
+
+  /**
+   * A file system configured for Single-AZ redundancy.
+   * This is a first-generation FSx for ONTAP file system.
+   */
+  SINGLE_AZ_1 = 'SINGLE_AZ_1',
+
+  /**
+   * A file system configured with multiple high-availability (HA) pairs for Single-AZ redundancy.
+   * This is a second-generation FSx for ONTAP file system.
+   */
+  SINGLE_AZ_2 = 'SINGLE_AZ_2',
+}
+
+/**
+ * The throughput capacity per HA pair for an Amazon FSx for NetApp ONTAP file system.
+ */
+export abstract class ThroughputCapacityPerHaPair {
+  /**
+   * The deployment type of the throughput capacity.
+   */
+  public abstract readonly deploymentType: OntapDeploymentType;
+  protected constructor(public readonly capacity: number) {}
+}
+
+/**
+ * The throughput capacity for the Single-AZ 1 deployment type.
+ */
+export class SingleAz1ThroughputCapacityPerHaPair extends ThroughputCapacityPerHaPair {
+  /**
+   * The throughput capacity of 128 MBps per HA pair.
+   */
+  public static readonly MB_PER_SEC_128 = new SingleAz1ThroughputCapacityPerHaPair(128);
+
+  /**
+   * The throughput capacity of 256 MBps per HA pair.
+   */
+  public static readonly MB_PER_SEC_256 = new SingleAz1ThroughputCapacityPerHaPair(256);
+
+  /**
+   * The throughput capacity of 512 MBps per HA pair.
+   */
+  public static readonly MB_PER_SEC_512 = new SingleAz1ThroughputCapacityPerHaPair(512);
+
+  /**
+   * The throughput capacity of 1024 MBps per HA pair.
+   */
+  public static readonly MB_PER_SEC_1024 = new SingleAz1ThroughputCapacityPerHaPair(1024);
+
+  /**
+   * The throughput capacity of 2048 MBps per HA pair.
+   */
+  public static readonly MB_PER_SEC_2048 = new SingleAz1ThroughputCapacityPerHaPair(2048);
+
+  /**
+   * The throughput capacity of 4096 MBps per HA pair.
+   */
+  public static readonly MB_PER_SEC_4096 = new SingleAz1ThroughputCapacityPerHaPair(4096);
+
+  /**
+   * The deployment type of the throughput capacity.
+   */
+  public readonly deploymentType = OntapDeploymentType.SINGLE_AZ_1;
+}
+
+/**
+ * The throughput capacity for the Multi-AZ 1 deployment type.
+ */
+export class MultiAz1ThroughputCapacityPerHaPair extends ThroughputCapacityPerHaPair {
+  /**
+   * The throughput capacity of 128 MBps per HA pair.
+   */
+  public static readonly MB_PER_SEC_128 = new MultiAz1ThroughputCapacityPerHaPair(128);
+
+  /**
+   * The throughput capacity of 256 MBps per HA pair.
+   */
+  public static readonly MB_PER_SEC_256 = new MultiAz1ThroughputCapacityPerHaPair(256);
+
+  /**
+   * The throughput capacity of 512 MBps per HA pair.
+   */
+  public static readonly MB_PER_SEC_512 = new MultiAz1ThroughputCapacityPerHaPair(512);
+
+  /**
+   * The throughput capacity of 1024 MBps per HA pair.
+   */
+  public static readonly MB_PER_SEC_1024 = new MultiAz1ThroughputCapacityPerHaPair(1024);
+
+  /**
+   * The throughput capacity of 2048 MBps per HA pair.
+   */
+  public static readonly MB_PER_SEC_2048 = new MultiAz1ThroughputCapacityPerHaPair(2048);
+
+  /**
+   * The throughput capacity of 4096 MBps per HA pair.
+   */
+  public static readonly MB_PER_SEC_4096 = new MultiAz1ThroughputCapacityPerHaPair(4096);
+
+  /**
+   * The deployment type of the throughput capacity.
+   */
+  public readonly deploymentType = OntapDeploymentType.MULTI_AZ_1;
+}
+
+/**
+ * The throughput capacity for the Single-AZ 2 deployment type.
+ */
+export class SingleAz2ThroughputCapacityPerHaPair extends ThroughputCapacityPerHaPair {
+  /**
+   * The throughput capacity of 1536 MBps per HA pair.
+   */
+  public static readonly MB_PER_SEC_1536 = new SingleAz2ThroughputCapacityPerHaPair(1536);
+
+  /**
+   * The throughput capacity of 3072 MBps per HA pair.
+   */
+  public static readonly MB_PER_SEC_3072 = new SingleAz2ThroughputCapacityPerHaPair(3072);
+
+  /**
+   * The throughput capacity of 6144 MBps per HA pair.
+   */
+  public static readonly MB_PER_SEC_6144 = new SingleAz2ThroughputCapacityPerHaPair(6144);
+
+  /**
+   * The deployment type of the throughput capacity.
+   */
+  public readonly deploymentType = OntapDeploymentType.SINGLE_AZ_2;
+}
+
+/**
+ * The throughput capacity for the Multi-AZ 2 deployment type.
+ */
+export class MultiAz2ThroughputCapacityPerHaPair extends ThroughputCapacityPerHaPair {
+  /**
+   * The throughput capacity of 384 MBps per HA pair.
+   */
+  public static readonly MB_PER_SEC_384 = new MultiAz2ThroughputCapacityPerHaPair(384);
+
+  /**
+   * The throughput capacity of 768 MBps per HA pair.
+   */
+  public static readonly MB_PER_SEC_768 = new MultiAz2ThroughputCapacityPerHaPair(768);
+
+  /**
+   * The throughput capacity of 1536 MBps per HA pair.
+   */
+  public static readonly MB_PER_SEC_1536 = new MultiAz2ThroughputCapacityPerHaPair(1536);
+
+  /**
+   * The throughput capacity of 3072 MBps per HA pair.
+   */
+  public static readonly MB_PER_SEC_3072 = new MultiAz2ThroughputCapacityPerHaPair(3072);
+
+  /**
+   * The throughput capacity of 6144 MBps per HA pair.
+   */
+  public static readonly MB_PER_SEC_6144 = new MultiAz2ThroughputCapacityPerHaPair(6144);
+
+  /**
+   * The deployment type of the throughput capacity.
+   */
+  public readonly deploymentType = OntapDeploymentType.MULTI_AZ_2;
+}
+
+/**
+ * The configuration for the Amazon FSx for NetApp ONTAP file system.
+ *
+ * @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-ontapconfiguration.html
+ */
+export interface OntapConfiguration {
+  /**
+   * The number of days to retain automatic backups.
+   *
+   * Setting this property to 0 disables automatic backups.
+   * You can retain automatic backups for a maximum of 90 days.
+   *
+   * @default - 30 days
+   */
+  readonly automaticBackupRetention?: Duration;
+
+  /**
+   * Start time for 30-minute daily automatic backup window in Coordinated Universal Time (UTC).
+   *
+   * @default - no backup window
+   */
+  readonly dailyAutomaticBackupStartTime?: DailyAutomaticBackupStartTime;
+
+  /**
+   * The FSx for ONTAP file system deployment type to use in creating the file system.
+   *
+   * @default OntapDeploymentType.MULTI_AZ_2
+   */
+  readonly deploymentType?: OntapDeploymentType;
+
+  /**
+   * The total number of SSD IOPS provisioned for the file system.
+   *
+   * The minimum and maximum values for this property depend on the value of HAPairs and StorageCapacity.
+   * The minimum value is calculated as StorageCapacity * 3 * HAPairs (3 IOPS per GB of StorageCapacity).
+   * The maximum value is calculated as 200,000 * HAPairs.
+   *
+   * @default - 3 IOPS * GB of storage capacity * HAPairs
+   */
+  readonly diskIops?: number;
+
+  /**
+   * The IP address range in which the endpoints to access your file system will be created.
+   *
+   * You can have overlapping endpoint IP addresses for file systems deployed in the same VPC/route tables, as long as they don't overlap with any subnet.
+   *
+   * @default - an unused IP address range from the 198.19.* range
+   */
+  readonly endpointIpAddressRange?: string;
+
+  /**
+   * The ONTAP administrative password for the `fsxadmin` user with which you administer your file system using the NetApp ONTAP CLI and REST API.
+   *
+   * If you don't specify a password, Amazon FSx will not set one. In that case, the user will not be able to log in.
+   *
+   * You can change the admin password at any time through the management console.
+   *
+   * @default - do not set an admin password
+   */
+  readonly fsxAdminPassword?: SecretValue;
+
+  /**
+   * How many high-availability (HA) pairs of file servers will power your file system.
+   *
+   * First-generation file systems are powered by 1 HA pair.
+   * Second-generation multi-AZ file systems are powered by 1 HA pair.
+   * Second generation single-AZ file systems are powered by up to 12 HA pairs.
+   *
+   * The value of this property affects the values of `storageCapacity`, `iops`, and `throughputCapacity`.
+   *
+   * Block storage protocol support (iSCSI and NVMe over TCP) is disabled on file systems with more than 6 HA pairs.
+   *
+   * @see https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/administering-file-systems.html#HA-pairs
+   * @see https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/supported-fsx-clients.html#using-block-storage
+   *
+   * @default 1
+   */
+  readonly haPairs?: number;
+
+  /**
+   * The subnet in which you want the preferred file server to be located.
+   *
+   * This value is required when `deploymentType` is set to `MULTI_AZ_1` or `MULTI_AZ_2`.
+   *
+   * @default - no default value (This value is not used for single-AZ file systems, but it is required for multi-AZ file systems)
+   */
+  readonly preferredSubnet?: aws_ec2.ISubnet;
+
+  /**
+   * The route tables in which Amazon FSx creates the rules for routing traffic to the correct file server.
+   *
+   * You should specify all virtual private cloud (VPC) route tables associated with the subnets in which your clients are located.
+   *
+   * Amazon FSx manages VPC route tables for Multi-AZ file systems using tag-based authentication.
+   * These route tables are tagged with Key: AmazonFSx; Value: ManagedByAmazonFSx.
+   *
+   * @see https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/unable-to-access.html#vpc-route-tables-not-tagged
+   *
+   * @default - Amazon FSx selects your VPC's default route table.
+   */
+  readonly routeTables?: aws_ec2.IRouteTable[];
+
+  /**
+   * The throughput capacity per HA pair for the file system.
+   *
+   * @see https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/managing-throughput-capacity.html
+   *
+   * @default - Amazon FSx determines the throughput capacity based on the storage capacity
+   */
+  readonly throughputCapacityPerHaPair?: ThroughputCapacityPerHaPair;
+
+  /**
+   * The preferred day and time to perform weekly maintenance.
+   *
+   * @default - automatically set by Amazon FSx
+   */
+  readonly weeklyMaintenanceStartTime?: MaintenanceTime;
+}
+
+/**
+ * Properties specific to the NetApp ONTAP version of the FSx file system.
+ */
+export interface OntapFileSystemProps extends aws_fsx.FileSystemProps {
+  /**
+   * Additional configuration for FSx specific to NetApp ONTAP.
+   */
+  readonly ontapConfiguration: OntapConfiguration;
+
+  /**
+   * The subnet that the file system will be accessible from.
+   *
+   * For MULTI_AZ_1 deployment types,
+   * provide exactly two subnets, one for the preferred file server and one for the standby file server.
+   *
+   * Specify one of these subnets as the preferred subnet using `OntapConfiguration.preferredSubnet` property for multi-AZ file system.
+   */
+  readonly vpcSubnets: aws_ec2.ISubnet[];
+}
+
+/**
+ * The FSx for NetApp ONTAP File System implementation of IFileSystem.
+ *
+ * @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html
+ *
+ * @resource AWS::FSx::FileSystem
+ */
+export class OntapFileSystem extends aws_fsx.FileSystemBase {
+  /**
+   * Import an existing FSx for NetApp ONTAP file system from the given properties.
+   */
+  public static fromOntapFileSystemAttributes(
+    scope: Construct,
+    id: string,
+    attrs: aws_fsx.FileSystemAttributes,
+  ): aws_fsx.IFileSystem {
+    class Import extends aws_fsx.FileSystemBase {
+      public readonly dnsName = attrs.dnsName;
+      public readonly fileSystemId = attrs.fileSystemId;
+      public readonly connections = OntapFileSystem.configureConnections(attrs.securityGroup);
+    }
+
+    return new Import(scope, id);
+  }
+
+  /**
+   * Configures a Connections object.
+   */
+  protected static configureConnections(securityGroup: aws_ec2.ISecurityGroup): aws_ec2.Connections {
+    const connections = new aws_ec2.Connections({
+      securityGroups: [securityGroup],
+    });
+
+    return connections;
+  }
+
+  /**
+   * The default FSx file system type used by FSx for NetApp ONTAP.
+   */
+  private static readonly DEFAULT_FILE_SYSTEM_TYPE: string = 'ONTAP';
+
+  /**
+   * The security groups/rules used to allow network connections to the file system.
+   */
+  public readonly connections: aws_ec2.Connections;
+
+  /**
+   * The management endpoint DNS name assigned to this file system.
+   */
+  public readonly dnsName: string;
+
+  /**
+   * The inter cluster endpoint DNS name assigned to this file system.
+   */
+  public readonly interClusterDnsName: string;
+
+  /**
+   * The ID that AWS assigns to the file system.
+   */
+  public readonly fileSystemId: string;
+
+  /**
+   * The encapsulated L1 file system.
+   */
+  private readonly fileSystem: aws_fsx.CfnFileSystem;
+
+  /**
+   * The deployment type of the file system.
+   */
+  private readonly deploymentType: OntapDeploymentType;
+
+  constructor(scope: Construct, id: string, props: OntapFileSystemProps) {
+    super(scope, id);
+
+    this.deploymentType = props.ontapConfiguration.deploymentType ?? OntapDeploymentType.MULTI_AZ_2;
+
+    this.validateProps(props);
+
+    const securityGroup = props.securityGroup || this.createSecurityGroup(props.vpc);
+    this.connections = OntapFileSystem.configureConnections(securityGroup);
+    this.fileSystem = this.createOntapFileSystem(securityGroup, props);
+
+    this.fileSystem.applyRemovalPolicy(props.removalPolicy);
+
+    this.fileSystemId = this.fileSystem.ref;
+    const baseDnsName = `${this.fileSystemId}.fsx.${this.env.region}.${Aws.URL_SUFFIX}`;
+    this.dnsName = `management.${baseDnsName}`;
+    this.interClusterDnsName = `intercluster.${baseDnsName}`;
+  }
+
+  protected createSecurityGroup(vpc: aws_ec2.IVpc): aws_ec2.SecurityGroup {
+    return new aws_ec2.SecurityGroup(this, 'FsxOntapSecurityGroup', {
+      vpc,
+    });
+  }
+
+  protected createOntapFileSystem(
+    fileSystemSecurityGroup: aws_ec2.ISecurityGroup,
+    props: OntapFileSystemProps,
+  ): aws_fsx.CfnFileSystem {
+    const ontapConfiguration = props.ontapConfiguration;
+
+    const fileSystem = new aws_fsx.CfnFileSystem(this, 'Resource', {
+      fileSystemType: OntapFileSystem.DEFAULT_FILE_SYSTEM_TYPE,
+      subnetIds: props.vpcSubnets.map(subnet => subnet.subnetId),
+      backupId: props.backupId,
+      kmsKeyId: props.kmsKey?.keyId,
+      ontapConfiguration: {
+        automaticBackupRetentionDays: ontapConfiguration.automaticBackupRetention?.toDays() ?? 30,
+        dailyAutomaticBackupStartTime: ontapConfiguration.dailyAutomaticBackupStartTime?.toTimestamp(),
+        deploymentType: this.deploymentType,
+        diskIopsConfiguration: {
+          mode: ontapConfiguration.diskIops ? 'USER_PROVISIONED' : 'AUTOMATIC',
+          iops: ontapConfiguration.diskIops,
+        },
+        endpointIpAddressRange: ontapConfiguration.endpointIpAddressRange,
+        fsxAdminPassword: ontapConfiguration.fsxAdminPassword?.unsafeUnwrap(),
+        haPairs: ontapConfiguration.haPairs,
+        preferredSubnetId: ontapConfiguration.preferredSubnet?.subnetId,
+        routeTableIds: ontapConfiguration.routeTables?.map(routeTable => routeTable.routeTableId),
+        throughputCapacityPerHaPair: ontapConfiguration.throughputCapacityPerHaPair?.capacity,
+        weeklyMaintenanceStartTime: ontapConfiguration.weeklyMaintenanceStartTime?.toTimestamp(),
+      },
+      securityGroupIds: [fileSystemSecurityGroup.securityGroupId],
+      storageCapacity: props.storageCapacityGiB,
+    });
+
+    return fileSystem;
+  }
+
+  /**
+   * Validates the props provided for a new FSx for Ontap file system.
+   */
+  private validateProps(props: OntapFileSystemProps) {
+    const ontapConfiguration = props.ontapConfiguration;
+
+    this.validateHaPairs(ontapConfiguration.haPairs);
+    this.validateAutomaticBackupRetention(ontapConfiguration.automaticBackupRetention);
+    this.validateDailyAutomaticBackupStartTime(
+      ontapConfiguration.automaticBackupRetention,
+      ontapConfiguration.dailyAutomaticBackupStartTime,
+    );
+    this.validateDiskIops(props.storageCapacityGiB, ontapConfiguration.diskIops, ontapConfiguration.haPairs);
+    this.validateEndpointIpAddressRange(ontapConfiguration.endpointIpAddressRange);
+    this.validateSubnets(props.vpcSubnets, ontapConfiguration.preferredSubnet);
+    this.validateRouteTables(ontapConfiguration.routeTables);
+    this.validateThroughputCapacity(ontapConfiguration.throughputCapacityPerHaPair);
+    this.validateStorageCapacity(ontapConfiguration.haPairs, props.storageCapacityGiB);
+  }
+
+  private validateAutomaticBackupRetention(automaticBackupRetention?: Duration): void {
+    if (
+      automaticBackupRetention == null ||
+      automaticBackupRetention.isUnresolved() ||
+      automaticBackupRetention.toMilliseconds() === 0
+    ) {
+      return;
+    }
+    if (automaticBackupRetention.toMilliseconds() < Duration.days(1).toMilliseconds()) {
+      throw new Error('automaticBackupRetention must be between 1 and 90 days or 0 for disabled');
+    }
+    if (automaticBackupRetention.toDays() > 90) {
+      throw new Error(
+        `automaticBackupRetention must be between 1 and 90 days or 0 for disabled. got: ${automaticBackupRetention.toDays()} days`,
+      );
+    }
+  }
+
+  private validateDailyAutomaticBackupStartTime(
+    automaticBackupRetention?: Duration,
+    dailyAutomaticBackupStartTime?: DailyAutomaticBackupStartTime,
+  ): void {
+    if (!dailyAutomaticBackupStartTime) {
+      return;
+    }
+
+    const automaticBackupDisabled = !automaticBackupRetention || automaticBackupRetention.toDays() === 0;
+
+    if (dailyAutomaticBackupStartTime && automaticBackupDisabled) {
+      throw new Error(
+        "'automaticBackupRetention' period must be set a non-zero day when 'dailyAutomaticBackupStartTime' is set",
+      );
+    }
+  }
+
+  private validateDiskIops(storageCapacityGiB: number, diskIops?: number, haPairs: number = 1): void {
+    if (
+      diskIops == null ||
+      Token.isUnresolved(diskIops) ||
+      Token.isUnresolved(storageCapacityGiB) ||
+      Token.isUnresolved(haPairs)
+    ) {
+      return;
+    }
+
+    const minDiskIops = storageCapacityGiB * 3 * haPairs;
+    const maxDiskIops = 200_000 * haPairs;
+
+    if (!Number.isInteger(diskIops) || diskIops < minDiskIops || diskIops > maxDiskIops) {
+      throw new Error(`\'diskIops\' must be an integer between ${minDiskIops} and ${maxDiskIops}, got ${diskIops}`);
+    }
+  }
+
+  private validateEndpointIpAddressRange(endpointIpAddressRange?: string): void {
+    if (endpointIpAddressRange == null || Token.isUnresolved(endpointIpAddressRange)) {
+      return;
+    }
+    if (
+      this.deploymentType !== OntapDeploymentType.MULTI_AZ_1 &&
+      this.deploymentType !== OntapDeploymentType.MULTI_AZ_2
+    ) {
+      throw new Error("'endpointIpAddressRange' can only be specified for multi-AZ file systems");
+    }
+    if (!/^[^\u0000\u0085\u2028\u2029\r\n]{9,17}$/.test(endpointIpAddressRange)) {
+      throw new Error(
+        "'endpointIpAddressRange' must be between 9 and 17 characters long and not contain any of the following characters: \\u0000, \\u0085, \\u2028, \\u2029, \\r, or \\n",
+      );
+    }
+  }
+
+  private validateHaPairs(haPairs?: number): void {
+    if (haPairs == null || Token.isUnresolved(haPairs)) {
+      return;
+    }
+    if (!Number.isInteger(haPairs) || haPairs < 1 || haPairs > 12) {
+      throw new Error(`\'haPairs\' must be an integer between 1 and 12, got ${haPairs}`);
+    }
+    if (
+      haPairs > 1 &&
+      [OntapDeploymentType.SINGLE_AZ_1, OntapDeploymentType.MULTI_AZ_1, OntapDeploymentType.MULTI_AZ_2].includes(
+        this.deploymentType,
+      )
+    ) {
+      throw new Error(`\'haPairs\' must be 1 for deployment type ${this.deploymentType}, got ${haPairs}`);
+    }
+  }
+
+  private validateSubnets(vpcSubnets: aws_ec2.ISubnet[], preferredSubnet?: aws_ec2.ISubnet): void {
+    if (
+      (this.deploymentType === OntapDeploymentType.MULTI_AZ_1 ||
+        this.deploymentType === OntapDeploymentType.MULTI_AZ_2) &&
+      !preferredSubnet
+    ) {
+      throw new Error("'preferredSubnet' must be specified for multi-AZ file systems");
+    }
+    if (
+      (this.deploymentType === OntapDeploymentType.SINGLE_AZ_1 ||
+        this.deploymentType === OntapDeploymentType.SINGLE_AZ_2) &&
+      preferredSubnet
+    ) {
+      throw new Error("'preferredSubnet' can only be specified for multi-AZ file systems");
+    }
+    if (preferredSubnet && !vpcSubnets.includes(preferredSubnet)) {
+      throw new Error("'preferredSubnet' must be one of the specified 'vpcSubnets'");
+    }
+  }
+
+  private validateRouteTables(routeTables?: aws_ec2.IRouteTable[]): void {
+    if (routeTables == null || routeTables.length === 0) {
+      return;
+    }
+    if (
+      this.deploymentType !== OntapDeploymentType.MULTI_AZ_1 &&
+      this.deploymentType !== OntapDeploymentType.MULTI_AZ_2
+    ) {
+      throw new Error("'routeTables' can only be specified for multi-AZ file systems");
+    }
+  }
+
+  private validateThroughputCapacity(throughputCapacityPerHaPair?: ThroughputCapacityPerHaPair): void {
+    if (throughputCapacityPerHaPair == null) {
+      return;
+    }
+    if (throughputCapacityPerHaPair.deploymentType !== this.deploymentType) {
+      throw new Error(
+        `'throughputCapacityPerHaPair' must be compatible with the deployment type, deployment type: ${this.deploymentType}, deployment type from throughput capacity: ${throughputCapacityPerHaPair.deploymentType}`,
+      );
+    }
+  }
+
+  private validateStorageCapacity(haPairs: number = 1, storageCapacityGiB: number): void {
+    if (Token.isUnresolved(storageCapacityGiB) || Token.isUnresolved(haPairs)) {
+      return;
+    }
+    if (
+      !Number.isInteger(storageCapacityGiB) ||
+      storageCapacityGiB < 1024 * haPairs ||
+      storageCapacityGiB > Math.min(1_048_576, 524_288 * haPairs)
+    ) {
+      throw new Error(
+        `storageCapacityGiB must be an integer between ${1024 * haPairs} and ${Math.min(1_048_576, 524_288 * haPairs)}, got ${storageCapacityGiB}`,
+      );
+    }
+  }
+}
diff --git a/src/index.ts b/src/index.ts
index 8eb5936..f08201b 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -1,4 +1,5 @@
 // Export constructs here
 export * as aws_cur from './aws-cur';
 export * as aws_ec2 from './aws-ec2';
+export * as aws_fsx from './aws-fsx';
 export * as aws_redshiftserverless from './aws-redshiftserverless';


Test patch:
diff --git a/test/aws-fsx/integ.ontap-file-system.ts b/test/aws-fsx/integ.ontap-file-system.ts
new file mode 100644
index 0000000..6d03e9c
--- /dev/null
+++ b/test/aws-fsx/integ.ontap-file-system.ts
@@ -0,0 +1,65 @@
+import * as integ from '@aws-cdk/integ-tests-alpha';
+import { App, Duration, RemovalPolicy, SecretValue, Stack, aws_ec2, aws_fsx } from 'aws-cdk-lib';
+import * as ocf from '../../src';
+import { DailyAutomaticBackupStartTime } from '../../src/aws-fsx/daily-automatic-backup-start-time';
+
+const app = new App();
+
+const stack = new Stack(app, 'FsxForOntapTestStack');
+
+const vpc = new aws_ec2.Vpc(stack, 'Vpc');
+
+new ocf.aws_fsx.OntapFileSystem(stack, 'OntapMultiAzFileSystem', {
+  vpc,
+  vpcSubnets: vpc.privateSubnets,
+  storageCapacityGiB: 5120,
+  ontapConfiguration: {
+    automaticBackupRetention: Duration.days(7),
+    dailyAutomaticBackupStartTime: new DailyAutomaticBackupStartTime({
+      hour: 1,
+      minute: 0,
+    }),
+    deploymentType: ocf.aws_fsx.OntapDeploymentType.MULTI_AZ_2,
+    diskIops: 15360,
+    endpointIpAddressRange: '192.168.39.0/24',
+    fsxAdminPassword: SecretValue.unsafePlainText('fsxPassword1'),
+    haPairs: 1,
+    preferredSubnet: vpc.privateSubnets[0],
+    routeTables: [vpc.privateSubnets[0].routeTable, vpc.privateSubnets[1].routeTable],
+    throughputCapacityPerHaPair: ocf.aws_fsx.MultiAz2ThroughputCapacityPerHaPair.MB_PER_SEC_384,
+    weeklyMaintenanceStartTime: new ocf.aws_fsx.MaintenanceTime({
+      day: aws_fsx.Weekday.SUNDAY,
+      hour: 1,
+      minute: 0,
+    }),
+  },
+  removalPolicy: RemovalPolicy.DESTROY,
+});
+
+new ocf.aws_fsx.OntapFileSystem(stack, 'OntapSingleAzFileSystem', {
+  vpc,
+  vpcSubnets: [vpc.privateSubnets[0]],
+  storageCapacityGiB: 5120,
+  ontapConfiguration: {
+    automaticBackupRetention: Duration.days(7),
+    dailyAutomaticBackupStartTime: new DailyAutomaticBackupStartTime({
+      hour: 1,
+      minute: 0,
+    }),
+    deploymentType: ocf.aws_fsx.OntapDeploymentType.SINGLE_AZ_2,
+    diskIops: 76800,
+    fsxAdminPassword: SecretValue.unsafePlainText('fsxPassword1'),
+    haPairs: 5,
+    throughputCapacityPerHaPair: ocf.aws_fsx.SingleAz2ThroughputCapacityPerHaPair.MB_PER_SEC_1536,
+    weeklyMaintenanceStartTime: new ocf.aws_fsx.MaintenanceTime({
+      day: aws_fsx.Weekday.SUNDAY,
+      hour: 1,
+      minute: 0,
+    }),
+  },
+  removalPolicy: RemovalPolicy.DESTROY,
+});
+
+new integ.IntegTest(app, 'FsxForOntapTest', {
+  testCases: [stack],
+});
diff --git a/test/aws-fsx/integ.ontap-file-system.ts.snapshot/FsxForOntapTestDefaultTestDeployAssert20A933DE.assets.json b/test/aws-fsx/integ.ontap-file-system.ts.snapshot/FsxForOntapTestDefaultTestDeployAssert20A933DE.assets.json
new file mode 100644
index 0000000..3eb1832
--- /dev/null
+++ b/test/aws-fsx/integ.ontap-file-system.ts.snapshot/FsxForOntapTestDefaultTestDeployAssert20A933DE.assets.json
@@ -0,0 +1,19 @@
+{
+  "version": "36.0.0",
+  "files": {
+    "21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": {
+      "source": {
+        "path": "FsxForOntapTestDefaultTestDeployAssert20A933DE.template.json",
+        "packaging": "file"
+      },
+      "destinations": {
+        "current_account-current_region": {
+          "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
+          "objectKey": "21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22.json",
+          "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
+        }
+      }
+    }
+  },
+  "dockerImages": {}
+}
\ No newline at end of file
diff --git a/test/aws-fsx/integ.ontap-file-system.ts.snapshot/FsxForOntapTestDefaultTestDeployAssert20A933DE.template.json b/test/aws-fsx/integ.ontap-file-system.ts.snapshot/FsxForOntapTestDefaultTestDeployAssert20A933DE.template.json
new file mode 100644
index 0000000..ad9d0fb
--- /dev/null
+++ b/test/aws-fsx/integ.ontap-file-system.ts.snapshot/FsxForOntapTestDefaultTestDeployAssert20A933DE.template.json
@@ -0,0 +1,36 @@
+{
+ "Parameters": {
+  "BootstrapVersion": {
+   "Type": "AWS::SSM::Parameter::Value<String>",
+   "Default": "/cdk-bootstrap/hnb659fds/version",
+   "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]"
+  }
+ },
+ "Rules": {
+  "CheckBootstrapVersion": {
+   "Assertions": [
+    {
+     "Assert": {
+      "Fn::Not": [
+       {
+        "Fn::Contains": [
+         [
+          "1",
+          "2",
+          "3",
+          "4",
+          "5"
+         ],
+         {
+          "Ref": "BootstrapVersion"
+         }
+        ]
+       }
+      ]
+     },
+     "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI."
+    }
+   ]
+  }
+ }
+}
\ No newline at end of file
diff --git a/test/aws-fsx/integ.ontap-file-system.ts.snapshot/FsxForOntapTestStack.assets.json b/test/aws-fsx/integ.ontap-file-system.ts.snapshot/FsxForOntapTestStack.assets.json
new file mode 100644
index 0000000..2fc5100
--- /dev/null
+++ b/test/aws-fsx/integ.ontap-file-system.ts.snapshot/FsxForOntapTestStack.assets.json
@@ -0,0 +1,32 @@
+{
+  "version": "36.0.0",
+  "files": {
+    "dd5711540f04e06aa955d7f4862fc04e8cdea464cb590dae91ed2976bb78098e": {
+      "source": {
+        "path": "asset.dd5711540f04e06aa955d7f4862fc04e8cdea464cb590dae91ed2976bb78098e",
+        "packaging": "zip"
+      },
+      "destinations": {
+        "current_account-current_region": {
+          "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
+          "objectKey": "dd5711540f04e06aa955d7f4862fc04e8cdea464cb590dae91ed2976bb78098e.zip",
+          "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
+        }
+      }
+    },
+    "0ade450d022495a5e64c0da21f36f7a666ae41cbaed960049a2def353fc588b8": {
+      "source": {
+        "path": "FsxForOntapTestStack.template.json",
+        "packaging": "file"
+      },
+      "destinations": {
+        "current_account-current_region": {
+          "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
+          "objectKey": "0ade450d022495a5e64c0da21f36f7a666ae41cbaed960049a2def353fc588b8.json",
+          "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
+        }
+      }
+    }
+  },
+  "dockerImages": {}
+}
\ No newline at end of file
diff --git a/test/aws-fsx/integ.ontap-file-system.ts.snapshot/FsxForOntapTestStack.template.json b/test/aws-fsx/integ.ontap-file-system.ts.snapshot/FsxForOntapTestStack.template.json
new file mode 100644
index 0000000..a907e82
--- /dev/null
+++ b/test/aws-fsx/integ.ontap-file-system.ts.snapshot/FsxForOntapTestStack.template.json
@@ -0,0 +1,662 @@
+{
+ "Resources": {
+  "Vpc8378EB38": {
+   "Type": "AWS::EC2::VPC",
+   "Properties": {
+    "CidrBlock": "10.0.0.0/16",
+    "EnableDnsHostnames": true,
+    "EnableDnsSupport": true,
+    "InstanceTenancy": "default",
+    "Tags": [
+     {
+      "Key": "Name",
+      "Value": "FsxForOntapTestStack/Vpc"
+     }
+    ]
+   }
+  },
+  "VpcPublicSubnet1Subnet5C2D37C4": {
+   "Type": "AWS::EC2::Subnet",
+   "Properties": {
+    "AvailabilityZone": {
+     "Fn::Select": [
+      0,
+      {
+       "Fn::GetAZs": ""
+      }
+     ]
+    },
+    "CidrBlock": "10.0.0.0/18",
+    "MapPublicIpOnLaunch": true,
+    "Tags": [
+     {
+      "Key": "aws-cdk:subnet-name",
+      "Value": "Public"
+     },
+     {
+      "Key": "aws-cdk:subnet-type",
+      "Value": "Public"
+     },
+     {
+      "Key": "Name",
+      "Value": "FsxForOntapTestStack/Vpc/PublicSubnet1"
+     }
+    ],
+    "VpcId": {
+     "Ref": "Vpc8378EB38"
+    }
+   }
+  },
+  "VpcPublicSubnet1RouteTable6C95E38E": {
+   "Type": "AWS::EC2::RouteTable",
+   "Properties": {
+    "Tags": [
+     {
+      "Key": "Name",
+      "Value": "FsxForOntapTestStack/Vpc/PublicSubnet1"
+     }
+    ],
+    "VpcId": {
+     "Ref": "Vpc8378EB38"
+    }
+   }
+  },
+  "VpcPublicSubnet1RouteTableAssociation97140677": {
+   "Type": "AWS::EC2::SubnetRouteTableAssociation",
+   "Properties": {
+    "RouteTableId": {
+     "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
+    },
+    "SubnetId": {
+     "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
+    }
+   }
+  },
+  "VpcPublicSubnet1DefaultRoute3DA9E72A": {
+   "Type": "AWS::EC2::Route",
+   "Properties": {
+    "DestinationCidrBlock": "0.0.0.0/0",
+    "GatewayId": {
+     "Ref": "VpcIGWD7BA715C"
+    },
+    "RouteTableId": {
+     "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
+    }
+   },
+   "DependsOn": [
+    "VpcVPCGWBF912B6E"
+   ]
+  },
+  "VpcPublicSubnet1EIPD7E02669": {
+   "Type": "AWS::EC2::EIP",
+   "Properties": {
+    "Domain": "vpc",
+    "Tags": [
+     {
+      "Key": "Name",
+      "Value": "FsxForOntapTestStack/Vpc/PublicSubnet1"
+     }
+    ]
+   }
+  },
+  "VpcPublicSubnet1NATGateway4D7517AA": {
+   "Type": "AWS::EC2::NatGateway",
+   "Properties": {
+    "AllocationId": {
+     "Fn::GetAtt": [
+      "VpcPublicSubnet1EIPD7E02669",
+      "AllocationId"
+     ]
+    },
+    "SubnetId": {
+     "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
+    },
+    "Tags": [
+     {
+      "Key": "Name",
+      "Value": "FsxForOntapTestStack/Vpc/PublicSubnet1"
+     }
+    ]
+   },
+   "DependsOn": [
+    "VpcPublicSubnet1DefaultRoute3DA9E72A",
+    "VpcPublicSubnet1RouteTableAssociation97140677"
+   ]
+  },
+  "VpcPublicSubnet2Subnet691E08A3": {
+   "Type": "AWS::EC2::Subnet",
+   "Properties": {
+    "AvailabilityZone": {
+     "Fn::Select": [
+      1,
+      {
+       "Fn::GetAZs": ""
+      }
+     ]
+    },
+    "CidrBlock": "10.0.64.0/18",
+    "MapPublicIpOnLaunch": true,
+    "Tags": [
+     {
+      "Key": "aws-cdk:subnet-name",
+      "Value": "Public"
+     },
+     {
+      "Key": "aws-cdk:subnet-type",
+      "Value": "Public"
+     },
+     {
+      "Key": "Name",
+      "Value": "FsxForOntapTestStack/Vpc/PublicSubnet2"
+     }
+    ],
+    "VpcId": {
+     "Ref": "Vpc8378EB38"
+    }
+   }
+  },
+  "VpcPublicSubnet2RouteTable94F7E489": {
+   "Type": "AWS::EC2::RouteTable",
+   "Properties": {
+    "Tags": [
+     {
+      "Key": "Name",
+      "Value": "FsxForOntapTestStack/Vpc/PublicSubnet2"
+     }
+    ],
+    "VpcId": {
+     "Ref": "Vpc8378EB38"
+    }
+   }
+  },
+  "VpcPublicSubnet2RouteTableAssociationDD5762D8": {
+   "Type": "AWS::EC2::SubnetRouteTableAssociation",
+   "Properties": {
+    "RouteTableId": {
+     "Ref": "VpcPublicSubnet2RouteTable94F7E489"
+    },
+    "SubnetId": {
+     "Ref": "VpcPublicSubnet2Subnet691E08A3"
+    }
+   }
+  },
+  "VpcPublicSubnet2DefaultRoute97F91067": {
+   "Type": "AWS::EC2::Route",
+   "Properties": {
+    "DestinationCidrBlock": "0.0.0.0/0",
+    "GatewayId": {
+     "Ref": "VpcIGWD7BA715C"
+    },
+    "RouteTableId": {
+     "Ref": "VpcPublicSubnet2RouteTable94F7E489"
+    }
+   },
+   "DependsOn": [
+    "VpcVPCGWBF912B6E"
+   ]
+  },
+  "VpcPublicSubnet2EIP3C605A87": {
+   "Type": "AWS::EC2::EIP",
+   "Properties": {
+    "Domain": "vpc",
+    "Tags": [
+     {
+      "Key": "Name",
+      "Value": "FsxForOntapTestStack/Vpc/PublicSubnet2"
+     }
+    ]
+   }
+  },
+  "VpcPublicSubnet2NATGateway9182C01D": {
+   "Type": "AWS::EC2::NatGateway",
+   "Properties": {
+    "AllocationId": {
+     "Fn::GetAtt": [
+      "VpcPublicSubnet2EIP3C605A87",
+      "AllocationId"
+     ]
+    },
+    "SubnetId": {
+     "Ref": "VpcPublicSubnet2Subnet691E08A3"
+    },
+    "Tags": [
+     {
+      "Key": "Name",
+      "Value": "FsxForOntapTestStack/Vpc/PublicSubnet2"
+     }
+    ]
+   },
+   "DependsOn": [
+    "VpcPublicSubnet2DefaultRoute97F91067",
+    "VpcPublicSubnet2RouteTableAssociationDD5762D8"
+   ]
+  },
+  "VpcPrivateSubnet1Subnet536B997A": {
+   "Type": "AWS::EC2::Subnet",
+   "Properties": {
+    "AvailabilityZone": {
+     "Fn::Select": [
+      0,
+      {
+       "Fn::GetAZs": ""
+      }
+     ]
+    },
+    "CidrBlock": "10.0.128.0/18",
+    "MapPublicIpOnLaunch": false,
+    "Tags": [
+     {
+      "Key": "aws-cdk:subnet-name",
+      "Value": "Private"
+     },
+     {
+      "Key": "aws-cdk:subnet-type",
+      "Value": "Private"
+     },
+     {
+      "Key": "Name",
+      "Value": "FsxForOntapTestStack/Vpc/PrivateSubnet1"
+     }
+    ],
+    "VpcId": {
+     "Ref": "Vpc8378EB38"
+    }
+   }
+  },
+  "VpcPrivateSubnet1RouteTableB2C5B500": {
+   "Type": "AWS::EC2::RouteTable",
+   "Properties": {
+    "Tags": [
+     {
+      "Key": "Name",
+      "Value": "FsxForOntapTestStack/Vpc/PrivateSubnet1"
+     }
+    ],
+    "VpcId": {
+     "Ref": "Vpc8378EB38"
+    }
+   }
+  },
+  "VpcPrivateSubnet1RouteTableAssociation70C59FA6": {
+   "Type": "AWS::EC2::SubnetRouteTableAssociation",
+   "Properties": {
+    "RouteTableId": {
+     "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
+    },
+    "SubnetId": {
+     "Ref": "VpcPrivateSubnet1Subnet536B997A"
+    }
+   }
+  },
+  "VpcPrivateSubnet1DefaultRouteBE02A9ED": {
+   "Type": "AWS::EC2::Route",
+   "Properties": {
+    "DestinationCidrBlock": "0.0.0.0/0",
+    "NatGatewayId": {
+     "Ref": "VpcPublicSubnet1NATGateway4D7517AA"
+    },
+    "RouteTableId": {
+     "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
+    }
+   }
+  },
+  "VpcPrivateSubnet2Subnet3788AAA1": {
+   "Type": "AWS::EC2::Subnet",
+   "Properties": {
+    "AvailabilityZone": {
+     "Fn::Select": [
+      1,
+      {
+       "Fn::GetAZs": ""
+      }
+     ]
+    },
+    "CidrBlock": "10.0.192.0/18",
+    "MapPublicIpOnLaunch": false,
+    "Tags": [
+     {
+      "Key": "aws-cdk:subnet-name",
+      "Value": "Private"
+     },
+     {
+      "Key": "aws-cdk:subnet-type",
+      "Value": "Private"
+     },
+     {
+      "Key": "Name",
+      "Value": "FsxForOntapTestStack/Vpc/PrivateSubnet2"
+     }
+    ],
+    "VpcId": {
+     "Ref": "Vpc8378EB38"
+    }
+   }
+  },
+  "VpcPrivateSubnet2RouteTableA678073B": {
+   "Type": "AWS::EC2::RouteTable",
+   "Properties": {
+    "Tags": [
+     {
+      "Key": "Name",
+      "Value": "FsxForOntapTestStack/Vpc/PrivateSubnet2"
+     }
+    ],
+    "VpcId": {
+     "Ref": "Vpc8378EB38"
+    }
+   }
+  },
+  "VpcPrivateSubnet2RouteTableAssociationA89CAD56": {
+   "Type": "AWS::EC2::SubnetRouteTableAssociation",
+   "Properties": {
+    "RouteTableId": {
+     "Ref": "VpcPrivateSubnet2RouteTableA678073B"
+    },
+    "SubnetId": {
+     "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
+    }
+   }
+  },
+  "VpcPrivateSubnet2DefaultRoute060D2087": {
+   "Type": "AWS::EC2::Route",
+   "Properties": {
+    "DestinationCidrBlock": "0.0.0.0/0",
+    "NatGatewayId": {
+     "Ref": "VpcPublicSubnet2NATGateway9182C01D"
+    },
+    "RouteTableId": {
+     "Ref": "VpcPrivateSubnet2RouteTableA678073B"
+    }
+   }
+  },
+  "VpcIGWD7BA715C": {
+   "Type": "AWS::EC2::InternetGateway",
+   "Properties": {
+    "Tags": [
+     {
+      "Key": "Name",
+      "Value": "FsxForOntapTestStack/Vpc"
+     }
+    ]
+   }
+  },
+  "VpcVPCGWBF912B6E": {
+   "Type": "AWS::EC2::VPCGatewayAttachment",
+   "Properties": {
+    "InternetGatewayId": {
+     "Ref": "VpcIGWD7BA715C"
+    },
+    "VpcId": {
+     "Ref": "Vpc8378EB38"
+    }
+   }
+  },
+  "VpcRestrictDefaultSecurityGroupCustomResourceC73DA2BE": {
+   "Type": "Custom::VpcRestrictDefaultSG",
+   "Properties": {
+    "ServiceToken": {
+     "Fn::GetAtt": [
+      "CustomVpcRestrictDefaultSGCustomResourceProviderHandlerDC833E5E",
+      "Arn"
+     ]
+    },
+    "DefaultSecurityGroupId": {
+     "Fn::GetAtt": [
+      "Vpc8378EB38",
+      "DefaultSecurityGroup"
+     ]
+    },
+    "Account": {
+     "Ref": "AWS::AccountId"
+    }
+   },
+   "UpdateReplacePolicy": "Delete",
+   "DeletionPolicy": "Delete"
+  },
+  "CustomVpcRestrictDefaultSGCustomResourceProviderRole26592FE0": {
+   "Type": "AWS::IAM::Role",
+   "Properties": {
+    "AssumeRolePolicyDocument": {
+     "Version": "2012-10-17",
+     "Statement": [
+      {
+       "Action": "sts:AssumeRole",
+       "Effect": "Allow",
+       "Principal": {
+        "Service": "lambda.amazonaws.com"
+       }
+      }
+     ]
+    },
+    "ManagedPolicyArns": [
+     {
+      "Fn::Sub": "arn:${AWS::Partition}:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
+     }
+    ],
+    "Policies": [
+     {
+      "PolicyName": "Inline",
+      "PolicyDocument": {
+       "Version": "2012-10-17",
+       "Statement": [
+        {
+         "Effect": "Allow",
+         "Action": [
+          "ec2:AuthorizeSecurityGroupIngress",
+          "ec2:AuthorizeSecurityGroupEgress",
+          "ec2:RevokeSecurityGroupIngress",
+          "ec2:RevokeSecurityGroupEgress"
+         ],
+         "Resource": [
+          {
+           "Fn::Join": [
+            "",
+            [
+             "arn:",
+             {
+              "Ref": "AWS::Partition"
+             },
+             ":ec2:",
+             {
+              "Ref": "AWS::Region"
+             },
+             ":",
+             {
+              "Ref": "AWS::AccountId"
+             },
+             ":security-group/",
+             {
+              "Fn::GetAtt": [
+               "Vpc8378EB38",
+               "DefaultSecurityGroup"
+              ]
+             }
+            ]
+           ]
+          }
+         ]
+        }
+       ]
+      }
+     }
+    ]
+   }
+  },
+  "CustomVpcRestrictDefaultSGCustomResourceProviderHandlerDC833E5E": {
+   "Type": "AWS::Lambda::Function",
+   "Properties": {
+    "Code": {
+     "S3Bucket": {
+      "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}"
+     },
+     "S3Key": "dd5711540f04e06aa955d7f4862fc04e8cdea464cb590dae91ed2976bb78098e.zip"
+    },
+    "Timeout": 900,
+    "MemorySize": 128,
+    "Handler": "__entrypoint__.handler",
+    "Role": {
+     "Fn::GetAtt": [
+      "CustomVpcRestrictDefaultSGCustomResourceProviderRole26592FE0",
+      "Arn"
+     ]
+    },
+    "Runtime": "nodejs18.x",
+    "Description": "Lambda function for removing all inbound/outbound rules from the VPC default security group"
+   },
+   "DependsOn": [
+    "CustomVpcRestrictDefaultSGCustomResourceProviderRole26592FE0"
+   ]
+  },
+  "OntapMultiAzFileSystemFsxOntapSecurityGroup6D28E847": {
+   "Type": "AWS::EC2::SecurityGroup",
+   "Properties": {
+    "GroupDescription": "FsxForOntapTestStack/OntapMultiAzFileSystem/FsxOntapSecurityGroup",
+    "SecurityGroupEgress": [
+     {
+      "CidrIp": "0.0.0.0/0",
+      "Description": "Allow all outbound traffic by default",
+      "IpProtocol": "-1"
+     }
+    ],
+    "VpcId": {
+     "Ref": "Vpc8378EB38"
+    }
+   }
+  },
+  "OntapMultiAzFileSystemB1F0FA1D": {
+   "Type": "AWS::FSx::FileSystem",
+   "Properties": {
+    "FileSystemType": "ONTAP",
+    "OntapConfiguration": {
+     "AutomaticBackupRetentionDays": 7,
+     "DailyAutomaticBackupStartTime": "01:00",
+     "DeploymentType": "MULTI_AZ_2",
+     "DiskIopsConfiguration": {
+      "Iops": 15360,
+      "Mode": "USER_PROVISIONED"
+     },
+     "EndpointIpAddressRange": "192.168.39.0/24",
+     "FsxAdminPassword": "fsxPassword1",
+     "HAPairs": 1,
+     "PreferredSubnetId": {
+      "Ref": "VpcPrivateSubnet1Subnet536B997A"
+     },
+     "RouteTableIds": [
+      {
+       "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
+      },
+      {
+       "Ref": "VpcPrivateSubnet2RouteTableA678073B"
+      }
+     ],
+     "ThroughputCapacityPerHAPair": 384,
+     "WeeklyMaintenanceStartTime": "7:01:00"
+    },
+    "SecurityGroupIds": [
+     {
+      "Fn::GetAtt": [
+       "OntapMultiAzFileSystemFsxOntapSecurityGroup6D28E847",
+       "GroupId"
+      ]
+     }
+    ],
+    "StorageCapacity": 5120,
+    "SubnetIds": [
+     {
+      "Ref": "VpcPrivateSubnet1Subnet536B997A"
+     },
+     {
+      "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
+     }
+    ]
+   },
+   "UpdateReplacePolicy": "Delete",
+   "DeletionPolicy": "Delete"
+  },
+  "OntapSingleAzFileSystemFsxOntapSecurityGroup614DD704": {
+   "Type": "AWS::EC2::SecurityGroup",
+   "Properties": {
+    "GroupDescription": "FsxForOntapTestStack/OntapSingleAzFileSystem/FsxOntapSecurityGroup",
+    "SecurityGroupEgress": [
+     {
+      "CidrIp": "0.0.0.0/0",
+      "Description": "Allow all outbound traffic by default",
+      "IpProtocol": "-1"
+     }
+    ],
+    "VpcId": {
+     "Ref": "Vpc8378EB38"
+    }
+   }
+  },
+  "OntapSingleAzFileSystem224E9F56": {
+   "Type": "AWS::FSx::FileSystem",
+   "Properties": {
+    "FileSystemType": "ONTAP",
+    "OntapConfiguration": {
+     "AutomaticBackupRetentionDays": 7,
+     "DailyAutomaticBackupStartTime": "01:00",
+     "DeploymentType": "SINGLE_AZ_2",
+     "DiskIopsConfiguration": {
+      "Iops": 76800,
+      "Mode": "USER_PROVISIONED"
+     },
+     "FsxAdminPassword": "fsxPassword1",
+     "HAPairs": 5,
+     "ThroughputCapacityPerHAPair": 1536,
+     "WeeklyMaintenanceStartTime": "7:01:00"
+    },
+    "SecurityGroupIds": [
+     {
+      "Fn::GetAtt": [
+       "OntapSingleAzFileSystemFsxOntapSecurityGroup614DD704",
+       "GroupId"
+      ]
+     }
+    ],
+    "StorageCapacity": 5120,
+    "SubnetIds": [
+     {
+      "Ref": "VpcPrivateSubnet1Subnet536B997A"
+     }
+    ]
+   },
+   "UpdateReplacePolicy": "Delete",
+   "DeletionPolicy": "Delete"
+  }
+ },
+ "Parameters": {
+  "BootstrapVersion": {
+   "Type": "AWS::SSM::Parameter::Value<String>",
+   "Default": "/cdk-bootstrap/hnb659fds/version",
+   "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]"
+  }
+ },
+ "Rules": {
+  "CheckBootstrapVersion": {
+   "Assertions": [
+    {
+     "Assert": {
+      "Fn::Not": [
+       {
+        "Fn::Contains": [
+         [
+          "1",
+          "2",
+          "3",
+          "4",
+          "5"
+         ],
+         {
+          "Ref": "BootstrapVersion"
+         }
+        ]
+       }
+      ]
+     },
+     "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI."
+    }
+   ]
+  }
+ }
+}
\ No newline at end of file
diff --git a/test/aws-fsx/integ.ontap-file-system.ts.snapshot/asset.dd5711540f04e06aa955d7f4862fc04e8cdea464cb590dae91ed2976bb78098e/__entrypoint__.js b/test/aws-fsx/integ.ontap-file-system.ts.snapshot/asset.dd5711540f04e06aa955d7f4862fc04e8cdea464cb590dae91ed2976bb78098e/__entrypoint__.js
new file mode 100644
index 0000000..5a1714e
--- /dev/null
+++ b/test/aws-fsx/integ.ontap-file-system.ts.snapshot/asset.dd5711540f04e06aa955d7f4862fc04e8cdea464cb590dae91ed2976bb78098e/__entrypoint__.js
@@ -0,0 +1,1 @@
+"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.withRetries=exports.handler=exports.external=void 0;const https=require("https"),url=require("url");exports.external={sendHttpRequest:defaultSendHttpRequest,log:defaultLog,includeStackTraces:!0,userHandlerIndex:"./index"};const CREATE_FAILED_PHYSICAL_ID_MARKER="AWSCDK::CustomResourceProviderFramework::CREATE_FAILED",MISSING_PHYSICAL_ID_MARKER="AWSCDK::CustomResourceProviderFramework::MISSING_PHYSICAL_ID";async function handler(event,context){const sanitizedEvent={...event,ResponseURL:"..."};if(exports.external.log(JSON.stringify(sanitizedEvent,void 0,2)),event.RequestType==="Delete"&&event.PhysicalResourceId===CREATE_FAILED_PHYSICAL_ID_MARKER){exports.external.log("ignoring DELETE event caused by a failed CREATE event"),await submitResponse("SUCCESS",event);return}try{const userHandler=require(exports.external.userHandlerIndex).handler,result=await userHandler(sanitizedEvent,context),responseEvent=renderResponse(event,result);await submitResponse("SUCCESS",responseEvent)}catch(e){const resp={...event,Reason:exports.external.includeStackTraces?e.stack:e.message};resp.PhysicalResourceId||(event.RequestType==="Create"?(exports.external.log("CREATE failed, responding with a marker physical resource id so that the subsequent DELETE will be ignored"),resp.PhysicalResourceId=CREATE_FAILED_PHYSICAL_ID_MARKER):exports.external.log(`ERROR: Malformed event. "PhysicalResourceId" is required: ${JSON.stringify(event)}`)),await submitResponse("FAILED",resp)}}exports.handler=handler;function renderResponse(cfnRequest,handlerResponse={}){const physicalResourceId=handlerResponse.PhysicalResourceId??cfnRequest.PhysicalResourceId??cfnRequest.RequestId;if(cfnRequest.RequestType==="Delete"&&physicalResourceId!==cfnRequest.PhysicalResourceId)throw new Error(`DELETE: cannot change the physical resource ID from "${cfnRequest.PhysicalResourceId}" to "${handlerResponse.PhysicalResourceId}" during deletion`);return{...cfnRequest,...handlerResponse,PhysicalResourceId:physicalResourceId}}async function submitResponse(status,event){const json={Status:status,Reason:event.Reason??status,StackId:event.StackId,RequestId:event.RequestId,PhysicalResourceId:event.PhysicalResourceId||MISSING_PHYSICAL_ID_MARKER,LogicalResourceId:event.LogicalResourceId,NoEcho:event.NoEcho,Data:event.Data};exports.external.log("submit response to cloudformation",json);const responseBody=JSON.stringify(json),parsedUrl=url.parse(event.ResponseURL),req={hostname:parsedUrl.hostname,path:parsedUrl.path,method:"PUT",headers:{"content-type":"","content-length":Buffer.byteLength(responseBody,"utf8")}};await withRetries({attempts:5,sleep:1e3},exports.external.sendHttpRequest)(req,responseBody)}async function defaultSendHttpRequest(options,responseBody){return new Promise((resolve,reject)=>{try{const request=https.request(options,_=>resolve());request.on("error",reject),request.write(responseBody),request.end()}catch(e){reject(e)}})}function defaultLog(fmt,...params){console.log(fmt,...params)}function withRetries(options,fn){return async(...xs)=>{let attempts=options.attempts,ms=options.sleep;for(;;)try{return await fn(...xs)}catch(e){if(attempts--<=0)throw e;await sleep(Math.floor(Math.random()*ms)),ms*=2}}}exports.withRetries=withRetries;async function sleep(ms){return new Promise(ok=>setTimeout(ok,ms))}
diff --git a/test/aws-fsx/integ.ontap-file-system.ts.snapshot/asset.dd5711540f04e06aa955d7f4862fc04e8cdea464cb590dae91ed2976bb78098e/index.js b/test/aws-fsx/integ.ontap-file-system.ts.snapshot/asset.dd5711540f04e06aa955d7f4862fc04e8cdea464cb590dae91ed2976bb78098e/index.js
new file mode 100644
index 0000000..9f1466d
--- /dev/null
+++ b/test/aws-fsx/integ.ontap-file-system.ts.snapshot/asset.dd5711540f04e06aa955d7f4862fc04e8cdea464cb590dae91ed2976bb78098e/index.js
@@ -0,0 +1,1 @@
+"use strict";var I=Object.create,t=Object.defineProperty,y=Object.getOwnPropertyDescriptor,P=Object.getOwnPropertyNames,g=Object.getPrototypeOf,l=Object.prototype.hasOwnProperty,G=(r,e)=>{for(var o in e)t(r,o,{get:e[o],enumerable:!0})},n=(r,e,o,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of P(e))!l.call(r,s)&&s!==o&&t(r,s,{get:()=>e[s],enumerable:!(i=y(e,s))||i.enumerable});return r},R=(r,e,o)=>(o=r!=null?I(g(r)):{},n(e||!r||!r.__esModule?t(o,"default",{value:r,enumerable:!0}):o,r)),S=r=>n(t({},"__esModule",{value:!0}),r),k={};G(k,{handler:()=>f}),module.exports=S(k);var a=R(require("@aws-sdk/client-ec2")),u=new a.EC2({});function c(r,e){return{GroupId:r,IpPermissions:[{UserIdGroupPairs:[{GroupId:r,UserId:e}],IpProtocol:"-1"}]}}function d(r){return{GroupId:r,IpPermissions:[{IpRanges:[{CidrIp:"0.0.0.0/0"}],IpProtocol:"-1"}]}}async function f(r){let e=r.ResourceProperties.DefaultSecurityGroupId,o=r.ResourceProperties.Account;switch(r.RequestType){case"Create":return p(e,o);case"Update":return h(r);case"Delete":return m(e,o)}}async function h(r){let e=r.OldResourceProperties.DefaultSecurityGroupId,o=r.ResourceProperties.DefaultSecurityGroupId;e!==o&&(await m(e,r.ResourceProperties.Account),await p(o,r.ResourceProperties.Account))}async function p(r,e){try{await u.revokeSecurityGroupEgress(d(r))}catch(o){if(o.name!=="InvalidPermission.NotFound")throw o}try{await u.revokeSecurityGroupIngress(c(r,e))}catch(o){if(o.name!=="InvalidPermission.NotFound")throw o}}async function m(r,e){await u.authorizeSecurityGroupIngress(c(r,e)),await u.authorizeSecurityGroupEgress(d(r))}
diff --git a/test/aws-fsx/integ.ontap-file-system.ts.snapshot/cdk.out b/test/aws-fsx/integ.ontap-file-system.ts.snapshot/cdk.out
new file mode 100644
index 0000000..1f0068d
--- /dev/null
+++ b/test/aws-fsx/integ.ontap-file-system.ts.snapshot/cdk.out
@@ -0,0 +1,1 @@
+{"version":"36.0.0"}
\ No newline at end of file
diff --git a/test/aws-fsx/integ.ontap-file-system.ts.snapshot/integ.json b/test/aws-fsx/integ.ontap-file-system.ts.snapshot/integ.json
new file mode 100644
index 0000000..8fab911
--- /dev/null
+++ b/test/aws-fsx/integ.ontap-file-system.ts.snapshot/integ.json
@@ -0,0 +1,12 @@
+{
+  "version": "36.0.0",
+  "testCases": {
+    "FsxForOntapTest/DefaultTest": {
+      "stacks": [
+        "FsxForOntapTestStack"
+      ],
+      "assertionStack": "FsxForOntapTest/DefaultTest/DeployAssert",
+      "assertionStackName": "FsxForOntapTestDefaultTestDeployAssert20A933DE"
+    }
+  }
+}
\ No newline at end of file
diff --git a/test/aws-fsx/integ.ontap-file-system.ts.snapshot/manifest.json b/test/aws-fsx/integ.ontap-file-system.ts.snapshot/manifest.json
new file mode 100644
index 0000000..9aab570
--- /dev/null
+++ b/test/aws-fsx/integ.ontap-file-system.ts.snapshot/manifest.json
@@ -0,0 +1,287 @@
+{
+  "version": "36.0.0",
+  "artifacts": {
+    "FsxForOntapTestStack.assets": {
+      "type": "cdk:asset-manifest",
+      "properties": {
+        "file": "FsxForOntapTestStack.assets.json",
+        "requiresBootstrapStackVersion": 6,
+        "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version"
+      }
+    },
+    "FsxForOntapTestStack": {
+      "type": "aws:cloudformation:stack",
+      "environment": "aws://unknown-account/unknown-region",
+      "properties": {
+        "templateFile": "FsxForOntapTestStack.template.json",
+        "terminationProtection": false,
+        "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}/0ade450d022495a5e64c0da21f36f7a666ae41cbaed960049a2def353fc588b8.json",
+        "requiresBootstrapStackVersion": 6,
+        "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
+        "additionalDependencies": [
+          "FsxForOntapTestStack.assets"
+        ],
+        "lookupRole": {
+          "arn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-lookup-role-${AWS::AccountId}-${AWS::Region}",
+          "requiresBootstrapStackVersion": 8,
+          "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version"
+        }
+      },
+      "dependencies": [
+        "FsxForOntapTestStack.assets"
+      ],
+      "metadata": {
+        "/FsxForOntapTestStack/Vpc/Resource": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "Vpc8378EB38"
+          }
+        ],
+        "/FsxForOntapTestStack/Vpc/PublicSubnet1/Subnet": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "VpcPublicSubnet1Subnet5C2D37C4"
+          }
+        ],
+        "/FsxForOntapTestStack/Vpc/PublicSubnet1/RouteTable": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "VpcPublicSubnet1RouteTable6C95E38E"
+          }
+        ],
+        "/FsxForOntapTestStack/Vpc/PublicSubnet1/RouteTableAssociation": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "VpcPublicSubnet1RouteTableAssociation97140677"
+          }
+        ],
+        "/FsxForOntapTestStack/Vpc/PublicSubnet1/DefaultRoute": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "VpcPublicSubnet1DefaultRoute3DA9E72A"
+          }
+        ],
+        "/FsxForOntapTestStack/Vpc/PublicSubnet1/EIP": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "VpcPublicSubnet1EIPD7E02669"
+          }
+        ],
+        "/FsxForOntapTestStack/Vpc/PublicSubnet1/NATGateway": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "VpcPublicSubnet1NATGateway4D7517AA"
+          }
+        ],
+        "/FsxForOntapTestStack/Vpc/PublicSubnet2/Subnet": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "VpcPublicSubnet2Subnet691E08A3"
+          }
+        ],
+        "/FsxForOntapTestStack/Vpc/PublicSubnet2/RouteTable": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "VpcPublicSubnet2RouteTable94F7E489"
+          }
+        ],
+        "/FsxForOntapTestStack/Vpc/PublicSubnet2/RouteTableAssociation": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "VpcPublicSubnet2RouteTableAssociationDD5762D8"
+          }
+        ],
+        "/FsxForOntapTestStack/Vpc/PublicSubnet2/DefaultRoute": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "VpcPublicSubnet2DefaultRoute97F91067"
+          }
+        ],
+        "/FsxForOntapTestStack/Vpc/PublicSubnet2/EIP": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "VpcPublicSubnet2EIP3C605A87"
+          }
+        ],
+        "/FsxForOntapTestStack/Vpc/PublicSubnet2/NATGateway": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "VpcPublicSubnet2NATGateway9182C01D"
+          }
+        ],
+        "/FsxForOntapTestStack/Vpc/PrivateSubnet1/Subnet": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "VpcPrivateSubnet1Subnet536B997A"
+          }
+        ],
+        "/FsxForOntapTestStack/Vpc/PrivateSubnet1/RouteTable": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "VpcPrivateSubnet1RouteTableB2C5B500"
+          }
+        ],
+        "/FsxForOntapTestStack/Vpc/PrivateSubnet1/RouteTableAssociation": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "VpcPrivateSubnet1RouteTableAssociation70C59FA6"
+          }
+        ],
+        "/FsxForOntapTestStack/Vpc/PrivateSubnet1/DefaultRoute": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "VpcPrivateSubnet1DefaultRouteBE02A9ED"
+          }
+        ],
+        "/FsxForOntapTestStack/Vpc/PrivateSubnet2/Subnet": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "VpcPrivateSubnet2Subnet3788AAA1"
+          }
+        ],
+        "/FsxForOntapTestStack/Vpc/PrivateSubnet2/RouteTable": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "VpcPrivateSubnet2RouteTableA678073B"
+          }
+        ],
+        "/FsxForOntapTestStack/Vpc/PrivateSubnet2/RouteTableAssociation": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "VpcPrivateSubnet2RouteTableAssociationA89CAD56"
+          }
+        ],
+        "/FsxForOntapTestStack/Vpc/PrivateSubnet2/DefaultRoute": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "VpcPrivateSubnet2DefaultRoute060D2087"
+          }
+        ],
+        "/FsxForOntapTestStack/Vpc/IGW": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "VpcIGWD7BA715C"
+          }
+        ],
+        "/FsxForOntapTestStack/Vpc/VPCGW": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "VpcVPCGWBF912B6E"
+          }
+        ],
+        "/FsxForOntapTestStack/Vpc/RestrictDefaultSecurityGroupCustomResource/Default": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "VpcRestrictDefaultSecurityGroupCustomResourceC73DA2BE"
+          }
+        ],
+        "/FsxForOntapTestStack/Custom::VpcRestrictDefaultSGCustomResourceProvider/Role": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "CustomVpcRestrictDefaultSGCustomResourceProviderRole26592FE0"
+          }
+        ],
+        "/FsxForOntapTestStack/Custom::VpcRestrictDefaultSGCustomResourceProvider/Handler": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "CustomVpcRestrictDefaultSGCustomResourceProviderHandlerDC833E5E"
+          }
+        ],
+        "/FsxForOntapTestStack/OntapMultiAzFileSystem/FsxOntapSecurityGroup/Resource": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "OntapMultiAzFileSystemFsxOntapSecurityGroup6D28E847"
+          }
+        ],
+        "/FsxForOntapTestStack/OntapMultiAzFileSystem/Resource": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "OntapMultiAzFileSystemB1F0FA1D"
+          }
+        ],
+        "/FsxForOntapTestStack/OntapSingleAzFileSystem/FsxOntapSecurityGroup/Resource": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "OntapSingleAzFileSystemFsxOntapSecurityGroup614DD704"
+          }
+        ],
+        "/FsxForOntapTestStack/OntapSingleAzFileSystem/Resource": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "OntapSingleAzFileSystem224E9F56"
+          }
+        ],
+        "/FsxForOntapTestStack/BootstrapVersion": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "BootstrapVersion"
+          }
+        ],
+        "/FsxForOntapTestStack/CheckBootstrapVersion": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "CheckBootstrapVersion"
+          }
+        ]
+      },
+      "displayName": "FsxForOntapTestStack"
+    },
+    "FsxForOntapTestDefaultTestDeployAssert20A933DE.assets": {
+      "type": "cdk:asset-manifest",
+      "properties": {
+        "file": "FsxForOntapTestDefaultTestDeployAssert20A933DE.assets.json",
+        "requiresBootstrapStackVersion": 6,
+        "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version"
+      }
+    },
+    "FsxForOntapTestDefaultTestDeployAssert20A933DE": {
+      "type": "aws:cloudformation:stack",
+      "environment": "aws://unknown-account/unknown-region",
+      "properties": {
+        "templateFile": "FsxForOntapTestDefaultTestDeployAssert20A933DE.template.json",
+        "terminationProtection": false,
+        "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}/21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22.json",
+        "requiresBootstrapStackVersion": 6,
+        "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
+        "additionalDependencies": [
+          "FsxForOntapTestDefaultTestDeployAssert20A933DE.assets"
+        ],
+        "lookupRole": {
+          "arn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-lookup-role-${AWS::AccountId}-${AWS::Region}",
+          "requiresBootstrapStackVersion": 8,
+          "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version"
+        }
+      },
+      "dependencies": [
+        "FsxForOntapTestDefaultTestDeployAssert20A933DE.assets"
+      ],
+      "metadata": {
+        "/FsxForOntapTest/DefaultTest/DeployAssert/BootstrapVersion": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "BootstrapVersion"
+          }
+        ],
+        "/FsxForOntapTest/DefaultTest/DeployAssert/CheckBootstrapVersion": [
+          {
+            "type": "aws:cdk:logicalId",
+            "data": "CheckBootstrapVersion"
+          }
+        ]
+      },
+      "displayName": "FsxForOntapTest/DefaultTest/DeployAssert"
+    },
+    "Tree": {
+      "type": "cdk:tree",
+      "properties": {
+        "file": "tree.json"
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/test/aws-fsx/integ.ontap-file-system.ts.snapshot/tree.json b/test/aws-fsx/integ.ontap-file-system.ts.snapshot/tree.json
new file mode 100644
index 0000000..e9f70aa
--- /dev/null
+++ b/test/aws-fsx/integ.ontap-file-system.ts.snapshot/tree.json
@@ -0,0 +1,981 @@
+{
+  "version": "tree-0.1",
+  "tree": {
+    "id": "App",
+    "path": "",
+    "children": {
+      "FsxForOntapTestStack": {
+        "id": "FsxForOntapTestStack",
+        "path": "FsxForOntapTestStack",
+        "children": {
+          "Vpc": {
+            "id": "Vpc",
+            "path": "FsxForOntapTestStack/Vpc",
+            "children": {
+              "Resource": {
+                "id": "Resource",
+                "path": "FsxForOntapTestStack/Vpc/Resource",
+                "attributes": {
+                  "aws:cdk:cloudformation:type": "AWS::EC2::VPC",
+                  "aws:cdk:cloudformation:props": {
+                    "cidrBlock": "10.0.0.0/16",
+                    "enableDnsHostnames": true,
+                    "enableDnsSupport": true,
+                    "instanceTenancy": "default",
+                    "tags": [
+                      {
+                        "key": "Name",
+                        "value": "FsxForOntapTestStack/Vpc"
+                      }
+                    ]
+                  }
+                },
+                "constructInfo": {
+                  "fqn": "aws-cdk-lib.aws_ec2.CfnVPC",
+                  "version": "2.120.0"
+                }
+              },
+              "PublicSubnet1": {
+                "id": "PublicSubnet1",
+                "path": "FsxForOntapTestStack/Vpc/PublicSubnet1",
+                "children": {
+                  "Subnet": {
+                    "id": "Subnet",
+                    "path": "FsxForOntapTestStack/Vpc/PublicSubnet1/Subnet",
+                    "attributes": {
+                      "aws:cdk:cloudformation:type": "AWS::EC2::Subnet",
+                      "aws:cdk:cloudformation:props": {
+                        "availabilityZone": {
+                          "Fn::Select": [
+                            0,
+                            {
+                              "Fn::GetAZs": ""
+                            }
+                          ]
+                        },
+                        "cidrBlock": "10.0.0.0/18",
+                        "mapPublicIpOnLaunch": true,
+                        "tags": [
+                          {
+                            "key": "aws-cdk:subnet-name",
+                            "value": "Public"
+                          },
+                          {
+                            "key": "aws-cdk:subnet-type",
+                            "value": "Public"
+                          },
+                          {
+                            "key": "Name",
+                            "value": "FsxForOntapTestStack/Vpc/PublicSubnet1"
+                          }
+                        ],
+                        "vpcId": {
+                          "Ref": "Vpc8378EB38"
+                        }
+                      }
+                    },
+                    "constructInfo": {
+                      "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
+                      "version": "2.120.0"
+                    }
+                  },
+                  "Acl": {
+                    "id": "Acl",
+                    "path": "FsxForOntapTestStack/Vpc/PublicSubnet1/Acl",
+                    "constructInfo": {
+                      "fqn": "aws-cdk-lib.Resource",
+                      "version": "2.120.0"
+                    }
+                  },
+                  "RouteTable": {
+                    "id": "RouteTable",
+                    "path": "FsxForOntapTestStack/Vpc/PublicSubnet1/RouteTable",
+                    "attributes": {
+                      "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
+                      "aws:cdk:cloudformation:props": {
+                        "tags": [
+                          {
+                            "key": "Name",
+                            "value": "FsxForOntapTestStack/Vpc/PublicSubnet1"
+                          }
+                        ],
+                        "vpcId": {
+                          "Ref": "Vpc8378EB38"
+                        }
+                      }
+                    },
+                    "constructInfo": {
+                      "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
+                      "version": "2.120.0"
+                    }
+                  },
+                  "RouteTableAssociation": {
+                    "id": "RouteTableAssociation",
+                    "path": "FsxForOntapTestStack/Vpc/PublicSubnet1/RouteTableAssociation",
+                    "attributes": {
+                      "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
+                      "aws:cdk:cloudformation:props": {
+                        "routeTableId": {
+                          "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
+                        },
+                        "subnetId": {
+                          "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
+                        }
+                      }
+                    },
+                    "constructInfo": {
+                      "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
+                      "version": "2.120.0"
+                    }
+                  },
+                  "DefaultRoute": {
+                    "id": "DefaultRoute",
+                    "path": "FsxForOntapTestStack/Vpc/PublicSubnet1/DefaultRoute",
+                    "attributes": {
+                      "aws:cdk:cloudformation:type": "AWS::EC2::Route",
+                      "aws:cdk:cloudformation:props": {
+                        "destinationCidrBlock": "0.0.0.0/0",
+                        "gatewayId": {
+                          "Ref": "VpcIGWD7BA715C"
+                        },
+                        "routeTableId": {
+                          "Ref": "VpcPublicSubnet1RouteTable6C95E38E"
+                        }
+                      }
+                    },
+                    "constructInfo": {
+                      "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
+                      "version": "2.120.0"
+                    }
+                  },
+                  "EIP": {
+                    "id": "EIP",
+                    "path": "FsxForOntapTestStack/Vpc/PublicSubnet1/EIP",
+                    "attributes": {
+                      "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
+                      "aws:cdk:cloudformation:props": {
+                        "domain": "vpc",
+                        "tags": [
+                          {
+                            "key": "Name",
+                            "value": "FsxForOntapTestStack/Vpc/PublicSubnet1"
+                          }
+                        ]
+                      }
+                    },
+                    "constructInfo": {
+                      "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
+                      "version": "2.120.0"
+                    }
+                  },
+                  "NATGateway": {
+                    "id": "NATGateway",
+                    "path": "FsxForOntapTestStack/Vpc/PublicSubnet1/NATGateway",
+                    "attributes": {
+                      "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
+                      "aws:cdk:cloudformation:props": {
+                        "allocationId": {
+                          "Fn::GetAtt": [
+                            "VpcPublicSubnet1EIPD7E02669",
+                            "AllocationId"
+                          ]
+                        },
+                        "subnetId": {
+                          "Ref": "VpcPublicSubnet1Subnet5C2D37C4"
+                        },
+                        "tags": [
+                          {
+                            "key": "Name",
+                            "value": "FsxForOntapTestStack/Vpc/PublicSubnet1"
+                          }
+                        ]
+                      }
+                    },
+                    "constructInfo": {
+                      "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
+                      "version": "2.120.0"
+                    }
+                  }
+                },
+                "constructInfo": {
+                  "fqn": "aws-cdk-lib.aws_ec2.PublicSubnet",
+                  "version": "2.120.0"
+                }
+              },
+              "PublicSubnet2": {
+                "id": "PublicSubnet2",
+                "path": "FsxForOntapTestStack/Vpc/PublicSubnet2",
+                "children": {
+                  "Subnet": {
+                    "id": "Subnet",
+                    "path": "FsxForOntapTestStack/Vpc/PublicSubnet2/Subnet",
+                    "attributes": {
+                      "aws:cdk:cloudformation:type": "AWS::EC2::Subnet",
+                      "aws:cdk:cloudformation:props": {
+                        "availabilityZone": {
+                          "Fn::Select": [
+                            1,
+                            {
+                              "Fn::GetAZs": ""
+                            }
+                          ]
+                        },
+                        "cidrBlock": "10.0.64.0/18",
+                        "mapPublicIpOnLaunch": true,
+                        "tags": [
+                          {
+                            "key": "aws-cdk:subnet-name",
+                            "value": "Public"
+                          },
+                          {
+                            "key": "aws-cdk:subnet-type",
+                            "value": "Public"
+                          },
+                          {
+                            "key": "Name",
+                            "value": "FsxForOntapTestStack/Vpc/PublicSubnet2"
+                          }
+                        ],
+                        "vpcId": {
+                          "Ref": "Vpc8378EB38"
+                        }
+                      }
+                    },
+                    "constructInfo": {
+                      "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
+                      "version": "2.120.0"
+                    }
+                  },
+                  "Acl": {
+                    "id": "Acl",
+                    "path": "FsxForOntapTestStack/Vpc/PublicSubnet2/Acl",
+                    "constructInfo": {
+                      "fqn": "aws-cdk-lib.Resource",
+                      "version": "2.120.0"
+                    }
+                  },
+                  "RouteTable": {
+                    "id": "RouteTable",
+                    "path": "FsxForOntapTestStack/Vpc/PublicSubnet2/RouteTable",
+                    "attributes": {
+                      "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
+                      "aws:cdk:cloudformation:props": {
+                        "tags": [
+                          {
+                            "key": "Name",
+                            "value": "FsxForOntapTestStack/Vpc/PublicSubnet2"
+                          }
+                        ],
+                        "vpcId": {
+                          "Ref": "Vpc8378EB38"
+                        }
+                      }
+                    },
+                    "constructInfo": {
+                      "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
+                      "version": "2.120.0"
+                    }
+                  },
+                  "RouteTableAssociation": {
+                    "id": "RouteTableAssociation",
+                    "path": "FsxForOntapTestStack/Vpc/PublicSubnet2/RouteTableAssociation",
+                    "attributes": {
+                      "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
+                      "aws:cdk:cloudformation:props": {
+                        "routeTableId": {
+                          "Ref": "VpcPublicSubnet2RouteTable94F7E489"
+                        },
+                        "subnetId": {
+                          "Ref": "VpcPublicSubnet2Subnet691E08A3"
+                        }
+                      }
+                    },
+                    "constructInfo": {
+                      "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
+                      "version": "2.120.0"
+                    }
+                  },
+                  "DefaultRoute": {
+                    "id": "DefaultRoute",
+                    "path": "FsxForOntapTestStack/Vpc/PublicSubnet2/DefaultRoute",
+                    "attributes": {
+                      "aws:cdk:cloudformation:type": "AWS::EC2::Route",
+                      "aws:cdk:cloudformation:props": {
+                        "destinationCidrBlock": "0.0.0.0/0",
+                        "gatewayId": {
+                          "Ref": "VpcIGWD7BA715C"
+                        },
+                        "routeTableId": {
+                          "Ref": "VpcPublicSubnet2RouteTable94F7E489"
+                        }
+                      }
+                    },
+                    "constructInfo": {
+                      "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
+                      "version": "2.120.0"
+                    }
+                  },
+                  "EIP": {
+                    "id": "EIP",
+                    "path": "FsxForOntapTestStack/Vpc/PublicSubnet2/EIP",
+                    "attributes": {
+                      "aws:cdk:cloudformation:type": "AWS::EC2::EIP",
+                      "aws:cdk:cloudformation:props": {
+                        "domain": "vpc",
+                        "tags": [
+                          {
+                            "key": "Name",
+                            "value": "FsxForOntapTestStack/Vpc/PublicSubnet2"
+                          }
+                        ]
+                      }
+                    },
+                    "constructInfo": {
+                      "fqn": "aws-cdk-lib.aws_ec2.CfnEIP",
+                      "version": "2.120.0"
+                    }
+                  },
+                  "NATGateway": {
+                    "id": "NATGateway",
+                    "path": "FsxForOntapTestStack/Vpc/PublicSubnet2/NATGateway",
+                    "attributes": {
+                      "aws:cdk:cloudformation:type": "AWS::EC2::NatGateway",
+                      "aws:cdk:cloudformation:props": {
+                        "allocationId": {
+                          "Fn::GetAtt": [
+                            "VpcPublicSubnet2EIP3C605A87",
+                            "AllocationId"
+                          ]
+                        },
+                        "subnetId": {
+                          "Ref": "VpcPublicSubnet2Subnet691E08A3"
+                        },
+                        "tags": [
+                          {
+                            "key": "Name",
+                            "value": "FsxForOntapTestStack/Vpc/PublicSubnet2"
+                          }
+                        ]
+                      }
+                    },
+                    "constructInfo": {
+                      "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway",
+                      "version": "2.120.0"
+                    }
+                  }
+                },
+                "constructInfo": {
+                  "fqn": "aws-cdk-lib.aws_ec2.PublicSubnet",
+                  "version": "2.120.0"
+                }
+              },
+              "PrivateSubnet1": {
+                "id": "PrivateSubnet1",
+                "path": "FsxForOntapTestStack/Vpc/PrivateSubnet1",
+                "children": {
+                  "Subnet": {
+                    "id": "Subnet",
+                    "path": "FsxForOntapTestStack/Vpc/PrivateSubnet1/Subnet",
+                    "attributes": {
+                      "aws:cdk:cloudformation:type": "AWS::EC2::Subnet",
+                      "aws:cdk:cloudformation:props": {
+                        "availabilityZone": {
+                          "Fn::Select": [
+                            0,
+                            {
+                              "Fn::GetAZs": ""
+                            }
+                          ]
+                        },
+                        "cidrBlock": "10.0.128.0/18",
+                        "mapPublicIpOnLaunch": false,
+                        "tags": [
+                          {
+                            "key": "aws-cdk:subnet-name",
+                            "value": "Private"
+                          },
+                          {
+                            "key": "aws-cdk:subnet-type",
+                            "value": "Private"
+                          },
+                          {
+                            "key": "Name",
+                            "value": "FsxForOntapTestStack/Vpc/PrivateSubnet1"
+                          }
+                        ],
+                        "vpcId": {
+                          "Ref": "Vpc8378EB38"
+                        }
+                      }
+                    },
+                    "constructInfo": {
+                      "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
+                      "version": "2.120.0"
+                    }
+                  },
+                  "Acl": {
+                    "id": "Acl",
+                    "path": "FsxForOntapTestStack/Vpc/PrivateSubnet1/Acl",
+                    "constructInfo": {
+                      "fqn": "aws-cdk-lib.Resource",
+                      "version": "2.120.0"
+                    }
+                  },
+                  "RouteTable": {
+                    "id": "RouteTable",
+                    "path": "FsxForOntapTestStack/Vpc/PrivateSubnet1/RouteTable",
+                    "attributes": {
+                      "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
+                      "aws:cdk:cloudformation:props": {
+                        "tags": [
+                          {
+                            "key": "Name",
+                            "value": "FsxForOntapTestStack/Vpc/PrivateSubnet1"
+                          }
+                        ],
+                        "vpcId": {
+                          "Ref": "Vpc8378EB38"
+                        }
+                      }
+                    },
+                    "constructInfo": {
+                      "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
+                      "version": "2.120.0"
+                    }
+                  },
+                  "RouteTableAssociation": {
+                    "id": "RouteTableAssociation",
+                    "path": "FsxForOntapTestStack/Vpc/PrivateSubnet1/RouteTableAssociation",
+                    "attributes": {
+                      "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
+                      "aws:cdk:cloudformation:props": {
+                        "routeTableId": {
+                          "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
+                        },
+                        "subnetId": {
+                          "Ref": "VpcPrivateSubnet1Subnet536B997A"
+                        }
+                      }
+                    },
+                    "constructInfo": {
+                      "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
+                      "version": "2.120.0"
+                    }
+                  },
+                  "DefaultRoute": {
+                    "id": "DefaultRoute",
+                    "path": "FsxForOntapTestStack/Vpc/PrivateSubnet1/DefaultRoute",
+                    "attributes": {
+                      "aws:cdk:cloudformation:type": "AWS::EC2::Route",
+                      "aws:cdk:cloudformation:props": {
+                        "destinationCidrBlock": "0.0.0.0/0",
+                        "natGatewayId": {
+                          "Ref": "VpcPublicSubnet1NATGateway4D7517AA"
+                        },
+                        "routeTableId": {
+                          "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
+                        }
+                      }
+                    },
+                    "constructInfo": {
+                      "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
+                      "version": "2.120.0"
+                    }
+                  }
+                },
+                "constructInfo": {
+                  "fqn": "aws-cdk-lib.aws_ec2.PrivateSubnet",
+                  "version": "2.120.0"
+                }
+              },
+              "PrivateSubnet2": {
+                "id": "PrivateSubnet2",
+                "path": "FsxForOntapTestStack/Vpc/PrivateSubnet2",
+                "children": {
+                  "Subnet": {
+                    "id": "Subnet",
+                    "path": "FsxForOntapTestStack/Vpc/PrivateSubnet2/Subnet",
+                    "attributes": {
+                      "aws:cdk:cloudformation:type": "AWS::EC2::Subnet",
+                      "aws:cdk:cloudformation:props": {
+                        "availabilityZone": {
+                          "Fn::Select": [
+                            1,
+                            {
+                              "Fn::GetAZs": ""
+                            }
+                          ]
+                        },
+                        "cidrBlock": "10.0.192.0/18",
+                        "mapPublicIpOnLaunch": false,
+                        "tags": [
+                          {
+                            "key": "aws-cdk:subnet-name",
+                            "value": "Private"
+                          },
+                          {
+                            "key": "aws-cdk:subnet-type",
+                            "value": "Private"
+                          },
+                          {
+                            "key": "Name",
+                            "value": "FsxForOntapTestStack/Vpc/PrivateSubnet2"
+                          }
+                        ],
+                        "vpcId": {
+                          "Ref": "Vpc8378EB38"
+                        }
+                      }
+                    },
+                    "constructInfo": {
+                      "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet",
+                      "version": "2.120.0"
+                    }
+                  },
+                  "Acl": {
+                    "id": "Acl",
+                    "path": "FsxForOntapTestStack/Vpc/PrivateSubnet2/Acl",
+                    "constructInfo": {
+                      "fqn": "aws-cdk-lib.Resource",
+                      "version": "2.120.0"
+                    }
+                  },
+                  "RouteTable": {
+                    "id": "RouteTable",
+                    "path": "FsxForOntapTestStack/Vpc/PrivateSubnet2/RouteTable",
+                    "attributes": {
+                      "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable",
+                      "aws:cdk:cloudformation:props": {
+                        "tags": [
+                          {
+                            "key": "Name",
+                            "value": "FsxForOntapTestStack/Vpc/PrivateSubnet2"
+                          }
+                        ],
+                        "vpcId": {
+                          "Ref": "Vpc8378EB38"
+                        }
+                      }
+                    },
+                    "constructInfo": {
+                      "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable",
+                      "version": "2.120.0"
+                    }
+                  },
+                  "RouteTableAssociation": {
+                    "id": "RouteTableAssociation",
+                    "path": "FsxForOntapTestStack/Vpc/PrivateSubnet2/RouteTableAssociation",
+                    "attributes": {
+                      "aws:cdk:cloudformation:type": "AWS::EC2::SubnetRouteTableAssociation",
+                      "aws:cdk:cloudformation:props": {
+                        "routeTableId": {
+                          "Ref": "VpcPrivateSubnet2RouteTableA678073B"
+                        },
+                        "subnetId": {
+                          "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
+                        }
+                      }
+                    },
+                    "constructInfo": {
+                      "fqn": "aws-cdk-lib.aws_ec2.CfnSubnetRouteTableAssociation",
+                      "version": "2.120.0"
+                    }
+                  },
+                  "DefaultRoute": {
+                    "id": "DefaultRoute",
+                    "path": "FsxForOntapTestStack/Vpc/PrivateSubnet2/DefaultRoute",
+                    "attributes": {
+                      "aws:cdk:cloudformation:type": "AWS::EC2::Route",
+                      "aws:cdk:cloudformation:props": {
+                        "destinationCidrBlock": "0.0.0.0/0",
+                        "natGatewayId": {
+                          "Ref": "VpcPublicSubnet2NATGateway9182C01D"
+                        },
+                        "routeTableId": {
+                          "Ref": "VpcPrivateSubnet2RouteTableA678073B"
+                        }
+                      }
+                    },
+                    "constructInfo": {
+                      "fqn": "aws-cdk-lib.aws_ec2.CfnRoute",
+                      "version": "2.120.0"
+                    }
+                  }
+                },
+                "constructInfo": {
+                  "fqn": "aws-cdk-lib.aws_ec2.PrivateSubnet",
+                  "version": "2.120.0"
+                }
+              },
+              "IGW": {
+                "id": "IGW",
+                "path": "FsxForOntapTestStack/Vpc/IGW",
+                "attributes": {
+                  "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway",
+                  "aws:cdk:cloudformation:props": {
+                    "tags": [
+                      {
+                        "key": "Name",
+                        "value": "FsxForOntapTestStack/Vpc"
+                      }
+                    ]
+                  }
+                },
+                "constructInfo": {
+                  "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway",
+                  "version": "2.120.0"
+                }
+              },
+              "VPCGW": {
+                "id": "VPCGW",
+                "path": "FsxForOntapTestStack/Vpc/VPCGW",
+                "attributes": {
+                  "aws:cdk:cloudformation:type": "AWS::EC2::VPCGatewayAttachment",
+                  "aws:cdk:cloudformation:props": {
+                    "internetGatewayId": {
+                      "Ref": "VpcIGWD7BA715C"
+                    },
+                    "vpcId": {
+                      "Ref": "Vpc8378EB38"
+                    }
+                  }
+                },
+                "constructInfo": {
+                  "fqn": "aws-cdk-lib.aws_ec2.CfnVPCGatewayAttachment",
+                  "version": "2.120.0"
+                }
+              },
+              "RestrictDefaultSecurityGroupCustomResource": {
+                "id": "RestrictDefaultSecurityGroupCustomResource",
+                "path": "FsxForOntapTestStack/Vpc/RestrictDefaultSecurityGroupCustomResource",
+                "children": {
+                  "Default": {
+                    "id": "Default",
+                    "path": "FsxForOntapTestStack/Vpc/RestrictDefaultSecurityGroupCustomResource/Default",
+                    "constructInfo": {
+                      "fqn": "aws-cdk-lib.CfnResource",
+                      "version": "2.120.0"
+                    }
+                  }
+                },
+                "constructInfo": {
+                  "fqn": "aws-cdk-lib.CustomResource",
+                  "version": "2.120.0"
+                }
+              }
+            },
+            "constructInfo": {
+              "fqn": "aws-cdk-lib.aws_ec2.Vpc",
+              "version": "2.120.0"
+            }
+          },
+          "Custom::VpcRestrictDefaultSGCustomResourceProvider": {
+            "id": "Custom::VpcRestrictDefaultSGCustomResourceProvider",
+            "path": "FsxForOntapTestStack/Custom::VpcRestrictDefaultSGCustomResourceProvider",
+            "children": {
+              "Staging": {
+                "id": "Staging",
+                "path": "FsxForOntapTestStack/Custom::VpcRestrictDefaultSGCustomResourceProvider/Staging",
+                "constructInfo": {
+                  "fqn": "aws-cdk-lib.AssetStaging",
+                  "version": "2.120.0"
+                }
+              },
+              "Role": {
+                "id": "Role",
+                "path": "FsxForOntapTestStack/Custom::VpcRestrictDefaultSGCustomResourceProvider/Role",
+                "constructInfo": {
+                  "fqn": "aws-cdk-lib.CfnResource",
+                  "version": "2.120.0"
+                }
+              },
+              "Handler": {
+                "id": "Handler",
+                "path": "FsxForOntapTestStack/Custom::VpcRestrictDefaultSGCustomResourceProvider/Handler",
+                "constructInfo": {
+                  "fqn": "aws-cdk-lib.CfnResource",
+                  "version": "2.120.0"
+                }
+              }
+            },
+            "constructInfo": {
+              "fqn": "aws-cdk-lib.CustomResourceProviderBase",
+              "version": "2.120.0"
+            }
+          },
+          "OntapMultiAzFileSystem": {
+            "id": "OntapMultiAzFileSystem",
+            "path": "FsxForOntapTestStack/OntapMultiAzFileSystem",
+            "children": {
+              "FsxOntapSecurityGroup": {
+                "id": "FsxOntapSecurityGroup",
+                "path": "FsxForOntapTestStack/OntapMultiAzFileSystem/FsxOntapSecurityGroup",
+                "children": {
+                  "Resource": {
+                    "id": "Resource",
+                    "path": "FsxForOntapTestStack/OntapMultiAzFileSystem/FsxOntapSecurityGroup/Resource",
+                    "attributes": {
+                      "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
+                      "aws:cdk:cloudformation:props": {
+                        "groupDescription": "FsxForOntapTestStack/OntapMultiAzFileSystem/FsxOntapSecurityGroup",
+                        "securityGroupEgress": [
+                          {
+                            "cidrIp": "0.0.0.0/0",
+                            "description": "Allow all outbound traffic by default",
+                            "ipProtocol": "-1"
+                          }
+                        ],
+                        "vpcId": {
+                          "Ref": "Vpc8378EB38"
+                        }
+                      }
+                    },
+                    "constructInfo": {
+                      "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
+                      "version": "2.120.0"
+                    }
+                  }
+                },
+                "constructInfo": {
+                  "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
+                  "version": "2.120.0"
+                }
+              },
+              "Resource": {
+                "id": "Resource",
+                "path": "FsxForOntapTestStack/OntapMultiAzFileSystem/Resource",
+                "attributes": {
+                  "aws:cdk:cloudformation:type": "AWS::FSx::FileSystem",
+                  "aws:cdk:cloudformation:props": {
+                    "fileSystemType": "ONTAP",
+                    "ontapConfiguration": {
+                      "automaticBackupRetentionDays": 7,
+                      "dailyAutomaticBackupStartTime": "01:00",
+                      "deploymentType": "MULTI_AZ_2",
+                      "diskIopsConfiguration": {
+                        "mode": "USER_PROVISIONED",
+                        "iops": 15360
+                      },
+                      "endpointIpAddressRange": "192.168.39.0/24",
+                      "fsxAdminPassword": "fsxPassword1",
+                      "haPairs": 1,
+                      "preferredSubnetId": {
+                        "Ref": "VpcPrivateSubnet1Subnet536B997A"
+                      },
+                      "routeTableIds": [
+                        {
+                          "Ref": "VpcPrivateSubnet1RouteTableB2C5B500"
+                        },
+                        {
+                          "Ref": "VpcPrivateSubnet2RouteTableA678073B"
+                        }
+                      ],
+                      "throughputCapacityPerHaPair": 384,
+                      "weeklyMaintenanceStartTime": "7:01:00"
+                    },
+                    "securityGroupIds": [
+                      {
+                        "Fn::GetAtt": [
+                          "OntapMultiAzFileSystemFsxOntapSecurityGroup6D28E847",
+                          "GroupId"
+                        ]
+                      }
+                    ],
+                    "storageCapacity": 5120,
+                    "subnetIds": [
+                      {
+                        "Ref": "VpcPrivateSubnet1Subnet536B997A"
+                      },
+                      {
+                        "Ref": "VpcPrivateSubnet2Subnet3788AAA1"
+                      }
+                    ]
+                  }
+                },
+                "constructInfo": {
+                  "fqn": "aws-cdk-lib.aws_fsx.CfnFileSystem",
+                  "version": "2.120.0"
+                }
+              }
+            },
+            "constructInfo": {
+              "fqn": "aws-cdk-lib.aws_fsx.FileSystemBase",
+              "version": "2.120.0"
+            }
+          },
+          "OntapSingleAzFileSystem": {
+            "id": "OntapSingleAzFileSystem",
+            "path": "FsxForOntapTestStack/OntapSingleAzFileSystem",
+            "children": {
+              "FsxOntapSecurityGroup": {
+                "id": "FsxOntapSecurityGroup",
+                "path": "FsxForOntapTestStack/OntapSingleAzFileSystem/FsxOntapSecurityGroup",
+                "children": {
+                  "Resource": {
+                    "id": "Resource",
+                    "path": "FsxForOntapTestStack/OntapSingleAzFileSystem/FsxOntapSecurityGroup/Resource",
+                    "attributes": {
+                      "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup",
+                      "aws:cdk:cloudformation:props": {
+                        "groupDescription": "FsxForOntapTestStack/OntapSingleAzFileSystem/FsxOntapSecurityGroup",
+                        "securityGroupEgress": [
+                          {
+                            "cidrIp": "0.0.0.0/0",
+                            "description": "Allow all outbound traffic by default",
+                            "ipProtocol": "-1"
+                          }
+                        ],
+                        "vpcId": {
+                          "Ref": "Vpc8378EB38"
+                        }
+                      }
+                    },
+                    "constructInfo": {
+                      "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup",
+                      "version": "2.120.0"
+                    }
+                  }
+                },
+                "constructInfo": {
+                  "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup",
+                  "version": "2.120.0"
+                }
+              },
+              "Resource": {
+                "id": "Resource",
+                "path": "FsxForOntapTestStack/OntapSingleAzFileSystem/Resource",
+                "attributes": {
+                  "aws:cdk:cloudformation:type": "AWS::FSx::FileSystem",
+                  "aws:cdk:cloudformation:props": {
+                    "fileSystemType": "ONTAP",
+                    "ontapConfiguration": {
+                      "automaticBackupRetentionDays": 7,
+                      "dailyAutomaticBackupStartTime": "01:00",
+                      "deploymentType": "SINGLE_AZ_2",
+                      "diskIopsConfiguration": {
+                        "mode": "USER_PROVISIONED",
+                        "iops": 76800
+                      },
+                      "fsxAdminPassword": "fsxPassword1",
+                      "haPairs": 5,
+                      "throughputCapacityPerHaPair": 1536,
+                      "weeklyMaintenanceStartTime": "7:01:00"
+                    },
+                    "securityGroupIds": [
+                      {
+                        "Fn::GetAtt": [
+                          "OntapSingleAzFileSystemFsxOntapSecurityGroup614DD704",
+                          "GroupId"
+                        ]
+                      }
+                    ],
+                    "storageCapacity": 5120,
+                    "subnetIds": [
+                      {
+                        "Ref": "VpcPrivateSubnet1Subnet536B997A"
+                      }
+                    ]
+                  }
+                },
+                "constructInfo": {
+                  "fqn": "aws-cdk-lib.aws_fsx.CfnFileSystem",
+                  "version": "2.120.0"
+                }
+              }
+            },
+            "constructInfo": {
+              "fqn": "aws-cdk-lib.aws_fsx.FileSystemBase",
+              "version": "2.120.0"
+            }
+          },
+          "BootstrapVersion": {
+            "id": "BootstrapVersion",
+            "path": "FsxForOntapTestStack/BootstrapVersion",
+            "constructInfo": {
+              "fqn": "aws-cdk-lib.CfnParameter",
+              "version": "2.120.0"
+            }
+          },
+          "CheckBootstrapVersion": {
+            "id": "CheckBootstrapVersion",
+            "path": "FsxForOntapTestStack/CheckBootstrapVersion",
+            "constructInfo": {
+              "fqn": "aws-cdk-lib.CfnRule",
+              "version": "2.120.0"
+            }
+          }
+        },
+        "constructInfo": {
+          "fqn": "aws-cdk-lib.Stack",
+          "version": "2.120.0"
+        }
+      },
+      "FsxForOntapTest": {
+        "id": "FsxForOntapTest",
+        "path": "FsxForOntapTest",
+        "children": {
+          "DefaultTest": {
+            "id": "DefaultTest",
+            "path": "FsxForOntapTest/DefaultTest",
+            "children": {
+              "Default": {
+                "id": "Default",
+                "path": "FsxForOntapTest/DefaultTest/Default",
+                "constructInfo": {
+                  "fqn": "constructs.Construct",
+                  "version": "10.3.0"
+                }
+              },
+              "DeployAssert": {
+                "id": "DeployAssert",
+                "path": "FsxForOntapTest/DefaultTest/DeployAssert",
+                "children": {
+                  "BootstrapVersion": {
+                    "id": "BootstrapVersion",
+                    "path": "FsxForOntapTest/DefaultTest/DeployAssert/BootstrapVersion",
+                    "constructInfo": {
+                      "fqn": "aws-cdk-lib.CfnParameter",
+                      "version": "2.120.0"
+                    }
+                  },
+                  "CheckBootstrapVersion": {
+                    "id": "CheckBootstrapVersion",
+                    "path": "FsxForOntapTest/DefaultTest/DeployAssert/CheckBootstrapVersion",
+                    "constructInfo": {
+                      "fqn": "aws-cdk-lib.CfnRule",
+                      "version": "2.120.0"
+                    }
+                  }
+                },
+                "constructInfo": {
+                  "fqn": "aws-cdk-lib.Stack",
+                  "version": "2.120.0"
+                }
+              }
+            },
+            "constructInfo": {
+              "fqn": "@aws-cdk/integ-tests-alpha.IntegTestCase",
+              "version": "2.120.0-alpha.0"
+            }
+          }
+        },
+        "constructInfo": {
+          "fqn": "@aws-cdk/integ-tests-alpha.IntegTest",
+          "version": "2.120.0-alpha.0"
+        }
+      },
+      "Tree": {
+        "id": "Tree",
+        "path": "Tree",
+        "constructInfo": {
+          "fqn": "constructs.Construct",
+          "version": "10.3.0"
+        }
+      }
+    },
+    "constructInfo": {
+      "fqn": "aws-cdk-lib.App",
+      "version": "2.120.0"
+    }
+  }
+}
\ No newline at end of file
diff --git a/test/aws-fsx/ontap-file-system.test.ts b/test/aws-fsx/ontap-file-system.test.ts
new file mode 100644
index 0000000..dbf177b
--- /dev/null
+++ b/test/aws-fsx/ontap-file-system.test.ts
@@ -0,0 +1,723 @@
+import { strictEqual } from 'assert';
+import { Aws, Duration, RemovalPolicy, SecretValue, Stack, aws_ec2, aws_fsx, aws_kms } from 'aws-cdk-lib';
+import { Template } from 'aws-cdk-lib/assertions';
+import {
+  MaintenanceTime,
+  OntapFileSystem,
+  OntapConfiguration,
+  OntapDeploymentType,
+  DailyAutomaticBackupStartTime,
+  ThroughputCapacityPerHaPair,
+  MultiAz1ThroughputCapacityPerHaPair,
+  MultiAz2ThroughputCapacityPerHaPair,
+  SingleAz2ThroughputCapacityPerHaPair,
+  SingleAz1ThroughputCapacityPerHaPair,
+} from '../../src/aws-fsx';
+
+describe('FSx for NetApp ONTAP File System', () => {
+  let ontapConfiguration: OntapConfiguration;
+  let stack: Stack;
+  let vpc: aws_ec2.Vpc;
+
+  beforeEach(() => {
+    stack = new Stack();
+    vpc = new aws_ec2.Vpc(stack, 'VPC');
+  });
+
+  test('default multi az file system', () => {
+    ontapConfiguration = {
+      deploymentType: OntapDeploymentType.MULTI_AZ_2,
+      preferredSubnet: vpc.privateSubnets[0],
+    };
+
+    const fileSystem = new OntapFileSystem(stack, 'FsxFileSystem', {
+      ontapConfiguration,
+      storageCapacityGiB: 1200,
+      vpc,
+      vpcSubnets: vpc.privateSubnets,
+    });
+
+    Template.fromStack(stack).hasResourceProperties('AWS::FSx::FileSystem', {
+      FileSystemType: 'ONTAP',
+      SubnetIds: [
+        {
+          Ref: 'VPCPrivateSubnet1Subnet8BCA10E0',
+        },
+        {
+          Ref: 'VPCPrivateSubnet2SubnetCFCDAA7A',
+        },
+      ],
+      OntapConfiguration: {
+        DeploymentType: 'MULTI_AZ_2',
+        AutomaticBackupRetentionDays: 30,
+        PreferredSubnetId: {
+          Ref: 'VPCPrivateSubnet1Subnet8BCA10E0',
+        },
+      },
+    });
+    Template.fromStack(stack).hasResourceProperties('AWS::EC2::SecurityGroup', {
+      VpcId: {
+        Ref: 'VPCB9E5F0B4',
+      },
+    });
+    strictEqual(fileSystem.dnsName, `management.${fileSystem.fileSystemId}.fsx.${stack.region}.${Aws.URL_SUFFIX}`);
+    strictEqual(
+      fileSystem.interClusterDnsName,
+      `intercluster.${fileSystem.fileSystemId}.fsx.${stack.region}.${Aws.URL_SUFFIX}`,
+    );
+  });
+
+  test('full settings multi az file system', () => {
+    const kmsKey = new aws_kms.Key(stack, 'Key');
+
+    ontapConfiguration = {
+      automaticBackupRetention: Duration.days(7),
+      dailyAutomaticBackupStartTime: new DailyAutomaticBackupStartTime({
+        hour: 1,
+        minute: 0,
+      }),
+      deploymentType: OntapDeploymentType.MULTI_AZ_2,
+      diskIops: 15360,
+      endpointIpAddressRange: '192.168.12.0/24',
+      fsxAdminPassword: SecretValue.unsafePlainText('fsxPassword2'),
+      haPairs: 1,
+      preferredSubnet: vpc.privateSubnets[0],
+      routeTables: vpc.privateSubnets.map(subnet => subnet.routeTable),
+      throughputCapacityPerHaPair: MultiAz2ThroughputCapacityPerHaPair.MB_PER_SEC_384,
+      weeklyMaintenanceStartTime: new MaintenanceTime({
+        day: aws_fsx.Weekday.SUNDAY,
+        hour: 5,
+        minute: 0,
+      }),
+    };
+
+    new OntapFileSystem(stack, 'FsxFileSystem', {
+      ontapConfiguration,
+      storageCapacityGiB: 1200,
+      vpc,
+      vpcSubnets: vpc.privateSubnets,
+      kmsKey,
+      backupId: 'backupId',
+      securityGroup: new aws_ec2.SecurityGroup(stack, 'SecurityGroup', {
+        vpc,
+        allowAllOutbound: false,
+      }),
+      removalPolicy: RemovalPolicy.DESTROY,
+    });
+
+    Template.fromStack(stack).hasResourceProperties('AWS::FSx::FileSystem', {
+      FileSystemType: 'ONTAP',
+      SubnetIds: [
+        {
+          Ref: 'VPCPrivateSubnet1Subnet8BCA10E0',
+        },
+        {
+          Ref: 'VPCPrivateSubnet2SubnetCFCDAA7A',
+        },
+      ],
+      OntapConfiguration: {
+        AutomaticBackupRetentionDays: 7,
+        DailyAutomaticBackupStartTime: '01:00',
+        DeploymentType: 'MULTI_AZ_2',
+        DiskIopsConfiguration: {
+          Mode: 'USER_PROVISIONED',
+          Iops: 15360,
+        },
+        EndpointIpAddressRange: '192.168.12.0/24',
+        FsxAdminPassword: 'fsxPassword2',
+        HAPairs: 1,
+        PreferredSubnetId: {
+          Ref: 'VPCPrivateSubnet1Subnet8BCA10E0',
+        },
+        RouteTableIds: [
+          {
+            Ref: 'VPCPrivateSubnet1RouteTableBE8A6027',
+          },
+          {
+            Ref: 'VPCPrivateSubnet2RouteTable0A19E10E',
+          },
+        ],
+        ThroughputCapacityPerHAPair: 384,
+        WeeklyMaintenanceStartTime: '7:05:00',
+      },
+      BackupId: 'backupId',
+      KmsKeyId: {
+        Ref: 'Key961B73FD',
+      },
+    });
+    Template.fromStack(stack).hasResourceProperties('AWS::EC2::SecurityGroup', {
+      VpcId: {
+        Ref: 'VPCB9E5F0B4',
+      },
+    });
+  });
+
+  test('default single az file system', () => {
+    ontapConfiguration = {
+      deploymentType: OntapDeploymentType.SINGLE_AZ_2,
+    };
+
+    const fileSystem = new OntapFileSystem(stack, 'FsxFileSystem', {
+      ontapConfiguration,
+      storageCapacityGiB: 1200,
+      vpc,
+      vpcSubnets: vpc.privateSubnets,
+    });
+
+    Template.fromStack(stack).hasResourceProperties('AWS::FSx::FileSystem', {
+      FileSystemType: 'ONTAP',
+      SubnetIds: [
+        {
+          Ref: 'VPCPrivateSubnet1Subnet8BCA10E0',
+        },
+        {
+          Ref: 'VPCPrivateSubnet2SubnetCFCDAA7A',
+        },
+      ],
+      OntapConfiguration: {
+        DeploymentType: 'SINGLE_AZ_2',
+        AutomaticBackupRetentionDays: 30,
+      },
+    });
+    Template.fromStack(stack).hasResourceProperties('AWS::EC2::SecurityGroup', {
+      VpcId: {
+        Ref: 'VPCB9E5F0B4',
+      },
+    });
+    strictEqual(fileSystem.dnsName, `management.${fileSystem.fileSystemId}.fsx.${stack.region}.${Aws.URL_SUFFIX}`);
+    strictEqual(
+      fileSystem.interClusterDnsName,
+      `intercluster.${fileSystem.fileSystemId}.fsx.${stack.region}.${Aws.URL_SUFFIX}`,
+    );
+  });
+
+  test('full settings single az file system', () => {
+    const kmsKey = new aws_kms.Key(stack, 'Key');
+
+    ontapConfiguration = {
+      automaticBackupRetention: Duration.days(7),
+      dailyAutomaticBackupStartTime: new DailyAutomaticBackupStartTime({
+        hour: 1,
+        minute: 0,
+      }),
+      deploymentType: OntapDeploymentType.SINGLE_AZ_2,
+      diskIops: 442368,
+      fsxAdminPassword: SecretValue.unsafePlainText('fsxPassword1'),
+      haPairs: 12,
+      throughputCapacityPerHaPair: SingleAz2ThroughputCapacityPerHaPair.MB_PER_SEC_1536,
+      weeklyMaintenanceStartTime: new MaintenanceTime({
+        day: aws_fsx.Weekday.SUNDAY,
+        hour: 5,
+        minute: 0,
+      }),
+    };
+
+    new OntapFileSystem(stack, 'FsxFileSystem', {
+      ontapConfiguration,
+      storageCapacityGiB: 12288,
+      vpc,
+      vpcSubnets: vpc.privateSubnets,
+      kmsKey,
+      backupId: 'backupId',
+      securityGroup: new aws_ec2.SecurityGroup(stack, 'SecurityGroup', {
+        vpc,
+        allowAllOutbound: false,
+      }),
+      removalPolicy: RemovalPolicy.DESTROY,
+    });
+
+    Template.fromStack(stack).hasResourceProperties('AWS::FSx::FileSystem', {
+      FileSystemType: 'ONTAP',
+      StorageCapacity: 12288,
+      SubnetIds: [
+        {
+          Ref: 'VPCPrivateSubnet1Subnet8BCA10E0',
+        },
+        {
+          Ref: 'VPCPrivateSubnet2SubnetCFCDAA7A',
+        },
+      ],
+      OntapConfiguration: {
+        AutomaticBackupRetentionDays: 7,
+        DailyAutomaticBackupStartTime: '01:00',
+        DeploymentType: 'SINGLE_AZ_2',
+        DiskIopsConfiguration: {
+          Mode: 'USER_PROVISIONED',
+          Iops: 442368,
+        },
+        FsxAdminPassword: 'fsxPassword1',
+        HAPairs: 12,
+        ThroughputCapacityPerHAPair: 1536,
+        WeeklyMaintenanceStartTime: '7:05:00',
+      },
+      BackupId: 'backupId',
+      KmsKeyId: {
+        Ref: 'Key961B73FD',
+      },
+    });
+  });
+
+  describe('HA pairs', () => {
+    test.each([0.1, -1, 0, 13])('throw error for invalid HA pairs %s', haPairs => {
+      ontapConfiguration = {
+        deploymentType: OntapDeploymentType.MULTI_AZ_2,
+        haPairs,
+      };
+
+      expect(() => {
+        new OntapFileSystem(stack, 'FsxFileSystem', {
+          ontapConfiguration,
+          storageCapacityGiB: 1200,
+          vpc,
+          vpcSubnets: vpc.privateSubnets,
+        });
+      }).toThrow(`\'haPairs\' must be an integer between 1 and 12, got ${haPairs}`);
+    });
+
+    test.each([OntapDeploymentType.MULTI_AZ_2, OntapDeploymentType.MULTI_AZ_1, OntapDeploymentType.SINGLE_AZ_1])(
+      'throw error for specification of multiple HA pairs except for SINGLE_AZ_1 deployment type %s',
+      deploymentType => {
+        const multiAzConfig = {
+          preferredSubnet: vpc.privateSubnets[0],
+          endpointIpAddressRange: '192.168.12.0/24',
+        };
+
+        ontapConfiguration = {
+          deploymentType,
+          haPairs: 2,
+        };
+
+        if ([OntapDeploymentType.MULTI_AZ_1, OntapDeploymentType.MULTI_AZ_2].includes(deploymentType)) {
+          ontapConfiguration = {
+            ...ontapConfiguration,
+            ...multiAzConfig,
+          };
+        }
+
+        expect(() => {
+          new OntapFileSystem(stack, 'FsxFileSystem', {
+            ontapConfiguration,
+            storageCapacityGiB: 1200,
+            vpc,
+            vpcSubnets: vpc.privateSubnets,
+          });
+        }).toThrow(`\'haPairs\' must be 1 for deployment type ${deploymentType}`);
+      },
+    );
+  });
+
+  describe('Automatic backup retention', () => {
+    test('disable automatic backup retention', () => {
+      ontapConfiguration = {
+        deploymentType: OntapDeploymentType.SINGLE_AZ_2,
+        automaticBackupRetention: Duration.days(0),
+      };
+
+      new OntapFileSystem(stack, 'FsxFileSystem', {
+        ontapConfiguration,
+        storageCapacityGiB: 1200,
+        vpc,
+        vpcSubnets: vpc.privateSubnets,
+      });
+
+      Template.fromStack(stack).hasResourceProperties('AWS::FSx::FileSystem', {
+        OntapConfiguration: {
+          DeploymentType: 'SINGLE_AZ_2',
+          AutomaticBackupRetentionDays: 0,
+        },
+      });
+    });
+
+    test.each([Duration.millis(1), Duration.minutes(1), Duration.hours(23)])(
+      'throw error for invalid automatic backup retention days %s',
+      duration => {
+        ontapConfiguration = {
+          deploymentType: OntapDeploymentType.SINGLE_AZ_2,
+          automaticBackupRetention: duration,
+        };
+
+        expect(() => {
+          new OntapFileSystem(stack, 'FsxFileSystem', {
+            ontapConfiguration,
+            storageCapacityGiB: 1200,
+            vpc,
+            vpcSubnets: vpc.privateSubnets,
+          });
+        }).toThrow('automaticBackupRetention must be between 1 and 90 days or 0 for disabled');
+      },
+    );
+
+    test('throw error for longer automatic backup retention days', () => {
+      ontapConfiguration = {
+        deploymentType: OntapDeploymentType.SINGLE_AZ_2,
+        automaticBackupRetention: Duration.days(91),
+      };
+
+      expect(() => {
+        new OntapFileSystem(stack, 'FsxFileSystem', {
+          ontapConfiguration,
+          storageCapacityGiB: 1200,
+          vpc,
+          vpcSubnets: vpc.privateSubnets,
+        });
+      }).toThrow('automaticBackupRetention must be between 1 and 90 days or 0 for disabled. got: 91 days');
+    });
+  });
+
+  test('throw error for spcifying `dailyAutomaticBackupStartTime` when automatic backup is disabled', () => {
+    ontapConfiguration = {
+      deploymentType: OntapDeploymentType.SINGLE_AZ_2,
+      dailyAutomaticBackupStartTime: new DailyAutomaticBackupStartTime({
+        hour: 1,
+        minute: 0,
+      }),
+      automaticBackupRetention: Duration.days(0),
+    };
+
+    expect(() => {
+      new OntapFileSystem(stack, 'FsxFileSystem', {
+        ontapConfiguration,
+        storageCapacityGiB: 1200,
+        vpc,
+        vpcSubnets: vpc.privateSubnets,
+      });
+    }).toThrow(
+      "'automaticBackupRetention' period must be set a non-zero day when 'dailyAutomaticBackupStartTime' is set",
+    );
+  });
+
+  test.each([
+    {
+      deploymentType: OntapDeploymentType.SINGLE_AZ_2,
+      diskIops: 0,
+      haPairs: 2,
+    },
+    {
+      deploymentType: OntapDeploymentType.SINGLE_AZ_2,
+      diskIops: 7199,
+      haPairs: 2,
+    },
+    {
+      deploymentType: OntapDeploymentType.SINGLE_AZ_2,
+      diskIops: 7200.1,
+      haPairs: 2,
+    },
+    {
+      deploymentType: OntapDeploymentType.SINGLE_AZ_2,
+      diskIops: 400_001,
+      haPairs: 2,
+    },
+    {
+      deploymentType: OntapDeploymentType.MULTI_AZ_2,
+      diskIops: 0,
+    },
+    {
+      deploymentType: OntapDeploymentType.MULTI_AZ_2,
+      diskIops: 3599,
+    },
+    {
+      deploymentType: OntapDeploymentType.MULTI_AZ_2,
+      diskIops: 200_001,
+    },
+  ])('throw error for invalid disk IOPS configuration %s', config => {
+    ontapConfiguration = {
+      deploymentType: config.deploymentType,
+      diskIops: config.diskIops,
+      haPairs: config.haPairs,
+    };
+
+    const storageCapacityGiB = 1200;
+    const haPairs = config.haPairs ?? 1;
+
+    const minDiskIops = storageCapacityGiB * 3 * haPairs;
+    const maxDiskIops = 200_000 * haPairs;
+
+    expect(() => {
+      new OntapFileSystem(stack, 'FsxFileSystem', {
+        ontapConfiguration,
+        storageCapacityGiB,
+        vpc,
+        vpcSubnets: vpc.privateSubnets,
+      });
+    }).toThrow(`\'diskIops\' must be an integer between ${minDiskIops} and ${maxDiskIops}, got ${config.diskIops}`);
+  });
+
+  describe('endpoint IP address range', () => {
+    test.each([OntapDeploymentType.SINGLE_AZ_2, OntapDeploymentType.SINGLE_AZ_1])(
+      'throw error for specifying endpointIpAddressRange for %s file system',
+      deploymentType => {
+        ontapConfiguration = {
+          deploymentType: deploymentType,
+          endpointIpAddressRange: '192.168.1.0/24',
+        };
+
+        expect(() => {
+          new OntapFileSystem(stack, 'FsxFileSystem', {
+            ontapConfiguration,
+            storageCapacityGiB: 1200,
+            vpc,
+            vpcSubnets: vpc.privateSubnets,
+          });
+        }).toThrow("'endpointIpAddressRange' can only be specified for multi-AZ file systems");
+      },
+    );
+
+    test.each([
+      '',
+      'a'.repeat(8),
+      'a'.repeat(18),
+      '192.168.0.1\u0000',
+      '10.0.0.1\u0085',
+      '172.16.0.1\u2028',
+      '172.16.0.1\u2029',
+      '172.16.0.1\r',
+      '172.16.0.1\n',
+    ])("throw error for invalid endpoint IP address range '%s'", ipAddressRange => {
+      ontapConfiguration = {
+        deploymentType: OntapDeploymentType.MULTI_AZ_2,
+        endpointIpAddressRange: ipAddressRange,
+        preferredSubnet: vpc.privateSubnets[0],
+      };
+
+      expect(() => {
+        new OntapFileSystem(stack, 'FsxFileSystem', {
+          ontapConfiguration,
+          storageCapacityGiB: 1200,
+          vpc,
+          vpcSubnets: vpc.privateSubnets,
+        });
+      }).toThrow(
+        "'endpointIpAddressRange' must be between 9 and 17 characters long and not contain any of the following characters: \\u0000, \\u0085, \\u2028, \\u2029, \\r, or \\n",
+      );
+    });
+  });
+
+  describe('subnet settings', () => {
+    test.each([OntapDeploymentType.SINGLE_AZ_2, OntapDeploymentType.SINGLE_AZ_1])(
+      'throw error for specifying preferred subnet for %s file system',
+      deploymentType => {
+        ontapConfiguration = {
+          deploymentType,
+          preferredSubnet: vpc.privateSubnets[0],
+        };
+
+        expect(() => {
+          new OntapFileSystem(stack, 'FsxFileSystem', {
+            ontapConfiguration,
+            storageCapacityGiB: 1200,
+            vpc,
+            vpcSubnets: vpc.privateSubnets,
+          });
+        }).toThrow("'preferredSubnet' can only be specified for multi-AZ file systems");
+      },
+    );
+
+    test.each([OntapDeploymentType.MULTI_AZ_2, OntapDeploymentType.MULTI_AZ_1])(
+      'throw error for not specifying preferred subnet for %s file systems',
+      deploymentType => {
+        ontapConfiguration = {
+          deploymentType,
+        };
+
+        expect(() => {
+          new OntapFileSystem(stack, 'FsxFileSystem', {
+            ontapConfiguration,
+            storageCapacityGiB: 1200,
+            vpc,
+            vpcSubnets: vpc.privateSubnets,
+          });
+        }).toThrow("'preferredSubnet' must be specified for multi-AZ file systems");
+      },
+    );
+
+    test('throw error for specifying preferred subnet that is not in the VPC subnets', () => {
+      ontapConfiguration = {
+        deploymentType: OntapDeploymentType.MULTI_AZ_2,
+        preferredSubnet: vpc.publicSubnets[0],
+        endpointIpAddressRange: '192.168.39.0/24',
+      };
+
+      expect(() => {
+        new OntapFileSystem(stack, 'FsxFileSystem', {
+          ontapConfiguration,
+          storageCapacityGiB: 1200,
+          vpc,
+          vpcSubnets: vpc.privateSubnets,
+        });
+      }).toThrow("'preferredSubnet' must be one of the specified 'vpcSubnets'");
+    });
+  });
+
+  test.each([OntapDeploymentType.SINGLE_AZ_2, OntapDeploymentType.SINGLE_AZ_1])(
+    'throw error for specifying route tables for %s file system',
+    deploymentType => {
+      ontapConfiguration = {
+        deploymentType,
+        routeTables: vpc.privateSubnets.map(subnet => subnet.routeTable),
+      };
+
+      expect(() => {
+        new OntapFileSystem(stack, 'FsxFileSystem', {
+          ontapConfiguration,
+          storageCapacityGiB: 1200,
+          vpc,
+          vpcSubnets: vpc.privateSubnets,
+        });
+      }).toThrow("'routeTables' can only be specified for multi-AZ file systems");
+    },
+  );
+
+  test.each([
+    {
+      storageCapacityGiB: 1023,
+      haPairs: 1,
+    },
+    {
+      storageCapacityGiB: 524_289,
+      haPairs: 1,
+    },
+    {
+      storageCapacityGiB: 1200.1,
+      haPairs: 1,
+    },
+    {
+      storageCapacityGiB: 5119,
+      haPairs: 5,
+    },
+    {
+      storageCapacityGiB: 1_048_577,
+      haPairs: 5,
+    },
+  ])('throw error for invalid storage capacity %s', config => {
+    ontapConfiguration = {
+      deploymentType: OntapDeploymentType.SINGLE_AZ_2,
+      haPairs: config.haPairs,
+    };
+
+    expect(() => {
+      new OntapFileSystem(stack, 'FsxFileSystem', {
+        ontapConfiguration,
+        storageCapacityGiB: config.storageCapacityGiB,
+        vpc,
+        vpcSubnets: vpc.privateSubnets,
+      });
+    }).toThrow(
+      `storageCapacityGiB must be an integer between ${1024 * config.haPairs} and ${Math.min(1_048_576, 524_288 * config.haPairs)}, got ${config.storageCapacityGiB}`,
+    );
+  });
+
+  describe('throughput capacity', () => {
+    const validValues: { [key in OntapDeploymentType]: ThroughputCapacityPerHaPair[] } = {
+      SINGLE_AZ_1: [
+        SingleAz1ThroughputCapacityPerHaPair.MB_PER_SEC_128,
+        SingleAz1ThroughputCapacityPerHaPair.MB_PER_SEC_256,
+        SingleAz1ThroughputCapacityPerHaPair.MB_PER_SEC_512,
+        SingleAz1ThroughputCapacityPerHaPair.MB_PER_SEC_1024,
+        SingleAz1ThroughputCapacityPerHaPair.MB_PER_SEC_2048,
+        SingleAz1ThroughputCapacityPerHaPair.MB_PER_SEC_4096,
+      ],
+      MULTI_AZ_1: [
+        MultiAz1ThroughputCapacityPerHaPair.MB_PER_SEC_128,
+        MultiAz1ThroughputCapacityPerHaPair.MB_PER_SEC_256,
+        MultiAz1ThroughputCapacityPerHaPair.MB_PER_SEC_512,
+        MultiAz1ThroughputCapacityPerHaPair.MB_PER_SEC_1024,
+        MultiAz1ThroughputCapacityPerHaPair.MB_PER_SEC_2048,
+        MultiAz1ThroughputCapacityPerHaPair.MB_PER_SEC_4096,
+      ],
+      SINGLE_AZ_2: [
+        SingleAz2ThroughputCapacityPerHaPair.MB_PER_SEC_1536,
+        SingleAz2ThroughputCapacityPerHaPair.MB_PER_SEC_3072,
+        SingleAz2ThroughputCapacityPerHaPair.MB_PER_SEC_6144,
+      ],
+      MULTI_AZ_2: [
+        MultiAz2ThroughputCapacityPerHaPair.MB_PER_SEC_384,
+        MultiAz2ThroughputCapacityPerHaPair.MB_PER_SEC_768,
+        MultiAz2ThroughputCapacityPerHaPair.MB_PER_SEC_1536,
+        MultiAz2ThroughputCapacityPerHaPair.MB_PER_SEC_3072,
+        MultiAz2ThroughputCapacityPerHaPair.MB_PER_SEC_6144,
+      ],
+    };
+
+    const testCases = Object.entries(validValues).flatMap(([deploymentType, throughputs]) =>
+      throughputs.map(throughput => ({ deploymentType: deploymentType as OntapDeploymentType, throughput })),
+    );
+
+    test.each(testCases)('valid throughput capacity per HA pair for %s', config => {
+      ontapConfiguration = {
+        deploymentType: config.deploymentType,
+        throughputCapacityPerHaPair: config.throughput,
+        haPairs: 1,
+      };
+
+      if (
+        config.deploymentType === OntapDeploymentType.MULTI_AZ_2 ||
+        config.deploymentType === OntapDeploymentType.MULTI_AZ_1
+      ) {
+        ontapConfiguration = {
+          ...ontapConfiguration,
+          preferredSubnet: vpc.privateSubnets[0],
+          endpointIpAddressRange: '192.168.12.0/24',
+        };
+      }
+
+      new OntapFileSystem(stack, 'FsxFileSystem', {
+        ontapConfiguration,
+        storageCapacityGiB: 1200,
+        vpc,
+        vpcSubnets: vpc.privateSubnets,
+      });
+
+      Template.fromStack(stack).hasResourceProperties('AWS::FSx::FileSystem', {
+        OntapConfiguration: {
+          DeploymentType: config.deploymentType,
+          ThroughputCapacityPerHAPair: config.throughput.capacity,
+          HAPairs: 1,
+        },
+      });
+    });
+
+    test.each([
+      {
+        deploymentType: OntapDeploymentType.SINGLE_AZ_1,
+        throughput: SingleAz2ThroughputCapacityPerHaPair.MB_PER_SEC_1536,
+      },
+      {
+        deploymentType: OntapDeploymentType.SINGLE_AZ_2,
+        throughput: SingleAz1ThroughputCapacityPerHaPair.MB_PER_SEC_128,
+      },
+      {
+        deploymentType: OntapDeploymentType.MULTI_AZ_1,
+        throughput: MultiAz2ThroughputCapacityPerHaPair.MB_PER_SEC_6144,
+      },
+      {
+        deploymentType: OntapDeploymentType.MULTI_AZ_2,
+        throughput: MultiAz1ThroughputCapacityPerHaPair.MB_PER_SEC_128,
+      },
+    ])('throw error for specifying different deployment type for throuput capacity %s', config => {
+      ontapConfiguration = {
+        deploymentType: config.deploymentType,
+        throughputCapacityPerHaPair: config.throughput,
+        haPairs: 1,
+      };
+
+      if ([OntapDeploymentType.MULTI_AZ_1, OntapDeploymentType.MULTI_AZ_2].includes(config.deploymentType)) {
+        ontapConfiguration = {
+          ...ontapConfiguration,
+          preferredSubnet: vpc.privateSubnets[0],
+          endpointIpAddressRange: '192.168.39.0/24',
+        };
+      }
+
+      expect(() => {
+        new OntapFileSystem(stack, 'FsxFileSystem', {
+          ontapConfiguration,
+          storageCapacityGiB: 1200,
+          vpc,
+          vpcSubnets: vpc.privateSubnets,
+        });
+      }).toThrow(
+        `'throughputCapacityPerHaPair' must be compatible with the deployment type, deployment type: ${config.deploymentType}, deployment type from throughput capacity: ${config.throughput.deploymentType}`,
+      );
+    });
+  });
+});