From f48220fd9dfc3532bc887d008897630b75df5d53 Mon Sep 17 00:00:00 2001 From: Matsuda Date: Fri, 11 Oct 2024 04:04:41 +0900 Subject: [PATCH 1/5] chore(glue): support ConnectionType.MARKETPLACE and ConnectionType.CUSTOM (#30395) ### Issue # (if applicable) N/A ### Reason for this change `MARKETPLACE` and `CUSTOM` are not supported in the current L2 Construct. (`SFTP` is also missing, but it is not supported at the moment.) https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-connection-connectioninput.html#cfn-glue-connection-connectioninput-connectiontype ### Description of changes Add missing connection types. ### Description of how you validated changes I determined that no testing was needed since this was only an addition of connection types. ### Checklist - [x] My code adheres to the [CONTRIBUTING GUIDE](https://github.com/aws/aws-cdk/blob/main/CONTRIBUTING.md) and [DESIGN GUIDELINES](https://github.com/aws/aws-cdk/blob/main/docs/DESIGN_GUIDELINES.md) ---- *By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license* --- packages/@aws-cdk/aws-glue-alpha/lib/connection.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/packages/@aws-cdk/aws-glue-alpha/lib/connection.ts b/packages/@aws-cdk/aws-glue-alpha/lib/connection.ts index 3d8b4738f3d57..e999eb58d11e5 100644 --- a/packages/@aws-cdk/aws-glue-alpha/lib/connection.ts +++ b/packages/@aws-cdk/aws-glue-alpha/lib/connection.ts @@ -8,6 +8,8 @@ import { CfnConnection } from 'aws-cdk-lib/aws-glue'; * * If you need to use a connection type that doesn't exist as a static member, you * can instantiate a `ConnectionType` object, e.g: `new ConnectionType('NEW_TYPE')`. + * + * @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-connection-connectioninput.html#cfn-glue-connection-connectioninput-connectiontype */ export class ConnectionType { @@ -31,6 +33,18 @@ export class ConnectionType { */ public static readonly NETWORK = new ConnectionType('NETWORK'); + /** + * Uses configuration settings contained in a connector purchased from AWS Marketplace + * to read from and write to data stores that are not natively supported by AWS Glue. + */ + public static readonly MARKETPLACE = new ConnectionType('MARKETPLACE'); + + /** + * Uses configuration settings contained in a custom connector to read from and write to data stores + * that are not natively supported by AWS Glue. + */ + public static readonly CUSTOM = new ConnectionType('CUSTOM'); + /** * The name of this ConnectionType, as expected by Connection resource. */ From 048975e75e718eb980cf33eb47bea04be095c585 Mon Sep 17 00:00:00 2001 From: Shailja Khurana <117320115+khushail@users.noreply.github.com> Date: Thu, 10 Oct 2024 13:29:16 -0700 Subject: [PATCH 2/5] docs(codebuild): updated Linux build image return type in doc (#31718) ### Issue # (if applicable) Closes #31717 ### Reason for this change It should be in sync with the description as mentioned in here https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_codebuild.LinuxArmBuildImage.html ### Checklist - [x] My code adheres to the [CONTRIBUTING GUIDE](https://github.com/aws/aws-cdk/blob/main/CONTRIBUTING.md) and [DESIGN GUIDELINES](https://github.com/aws/aws-cdk/blob/main/docs/DESIGN_GUIDELINES.md) ---- *By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license* --- packages/aws-cdk-lib/aws-codebuild/lib/linux-arm-build-image.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/aws-cdk-lib/aws-codebuild/lib/linux-arm-build-image.ts b/packages/aws-cdk-lib/aws-codebuild/lib/linux-arm-build-image.ts index 7d6e507d152e2..def27d5c28e28 100644 --- a/packages/aws-cdk-lib/aws-codebuild/lib/linux-arm-build-image.ts +++ b/packages/aws-cdk-lib/aws-codebuild/lib/linux-arm-build-image.ts @@ -42,7 +42,7 @@ export class LinuxArmBuildImage implements IBuildImage { public static readonly AMAZON_LINUX_2_STANDARD_3_0 = LinuxArmBuildImage.fromCodeBuildImageId('aws/codebuild/amazonlinux2-aarch64-standard:3.0'); /** - * @returns a x86-64 Linux build image from a Docker Hub image. + * @returns a aarch-64 Linux build image from a Docker Hub image. */ public static fromDockerRegistry(name: string, options: DockerImageOptions = {}): IBuildImage { return new LinuxArmBuildImage({ From 2d9aefbb6c2c5323d3d2d17e5961fb2300c25fa3 Mon Sep 17 00:00:00 2001 From: Kazuho Cryer-Shinozuka Date: Fri, 11 Oct 2024 08:24:57 +0900 Subject: [PATCH 3/5] feat(fsx): support HDD storage type for a Lustre file systems (#30207) ### Issue # (if applicable) Closes #30206. ### Reason for this change AWS FSx for Luster file systems supports HDD storage type and LusterFileSystem construct cannot configure it. ### Description of changes - Add `storageType` for `fsx.FileStstemProps` - For future expansion, `storageType` is added not to `LusterFileSystemProps` but to `FileSystemProps` because HDD storage is also supported by Windows file systems. - Update the validation of the props below to address the HDD storage type. - `LusterConfiguration.perUnitStorageThroughput` - `FileSystemProps.storageCapacityGiB` ### Description of how you validated changes Added both unit and integ tests. ### Checklist - [x] My code adheres to the [CONTRIBUTING GUIDE](https://github.com/aws/aws-cdk/blob/main/CONTRIBUTING.md) and [DESIGN GUIDELINES](https://github.com/aws/aws-cdk/blob/main/docs/DESIGN_GUIDELINES.md) ---- *By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license* --- .../FsxLustreStorageTypeStack.assets.json | 19 + .../FsxLustreStorageTypeStack.template.json | 801 ++++++++++ ...efaultTestDeployAssert50B0FE3D.assets.json | 19 + ...aultTestDeployAssert50B0FE3D.template.json | 36 + .../cdk.out | 1 + .../integ.json | 12 + .../manifest.json | 347 +++++ .../tree.json | 1362 +++++++++++++++++ .../integ.lustre-file-system-storage-type.ts | 73 + packages/aws-cdk-lib/aws-fsx/README.md | 37 +- .../aws-cdk-lib/aws-fsx/lib/file-system.ts | 27 +- .../aws-fsx/lib/lustre-file-system.ts | 118 +- .../aws-fsx/test/lustre-file-system.test.ts | 205 ++- 13 files changed, 3034 insertions(+), 23 deletions(-) create mode 100644 packages/@aws-cdk-testing/framework-integ/test/aws-fsx/test/integ.lustre-file-system-storage-type.js.snapshot/FsxLustreStorageTypeStack.assets.json create mode 100644 packages/@aws-cdk-testing/framework-integ/test/aws-fsx/test/integ.lustre-file-system-storage-type.js.snapshot/FsxLustreStorageTypeStack.template.json create mode 100644 packages/@aws-cdk-testing/framework-integ/test/aws-fsx/test/integ.lustre-file-system-storage-type.js.snapshot/FsxLustreStorageTypeTestDefaultTestDeployAssert50B0FE3D.assets.json create mode 100644 packages/@aws-cdk-testing/framework-integ/test/aws-fsx/test/integ.lustre-file-system-storage-type.js.snapshot/FsxLustreStorageTypeTestDefaultTestDeployAssert50B0FE3D.template.json create mode 100644 packages/@aws-cdk-testing/framework-integ/test/aws-fsx/test/integ.lustre-file-system-storage-type.js.snapshot/cdk.out create mode 100644 packages/@aws-cdk-testing/framework-integ/test/aws-fsx/test/integ.lustre-file-system-storage-type.js.snapshot/integ.json create mode 100644 packages/@aws-cdk-testing/framework-integ/test/aws-fsx/test/integ.lustre-file-system-storage-type.js.snapshot/manifest.json create mode 100644 packages/@aws-cdk-testing/framework-integ/test/aws-fsx/test/integ.lustre-file-system-storage-type.js.snapshot/tree.json create mode 100644 packages/@aws-cdk-testing/framework-integ/test/aws-fsx/test/integ.lustre-file-system-storage-type.ts diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-fsx/test/integ.lustre-file-system-storage-type.js.snapshot/FsxLustreStorageTypeStack.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-fsx/test/integ.lustre-file-system-storage-type.js.snapshot/FsxLustreStorageTypeStack.assets.json new file mode 100644 index 0000000000000..09a12e886531d --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-fsx/test/integ.lustre-file-system-storage-type.js.snapshot/FsxLustreStorageTypeStack.assets.json @@ -0,0 +1,19 @@ +{ + "version": "36.0.0", + "files": { + "b70afe3fccbab7f6f454145285c729eb91a7254c797c5156812a783b8f6cefd9": { + "source": { + "path": "FsxLustreStorageTypeStack.template.json", + "packaging": "file" + }, + "destinations": { + "current_account-current_region": { + "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", + "objectKey": "b70afe3fccbab7f6f454145285c729eb91a7254c797c5156812a783b8f6cefd9.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/packages/@aws-cdk-testing/framework-integ/test/aws-fsx/test/integ.lustre-file-system-storage-type.js.snapshot/FsxLustreStorageTypeStack.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-fsx/test/integ.lustre-file-system-storage-type.js.snapshot/FsxLustreStorageTypeStack.template.json new file mode 100644 index 0000000000000..5e83a4b07e5f2 --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-fsx/test/integ.lustre-file-system-storage-type.js.snapshot/FsxLustreStorageTypeStack.template.json @@ -0,0 +1,801 @@ +{ + "Resources": { + "Vpc8378EB38": { + "Type": "AWS::EC2::VPC", + "Properties": { + "CidrBlock": "10.0.0.0/16", + "EnableDnsHostnames": true, + "EnableDnsSupport": true, + "InstanceTenancy": "default", + "Tags": [ + { + "Key": "Name", + "Value": "FsxLustreStorageTypeStack/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": "FsxLustreStorageTypeStack/Vpc/PublicSubnet1" + } + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } + } + }, + "VpcPublicSubnet1RouteTable6C95E38E": { + "Type": "AWS::EC2::RouteTable", + "Properties": { + "Tags": [ + { + "Key": "Name", + "Value": "FsxLustreStorageTypeStack/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": "FsxLustreStorageTypeStack/Vpc/PublicSubnet1" + } + ] + } + }, + "VpcPublicSubnet1NATGateway4D7517AA": { + "Type": "AWS::EC2::NatGateway", + "Properties": { + "AllocationId": { + "Fn::GetAtt": [ + "VpcPublicSubnet1EIPD7E02669", + "AllocationId" + ] + }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, + "Tags": [ + { + "Key": "Name", + "Value": "FsxLustreStorageTypeStack/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": "FsxLustreStorageTypeStack/Vpc/PublicSubnet2" + } + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } + } + }, + "VpcPublicSubnet2RouteTable94F7E489": { + "Type": "AWS::EC2::RouteTable", + "Properties": { + "Tags": [ + { + "Key": "Name", + "Value": "FsxLustreStorageTypeStack/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": "FsxLustreStorageTypeStack/Vpc/PublicSubnet2" + } + ] + } + }, + "VpcPublicSubnet2NATGateway9182C01D": { + "Type": "AWS::EC2::NatGateway", + "Properties": { + "AllocationId": { + "Fn::GetAtt": [ + "VpcPublicSubnet2EIP3C605A87", + "AllocationId" + ] + }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, + "Tags": [ + { + "Key": "Name", + "Value": "FsxLustreStorageTypeStack/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": "FsxLustreStorageTypeStack/Vpc/PrivateSubnet1" + } + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } + } + }, + "VpcPrivateSubnet1RouteTableB2C5B500": { + "Type": "AWS::EC2::RouteTable", + "Properties": { + "Tags": [ + { + "Key": "Name", + "Value": "FsxLustreStorageTypeStack/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": "FsxLustreStorageTypeStack/Vpc/PrivateSubnet2" + } + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } + } + }, + "VpcPrivateSubnet2RouteTableA678073B": { + "Type": "AWS::EC2::RouteTable", + "Properties": { + "Tags": [ + { + "Key": "Name", + "Value": "FsxLustreStorageTypeStack/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": "FsxLustreStorageTypeStack/Vpc" + } + ] + } + }, + "VpcVPCGWBF912B6E": { + "Type": "AWS::EC2::VPCGatewayAttachment", + "Properties": { + "InternetGatewayId": { + "Ref": "VpcIGWD7BA715C" + }, + "VpcId": { + "Ref": "Vpc8378EB38" + } + } + }, + "FsxLustreFileSystemSsdStorageFsxLustreSecurityGroup14F696B3": { + "Type": "AWS::EC2::SecurityGroup", + "Properties": { + "GroupDescription": "FsxLustreStorageTypeStack/FsxLustreFileSystemSsdStorage/FsxLustreSecurityGroup", + "SecurityGroupEgress": [ + { + "CidrIp": "0.0.0.0/0", + "Description": "Allow all outbound traffic by default", + "IpProtocol": "-1" + } + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } + } + }, + "FsxLustreFileSystemSsdStorageFsxLustreSecurityGroupfromFsxLustreStorageTypeStackFsxLustreFileSystemSsdStorageFsxLustreSecurityGroup900D4B37988102342FA56B2": { + "Type": "AWS::EC2::SecurityGroupIngress", + "Properties": { + "Description": "from FsxLustreStorageTypeStackFsxLustreFileSystemSsdStorageFsxLustreSecurityGroup900D4B37:988-1023", + "FromPort": 988, + "GroupId": { + "Fn::GetAtt": [ + "FsxLustreFileSystemSsdStorageFsxLustreSecurityGroup14F696B3", + "GroupId" + ] + }, + "IpProtocol": "tcp", + "SourceSecurityGroupId": { + "Fn::GetAtt": [ + "FsxLustreFileSystemSsdStorageFsxLustreSecurityGroup14F696B3", + "GroupId" + ] + }, + "ToPort": 1023 + } + }, + "FsxLustreFileSystemSsdStorageFsxLustreSecurityGroupfromFsxLustreStorageTypeStackSsdFsxInstanceInstanceSecurityGroupAC704ACF988102380D6A84E": { + "Type": "AWS::EC2::SecurityGroupIngress", + "Properties": { + "Description": "from FsxLustreStorageTypeStackSsdFsxInstanceInstanceSecurityGroupAC704ACF:988-1023", + "FromPort": 988, + "GroupId": { + "Fn::GetAtt": [ + "FsxLustreFileSystemSsdStorageFsxLustreSecurityGroup14F696B3", + "GroupId" + ] + }, + "IpProtocol": "tcp", + "SourceSecurityGroupId": { + "Fn::GetAtt": [ + "SsdFsxInstanceInstanceSecurityGroup6C5726B9", + "GroupId" + ] + }, + "ToPort": 1023 + } + }, + "FsxLustreFileSystemSsdStorage70256D99": { + "Type": "AWS::FSx::FileSystem", + "Properties": { + "FileSystemType": "LUSTRE", + "LustreConfiguration": { + "DataCompressionType": "LZ4", + "DeploymentType": "SCRATCH_2" + }, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "FsxLustreFileSystemSsdStorageFsxLustreSecurityGroup14F696B3", + "GroupId" + ] + } + ], + "StorageCapacity": 1200, + "StorageType": "SSD", + "SubnetIds": [ + { + "Ref": "VpcPrivateSubnet1Subnet536B997A" + } + ] + }, + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "SsdFsxInstanceInstanceSecurityGroup6C5726B9": { + "Type": "AWS::EC2::SecurityGroup", + "Properties": { + "GroupDescription": "FsxLustreStorageTypeStack/SsdFsxInstance/InstanceSecurityGroup", + "SecurityGroupEgress": [ + { + "CidrIp": "0.0.0.0/0", + "Description": "Allow all outbound traffic by default", + "IpProtocol": "-1" + } + ], + "Tags": [ + { + "Key": "Name", + "Value": "FsxLustreStorageTypeStack/SsdFsxInstance" + } + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } + } + }, + "SsdFsxInstanceInstanceRole933EE1D6": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "ec2.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Tags": [ + { + "Key": "Name", + "Value": "FsxLustreStorageTypeStack/SsdFsxInstance" + } + ] + } + }, + "SsdFsxInstanceInstanceProfile0AD53366": { + "Type": "AWS::IAM::InstanceProfile", + "Properties": { + "Roles": [ + { + "Ref": "SsdFsxInstanceInstanceRole933EE1D6" + } + ] + } + }, + "SsdFsxInstance09AA8DE7": { + "Type": "AWS::EC2::Instance", + "Properties": { + "AvailabilityZone": { + "Fn::Select": [ + 0, + { + "Fn::GetAZs": "" + } + ] + }, + "IamInstanceProfile": { + "Ref": "SsdFsxInstanceInstanceProfile0AD53366" + }, + "ImageId": { + "Ref": "SsmParameterValueawsserviceamiamazonlinuxlatestal2023amikernel61x8664C96584B6F00A464EAD1953AFF4B05118Parameter" + }, + "InstanceType": "t2.large", + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "SsdFsxInstanceInstanceSecurityGroup6C5726B9", + "GroupId" + ] + } + ], + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, + "Tags": [ + { + "Key": "Name", + "Value": "FsxLustreStorageTypeStack/SsdFsxInstance" + } + ], + "UserData": { + "Fn::Base64": "#!/bin/bash" + } + }, + "DependsOn": [ + "SsdFsxInstanceInstanceRole933EE1D6" + ] + }, + "FsxLustreFileSystemHddStorageFsxLustreSecurityGroupCB529CFC": { + "Type": "AWS::EC2::SecurityGroup", + "Properties": { + "GroupDescription": "FsxLustreStorageTypeStack/FsxLustreFileSystemHddStorage/FsxLustreSecurityGroup", + "SecurityGroupEgress": [ + { + "CidrIp": "0.0.0.0/0", + "Description": "Allow all outbound traffic by default", + "IpProtocol": "-1" + } + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } + } + }, + "FsxLustreFileSystemHddStorageFsxLustreSecurityGroupfromFsxLustreStorageTypeStackFsxLustreFileSystemHddStorageFsxLustreSecurityGroup36EAA88E9881023C048CB34": { + "Type": "AWS::EC2::SecurityGroupIngress", + "Properties": { + "Description": "from FsxLustreStorageTypeStackFsxLustreFileSystemHddStorageFsxLustreSecurityGroup36EAA88E:988-1023", + "FromPort": 988, + "GroupId": { + "Fn::GetAtt": [ + "FsxLustreFileSystemHddStorageFsxLustreSecurityGroupCB529CFC", + "GroupId" + ] + }, + "IpProtocol": "tcp", + "SourceSecurityGroupId": { + "Fn::GetAtt": [ + "FsxLustreFileSystemHddStorageFsxLustreSecurityGroupCB529CFC", + "GroupId" + ] + }, + "ToPort": 1023 + } + }, + "FsxLustreFileSystemHddStorageFsxLustreSecurityGroupfromFsxLustreStorageTypeStackHddFsxInstanceInstanceSecurityGroup83E545BE98810231EFC35B6": { + "Type": "AWS::EC2::SecurityGroupIngress", + "Properties": { + "Description": "from FsxLustreStorageTypeStackHddFsxInstanceInstanceSecurityGroup83E545BE:988-1023", + "FromPort": 988, + "GroupId": { + "Fn::GetAtt": [ + "FsxLustreFileSystemHddStorageFsxLustreSecurityGroupCB529CFC", + "GroupId" + ] + }, + "IpProtocol": "tcp", + "SourceSecurityGroupId": { + "Fn::GetAtt": [ + "HddFsxInstanceInstanceSecurityGroupFF15A567", + "GroupId" + ] + }, + "ToPort": 1023 + } + }, + "FsxLustreFileSystemHddStorage85B422B8": { + "Type": "AWS::FSx::FileSystem", + "Properties": { + "FileSystemType": "LUSTRE", + "LustreConfiguration": { + "DataCompressionType": "LZ4", + "DeploymentType": "PERSISTENT_1", + "DriveCacheType": "READ", + "PerUnitStorageThroughput": 12 + }, + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "FsxLustreFileSystemHddStorageFsxLustreSecurityGroupCB529CFC", + "GroupId" + ] + } + ], + "StorageCapacity": 6000, + "StorageType": "HDD", + "SubnetIds": [ + { + "Ref": "VpcPrivateSubnet2Subnet3788AAA1" + } + ] + }, + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "HddFsxInstanceInstanceSecurityGroupFF15A567": { + "Type": "AWS::EC2::SecurityGroup", + "Properties": { + "GroupDescription": "FsxLustreStorageTypeStack/HddFsxInstance/InstanceSecurityGroup", + "SecurityGroupEgress": [ + { + "CidrIp": "0.0.0.0/0", + "Description": "Allow all outbound traffic by default", + "IpProtocol": "-1" + } + ], + "Tags": [ + { + "Key": "Name", + "Value": "FsxLustreStorageTypeStack/HddFsxInstance" + } + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } + } + }, + "HddFsxInstanceInstanceRole7B336CC9": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "ec2.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "Tags": [ + { + "Key": "Name", + "Value": "FsxLustreStorageTypeStack/HddFsxInstance" + } + ] + } + }, + "HddFsxInstanceInstanceProfile0833AA40": { + "Type": "AWS::IAM::InstanceProfile", + "Properties": { + "Roles": [ + { + "Ref": "HddFsxInstanceInstanceRole7B336CC9" + } + ] + } + }, + "HddFsxInstance019A1F6D": { + "Type": "AWS::EC2::Instance", + "Properties": { + "AvailabilityZone": { + "Fn::Select": [ + 0, + { + "Fn::GetAZs": "" + } + ] + }, + "IamInstanceProfile": { + "Ref": "HddFsxInstanceInstanceProfile0833AA40" + }, + "ImageId": { + "Ref": "SsmParameterValueawsserviceamiamazonlinuxlatestal2023amikernel61x8664C96584B6F00A464EAD1953AFF4B05118Parameter" + }, + "InstanceType": "t2.large", + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "HddFsxInstanceInstanceSecurityGroupFF15A567", + "GroupId" + ] + } + ], + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, + "Tags": [ + { + "Key": "Name", + "Value": "FsxLustreStorageTypeStack/HddFsxInstance" + } + ], + "UserData": { + "Fn::Base64": "#!/bin/bash" + } + }, + "DependsOn": [ + "HddFsxInstanceInstanceRole7B336CC9" + ] + } + }, + "Parameters": { + "SsmParameterValueawsserviceamiamazonlinuxlatestal2023amikernel61x8664C96584B6F00A464EAD1953AFF4B05118Parameter": { + "Type": "AWS::SSM::Parameter::Value", + "Default": "/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64" + }, + "BootstrapVersion": { + "Type": "AWS::SSM::Parameter::Value", + "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/packages/@aws-cdk-testing/framework-integ/test/aws-fsx/test/integ.lustre-file-system-storage-type.js.snapshot/FsxLustreStorageTypeTestDefaultTestDeployAssert50B0FE3D.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-fsx/test/integ.lustre-file-system-storage-type.js.snapshot/FsxLustreStorageTypeTestDefaultTestDeployAssert50B0FE3D.assets.json new file mode 100644 index 0000000000000..52725461bcef7 --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-fsx/test/integ.lustre-file-system-storage-type.js.snapshot/FsxLustreStorageTypeTestDefaultTestDeployAssert50B0FE3D.assets.json @@ -0,0 +1,19 @@ +{ + "version": "36.0.0", + "files": { + "21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": { + "source": { + "path": "FsxLustreStorageTypeTestDefaultTestDeployAssert50B0FE3D.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/packages/@aws-cdk-testing/framework-integ/test/aws-fsx/test/integ.lustre-file-system-storage-type.js.snapshot/FsxLustreStorageTypeTestDefaultTestDeployAssert50B0FE3D.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-fsx/test/integ.lustre-file-system-storage-type.js.snapshot/FsxLustreStorageTypeTestDefaultTestDeployAssert50B0FE3D.template.json new file mode 100644 index 0000000000000..ad9d0fb73d1dd --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-fsx/test/integ.lustre-file-system-storage-type.js.snapshot/FsxLustreStorageTypeTestDefaultTestDeployAssert50B0FE3D.template.json @@ -0,0 +1,36 @@ +{ + "Parameters": { + "BootstrapVersion": { + "Type": "AWS::SSM::Parameter::Value", + "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/packages/@aws-cdk-testing/framework-integ/test/aws-fsx/test/integ.lustre-file-system-storage-type.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-fsx/test/integ.lustre-file-system-storage-type.js.snapshot/cdk.out new file mode 100644 index 0000000000000..1f0068d32659a --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-fsx/test/integ.lustre-file-system-storage-type.js.snapshot/cdk.out @@ -0,0 +1 @@ +{"version":"36.0.0"} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-fsx/test/integ.lustre-file-system-storage-type.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-fsx/test/integ.lustre-file-system-storage-type.js.snapshot/integ.json new file mode 100644 index 0000000000000..5fe2606728a96 --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-fsx/test/integ.lustre-file-system-storage-type.js.snapshot/integ.json @@ -0,0 +1,12 @@ +{ + "version": "36.0.0", + "testCases": { + "FsxLustreStorageTypeTest/DefaultTest": { + "stacks": [ + "FsxLustreStorageTypeStack" + ], + "assertionStack": "FsxLustreStorageTypeTest/DefaultTest/DeployAssert", + "assertionStackName": "FsxLustreStorageTypeTestDefaultTestDeployAssert50B0FE3D" + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-fsx/test/integ.lustre-file-system-storage-type.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-fsx/test/integ.lustre-file-system-storage-type.js.snapshot/manifest.json new file mode 100644 index 0000000000000..15026c9a5a72d --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-fsx/test/integ.lustre-file-system-storage-type.js.snapshot/manifest.json @@ -0,0 +1,347 @@ +{ + "version": "36.0.0", + "artifacts": { + "FsxLustreStorageTypeStack.assets": { + "type": "cdk:asset-manifest", + "properties": { + "file": "FsxLustreStorageTypeStack.assets.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" + } + }, + "FsxLustreStorageTypeStack": { + "type": "aws:cloudformation:stack", + "environment": "aws://unknown-account/unknown-region", + "properties": { + "templateFile": "FsxLustreStorageTypeStack.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}/b70afe3fccbab7f6f454145285c729eb91a7254c797c5156812a783b8f6cefd9.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", + "additionalDependencies": [ + "FsxLustreStorageTypeStack.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": [ + "FsxLustreStorageTypeStack.assets" + ], + "metadata": { + "/FsxLustreStorageTypeStack/Vpc/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "Vpc8378EB38" + } + ], + "/FsxLustreStorageTypeStack/Vpc/PublicSubnet1/Subnet": [ + { + "type": "aws:cdk:logicalId", + "data": "VpcPublicSubnet1Subnet5C2D37C4" + } + ], + "/FsxLustreStorageTypeStack/Vpc/PublicSubnet1/RouteTable": [ + { + "type": "aws:cdk:logicalId", + "data": "VpcPublicSubnet1RouteTable6C95E38E" + } + ], + "/FsxLustreStorageTypeStack/Vpc/PublicSubnet1/RouteTableAssociation": [ + { + "type": "aws:cdk:logicalId", + "data": "VpcPublicSubnet1RouteTableAssociation97140677" + } + ], + "/FsxLustreStorageTypeStack/Vpc/PublicSubnet1/DefaultRoute": [ + { + "type": "aws:cdk:logicalId", + "data": "VpcPublicSubnet1DefaultRoute3DA9E72A" + } + ], + "/FsxLustreStorageTypeStack/Vpc/PublicSubnet1/EIP": [ + { + "type": "aws:cdk:logicalId", + "data": "VpcPublicSubnet1EIPD7E02669" + } + ], + "/FsxLustreStorageTypeStack/Vpc/PublicSubnet1/NATGateway": [ + { + "type": "aws:cdk:logicalId", + "data": "VpcPublicSubnet1NATGateway4D7517AA" + } + ], + "/FsxLustreStorageTypeStack/Vpc/PublicSubnet2/Subnet": [ + { + "type": "aws:cdk:logicalId", + "data": "VpcPublicSubnet2Subnet691E08A3" + } + ], + "/FsxLustreStorageTypeStack/Vpc/PublicSubnet2/RouteTable": [ + { + "type": "aws:cdk:logicalId", + "data": "VpcPublicSubnet2RouteTable94F7E489" + } + ], + "/FsxLustreStorageTypeStack/Vpc/PublicSubnet2/RouteTableAssociation": [ + { + "type": "aws:cdk:logicalId", + "data": "VpcPublicSubnet2RouteTableAssociationDD5762D8" + } + ], + "/FsxLustreStorageTypeStack/Vpc/PublicSubnet2/DefaultRoute": [ + { + "type": "aws:cdk:logicalId", + "data": "VpcPublicSubnet2DefaultRoute97F91067" + } + ], + "/FsxLustreStorageTypeStack/Vpc/PublicSubnet2/EIP": [ + { + "type": "aws:cdk:logicalId", + "data": "VpcPublicSubnet2EIP3C605A87" + } + ], + "/FsxLustreStorageTypeStack/Vpc/PublicSubnet2/NATGateway": [ + { + "type": "aws:cdk:logicalId", + "data": "VpcPublicSubnet2NATGateway9182C01D" + } + ], + "/FsxLustreStorageTypeStack/Vpc/PrivateSubnet1/Subnet": [ + { + "type": "aws:cdk:logicalId", + "data": "VpcPrivateSubnet1Subnet536B997A" + } + ], + "/FsxLustreStorageTypeStack/Vpc/PrivateSubnet1/RouteTable": [ + { + "type": "aws:cdk:logicalId", + "data": "VpcPrivateSubnet1RouteTableB2C5B500" + } + ], + "/FsxLustreStorageTypeStack/Vpc/PrivateSubnet1/RouteTableAssociation": [ + { + "type": "aws:cdk:logicalId", + "data": "VpcPrivateSubnet1RouteTableAssociation70C59FA6" + } + ], + "/FsxLustreStorageTypeStack/Vpc/PrivateSubnet1/DefaultRoute": [ + { + "type": "aws:cdk:logicalId", + "data": "VpcPrivateSubnet1DefaultRouteBE02A9ED" + } + ], + "/FsxLustreStorageTypeStack/Vpc/PrivateSubnet2/Subnet": [ + { + "type": "aws:cdk:logicalId", + "data": "VpcPrivateSubnet2Subnet3788AAA1" + } + ], + "/FsxLustreStorageTypeStack/Vpc/PrivateSubnet2/RouteTable": [ + { + "type": "aws:cdk:logicalId", + "data": "VpcPrivateSubnet2RouteTableA678073B" + } + ], + "/FsxLustreStorageTypeStack/Vpc/PrivateSubnet2/RouteTableAssociation": [ + { + "type": "aws:cdk:logicalId", + "data": "VpcPrivateSubnet2RouteTableAssociationA89CAD56" + } + ], + "/FsxLustreStorageTypeStack/Vpc/PrivateSubnet2/DefaultRoute": [ + { + "type": "aws:cdk:logicalId", + "data": "VpcPrivateSubnet2DefaultRoute060D2087" + } + ], + "/FsxLustreStorageTypeStack/Vpc/IGW": [ + { + "type": "aws:cdk:logicalId", + "data": "VpcIGWD7BA715C" + } + ], + "/FsxLustreStorageTypeStack/Vpc/VPCGW": [ + { + "type": "aws:cdk:logicalId", + "data": "VpcVPCGWBF912B6E" + } + ], + "/FsxLustreStorageTypeStack/FsxLustreFileSystemSsdStorage/FsxLustreSecurityGroup/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "FsxLustreFileSystemSsdStorageFsxLustreSecurityGroup14F696B3" + } + ], + "/FsxLustreStorageTypeStack/FsxLustreFileSystemSsdStorage/FsxLustreSecurityGroup/from FsxLustreStorageTypeStackFsxLustreFileSystemSsdStorageFsxLustreSecurityGroup900D4B37:988-1023": [ + { + "type": "aws:cdk:logicalId", + "data": "FsxLustreFileSystemSsdStorageFsxLustreSecurityGroupfromFsxLustreStorageTypeStackFsxLustreFileSystemSsdStorageFsxLustreSecurityGroup900D4B37988102342FA56B2" + } + ], + "/FsxLustreStorageTypeStack/FsxLustreFileSystemSsdStorage/FsxLustreSecurityGroup/from FsxLustreStorageTypeStackSsdFsxInstanceInstanceSecurityGroupAC704ACF:988-1023": [ + { + "type": "aws:cdk:logicalId", + "data": "FsxLustreFileSystemSsdStorageFsxLustreSecurityGroupfromFsxLustreStorageTypeStackSsdFsxInstanceInstanceSecurityGroupAC704ACF988102380D6A84E" + } + ], + "/FsxLustreStorageTypeStack/FsxLustreFileSystemSsdStorage/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "FsxLustreFileSystemSsdStorage70256D99" + } + ], + "/FsxLustreStorageTypeStack/SsdFsxInstance/InstanceSecurityGroup/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "SsdFsxInstanceInstanceSecurityGroup6C5726B9" + } + ], + "/FsxLustreStorageTypeStack/SsdFsxInstance/InstanceRole/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "SsdFsxInstanceInstanceRole933EE1D6" + } + ], + "/FsxLustreStorageTypeStack/SsdFsxInstance/InstanceProfile": [ + { + "type": "aws:cdk:logicalId", + "data": "SsdFsxInstanceInstanceProfile0AD53366" + } + ], + "/FsxLustreStorageTypeStack/SsdFsxInstance/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "SsdFsxInstance09AA8DE7" + } + ], + "/FsxLustreStorageTypeStack/SsmParameterValue:--aws--service--ami-amazon-linux-latest--al2023-ami-kernel-6.1-x86_64:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter": [ + { + "type": "aws:cdk:logicalId", + "data": "SsmParameterValueawsserviceamiamazonlinuxlatestal2023amikernel61x8664C96584B6F00A464EAD1953AFF4B05118Parameter" + } + ], + "/FsxLustreStorageTypeStack/FsxLustreFileSystemHddStorage/FsxLustreSecurityGroup/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "FsxLustreFileSystemHddStorageFsxLustreSecurityGroupCB529CFC" + } + ], + "/FsxLustreStorageTypeStack/FsxLustreFileSystemHddStorage/FsxLustreSecurityGroup/from FsxLustreStorageTypeStackFsxLustreFileSystemHddStorageFsxLustreSecurityGroup36EAA88E:988-1023": [ + { + "type": "aws:cdk:logicalId", + "data": "FsxLustreFileSystemHddStorageFsxLustreSecurityGroupfromFsxLustreStorageTypeStackFsxLustreFileSystemHddStorageFsxLustreSecurityGroup36EAA88E9881023C048CB34" + } + ], + "/FsxLustreStorageTypeStack/FsxLustreFileSystemHddStorage/FsxLustreSecurityGroup/from FsxLustreStorageTypeStackHddFsxInstanceInstanceSecurityGroup83E545BE:988-1023": [ + { + "type": "aws:cdk:logicalId", + "data": "FsxLustreFileSystemHddStorageFsxLustreSecurityGroupfromFsxLustreStorageTypeStackHddFsxInstanceInstanceSecurityGroup83E545BE98810231EFC35B6" + } + ], + "/FsxLustreStorageTypeStack/FsxLustreFileSystemHddStorage/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "FsxLustreFileSystemHddStorage85B422B8" + } + ], + "/FsxLustreStorageTypeStack/HddFsxInstance/InstanceSecurityGroup/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "HddFsxInstanceInstanceSecurityGroupFF15A567" + } + ], + "/FsxLustreStorageTypeStack/HddFsxInstance/InstanceRole/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "HddFsxInstanceInstanceRole7B336CC9" + } + ], + "/FsxLustreStorageTypeStack/HddFsxInstance/InstanceProfile": [ + { + "type": "aws:cdk:logicalId", + "data": "HddFsxInstanceInstanceProfile0833AA40" + } + ], + "/FsxLustreStorageTypeStack/HddFsxInstance/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "HddFsxInstance019A1F6D" + } + ], + "/FsxLustreStorageTypeStack/BootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "BootstrapVersion" + } + ], + "/FsxLustreStorageTypeStack/CheckBootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "CheckBootstrapVersion" + } + ] + }, + "displayName": "FsxLustreStorageTypeStack" + }, + "FsxLustreStorageTypeTestDefaultTestDeployAssert50B0FE3D.assets": { + "type": "cdk:asset-manifest", + "properties": { + "file": "FsxLustreStorageTypeTestDefaultTestDeployAssert50B0FE3D.assets.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" + } + }, + "FsxLustreStorageTypeTestDefaultTestDeployAssert50B0FE3D": { + "type": "aws:cloudformation:stack", + "environment": "aws://unknown-account/unknown-region", + "properties": { + "templateFile": "FsxLustreStorageTypeTestDefaultTestDeployAssert50B0FE3D.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": [ + "FsxLustreStorageTypeTestDefaultTestDeployAssert50B0FE3D.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": [ + "FsxLustreStorageTypeTestDefaultTestDeployAssert50B0FE3D.assets" + ], + "metadata": { + "/FsxLustreStorageTypeTest/DefaultTest/DeployAssert/BootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "BootstrapVersion" + } + ], + "/FsxLustreStorageTypeTest/DefaultTest/DeployAssert/CheckBootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "CheckBootstrapVersion" + } + ] + }, + "displayName": "FsxLustreStorageTypeTest/DefaultTest/DeployAssert" + }, + "Tree": { + "type": "cdk:tree", + "properties": { + "file": "tree.json" + } + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-fsx/test/integ.lustre-file-system-storage-type.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-fsx/test/integ.lustre-file-system-storage-type.js.snapshot/tree.json new file mode 100644 index 0000000000000..fd749c10093d3 --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-fsx/test/integ.lustre-file-system-storage-type.js.snapshot/tree.json @@ -0,0 +1,1362 @@ +{ + "version": "tree-0.1", + "tree": { + "id": "App", + "path": "", + "children": { + "FsxLustreStorageTypeStack": { + "id": "FsxLustreStorageTypeStack", + "path": "FsxLustreStorageTypeStack", + "children": { + "Vpc": { + "id": "Vpc", + "path": "FsxLustreStorageTypeStack/Vpc", + "children": { + "Resource": { + "id": "Resource", + "path": "FsxLustreStorageTypeStack/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": "FsxLustreStorageTypeStack/Vpc" + } + ] + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_ec2.CfnVPC", + "version": "0.0.0" + } + }, + "PublicSubnet1": { + "id": "PublicSubnet1", + "path": "FsxLustreStorageTypeStack/Vpc/PublicSubnet1", + "children": { + "Subnet": { + "id": "Subnet", + "path": "FsxLustreStorageTypeStack/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": "FsxLustreStorageTypeStack/Vpc/PublicSubnet1" + } + ], + "vpcId": { + "Ref": "Vpc8378EB38" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet", + "version": "0.0.0" + } + }, + "Acl": { + "id": "Acl", + "path": "FsxLustreStorageTypeStack/Vpc/PublicSubnet1/Acl", + "constructInfo": { + "fqn": "aws-cdk-lib.Resource", + "version": "0.0.0" + } + }, + "RouteTable": { + "id": "RouteTable", + "path": "FsxLustreStorageTypeStack/Vpc/PublicSubnet1/RouteTable", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable", + "aws:cdk:cloudformation:props": { + "tags": [ + { + "key": "Name", + "value": "FsxLustreStorageTypeStack/Vpc/PublicSubnet1" + } + ], + "vpcId": { + "Ref": "Vpc8378EB38" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable", + "version": "0.0.0" + } + }, + "RouteTableAssociation": { + "id": "RouteTableAssociation", + "path": "FsxLustreStorageTypeStack/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": "0.0.0" + } + }, + "DefaultRoute": { + "id": "DefaultRoute", + "path": "FsxLustreStorageTypeStack/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": "0.0.0" + } + }, + "EIP": { + "id": "EIP", + "path": "FsxLustreStorageTypeStack/Vpc/PublicSubnet1/EIP", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::EC2::EIP", + "aws:cdk:cloudformation:props": { + "domain": "vpc", + "tags": [ + { + "key": "Name", + "value": "FsxLustreStorageTypeStack/Vpc/PublicSubnet1" + } + ] + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_ec2.CfnEIP", + "version": "0.0.0" + } + }, + "NATGateway": { + "id": "NATGateway", + "path": "FsxLustreStorageTypeStack/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": "FsxLustreStorageTypeStack/Vpc/PublicSubnet1" + } + ] + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_ec2.PublicSubnet", + "version": "0.0.0" + } + }, + "PublicSubnet2": { + "id": "PublicSubnet2", + "path": "FsxLustreStorageTypeStack/Vpc/PublicSubnet2", + "children": { + "Subnet": { + "id": "Subnet", + "path": "FsxLustreStorageTypeStack/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": "FsxLustreStorageTypeStack/Vpc/PublicSubnet2" + } + ], + "vpcId": { + "Ref": "Vpc8378EB38" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet", + "version": "0.0.0" + } + }, + "Acl": { + "id": "Acl", + "path": "FsxLustreStorageTypeStack/Vpc/PublicSubnet2/Acl", + "constructInfo": { + "fqn": "aws-cdk-lib.Resource", + "version": "0.0.0" + } + }, + "RouteTable": { + "id": "RouteTable", + "path": "FsxLustreStorageTypeStack/Vpc/PublicSubnet2/RouteTable", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable", + "aws:cdk:cloudformation:props": { + "tags": [ + { + "key": "Name", + "value": "FsxLustreStorageTypeStack/Vpc/PublicSubnet2" + } + ], + "vpcId": { + "Ref": "Vpc8378EB38" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable", + "version": "0.0.0" + } + }, + "RouteTableAssociation": { + "id": "RouteTableAssociation", + "path": "FsxLustreStorageTypeStack/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": "0.0.0" + } + }, + "DefaultRoute": { + "id": "DefaultRoute", + "path": "FsxLustreStorageTypeStack/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": "0.0.0" + } + }, + "EIP": { + "id": "EIP", + "path": "FsxLustreStorageTypeStack/Vpc/PublicSubnet2/EIP", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::EC2::EIP", + "aws:cdk:cloudformation:props": { + "domain": "vpc", + "tags": [ + { + "key": "Name", + "value": "FsxLustreStorageTypeStack/Vpc/PublicSubnet2" + } + ] + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_ec2.CfnEIP", + "version": "0.0.0" + } + }, + "NATGateway": { + "id": "NATGateway", + "path": "FsxLustreStorageTypeStack/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": "FsxLustreStorageTypeStack/Vpc/PublicSubnet2" + } + ] + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_ec2.CfnNatGateway", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_ec2.PublicSubnet", + "version": "0.0.0" + } + }, + "PrivateSubnet1": { + "id": "PrivateSubnet1", + "path": "FsxLustreStorageTypeStack/Vpc/PrivateSubnet1", + "children": { + "Subnet": { + "id": "Subnet", + "path": "FsxLustreStorageTypeStack/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": "FsxLustreStorageTypeStack/Vpc/PrivateSubnet1" + } + ], + "vpcId": { + "Ref": "Vpc8378EB38" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet", + "version": "0.0.0" + } + }, + "Acl": { + "id": "Acl", + "path": "FsxLustreStorageTypeStack/Vpc/PrivateSubnet1/Acl", + "constructInfo": { + "fqn": "aws-cdk-lib.Resource", + "version": "0.0.0" + } + }, + "RouteTable": { + "id": "RouteTable", + "path": "FsxLustreStorageTypeStack/Vpc/PrivateSubnet1/RouteTable", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable", + "aws:cdk:cloudformation:props": { + "tags": [ + { + "key": "Name", + "value": "FsxLustreStorageTypeStack/Vpc/PrivateSubnet1" + } + ], + "vpcId": { + "Ref": "Vpc8378EB38" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable", + "version": "0.0.0" + } + }, + "RouteTableAssociation": { + "id": "RouteTableAssociation", + "path": "FsxLustreStorageTypeStack/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": "0.0.0" + } + }, + "DefaultRoute": { + "id": "DefaultRoute", + "path": "FsxLustreStorageTypeStack/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": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_ec2.PrivateSubnet", + "version": "0.0.0" + } + }, + "PrivateSubnet2": { + "id": "PrivateSubnet2", + "path": "FsxLustreStorageTypeStack/Vpc/PrivateSubnet2", + "children": { + "Subnet": { + "id": "Subnet", + "path": "FsxLustreStorageTypeStack/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": "FsxLustreStorageTypeStack/Vpc/PrivateSubnet2" + } + ], + "vpcId": { + "Ref": "Vpc8378EB38" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_ec2.CfnSubnet", + "version": "0.0.0" + } + }, + "Acl": { + "id": "Acl", + "path": "FsxLustreStorageTypeStack/Vpc/PrivateSubnet2/Acl", + "constructInfo": { + "fqn": "aws-cdk-lib.Resource", + "version": "0.0.0" + } + }, + "RouteTable": { + "id": "RouteTable", + "path": "FsxLustreStorageTypeStack/Vpc/PrivateSubnet2/RouteTable", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::EC2::RouteTable", + "aws:cdk:cloudformation:props": { + "tags": [ + { + "key": "Name", + "value": "FsxLustreStorageTypeStack/Vpc/PrivateSubnet2" + } + ], + "vpcId": { + "Ref": "Vpc8378EB38" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_ec2.CfnRouteTable", + "version": "0.0.0" + } + }, + "RouteTableAssociation": { + "id": "RouteTableAssociation", + "path": "FsxLustreStorageTypeStack/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": "0.0.0" + } + }, + "DefaultRoute": { + "id": "DefaultRoute", + "path": "FsxLustreStorageTypeStack/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": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_ec2.PrivateSubnet", + "version": "0.0.0" + } + }, + "IGW": { + "id": "IGW", + "path": "FsxLustreStorageTypeStack/Vpc/IGW", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::EC2::InternetGateway", + "aws:cdk:cloudformation:props": { + "tags": [ + { + "key": "Name", + "value": "FsxLustreStorageTypeStack/Vpc" + } + ] + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_ec2.CfnInternetGateway", + "version": "0.0.0" + } + }, + "VPCGW": { + "id": "VPCGW", + "path": "FsxLustreStorageTypeStack/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": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_ec2.Vpc", + "version": "0.0.0" + } + }, + "FsxLustreFileSystemSsdStorage": { + "id": "FsxLustreFileSystemSsdStorage", + "path": "FsxLustreStorageTypeStack/FsxLustreFileSystemSsdStorage", + "children": { + "FsxLustreSecurityGroup": { + "id": "FsxLustreSecurityGroup", + "path": "FsxLustreStorageTypeStack/FsxLustreFileSystemSsdStorage/FsxLustreSecurityGroup", + "children": { + "Resource": { + "id": "Resource", + "path": "FsxLustreStorageTypeStack/FsxLustreFileSystemSsdStorage/FsxLustreSecurityGroup/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup", + "aws:cdk:cloudformation:props": { + "groupDescription": "FsxLustreStorageTypeStack/FsxLustreFileSystemSsdStorage/FsxLustreSecurityGroup", + "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": "0.0.0" + } + }, + "from FsxLustreStorageTypeStackFsxLustreFileSystemSsdStorageFsxLustreSecurityGroup900D4B37:988-1023": { + "id": "from FsxLustreStorageTypeStackFsxLustreFileSystemSsdStorageFsxLustreSecurityGroup900D4B37:988-1023", + "path": "FsxLustreStorageTypeStack/FsxLustreFileSystemSsdStorage/FsxLustreSecurityGroup/from FsxLustreStorageTypeStackFsxLustreFileSystemSsdStorageFsxLustreSecurityGroup900D4B37:988-1023", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroupIngress", + "aws:cdk:cloudformation:props": { + "description": "from FsxLustreStorageTypeStackFsxLustreFileSystemSsdStorageFsxLustreSecurityGroup900D4B37:988-1023", + "fromPort": 988, + "groupId": { + "Fn::GetAtt": [ + "FsxLustreFileSystemSsdStorageFsxLustreSecurityGroup14F696B3", + "GroupId" + ] + }, + "ipProtocol": "tcp", + "sourceSecurityGroupId": { + "Fn::GetAtt": [ + "FsxLustreFileSystemSsdStorageFsxLustreSecurityGroup14F696B3", + "GroupId" + ] + }, + "toPort": 1023 + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroupIngress", + "version": "0.0.0" + } + }, + "from FsxLustreStorageTypeStackSsdFsxInstanceInstanceSecurityGroupAC704ACF:988-1023": { + "id": "from FsxLustreStorageTypeStackSsdFsxInstanceInstanceSecurityGroupAC704ACF:988-1023", + "path": "FsxLustreStorageTypeStack/FsxLustreFileSystemSsdStorage/FsxLustreSecurityGroup/from FsxLustreStorageTypeStackSsdFsxInstanceInstanceSecurityGroupAC704ACF:988-1023", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroupIngress", + "aws:cdk:cloudformation:props": { + "description": "from FsxLustreStorageTypeStackSsdFsxInstanceInstanceSecurityGroupAC704ACF:988-1023", + "fromPort": 988, + "groupId": { + "Fn::GetAtt": [ + "FsxLustreFileSystemSsdStorageFsxLustreSecurityGroup14F696B3", + "GroupId" + ] + }, + "ipProtocol": "tcp", + "sourceSecurityGroupId": { + "Fn::GetAtt": [ + "SsdFsxInstanceInstanceSecurityGroup6C5726B9", + "GroupId" + ] + }, + "toPort": 1023 + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroupIngress", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup", + "version": "0.0.0" + } + }, + "Resource": { + "id": "Resource", + "path": "FsxLustreStorageTypeStack/FsxLustreFileSystemSsdStorage/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::FSx::FileSystem", + "aws:cdk:cloudformation:props": { + "fileSystemType": "LUSTRE", + "lustreConfiguration": { + "deploymentType": "SCRATCH_2", + "dataCompressionType": "LZ4" + }, + "securityGroupIds": [ + { + "Fn::GetAtt": [ + "FsxLustreFileSystemSsdStorageFsxLustreSecurityGroup14F696B3", + "GroupId" + ] + } + ], + "storageCapacity": 1200, + "storageType": "SSD", + "subnetIds": [ + { + "Ref": "VpcPrivateSubnet1Subnet536B997A" + } + ] + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_fsx.CfnFileSystem", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_fsx.LustreFileSystem", + "version": "0.0.0" + } + }, + "SsdFsxInstance": { + "id": "SsdFsxInstance", + "path": "FsxLustreStorageTypeStack/SsdFsxInstance", + "children": { + "InstanceSecurityGroup": { + "id": "InstanceSecurityGroup", + "path": "FsxLustreStorageTypeStack/SsdFsxInstance/InstanceSecurityGroup", + "children": { + "Resource": { + "id": "Resource", + "path": "FsxLustreStorageTypeStack/SsdFsxInstance/InstanceSecurityGroup/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup", + "aws:cdk:cloudformation:props": { + "groupDescription": "FsxLustreStorageTypeStack/SsdFsxInstance/InstanceSecurityGroup", + "securityGroupEgress": [ + { + "cidrIp": "0.0.0.0/0", + "description": "Allow all outbound traffic by default", + "ipProtocol": "-1" + } + ], + "tags": [ + { + "key": "Name", + "value": "FsxLustreStorageTypeStack/SsdFsxInstance" + } + ], + "vpcId": { + "Ref": "Vpc8378EB38" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup", + "version": "0.0.0" + } + }, + "InstanceRole": { + "id": "InstanceRole", + "path": "FsxLustreStorageTypeStack/SsdFsxInstance/InstanceRole", + "children": { + "ImportInstanceRole": { + "id": "ImportInstanceRole", + "path": "FsxLustreStorageTypeStack/SsdFsxInstance/InstanceRole/ImportInstanceRole", + "constructInfo": { + "fqn": "aws-cdk-lib.Resource", + "version": "0.0.0" + } + }, + "Resource": { + "id": "Resource", + "path": "FsxLustreStorageTypeStack/SsdFsxInstance/InstanceRole/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::IAM::Role", + "aws:cdk:cloudformation:props": { + "assumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "ec2.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "tags": [ + { + "key": "Name", + "value": "FsxLustreStorageTypeStack/SsdFsxInstance" + } + ] + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.CfnRole", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.Role", + "version": "0.0.0" + } + }, + "InstanceProfile": { + "id": "InstanceProfile", + "path": "FsxLustreStorageTypeStack/SsdFsxInstance/InstanceProfile", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::IAM::InstanceProfile", + "aws:cdk:cloudformation:props": { + "roles": [ + { + "Ref": "SsdFsxInstanceInstanceRole933EE1D6" + } + ] + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.CfnInstanceProfile", + "version": "0.0.0" + } + }, + "Resource": { + "id": "Resource", + "path": "FsxLustreStorageTypeStack/SsdFsxInstance/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::EC2::Instance", + "aws:cdk:cloudformation:props": { + "availabilityZone": { + "Fn::Select": [ + 0, + { + "Fn::GetAZs": "" + } + ] + }, + "iamInstanceProfile": { + "Ref": "SsdFsxInstanceInstanceProfile0AD53366" + }, + "imageId": { + "Ref": "SsmParameterValueawsserviceamiamazonlinuxlatestal2023amikernel61x8664C96584B6F00A464EAD1953AFF4B05118Parameter" + }, + "instanceType": "t2.large", + "securityGroupIds": [ + { + "Fn::GetAtt": [ + "SsdFsxInstanceInstanceSecurityGroup6C5726B9", + "GroupId" + ] + } + ], + "subnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, + "tags": [ + { + "key": "Name", + "value": "FsxLustreStorageTypeStack/SsdFsxInstance" + } + ], + "userData": { + "Fn::Base64": "#!/bin/bash" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_ec2.CfnInstance", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_ec2.Instance", + "version": "0.0.0" + } + }, + "SsmParameterValue:--aws--service--ami-amazon-linux-latest--al2023-ami-kernel-6.1-x86_64:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter": { + "id": "SsmParameterValue:--aws--service--ami-amazon-linux-latest--al2023-ami-kernel-6.1-x86_64:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter", + "path": "FsxLustreStorageTypeStack/SsmParameterValue:--aws--service--ami-amazon-linux-latest--al2023-ami-kernel-6.1-x86_64:C96584B6-F00A-464E-AD19-53AFF4B05118.Parameter", + "constructInfo": { + "fqn": "aws-cdk-lib.CfnParameter", + "version": "0.0.0" + } + }, + "SsmParameterValue:--aws--service--ami-amazon-linux-latest--al2023-ami-kernel-6.1-x86_64:C96584B6-F00A-464E-AD19-53AFF4B05118": { + "id": "SsmParameterValue:--aws--service--ami-amazon-linux-latest--al2023-ami-kernel-6.1-x86_64:C96584B6-F00A-464E-AD19-53AFF4B05118", + "path": "FsxLustreStorageTypeStack/SsmParameterValue:--aws--service--ami-amazon-linux-latest--al2023-ami-kernel-6.1-x86_64:C96584B6-F00A-464E-AD19-53AFF4B05118", + "constructInfo": { + "fqn": "aws-cdk-lib.Resource", + "version": "0.0.0" + } + }, + "FsxLustreFileSystemHddStorage": { + "id": "FsxLustreFileSystemHddStorage", + "path": "FsxLustreStorageTypeStack/FsxLustreFileSystemHddStorage", + "children": { + "FsxLustreSecurityGroup": { + "id": "FsxLustreSecurityGroup", + "path": "FsxLustreStorageTypeStack/FsxLustreFileSystemHddStorage/FsxLustreSecurityGroup", + "children": { + "Resource": { + "id": "Resource", + "path": "FsxLustreStorageTypeStack/FsxLustreFileSystemHddStorage/FsxLustreSecurityGroup/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup", + "aws:cdk:cloudformation:props": { + "groupDescription": "FsxLustreStorageTypeStack/FsxLustreFileSystemHddStorage/FsxLustreSecurityGroup", + "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": "0.0.0" + } + }, + "from FsxLustreStorageTypeStackFsxLustreFileSystemHddStorageFsxLustreSecurityGroup36EAA88E:988-1023": { + "id": "from FsxLustreStorageTypeStackFsxLustreFileSystemHddStorageFsxLustreSecurityGroup36EAA88E:988-1023", + "path": "FsxLustreStorageTypeStack/FsxLustreFileSystemHddStorage/FsxLustreSecurityGroup/from FsxLustreStorageTypeStackFsxLustreFileSystemHddStorageFsxLustreSecurityGroup36EAA88E:988-1023", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroupIngress", + "aws:cdk:cloudformation:props": { + "description": "from FsxLustreStorageTypeStackFsxLustreFileSystemHddStorageFsxLustreSecurityGroup36EAA88E:988-1023", + "fromPort": 988, + "groupId": { + "Fn::GetAtt": [ + "FsxLustreFileSystemHddStorageFsxLustreSecurityGroupCB529CFC", + "GroupId" + ] + }, + "ipProtocol": "tcp", + "sourceSecurityGroupId": { + "Fn::GetAtt": [ + "FsxLustreFileSystemHddStorageFsxLustreSecurityGroupCB529CFC", + "GroupId" + ] + }, + "toPort": 1023 + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroupIngress", + "version": "0.0.0" + } + }, + "from FsxLustreStorageTypeStackHddFsxInstanceInstanceSecurityGroup83E545BE:988-1023": { + "id": "from FsxLustreStorageTypeStackHddFsxInstanceInstanceSecurityGroup83E545BE:988-1023", + "path": "FsxLustreStorageTypeStack/FsxLustreFileSystemHddStorage/FsxLustreSecurityGroup/from FsxLustreStorageTypeStackHddFsxInstanceInstanceSecurityGroup83E545BE:988-1023", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroupIngress", + "aws:cdk:cloudformation:props": { + "description": "from FsxLustreStorageTypeStackHddFsxInstanceInstanceSecurityGroup83E545BE:988-1023", + "fromPort": 988, + "groupId": { + "Fn::GetAtt": [ + "FsxLustreFileSystemHddStorageFsxLustreSecurityGroupCB529CFC", + "GroupId" + ] + }, + "ipProtocol": "tcp", + "sourceSecurityGroupId": { + "Fn::GetAtt": [ + "HddFsxInstanceInstanceSecurityGroupFF15A567", + "GroupId" + ] + }, + "toPort": 1023 + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroupIngress", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup", + "version": "0.0.0" + } + }, + "Resource": { + "id": "Resource", + "path": "FsxLustreStorageTypeStack/FsxLustreFileSystemHddStorage/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::FSx::FileSystem", + "aws:cdk:cloudformation:props": { + "fileSystemType": "LUSTRE", + "lustreConfiguration": { + "deploymentType": "PERSISTENT_1", + "dataCompressionType": "LZ4", + "perUnitStorageThroughput": 12, + "driveCacheType": "READ" + }, + "securityGroupIds": [ + { + "Fn::GetAtt": [ + "FsxLustreFileSystemHddStorageFsxLustreSecurityGroupCB529CFC", + "GroupId" + ] + } + ], + "storageCapacity": 6000, + "storageType": "HDD", + "subnetIds": [ + { + "Ref": "VpcPrivateSubnet2Subnet3788AAA1" + } + ] + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_fsx.CfnFileSystem", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_fsx.LustreFileSystem", + "version": "0.0.0" + } + }, + "HddFsxInstance": { + "id": "HddFsxInstance", + "path": "FsxLustreStorageTypeStack/HddFsxInstance", + "children": { + "InstanceSecurityGroup": { + "id": "InstanceSecurityGroup", + "path": "FsxLustreStorageTypeStack/HddFsxInstance/InstanceSecurityGroup", + "children": { + "Resource": { + "id": "Resource", + "path": "FsxLustreStorageTypeStack/HddFsxInstance/InstanceSecurityGroup/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::EC2::SecurityGroup", + "aws:cdk:cloudformation:props": { + "groupDescription": "FsxLustreStorageTypeStack/HddFsxInstance/InstanceSecurityGroup", + "securityGroupEgress": [ + { + "cidrIp": "0.0.0.0/0", + "description": "Allow all outbound traffic by default", + "ipProtocol": "-1" + } + ], + "tags": [ + { + "key": "Name", + "value": "FsxLustreStorageTypeStack/HddFsxInstance" + } + ], + "vpcId": { + "Ref": "Vpc8378EB38" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_ec2.CfnSecurityGroup", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_ec2.SecurityGroup", + "version": "0.0.0" + } + }, + "InstanceRole": { + "id": "InstanceRole", + "path": "FsxLustreStorageTypeStack/HddFsxInstance/InstanceRole", + "children": { + "ImportInstanceRole": { + "id": "ImportInstanceRole", + "path": "FsxLustreStorageTypeStack/HddFsxInstance/InstanceRole/ImportInstanceRole", + "constructInfo": { + "fqn": "aws-cdk-lib.Resource", + "version": "0.0.0" + } + }, + "Resource": { + "id": "Resource", + "path": "FsxLustreStorageTypeStack/HddFsxInstance/InstanceRole/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::IAM::Role", + "aws:cdk:cloudformation:props": { + "assumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "ec2.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "tags": [ + { + "key": "Name", + "value": "FsxLustreStorageTypeStack/HddFsxInstance" + } + ] + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.CfnRole", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.Role", + "version": "0.0.0" + } + }, + "InstanceProfile": { + "id": "InstanceProfile", + "path": "FsxLustreStorageTypeStack/HddFsxInstance/InstanceProfile", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::IAM::InstanceProfile", + "aws:cdk:cloudformation:props": { + "roles": [ + { + "Ref": "HddFsxInstanceInstanceRole7B336CC9" + } + ] + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.CfnInstanceProfile", + "version": "0.0.0" + } + }, + "Resource": { + "id": "Resource", + "path": "FsxLustreStorageTypeStack/HddFsxInstance/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::EC2::Instance", + "aws:cdk:cloudformation:props": { + "availabilityZone": { + "Fn::Select": [ + 0, + { + "Fn::GetAZs": "" + } + ] + }, + "iamInstanceProfile": { + "Ref": "HddFsxInstanceInstanceProfile0833AA40" + }, + "imageId": { + "Ref": "SsmParameterValueawsserviceamiamazonlinuxlatestal2023amikernel61x8664C96584B6F00A464EAD1953AFF4B05118Parameter" + }, + "instanceType": "t2.large", + "securityGroupIds": [ + { + "Fn::GetAtt": [ + "HddFsxInstanceInstanceSecurityGroupFF15A567", + "GroupId" + ] + } + ], + "subnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, + "tags": [ + { + "key": "Name", + "value": "FsxLustreStorageTypeStack/HddFsxInstance" + } + ], + "userData": { + "Fn::Base64": "#!/bin/bash" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_ec2.CfnInstance", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_ec2.Instance", + "version": "0.0.0" + } + }, + "BootstrapVersion": { + "id": "BootstrapVersion", + "path": "FsxLustreStorageTypeStack/BootstrapVersion", + "constructInfo": { + "fqn": "aws-cdk-lib.CfnParameter", + "version": "0.0.0" + } + }, + "CheckBootstrapVersion": { + "id": "CheckBootstrapVersion", + "path": "FsxLustreStorageTypeStack/CheckBootstrapVersion", + "constructInfo": { + "fqn": "aws-cdk-lib.CfnRule", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.Stack", + "version": "0.0.0" + } + }, + "FsxLustreStorageTypeTest": { + "id": "FsxLustreStorageTypeTest", + "path": "FsxLustreStorageTypeTest", + "children": { + "DefaultTest": { + "id": "DefaultTest", + "path": "FsxLustreStorageTypeTest/DefaultTest", + "children": { + "Default": { + "id": "Default", + "path": "FsxLustreStorageTypeTest/DefaultTest/Default", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.3.0" + } + }, + "DeployAssert": { + "id": "DeployAssert", + "path": "FsxLustreStorageTypeTest/DefaultTest/DeployAssert", + "children": { + "BootstrapVersion": { + "id": "BootstrapVersion", + "path": "FsxLustreStorageTypeTest/DefaultTest/DeployAssert/BootstrapVersion", + "constructInfo": { + "fqn": "aws-cdk-lib.CfnParameter", + "version": "0.0.0" + } + }, + "CheckBootstrapVersion": { + "id": "CheckBootstrapVersion", + "path": "FsxLustreStorageTypeTest/DefaultTest/DeployAssert/CheckBootstrapVersion", + "constructInfo": { + "fqn": "aws-cdk-lib.CfnRule", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.Stack", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "@aws-cdk/integ-tests-alpha.IntegTestCase", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "@aws-cdk/integ-tests-alpha.IntegTest", + "version": "0.0.0" + } + }, + "Tree": { + "id": "Tree", + "path": "Tree", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.3.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.App", + "version": "0.0.0" + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-fsx/test/integ.lustre-file-system-storage-type.ts b/packages/@aws-cdk-testing/framework-integ/test/aws-fsx/test/integ.lustre-file-system-storage-type.ts new file mode 100644 index 0000000000000..73cb8dc44253b --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-fsx/test/integ.lustre-file-system-storage-type.ts @@ -0,0 +1,73 @@ +import { + AmazonLinuxGeneration, + AmazonLinuxImage, + Instance, + InstanceClass, + InstanceSize, + InstanceType, + SubnetType, + Vpc, +} from 'aws-cdk-lib/aws-ec2'; +import { App, RemovalPolicy, Stack } from 'aws-cdk-lib'; +import { LustreDeploymentType, LustreFileSystem, LustreDataCompressionType, StorageType, DriveCacheType } from 'aws-cdk-lib/aws-fsx'; +import * as integ from '@aws-cdk/integ-tests-alpha'; + +const app = new App(); + +const stack = new Stack(app, 'FsxLustreStorageTypeStack'); + +const vpc = new Vpc(stack, 'Vpc', { restrictDefaultSecurityGroup: false }); + +const ssdFileSystem = new LustreFileSystem(stack, 'FsxLustreFileSystemSsdStorage', { + lustreConfiguration: { + deploymentType: LustreDeploymentType.SCRATCH_2, + dataCompressionType: LustreDataCompressionType.LZ4, + }, + storageCapacityGiB: 1200, + vpc, + vpcSubnet: vpc.privateSubnets[0], + removalPolicy: RemovalPolicy.DESTROY, + storageType: StorageType.SSD, +}); + +const ssdFsxInstance = new Instance(stack, 'SsdFsxInstance', { + instanceType: InstanceType.of(InstanceClass.T2, InstanceSize.LARGE), + machineImage: new AmazonLinuxImage({ + generation: AmazonLinuxGeneration.AMAZON_LINUX_2023, + }), + vpc, + vpcSubnets: { + subnetType: SubnetType.PUBLIC, + }, +}); +ssdFileSystem.connections.allowDefaultPortFrom(ssdFsxInstance); + +const hddFileSystem = new LustreFileSystem(stack, 'FsxLustreFileSystemHddStorage', { + lustreConfiguration: { + deploymentType: LustreDeploymentType.PERSISTENT_1, + dataCompressionType: LustreDataCompressionType.LZ4, + perUnitStorageThroughput: 12, + driveCacheType: DriveCacheType.READ, + }, + storageCapacityGiB: 6000, + vpc, + vpcSubnet: vpc.privateSubnets[1], + removalPolicy: RemovalPolicy.DESTROY, + storageType: StorageType.HDD, +}); + +const hddFsxInstance = new Instance(stack, 'HddFsxInstance', { + instanceType: InstanceType.of(InstanceClass.T2, InstanceSize.LARGE), + machineImage: new AmazonLinuxImage({ + generation: AmazonLinuxGeneration.AMAZON_LINUX_2023, + }), + vpc, + vpcSubnets: { + subnetType: SubnetType.PUBLIC, + }, +}); +hddFileSystem.connections.allowDefaultPortFrom(hddFsxInstance); + +new integ.IntegTest(app, 'FsxLustreStorageTypeTest', { + testCases: [stack], +}); diff --git a/packages/aws-cdk-lib/aws-fsx/README.md b/packages/aws-cdk-lib/aws-fsx/README.md index 61cd2951ef22b..3f5a8db7eb325 100644 --- a/packages/aws-cdk-lib/aws-fsx/README.md +++ b/packages/aws-cdk-lib/aws-fsx/README.md @@ -196,8 +196,8 @@ const lustreConfiguration = { When you turn data compression on for an existing file system, only newly written files are compressed. Existing files are not compressed. For more information, see [Compressing previously written files](https://docs.aws.amazon.com/fsx/latest/LustreGuide/data-compression.html#migrate-compression). - ### Backups + You can take daily automatic backups by setting `automaticBackupRetention` to a non-zero day in the `lustreConfiguration`. Additionally, you can set the backup window by specifying the `dailyAutomaticBackupStartTime`. @@ -217,6 +217,41 @@ const lustreConfiguration = { For more information, see [Working with backups ](https://docs.aws.amazon.com/fsx/latest/LustreGuide/using-backups-fsx.html). +### Storage Type + +By default, FSx for Lustre uses SSD storage. To use HDD storage, specify `storageType`: + +```ts +declare const vpc: ec2.Vpc; + +const fileSystem = new fsx.LustreFileSystem(this, 'FsxLustreFileSystem', { + lustreConfiguration: { deploymentType: fsx.LustreDeploymentType.PERSISTENT_1 }, + storageCapacityGiB: 1200, + vpc, + vpcSubnet: vpc.privateSubnets[0], + storageType: fsx.StorageType.HDD, +}); +``` + +**Note:** The HDD storage type is only supported for `PERSISTENT_1` deployment types. + +To improve the performance of frequently accessed files by caching up to 20% of the total storage capacity of the file system, set `driveCacheType` to `READ`: + +```ts +declare const vpc: ec2.Vpc; + +const fileSystem = new fsx.LustreFileSystem(this, 'FsxLustreFileSystem', { + lustreConfiguration: { + deploymentType: fsx.LustreDeploymentType.PERSISTENT_1, + driveCacheType: fsx.DriveCacheType.READ, + }, + storageCapacityGiB: 1200, + vpc, + vpcSubnet: vpc.privateSubnets[0], + storageType: fsx.StorageType.HDD, +}); +``` + ## FSx for Windows File Server The L2 construct for the FSx for Windows File Server has not yet been implemented. To instantiate an FSx for Windows diff --git a/packages/aws-cdk-lib/aws-fsx/lib/file-system.ts b/packages/aws-cdk-lib/aws-fsx/lib/file-system.ts index a6c1f5c5eaf23..92085a4e708d8 100644 --- a/packages/aws-cdk-lib/aws-fsx/lib/file-system.ts +++ b/packages/aws-cdk-lib/aws-fsx/lib/file-system.ts @@ -2,6 +2,20 @@ import { Connections, IConnectable, ISecurityGroup, IVpc } from '../../aws-ec2'; import { IKey } from '../../aws-kms'; import { RemovalPolicy, Resource } from '../../core'; +/** + * The storage type for the file system. + */ +export enum StorageType { + /** + * Solid State Drive storage + */ + SSD = 'SSD', + /** + * Hard Disk Drive storage + */ + HDD = 'HDD', +} + /** * Interface to implement FSx File Systems. */ @@ -47,9 +61,11 @@ export interface FileSystemProps { /** * 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. + * For SCRATCH_2, PERSISTENT_2 and PERSISTENT_1 deployment types using SSD storage type, the valid values are 1200 GiB, 2400 GiB, and increments of 2400 GiB. + * For PERSISTENT_1 HDD file systems, valid values are increments of 6000 GiB for 12 MB/s/TiB file systems and increments of 1800 GiB for 40 MB/s/TiB file systems. */ readonly storageCapacityGiB: number; @@ -59,6 +75,15 @@ export interface FileSystemProps { * @default RemovalPolicy.RETAIN */ readonly removalPolicy?: RemovalPolicy; + + /** + * The storage type for the file system that you're creating. + * + * @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html#cfn-fsx-filesystem-storagetype + * + * @default StorageType.SSD + */ + readonly storageType?: StorageType; } /** diff --git a/packages/aws-cdk-lib/aws-fsx/lib/lustre-file-system.ts b/packages/aws-cdk-lib/aws-fsx/lib/lustre-file-system.ts index 58803107856d5..b25d3f0f157f9 100644 --- a/packages/aws-cdk-lib/aws-fsx/lib/lustre-file-system.ts +++ b/packages/aws-cdk-lib/aws-fsx/lib/lustre-file-system.ts @@ -1,6 +1,6 @@ import { Construct } from 'constructs'; import { DailyAutomaticBackupStartTime } from './daily-automatic-backup-start-time'; -import { FileSystemAttributes, FileSystemBase, FileSystemProps, IFileSystem } from './file-system'; +import { FileSystemAttributes, FileSystemBase, FileSystemProps, IFileSystem, StorageType } from './file-system'; import { CfnFileSystem } from './fsx.generated'; import { LustreMaintenanceTime } from './maintenance-time'; import { Connections, ISecurityGroup, ISubnet, Port, SecurityGroup } from '../../aws-ec2'; @@ -51,6 +51,20 @@ export enum LustreAutoImportPolicy { NEW_CHANGED_DELETED = 'NEW_CHANGED_DELETED', } +/** + * The type of drive cache used by PERSISTENT_1 file systems that are provisioned with HDD storage devices. + */ +export enum DriveCacheType { + /** + * The Lustre file system is configured with no data cache. + */ + NONE = 'NONE', + /** + * The Lustre file system is configured with a read cache. + */ + READ = 'READ', +} + /** * The permitted Lustre data compression algorithms */ @@ -129,10 +143,15 @@ export interface LustreConfiguration { readonly dataCompressionType?: LustreDataCompressionType; /** - * Required for the PERSISTENT_1 deployment type, describes the amount of read and write throughput for each 1 - * tebibyte of storage, in MB/s/TiB. Valid values are 50, 100, 200. + * Provisions the amount of read and write throughput for each 1 tebibyte (TiB) of file system storage capacity, in MB/s/TiB. + * Required with PERSISTENT_1 and PERSISTENT_2 deployment types. * - * @default - no default, conditionally required for PERSISTENT_1 deployment type + * Valid values: + * - For PERSISTENT_1 SSD storage: 50, 100, 200 MB/s/TiB. + * - For PERSISTENT_1 HDD storage: 12, 40 MB/s/TiB. + * - For PERSISTENT_2 SSD storage: 125, 250, 500, 1000 MB/s/TiB. + * + * @default - no default, conditionally required for PERSISTENT_1 and PERSISTENT_2 deployment type */ readonly perUnitStorageThroughput?: number; @@ -170,6 +189,12 @@ export interface LustreConfiguration { */ readonly dailyAutomaticBackupStartTime?: DailyAutomaticBackupStartTime; + /** + * The type of drive cache used by PERSISTENT_1 file systems that are provisioned with HDD storage devices. + * + * @default - no drive cache + */ + readonly driveCacheType?: DriveCacheType; } /** @@ -270,6 +295,7 @@ export class LustreFileSystem extends FileSystemBase { weeklyMaintenanceStartTime: props.lustreConfiguration.weeklyMaintenanceStartTime?.toTimestamp(), automaticBackupRetentionDays: props.lustreConfiguration.automaticBackupRetention?.toDays(), dailyAutomaticBackupStartTime: props.lustreConfiguration.dailyAutomaticBackupStartTime?.toTimestamp(), + driveCacheType: props.lustreConfiguration.driveCacheType ?? (props.storageType === StorageType.HDD ? DriveCacheType.NONE : undefined), }; const lustreConfiguration = Object.assign({}, props.lustreConfiguration, updatedLustureProps); @@ -289,6 +315,7 @@ export class LustreFileSystem extends FileSystemBase { lustreConfiguration, securityGroupIds: [securityGroup.securityGroupId], storageCapacity: props.storageCapacityGiB, + storageType: props.storageType, }); this.fileSystem.applyRemovalPolicy(props.removalPolicy); @@ -303,6 +330,7 @@ export class LustreFileSystem extends FileSystemBase { private validateProps(props: LustreFileSystemProps) { const lustreConfiguration = props.lustreConfiguration; const deploymentType = lustreConfiguration.deploymentType; + const perUnitStorageThroughput = lustreConfiguration.perUnitStorageThroughput; // Make sure the import path is valid before validating the export path this.validateImportPath(lustreConfiguration.importPath); @@ -310,12 +338,36 @@ export class LustreFileSystem extends FileSystemBase { this.validateImportedFileChunkSize(lustreConfiguration.importedFileChunkSizeMiB); this.validateAutoImportPolicy(deploymentType, lustreConfiguration.importPath, lustreConfiguration.autoImportPolicy); - this.validatePerUnitStorageThroughput(deploymentType, lustreConfiguration.perUnitStorageThroughput); - this.validateStorageCapacity(deploymentType, props.storageCapacityGiB); this.validateAutomaticBackupRetention(deploymentType, lustreConfiguration.automaticBackupRetention); this.validateDailyAutomaticBackupStartTime(lustreConfiguration.automaticBackupRetention, lustreConfiguration.dailyAutomaticBackupStartTime); + this.validatePerUnitStorageThroughput(deploymentType, perUnitStorageThroughput, props.storageType); + this.validateStorageCapacity(deploymentType, props.storageCapacityGiB, props.storageType, perUnitStorageThroughput); + this.validateStorageType(deploymentType, props.storageType); + this.validateDriveCacheType(deploymentType, props.storageType, lustreConfiguration.driveCacheType); + } + + /** + * Validates the drive cache type is only set for the PERSISTENT_1 deployment type and HDD storage type. + */ + private validateDriveCacheType(deploymentType: LustreDeploymentType, storageType?: StorageType, driveCacheType?: DriveCacheType): void { + if (!driveCacheType) return; + + if (deploymentType !== LustreDeploymentType.PERSISTENT_1 || storageType !== StorageType.HDD) { + throw new Error(`driveCacheType can only be set for PERSISTENT_1 HDD storage type, got: ${deploymentType} and ${storageType}`); + } + } + + /** + * Validates if the storage type corresponds to the appropriate deployment type. + */ + private validateStorageType(deploymentType: LustreDeploymentType, storageType?: StorageType): void { + if (!storageType) return; + + if (storageType === StorageType.HDD && deploymentType !== LustreDeploymentType.PERSISTENT_1) { + throw new Error(`Storage type HDD is only supported for PERSISTENT_1 deployment type, got: ${deploymentType}`); + } } /** @@ -383,8 +435,14 @@ export class LustreFileSystem extends FileSystemBase { /** * Validates the perUnitStorageThroughput is defined correctly for the given deploymentType. + * + * @see https://docs.aws.amazon.com/fsx/latest/LustreGuide/managing-throughput-capacity.html */ - private validatePerUnitStorageThroughput(deploymentType: LustreDeploymentType, perUnitStorageThroughput?: number) { + private validatePerUnitStorageThroughput( + deploymentType: LustreDeploymentType, + perUnitStorageThroughput?: number, + storageType?: StorageType, + ): void { if (perUnitStorageThroughput === undefined) { return; } if (deploymentType !== LustreDeploymentType.PERSISTENT_1 && deploymentType !== LustreDeploymentType.PERSISTENT_2) { @@ -392,29 +450,59 @@ export class LustreFileSystem extends FileSystemBase { } if (deploymentType === LustreDeploymentType.PERSISTENT_1) { - if (![50, 100, 200].includes(perUnitStorageThroughput)) { - throw new Error('perUnitStorageThroughput must be 50, 100, or 200 MB/s/TiB for PERSISTENT_1 deployment type, got: ' + perUnitStorageThroughput); + if (storageType === StorageType.HDD && ![12, 40].includes(perUnitStorageThroughput)) { + throw new Error(`perUnitStorageThroughput must be 12 or 40 MB/s/TiB for PERSISTENT_1 HDD storage, got: ${perUnitStorageThroughput}`); + } + if ((storageType === undefined || storageType === StorageType.SSD) && ![50, 100, 200].includes(perUnitStorageThroughput)) { + throw new Error('perUnitStorageThroughput must be 50, 100, or 200 MB/s/TiB for PERSISTENT_1 SSD storage, got: ' + perUnitStorageThroughput); } } if (deploymentType === LustreDeploymentType.PERSISTENT_2) { if (![125, 250, 500, 1000].includes(perUnitStorageThroughput)) { - throw new Error('perUnitStorageThroughput must be 125, 250, 500 or 1000 MB/s/TiB for PERSISTENT_2 deployment type, got: ' + perUnitStorageThroughput); + throw new Error(`perUnitStorageThroughput must be 125, 250, 500 or 1000 MB/s/TiB for PERSISTENT_2 deployment type, got: ${perUnitStorageThroughput}`); } } } /** * Validates the storage capacity is an acceptable value for the deployment type. - */ - private validateStorageCapacity(deploymentType: LustreDeploymentType, storageCapacity: number): void { + * + * @see https://docs.aws.amazon.com/fsx/latest/LustreGuide/increase-storage-capacity.html + */ + private validateStorageCapacity( + deploymentType: LustreDeploymentType, + storageCapacity: number, + storageType?: StorageType, + perUnitStorageThroughput?: number, + ): void { if (deploymentType === LustreDeploymentType.SCRATCH_1) { if (![1200, 2400, 3600].includes(storageCapacity) && storageCapacity % 3600 !== 0) { - throw new Error('storageCapacity must be 1,200, 2,400, 3,600, or a multiple of 3,600'); + throw new Error(`storageCapacity must be 1,200, 2,400, 3,600, or a multiple of 3,600 for SCRATCH_1 deployment type, got ${storageCapacity}.`); } - } else { + } + + if ( + deploymentType === LustreDeploymentType.PERSISTENT_2 + || deploymentType === LustreDeploymentType.SCRATCH_2 + ) { if (![1200, 2400].includes(storageCapacity) && storageCapacity % 2400 !== 0) { - throw new Error('storageCapacity must be 1,200, 2,400, or a multiple of 2,400'); + throw new Error(`storageCapacity must be 1,200, 2,400, or a multiple of 2,400 for SCRATCH_2 and PERSISTENT_2 deployment types, got ${storageCapacity}`); + } + } + + if (deploymentType === LustreDeploymentType.PERSISTENT_1) { + if (storageType === StorageType.HDD) { + if (perUnitStorageThroughput === 12 && storageCapacity % 6000 !== 0) { + throw new Error(`storageCapacity must be a multiple of 6,000 for PERSISTENT_1 HDD storage with 12 MB/s/TiB throughput, got ${storageCapacity}`); + } + if (perUnitStorageThroughput === 40 && storageCapacity % 1800 !== 0) { + throw new Error(`storageCapacity must be a multiple of 1,800 for PERSISTENT_1 HDD storage with 40 MB/s/TiB throughput, got ${storageCapacity}`); + } + } else { + if (![1200, 2400].includes(storageCapacity) && storageCapacity % 2400 !== 0) { + throw new Error(`storageCapacity must be 1,200, 2,400, or a multiple of 2,400 for PERSISTENT_1 SSD storage, got ${storageCapacity}`); + } } } } diff --git a/packages/aws-cdk-lib/aws-fsx/test/lustre-file-system.test.ts b/packages/aws-cdk-lib/aws-fsx/test/lustre-file-system.test.ts index 00aeaf10a2d6d..a0decddad2880 100644 --- a/packages/aws-cdk-lib/aws-fsx/test/lustre-file-system.test.ts +++ b/packages/aws-cdk-lib/aws-fsx/test/lustre-file-system.test.ts @@ -3,7 +3,18 @@ import { Template } from '../../assertions'; import { ISubnet, Port, SecurityGroup, Subnet, Vpc } from '../../aws-ec2'; import { Key } from '../../aws-kms'; import { Aws, Duration, Stack, Token } from '../../core'; -import { LustreConfiguration, LustreDeploymentType, LustreAutoImportPolicy, LustreFileSystem, LustreMaintenanceTime, Weekday, LustreDataCompressionType, DailyAutomaticBackupStartTime } from '../lib'; +import { + LustreConfiguration, + LustreDeploymentType, + LustreAutoImportPolicy, + LustreFileSystem, + LustreMaintenanceTime, + Weekday, + LustreDataCompressionType, + DailyAutomaticBackupStartTime, + StorageType, + DriveCacheType, +} from '../lib'; describe('FSx for Lustre File System', () => { let lustreConfiguration: LustreConfiguration; @@ -502,12 +513,12 @@ describe('FSx for Lustre File System', () => { }); }); - describe('perUnitStorageThroughput', () => { + describe('perUnitStorageThroughput_PERSISTENT_1', () => { test.each([ 50, 100, 200, - ])('valid perUnitStorageThroughput of %d', (throughput: number) => { + ])('valid perUnitStorageThroughput of %d for SSD storage', (throughput: number) => { lustreConfiguration = { deploymentType: LustreDeploymentType.PERSISTENT_1, perUnitStorageThroughput: throughput, @@ -534,7 +545,7 @@ describe('FSx for Lustre File System', () => { 250, 500, 1000, - ])('invalid perUnitStorageThroughput', (invalidValue: number) => { + ])('invalid perUnitStorageThroughput for SSD storage', (invalidValue: number) => { lustreConfiguration = { deploymentType: LustreDeploymentType.PERSISTENT_1, perUnitStorageThroughput: invalidValue, @@ -547,7 +558,48 @@ describe('FSx for Lustre File System', () => { vpc, vpcSubnet, }); - }).toThrowError('perUnitStorageThroughput must be 50, 100, or 200 MB/s/TiB for PERSISTENT_1 deployment type, got: ' + invalidValue); + }).toThrowError('perUnitStorageThroughput must be 50, 100, or 200 MB/s/TiB for PERSISTENT_1 SSD storage, got: ' + invalidValue); + }); + + test.each([12, 40])('valid perUnitStorageThroughput of %d for HDD storage', (validValue: number) => { + lustreConfiguration = { + deploymentType: LustreDeploymentType.PERSISTENT_1, + perUnitStorageThroughput: validValue, + }; + storageCapacity = 18000; + + new LustreFileSystem(stack, 'FsxFileSystem', { + lustreConfiguration, + storageCapacityGiB: storageCapacity, + vpc, + vpcSubnet, + storageType: StorageType.HDD, + }); + + Template.fromStack(stack).hasResourceProperties('AWS::FSx::FileSystem', { + LustreConfiguration: { + DeploymentType: LustreDeploymentType.PERSISTENT_1, + PerUnitStorageThroughput: validValue, + }, + StorageType: StorageType.HDD, + }); + }); + + test.each([1, 50, 100, 125, 200, 250, 500, 1000])('invalid perUnitStorageThroughput of %d for HDD storage', (invalidValue: number) => { + lustreConfiguration = { + deploymentType: LustreDeploymentType.PERSISTENT_1, + perUnitStorageThroughput: invalidValue, + }; + + expect(() => { + new LustreFileSystem(stack, 'FsxFileSystem', { + lustreConfiguration, + storageCapacityGiB: storageCapacity, + vpc, + vpcSubnet, + storageType: StorageType.HDD, + }); + }).toThrow('perUnitStorageThroughput must be 12 or 40 MB/s/TiB for PERSISTENT_1 HDD storage, got: ' + invalidValue); }); test('setting perUnitStorageThroughput on wrong deploymentType', () => { @@ -704,6 +756,69 @@ describe('FSx for Lustre File System', () => { }); }).toThrowError(/storageCapacity must be 1,200, 2,400, 3,600, or a multiple of 3,600/); }); + + test.each([ + [6000, 12], + [12000, 12], + [1800, 40], + [3600, 40], + ])('proper multiple for storage capacity using %d with PERSISTENT_1 HDD', (validValue: number, throughput: number) => { + lustreConfiguration = { + deploymentType: LustreDeploymentType.PERSISTENT_1, + perUnitStorageThroughput: throughput, + }; + + new LustreFileSystem(stack, 'FsxFileSystem', { + lustreConfiguration, + storageCapacityGiB: validValue, + vpc, + vpcSubnet, + storageType: StorageType.HDD, + }); + + Template.fromStack(stack).hasResourceProperties('AWS::FSx::FileSystem', { + LustreConfiguration: { + DeploymentType: LustreDeploymentType.PERSISTENT_1, + PerUnitStorageThroughput: throughput, + }, + StorageCapacity: validValue, + StorageType: StorageType.HDD, + }); + }); + + test.each([1, 6001])('invalid value of %d for storage capacity with PERSISTENT_1 HDD with 12 MB/s/TiB throughput', (invalidValue: number) => { + lustreConfiguration = { + deploymentType: LustreDeploymentType.PERSISTENT_1, + perUnitStorageThroughput: 12, + }; + + expect(() => { + new LustreFileSystem(stack, 'FsxFileSystem', { + lustreConfiguration, + storageCapacityGiB: invalidValue, + vpc, + vpcSubnet, + storageType: StorageType.HDD, + }); + }).toThrow('storageCapacity must be a multiple of 6,000 for PERSISTENT_1 HDD storage with 12 MB/s/TiB throughput'); + }); + + test.each([1, 1801])('invalid value of %d for storage capacity with PERSISTENT_1 HDD with 40 MB/s/TiB throughput', (invalidValue: number) => { + lustreConfiguration = { + deploymentType: LustreDeploymentType.PERSISTENT_1, + perUnitStorageThroughput: 40, + }; + + expect(() => { + new LustreFileSystem(stack, 'FsxFileSystem', { + lustreConfiguration, + storageCapacityGiB: invalidValue, + vpc, + vpcSubnet, + storageType: StorageType.HDD, + }); + }).toThrow('storageCapacity must be a multiple of 1,800 for PERSISTENT_1 HDD storage with 40 MB/s/TiB throughput'); + }); }); describe('automaticBackupRetention', () => { @@ -794,6 +909,84 @@ describe('FSx for Lustre File System', () => { }); }).toThrow('automaticBackupRetention period must be set a non-zero day when dailyAutomaticBackupStartTime is set'); }); + + test.each([ + LustreDeploymentType.PERSISTENT_2, + LustreDeploymentType.SCRATCH_1, + LustreDeploymentType.SCRATCH_2, + ])('HDD storage type is not supported for %s', (deploymentType: LustreDeploymentType) => { + lustreConfiguration = { + deploymentType, + }; + + expect(() => { + new LustreFileSystem(stack, 'FsxFileSystem', { + lustreConfiguration, + storageCapacityGiB: storageCapacity, + vpc, + vpcSubnet, + storageType: StorageType.HDD, + }); + }).toThrow(`Storage type HDD is only supported for PERSISTENT_1 deployment type, got: ${deploymentType}`); + }); + + test.each([{ + deploymentType: LustreDeploymentType.PERSISTENT_1, + storageType: StorageType.SSD, + driveCacheType: DriveCacheType.READ, + }, + { + deploymentType: LustreDeploymentType.PERSISTENT_1, + storageType: StorageType.SSD, + driveCacheType: DriveCacheType.NONE, + }, + { + deploymentType: LustreDeploymentType.PERSISTENT_2, + storageType: StorageType.SSD, + driveCacheType: DriveCacheType.READ, + }, + { + deploymentType: LustreDeploymentType.PERSISTENT_2, + storageType: StorageType.SSD, + driveCacheType: DriveCacheType.NONE, + }])('throw error for invalid drive cache type', (props) => { + lustreConfiguration = { + deploymentType: props.deploymentType, + driveCacheType: props.driveCacheType, + }; + + expect(() => { + new LustreFileSystem(stack, 'FsxFileSystem', { + lustreConfiguration, + storageCapacityGiB: storageCapacity, + vpc, + vpcSubnet, + storageType: props.storageType, + }); + }).toThrow(`driveCacheType can only be set for PERSISTENT_1 HDD storage type, got: ${props.deploymentType} and ${props.storageType}`); + }); + }); + }); + + test.each([StorageType.SSD, StorageType.HDD])('specify storage type %s', (storageType: StorageType) => { + lustreConfiguration = { + deploymentType: LustreDeploymentType.PERSISTENT_1, + }; + + new LustreFileSystem(stack, 'FsxFileSystem', { + lustreConfiguration, + storageCapacityGiB: storageCapacity, + vpc, + vpcSubnet, + storageType, + }); + + Template.fromStack(stack).hasResourceProperties('AWS::FSx::FileSystem', { + LustreConfiguration: { + DeploymentType: LustreDeploymentType.PERSISTENT_1, + ...( storageType === StorageType.HDD ? { DriveCacheType: 'NONE' } : undefined ), + }, + StorageType: storageType, }); }); @@ -834,4 +1027,4 @@ describe('FSx for Lustre File System', () => { }, }); }); -}); \ No newline at end of file +}); From 1ab6c4c3bf25c378f7fa6a575e082ad4051692e9 Mon Sep 17 00:00:00 2001 From: Kaizen Conroy <36202692+kaizencc@users.noreply.github.com> Date: Fri, 11 Oct 2024 02:48:16 -0400 Subject: [PATCH 4/5] chore: sync workflow needs git-lfs (#31708) i believe this is necessary as CDK requires git-lfs now. ---- *By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license* --- .github/workflows/sync-from-upstream.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/sync-from-upstream.yml b/.github/workflows/sync-from-upstream.yml index fba99dd721aba..924317761ac37 100644 --- a/.github/workflows/sync-from-upstream.yml +++ b/.github/workflows/sync-from-upstream.yml @@ -43,15 +43,21 @@ jobs: contents: write needs: [check-secret] steps: - - name: Checkout using User Token + - name: Checkout using User Token (+ download lfs dependencies) if: needs.check-secret.outputs.ok == 'true' uses: actions/checkout@v4 with: + lfs: true token: ${{ secrets.PROJEN_GITHUB_TOKEN }} - - name: Checkout using GitHub Actions permissions + - name: Checkout using GitHub Actions permissions (+ download lfs dependencies) if: needs.check-secret.outputs.ok == 'false' uses: actions/checkout@v4 + with: + lfs: true + + - name: Checkout LFS objects + run: git lfs checkout - name: Sync from aws/aws-cdk run: |- From cd324d028e03215e877f13a26992ebd5a2b4db03 Mon Sep 17 00:00:00 2001 From: Rico Hermans Date: Fri, 11 Oct 2024 15:45:37 +0200 Subject: [PATCH 5/5] fix(cli): `cdk import` errors with 'S3 error: Access Denied' (#31727) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In #31597 we changed `cdk diff` to always use the file asset publishing role, instead of direct CLI credentials. This included a refactor that impacted `cdk import`, which was now not uploading the stack template at all anymore. The operation that is now broken only happens in a case with interactive input, which is why this wasn't caught by integ tests. In this change, put the requisite asset-handling code around `makeBodyParameter` to make the asset uploading happen properly. In future PRs: - Add an integration test for `cdk import` which would have exposed the same error. - Refactor the contract of `makeBodyParameter`, and perhaps more around asset uploading, to make the expectations and promises of that function more clear; right now it was not obvious what the function would and wouldn't do for you, which led to this error. I did some refactorings in this PR already (renames, removing an unused argument). I saw an opportunity for more but didn't want to add risk and delay to this patch. Hence, forthcoming 😄 . Closes #31716. ---- *By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license* --- packages/aws-cdk/lib/api/deployments.ts | 44 ++++++++++----- .../aws-cdk/lib/api/util/cloudformation.ts | 56 +++++++++++-------- packages/aws-cdk/lib/cdk-toolkit.ts | 4 -- 3 files changed, 62 insertions(+), 42 deletions(-) diff --git a/packages/aws-cdk/lib/api/deployments.ts b/packages/aws-cdk/lib/api/deployments.ts index d5b6f8a63e987..27cf27e135cc3 100644 --- a/packages/aws-cdk/lib/api/deployments.ts +++ b/packages/aws-cdk/lib/api/deployments.ts @@ -12,7 +12,7 @@ import { deployStack, DeployStackResult, destroyStack, DeploymentMethod } from ' import { EnvironmentResources, EnvironmentResourcesRegistry } from './environment-resources'; import { HotswapMode } from './hotswap/common'; import { loadCurrentTemplateWithNestedStacks, loadCurrentTemplate, RootTemplateWithNestedStacks } from './nested-stack-helpers'; -import { CloudFormationStack, Template, ResourcesToImport, ResourceIdentifierSummaries, stabilizeStack } from './util/cloudformation'; +import { CloudFormationStack, Template, ResourcesToImport, ResourceIdentifierSummaries, stabilizeStack, uploadStackTemplateAssets } from './util/cloudformation'; import { StackActivityMonitor, StackActivityProgress } from './util/cloudformation/stack-activity-monitor'; import { StackEventPoller } from './util/cloudformation/stack-event-poller'; import { RollbackChoice } from './util/cloudformation/stack-status'; @@ -292,13 +292,6 @@ interface AssetOptions { */ readonly stack: cxapi.CloudFormationStackArtifact; - /** - * Name of the toolkit stack, if not the default name. - * - * @default 'CDKToolkit' - */ - readonly toolkitStackName?: string; - /** * Execution role for the building. * @@ -426,14 +419,29 @@ export class Deployments { const { stackSdk, resolvedEnvironment, envResources } = await this.prepareSdkFor(stackArtifact, undefined, Mode.ForReading); const cfn = stackSdk.cloudFormation(); + await uploadStackTemplateAssets(stackArtifact, this); + // Upload the template, if necessary, before passing it to CFN + const builder = new AssetManifestBuilder(); const cfnParam = await makeBodyParameter( stackArtifact, resolvedEnvironment, - new AssetManifestBuilder(), + builder, envResources, stackSdk); + // If the `makeBodyParameter` before this added assets, make sure to publish them before + // calling the API. + const addedAssets = builder.toManifest(stackArtifact.assembly.directory); + for (const entry of addedAssets.entries) { + await this.buildSingleAsset('no-version-validation', addedAssets, entry, { + stack: stackArtifact, + }); + await this.publishSingleAsset(addedAssets, entry, { + stack: stackArtifact, + }); + } + const response = await cfn.getTemplateSummary(cfnParam).promise(); if (!response.ResourceIdentifierSummaries) { debug('GetTemplateSummary API call did not return "ResourceIdentifierSummaries"'); @@ -805,16 +813,22 @@ export class Deployments { /** * Build a single asset from an asset manifest + * + * If an assert manifest artifact is given, the bootstrap stack version + * will be validated according to the constraints in that manifest artifact. + * If that is not necessary, `'no-version-validation'` can be passed. */ // eslint-disable-next-line max-len - public async buildSingleAsset(assetArtifact: cxapi.AssetManifestArtifact, assetManifest: AssetManifest, asset: IManifestEntry, options: BuildStackAssetsOptions) { + public async buildSingleAsset(assetArtifact: cxapi.AssetManifestArtifact | 'no-version-validation', assetManifest: AssetManifest, asset: IManifestEntry, options: BuildStackAssetsOptions) { const { resolvedEnvironment, envResources } = await this.prepareSdkFor(options.stack, options.roleArn, Mode.ForWriting); - await this.validateBootstrapStackVersion( - options.stack.stackName, - assetArtifact.requiresBootstrapStackVersion, - assetArtifact.bootstrapStackVersionSsmParameter, - envResources); + if (assetArtifact !== 'no-version-validation') { + await this.validateBootstrapStackVersion( + options.stack.stackName, + assetArtifact.requiresBootstrapStackVersion, + assetArtifact.bootstrapStackVersionSsmParameter, + envResources); + } const publisher = this.cachedPublisher(assetManifest, resolvedEnvironment, options.stackName); await publisher.buildEntry(asset); diff --git a/packages/aws-cdk/lib/api/util/cloudformation.ts b/packages/aws-cdk/lib/api/util/cloudformation.ts index 85a2742449da0..ab01db3aec1ab 100644 --- a/packages/aws-cdk/lib/api/util/cloudformation.ts +++ b/packages/aws-cdk/lib/api/util/cloudformation.ts @@ -305,7 +305,6 @@ export type PrepareChangeSetOptions = { sdkProvider: SdkProvider; stream: NodeJS.WritableStream; parameters: { [name: string]: string | undefined }; - toolkitStackName?: string; resourcesToImport?: ResourcesToImport; } @@ -342,12 +341,14 @@ export async function createDiffChangeSet(options: PrepareChangeSetOptions): Pro } /** - * Returns all file entries from an AssetManifestArtifact. This is used in the - * `uploadBodyParameterAndCreateChangeSet` function to find all template asset files to build and publish. + * Returns all file entries from an AssetManifestArtifact that look like templates. + * + * This is used in the `uploadBodyParameterAndCreateChangeSet` function to find + * all template asset files to build and publish. * * Returns a tuple of [AssetManifest, FileManifestEntry[]] */ -function fileEntriesFromAssetManifestArtifact(artifact: cxapi.AssetManifestArtifact): [AssetManifest, FileManifestEntry[]] { +function templatesFromAssetManifestArtifact(artifact: cxapi.AssetManifestArtifact): [AssetManifest, FileManifestEntry[]] { const assets: (FileManifestEntry)[] = []; const fileName = artifact.file; const assetManifest = AssetManifest.fromFile(fileName); @@ -365,25 +366,7 @@ function fileEntriesFromAssetManifestArtifact(artifact: cxapi.AssetManifestArtif async function uploadBodyParameterAndCreateChangeSet(options: PrepareChangeSetOptions): Promise { try { - for (const artifact of options.stack.dependencies) { - // Skip artifact if it is not an Asset Manifest Artifact - if (!cxapi.AssetManifestArtifact.isAssetManifestArtifact(artifact)) { - continue; - } - - // Build and publish each file entry of the Asset Manifest Artifact: - const [assetManifest, file_entries] = fileEntriesFromAssetManifestArtifact(artifact); - for (const entry of file_entries) { - await options.deployments.buildSingleAsset(artifact, assetManifest, entry, { - stack: options.stack, - toolkitStackName: options.toolkitStackName, - }); - await options.deployments.publishSingleAsset(assetManifest, entry, { - stack: options.stack, - toolkitStackName: options.toolkitStackName, - }); - } - } + await uploadStackTemplateAssets(options.stack, options.deployments); const preparedSdk = (await options.deployments.prepareSdkWithDeployRole(options.stack)); const bodyParameter = await makeBodyParameter( @@ -419,6 +402,33 @@ async function uploadBodyParameterAndCreateChangeSet(options: PrepareChangeSetOp } } +/** + * Uploads the assets that look like templates for this CloudFormation stack + * + * This is necessary for any CloudFormation call that needs the template, it may need + * to be uploaded to an S3 bucket first. We have to follow the instructions in the + * asset manifest, because technically that is the only place that knows about + * bucket and assumed roles and such. + */ +export async function uploadStackTemplateAssets(stack: cxapi.CloudFormationStackArtifact, deployments: Deployments) { + for (const artifact of stack.dependencies) { + // Skip artifact if it is not an Asset Manifest Artifact + if (!cxapi.AssetManifestArtifact.isAssetManifestArtifact(artifact)) { + continue; + } + + const [assetManifest, file_entries] = templatesFromAssetManifestArtifact(artifact); + for (const entry of file_entries) { + await deployments.buildSingleAsset(artifact, assetManifest, entry, { + stack, + }); + await deployments.publishSingleAsset(assetManifest, entry, { + stack, + }); + } + } +} + async function createChangeSet(options: CreateChangeSetOptions): Promise { await cleanupOldChangeset(options.changeSetName, options.stack.stackName, options.cfn); diff --git a/packages/aws-cdk/lib/cdk-toolkit.ts b/packages/aws-cdk/lib/cdk-toolkit.ts index e72dc8e9a7ddc..5b823548413b1 100644 --- a/packages/aws-cdk/lib/cdk-toolkit.ts +++ b/packages/aws-cdk/lib/cdk-toolkit.ts @@ -186,7 +186,6 @@ export class CdkToolkit { parameters: Object.assign({}, parameterMap['*'], parameterMap[stack.stackName]), resourcesToImport, stream, - toolkitStackName: options.toolkitStackName, }); } else { debug(`the stack '${stack.stackName}' has not been deployed to CloudFormation or describeStacks call failed, skipping changeset creation.`); @@ -246,7 +245,6 @@ export class CdkToolkit { await this.props.deployments.buildSingleAsset(assetNode.assetManifestArtifact, assetNode.assetManifest, assetNode.asset, { stack: assetNode.parentStack, roleArn: options.roleArn, - toolkitStackName: options.toolkitStackName, stackName: assetNode.parentStack.stackName, }); }; @@ -255,7 +253,6 @@ export class CdkToolkit { await this.props.deployments.publishSingleAsset(assetNode.assetManifest, assetNode.asset, { stack: assetNode.parentStack, roleArn: options.roleArn, - toolkitStackName: options.toolkitStackName, stackName: assetNode.parentStack.stackName, }); }; @@ -1030,7 +1027,6 @@ export class CdkToolkit { await graph.removeUnnecessaryAssets(assetNode => this.props.deployments.isSingleAssetPublished(assetNode.assetManifest, assetNode.asset, { stack: assetNode.parentStack, roleArn: options.roleArn, - toolkitStackName: options.toolkitStackName, stackName: assetNode.parentStack.stackName, })); }