diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-backup/test/integ.backup.js.snapshot/cdk-backup.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-backup/test/integ.backup.js.snapshot/cdk-backup.assets.json index 19ddf51ac30c3..7f204fd01f16f 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-backup/test/integ.backup.js.snapshot/cdk-backup.assets.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-backup/test/integ.backup.js.snapshot/cdk-backup.assets.json @@ -1,7 +1,8 @@ { - "version": "32.0.0", + "version": "41.0.0", "files": { - "0c52c355c71ac95690274d7987110017ff9cd1a1bc79fa4206fda2f55d6b62d5": { + "760c101371a429c55068a22fedc9e6142b40e6ab6fab56af785c79b737df5ca4": { + "displayName": "cdk-backup Template", "source": { "path": "cdk-backup.template.json", "packaging": "file" @@ -9,7 +10,7 @@ "destinations": { "current_account-current_region": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "0c52c355c71ac95690274d7987110017ff9cd1a1bc79fa4206fda2f55d6b62d5.json", + "objectKey": "760c101371a429c55068a22fedc9e6142b40e6ab6fab56af785c79b737df5ca4.json", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" } } diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-backup/test/integ.backup.js.snapshot/cdk-backup.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-backup/test/integ.backup.js.snapshot/cdk-backup.template.json index 2722b98da789d..777c3bc198f7d 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-backup/test/integ.backup.js.snapshot/cdk-backup.template.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-backup/test/integ.backup.js.snapshot/cdk-backup.template.json @@ -132,6 +132,13 @@ } } ], + "IndexActions": [ + { + "ResourceTypes": [ + "S3" + ] + } + ], "RecoveryPointTags": { "stage": "prod" }, diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-backup/test/integ.backup.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-backup/test/integ.backup.js.snapshot/cdk.out index f0b901e7c06e5..188478b55560e 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-backup/test/integ.backup.js.snapshot/cdk.out +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-backup/test/integ.backup.js.snapshot/cdk.out @@ -1 +1 @@ -{"version":"32.0.0"} \ No newline at end of file +{"version":"41.0.0"} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-backup/test/integ.backup.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-backup/test/integ.backup.js.snapshot/integ.json index 266124ac58c12..2130c5bf5cfab 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-backup/test/integ.backup.js.snapshot/integ.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-backup/test/integ.backup.js.snapshot/integ.json @@ -1,5 +1,5 @@ { - "version": "33.0.0", + "version": "42.0.0", "testCases": { "integ.backup": { "stacks": [ @@ -10,5 +10,6 @@ } }, "synthContext": {}, - "enableLookups": false + "enableLookups": false, + "minimumCliVersion": "2.1006.0" } \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-backup/test/integ.backup.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-backup/test/integ.backup.js.snapshot/manifest.json index aa4d73d1faac8..9b143cedf4eb4 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-backup/test/integ.backup.js.snapshot/manifest.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-backup/test/integ.backup.js.snapshot/manifest.json @@ -1,5 +1,5 @@ { - "version": "33.0.0", + "version": "42.0.0", "artifacts": { "cdk-backup.assets": { "type": "cdk:asset-manifest", @@ -14,10 +14,11 @@ "environment": "aws://unknown-account/unknown-region", "properties": { "templateFile": "cdk-backup.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}/0c52c355c71ac95690274d7987110017ff9cd1a1bc79fa4206fda2f55d6b62d5.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/760c101371a429c55068a22fedc9e6142b40e6ab6fab56af785c79b737df5ca4.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ @@ -33,24 +34,64 @@ "cdk-backup.assets" ], "metadata": { + "/cdk-backup/Table": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "partitionKey": { + "name": "*", + "type": "S" + }, + "removalPolicy": "destroy" + } + } + ], "/cdk-backup/Table/Resource": [ { "type": "aws:cdk:logicalId", "data": "TableCD117FA1" } ], + "/cdk-backup/Table/ScalingRole": [ + { + "type": "aws:cdk:analytics:construct", + "data": "*" + } + ], "/cdk-backup/FileSystem": [ { "type": "aws:cdk:logicalId", "data": "FileSystem" } ], + "/cdk-backup/Vault": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "removalPolicy": "destroy", + "lockConfiguration": { + "minRetention": "*" + } + } + } + ], "/cdk-backup/Vault/Resource": [ { "type": "aws:cdk:logicalId", "data": "Vault23237E5B" } ], + "/cdk-backup/SecondaryVault": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "removalPolicy": "destroy", + "lockConfiguration": { + "minRetention": "*" + } + } + } + ], "/cdk-backup/SecondaryVault/Resource": [ { "type": "aws:cdk:logicalId", @@ -63,18 +104,117 @@ "data": "Env" } ], + "/cdk-backup/ThirdVault": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "removalPolicy": "destroy", + "backupVaultName": "*", + "lockConfiguration": { + "minRetention": "*" + } + } + } + ], "/cdk-backup/ThirdVault/Resource": [ { "type": "aws:cdk:logicalId", "data": "ThirdVault3441C01E" } ], + "/cdk-backup/Plan": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "backupVault": "*" + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addRule": [ + {} + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addRule": [ + {} + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addRule": [ + {} + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addSelection": [ + "*", + { + "resources": "*" + } + ] + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addRule": [ + {} + ] + } + } + ], "/cdk-backup/Plan/Resource": [ { "type": "aws:cdk:logicalId", "data": "PlanDAF4E53A" } ], + "/cdk-backup/Plan/Selection": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "backupPlan": "*", + "resources": "*" + } + } + ], + "/cdk-backup/Plan/Selection/Role": [ + { + "type": "aws:cdk:analytics:construct", + "data": { + "assumedBy": { + "principalAccount": "*", + "assumeRoleAction": "*" + } + } + }, + { + "type": "aws:cdk:analytics:method", + "data": { + "addManagedPolicy": [ + { + "managedPolicyArn": "*" + } + ] + } + } + ], + "/cdk-backup/Plan/Selection/Role/ImportRole": [ + { + "type": "aws:cdk:analytics:construct", + "data": "*" + } + ], "/cdk-backup/Plan/Selection/Role/Resource": [ { "type": "aws:cdk:logicalId", @@ -108,5 +248,6 @@ "file": "tree.json" } } - } + }, + "minimumCliVersion": "2.1006.0" } \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-backup/test/integ.backup.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-backup/test/integ.backup.js.snapshot/tree.json index 3728b496ca8cf..8dc71679996be 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-backup/test/integ.backup.js.snapshot/tree.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-backup/test/integ.backup.js.snapshot/tree.json @@ -1,449 +1 @@ -{ - "version": "tree-0.1", - "tree": { - "id": "App", - "path": "", - "children": { - "cdk-backup": { - "id": "cdk-backup", - "path": "cdk-backup", - "children": { - "Table": { - "id": "Table", - "path": "cdk-backup/Table", - "children": { - "Resource": { - "id": "Resource", - "path": "cdk-backup/Table/Resource", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::DynamoDB::Table", - "aws:cdk:cloudformation:props": { - "attributeDefinitions": [ - { - "attributeName": "id", - "attributeType": "S" - } - ], - "keySchema": [ - { - "attributeName": "id", - "keyType": "HASH" - } - ], - "provisionedThroughput": { - "readCapacityUnits": 5, - "writeCapacityUnits": 5 - } - } - }, - "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.2.69" - } - }, - "ScalingRole": { - "id": "ScalingRole", - "path": "cdk-backup/Table/ScalingRole", - "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.2.69" - } - } - }, - "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.2.69" - } - }, - "FileSystem": { - "id": "FileSystem", - "path": "cdk-backup/FileSystem", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::EFS::FileSystem", - "aws:cdk:cloudformation:props": {} - }, - "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.2.69" - } - }, - "Vault": { - "id": "Vault", - "path": "cdk-backup/Vault", - "children": { - "Resource": { - "id": "Resource", - "path": "cdk-backup/Vault/Resource", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::Backup::BackupVault", - "aws:cdk:cloudformation:props": { - "backupVaultName": "cdkbackupVaultC2A6D3CB", - "lockConfiguration": { - "minRetentionDays": 5 - } - } - }, - "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.2.69" - } - } - }, - "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.2.69" - } - }, - "SecondaryVault": { - "id": "SecondaryVault", - "path": "cdk-backup/SecondaryVault", - "children": { - "Resource": { - "id": "Resource", - "path": "cdk-backup/SecondaryVault/Resource", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::Backup::BackupVault", - "aws:cdk:cloudformation:props": { - "backupVaultName": "cdkbackupSecondaryVaultA01C2A0E", - "lockConfiguration": { - "minRetentionDays": 5 - } - } - }, - "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.2.69" - } - } - }, - "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.2.69" - } - }, - "Env": { - "id": "Env", - "path": "cdk-backup/Env", - "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.2.69" - } - }, - "ThirdVault": { - "id": "ThirdVault", - "path": "cdk-backup/ThirdVault", - "children": { - "Resource": { - "id": "Resource", - "path": "cdk-backup/ThirdVault/Resource", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::Backup::BackupVault", - "aws:cdk:cloudformation:props": { - "backupVaultName": { - "Fn::Join": [ - "", - [ - "backupVault-", - { - "Ref": "Env" - } - ] - ] - }, - "lockConfiguration": { - "minRetentionDays": 5 - } - } - }, - "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.2.69" - } - } - }, - "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.2.69" - } - }, - "Plan": { - "id": "Plan", - "path": "cdk-backup/Plan", - "children": { - "Resource": { - "id": "Resource", - "path": "cdk-backup/Plan/Resource", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::Backup::BackupPlan", - "aws:cdk:cloudformation:props": { - "backupPlan": { - "backupPlanName": "Plan", - "backupPlanRule": [ - { - "lifecycle": { - "deleteAfterDays": 35 - }, - "ruleName": "Daily", - "scheduleExpression": "cron(0 5 * * ? *)", - "targetBackupVault": { - "Fn::GetAtt": [ - "Vault23237E5B", - "BackupVaultName" - ] - } - }, - { - "lifecycle": { - "deleteAfterDays": 90 - }, - "ruleName": "Weekly", - "scheduleExpression": "cron(0 5 ? * SAT *)", - "targetBackupVault": { - "Fn::GetAtt": [ - "Vault23237E5B", - "BackupVaultName" - ] - } - }, - { - "lifecycle": { - "deleteAfterDays": 1825, - "moveToColdStorageAfterDays": 90 - }, - "ruleName": "Monthly5Year", - "scheduleExpression": "cron(0 5 1 * ? *)", - "targetBackupVault": { - "Fn::GetAtt": [ - "Vault23237E5B", - "BackupVaultName" - ] - } - }, - { - "ruleName": "PlanRule3", - "targetBackupVault": { - "Fn::GetAtt": [ - "Vault23237E5B", - "BackupVaultName" - ] - }, - "copyActions": [ - { - "destinationBackupVaultArn": { - "Fn::GetAtt": [ - "SecondaryVault67665B5E", - "BackupVaultArn" - ] - }, - "lifecycle": { - "deleteAfterDays": 120, - "moveToColdStorageAfterDays": 30 - } - } - ], - "recoveryPointTags": { - "stage": "prod" - } - } - ] - } - } - }, - "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.2.69" - } - }, - "Selection": { - "id": "Selection", - "path": "cdk-backup/Plan/Selection", - "children": { - "Role": { - "id": "Role", - "path": "cdk-backup/Plan/Selection/Role", - "children": { - "ImportRole": { - "id": "ImportRole", - "path": "cdk-backup/Plan/Selection/Role/ImportRole", - "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.2.69" - } - }, - "Resource": { - "id": "Resource", - "path": "cdk-backup/Plan/Selection/Role/Resource", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::IAM::Role", - "aws:cdk:cloudformation:props": { - "assumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "backup.amazonaws.com" - } - } - ], - "Version": "2012-10-17" - }, - "managedPolicyArns": [ - { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition" - }, - ":iam::aws:policy/service-role/AWSBackupServiceRolePolicyForBackup" - ] - ] - } - ] - } - }, - "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.2.69" - } - } - }, - "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.2.69" - } - }, - "Resource": { - "id": "Resource", - "path": "cdk-backup/Plan/Selection/Resource", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::Backup::BackupSelection", - "aws:cdk:cloudformation:props": { - "backupPlanId": { - "Fn::GetAtt": [ - "PlanDAF4E53A", - "BackupPlanId" - ] - }, - "backupSelection": { - "iamRoleArn": { - "Fn::GetAtt": [ - "PlanSelectionRole6D10F4B7", - "Arn" - ] - }, - "selectionName": "Selection", - "listOfTags": [ - { - "conditionKey": "stage", - "conditionType": "STRINGEQUALS", - "conditionValue": "prod" - } - ], - "resources": [ - { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition" - }, - ":dynamodb:", - { - "Ref": "AWS::Region" - }, - ":", - { - "Ref": "AWS::AccountId" - }, - ":table/", - { - "Ref": "TableCD117FA1" - } - ] - ] - }, - { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition" - }, - ":elasticfilesystem:", - { - "Ref": "AWS::Region" - }, - ":", - { - "Ref": "AWS::AccountId" - }, - ":file-system/", - { - "Ref": "FileSystem" - } - ] - ] - } - ] - } - } - }, - "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.2.69" - } - } - }, - "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.2.69" - } - } - }, - "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.2.69" - } - }, - "BootstrapVersion": { - "id": "BootstrapVersion", - "path": "cdk-backup/BootstrapVersion", - "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.2.69" - } - }, - "CheckBootstrapVersion": { - "id": "CheckBootstrapVersion", - "path": "cdk-backup/CheckBootstrapVersion", - "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.2.69" - } - } - }, - "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.2.69" - } - }, - "Tree": { - "id": "Tree", - "path": "Tree", - "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.2.69" - } - } - }, - "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.2.69" - } - } -} \ No newline at end of file +{"version":"tree-0.1","tree":{"id":"App","path":"","children":{"cdk-backup":{"id":"cdk-backup","path":"cdk-backup","children":{"Table":{"id":"Table","path":"cdk-backup/Table","children":{"Resource":{"id":"Resource","path":"cdk-backup/Table/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::DynamoDB::Table","aws:cdk:cloudformation:props":{"attributeDefinitions":[{"attributeName":"id","attributeType":"S"}],"keySchema":[{"attributeName":"id","keyType":"HASH"}],"provisionedThroughput":{"readCapacityUnits":5,"writeCapacityUnits":5}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_dynamodb.CfnTable","version":"0.0.0"}},"ScalingRole":{"id":"ScalingRole","path":"cdk-backup/Table/ScalingRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_dynamodb.Table","version":"0.0.0","metadata":[{"partitionKey":{"name":"*","type":"S"},"removalPolicy":"destroy"}]}},"FileSystem":{"id":"FileSystem","path":"cdk-backup/FileSystem","attributes":{"aws:cdk:cloudformation:type":"AWS::EFS::FileSystem","aws:cdk:cloudformation:props":{}},"constructInfo":{"fqn":"aws-cdk-lib.aws_efs.CfnFileSystem","version":"0.0.0"}},"Vault":{"id":"Vault","path":"cdk-backup/Vault","children":{"Resource":{"id":"Resource","path":"cdk-backup/Vault/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::Backup::BackupVault","aws:cdk:cloudformation:props":{"backupVaultName":"cdkbackupVaultC2A6D3CB","lockConfiguration":{"minRetentionDays":5}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_backup.CfnBackupVault","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_backup.BackupVault","version":"0.0.0","metadata":[{"removalPolicy":"destroy","lockConfiguration":{"minRetention":"*"}}]}},"SecondaryVault":{"id":"SecondaryVault","path":"cdk-backup/SecondaryVault","children":{"Resource":{"id":"Resource","path":"cdk-backup/SecondaryVault/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::Backup::BackupVault","aws:cdk:cloudformation:props":{"backupVaultName":"cdkbackupSecondaryVaultA01C2A0E","lockConfiguration":{"minRetentionDays":5}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_backup.CfnBackupVault","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_backup.BackupVault","version":"0.0.0","metadata":[{"removalPolicy":"destroy","lockConfiguration":{"minRetention":"*"}}]}},"Env":{"id":"Env","path":"cdk-backup/Env","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"ThirdVault":{"id":"ThirdVault","path":"cdk-backup/ThirdVault","children":{"Resource":{"id":"Resource","path":"cdk-backup/ThirdVault/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::Backup::BackupVault","aws:cdk:cloudformation:props":{"backupVaultName":{"Fn::Join":["",["backupVault-",{"Ref":"Env"}]]},"lockConfiguration":{"minRetentionDays":5}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_backup.CfnBackupVault","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_backup.BackupVault","version":"0.0.0","metadata":[{"removalPolicy":"destroy","backupVaultName":"*","lockConfiguration":{"minRetention":"*"}}]}},"Plan":{"id":"Plan","path":"cdk-backup/Plan","children":{"Resource":{"id":"Resource","path":"cdk-backup/Plan/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::Backup::BackupPlan","aws:cdk:cloudformation:props":{"backupPlan":{"backupPlanName":"Plan","backupPlanRule":[{"lifecycle":{"deleteAfterDays":35},"ruleName":"Daily","scheduleExpression":"cron(0 5 * * ? *)","targetBackupVault":{"Fn::GetAtt":["Vault23237E5B","BackupVaultName"]}},{"lifecycle":{"deleteAfterDays":90},"ruleName":"Weekly","scheduleExpression":"cron(0 5 ? * SAT *)","targetBackupVault":{"Fn::GetAtt":["Vault23237E5B","BackupVaultName"]}},{"lifecycle":{"deleteAfterDays":1825,"moveToColdStorageAfterDays":90},"ruleName":"Monthly5Year","scheduleExpression":"cron(0 5 1 * ? *)","targetBackupVault":{"Fn::GetAtt":["Vault23237E5B","BackupVaultName"]}},{"ruleName":"PlanRule3","targetBackupVault":{"Fn::GetAtt":["Vault23237E5B","BackupVaultName"]},"copyActions":[{"destinationBackupVaultArn":{"Fn::GetAtt":["SecondaryVault67665B5E","BackupVaultArn"]},"lifecycle":{"deleteAfterDays":120,"moveToColdStorageAfterDays":30}}],"recoveryPointTags":{"stage":"prod"},"indexActions":[{"resourceTypes":["S3"]}]}]}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_backup.CfnBackupPlan","version":"0.0.0"}},"Selection":{"id":"Selection","path":"cdk-backup/Plan/Selection","children":{"Role":{"id":"Role","path":"cdk-backup/Plan/Selection/Role","children":{"ImportRole":{"id":"ImportRole","path":"cdk-backup/Plan/Selection/Role/ImportRole","constructInfo":{"fqn":"aws-cdk-lib.Resource","version":"0.0.0","metadata":["*"]}},"Resource":{"id":"Resource","path":"cdk-backup/Plan/Selection/Role/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::IAM::Role","aws:cdk:cloudformation:props":{"assumeRolePolicyDocument":{"Statement":[{"Action":"sts:AssumeRole","Effect":"Allow","Principal":{"Service":"backup.amazonaws.com"}}],"Version":"2012-10-17"},"managedPolicyArns":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":iam::aws:policy/service-role/AWSBackupServiceRolePolicyForBackup"]]}]}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.CfnRole","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_iam.Role","version":"0.0.0","metadata":[{"assumedBy":{"principalAccount":"*","assumeRoleAction":"*"}},{"addManagedPolicy":[{"managedPolicyArn":"*"}]}]}},"Resource":{"id":"Resource","path":"cdk-backup/Plan/Selection/Resource","attributes":{"aws:cdk:cloudformation:type":"AWS::Backup::BackupSelection","aws:cdk:cloudformation:props":{"backupPlanId":{"Fn::GetAtt":["PlanDAF4E53A","BackupPlanId"]},"backupSelection":{"iamRoleArn":{"Fn::GetAtt":["PlanSelectionRole6D10F4B7","Arn"]},"selectionName":"Selection","listOfTags":[{"conditionKey":"stage","conditionType":"STRINGEQUALS","conditionValue":"prod"}],"resources":[{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":dynamodb:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":table/",{"Ref":"TableCD117FA1"}]]},{"Fn::Join":["",["arn:",{"Ref":"AWS::Partition"},":elasticfilesystem:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":file-system/",{"Ref":"FileSystem"}]]}]}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_backup.CfnBackupSelection","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_backup.BackupSelection","version":"0.0.0","metadata":[{"backupPlan":"*","resources":"*"}]}}},"constructInfo":{"fqn":"aws-cdk-lib.aws_backup.BackupPlan","version":"0.0.0","metadata":[{"backupVault":"*"},{"addRule":[{}]},{"addRule":[{}]},{"addRule":[{}]},{"addSelection":["*",{"resources":"*"}]},{"addRule":[{}]}]}},"BootstrapVersion":{"id":"BootstrapVersion","path":"cdk-backup/BootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnParameter","version":"0.0.0"}},"CheckBootstrapVersion":{"id":"CheckBootstrapVersion","path":"cdk-backup/CheckBootstrapVersion","constructInfo":{"fqn":"aws-cdk-lib.CfnRule","version":"0.0.0"}}},"constructInfo":{"fqn":"aws-cdk-lib.Stack","version":"0.0.0"}},"Tree":{"id":"Tree","path":"Tree","constructInfo":{"fqn":"constructs.Construct","version":"10.4.2"}}},"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-backup/test/integ.backup.ts b/packages/@aws-cdk-testing/framework-integ/test/aws-backup/test/integ.backup.ts index d5138ced8bc41..c4c3f5745e0ec 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-backup/test/integ.backup.ts +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-backup/test/integ.backup.ts @@ -60,6 +60,9 @@ class TestStack extends Stack { recoveryPointTags: { stage: 'prod', }, + indexActions: [{ + resourceTypes: [backup.IndexActionResourceType.S3], + }], })); } } diff --git a/packages/aws-cdk-lib/aws-backup/README.md b/packages/aws-cdk-lib/aws-backup/README.md index 04c0973cd8ea8..efa080973bfec 100644 --- a/packages/aws-cdk-lib/aws-backup/README.md +++ b/packages/aws-cdk-lib/aws-backup/README.md @@ -137,6 +137,17 @@ plan.addRule(new backup.BackupPlanRule({ })); ``` +You can enable Backup indexes for specific resource types in the rule by using `indexActions`. + +```ts +declare const plan: backup.BackupPlan; +plan.addRule(new backup.BackupPlanRule({ + indexActions: [{ + resourceTypes: [backup.IndexActionResourceType.S3], + }], +})); +``` + Ready-made rules are also available: ```ts diff --git a/packages/aws-cdk-lib/aws-backup/lib/plan.ts b/packages/aws-cdk-lib/aws-backup/lib/plan.ts index 98f96404a4240..36711e9b5e6f6 100644 --- a/packages/aws-cdk-lib/aws-backup/lib/plan.ts +++ b/packages/aws-cdk-lib/aws-backup/lib/plan.ts @@ -197,6 +197,7 @@ export class BackupPlan extends Resource implements IBackupPlan { targetBackupVault: vault.backupVaultName, copyActions: rule.props.copyActions?.map(this.planCopyActions), recoveryPointTags: rule.props.recoveryPointTags, + indexActions: rule.props.indexActions, }); } diff --git a/packages/aws-cdk-lib/aws-backup/lib/rule.ts b/packages/aws-cdk-lib/aws-backup/lib/rule.ts index 52982411a4de3..019014eeede3d 100644 --- a/packages/aws-cdk-lib/aws-backup/lib/rule.ts +++ b/packages/aws-cdk-lib/aws-backup/lib/rule.ts @@ -84,6 +84,14 @@ export interface BackupPlanRuleProps { * @default - no recovery point tags. */ readonly recoveryPointTags?: { [key: string]: string }; + + /** + * To help search your backups, you can enable Backup indexes by assigning index actions. + * Currently, you can only have up to a single index action per BackupRule. + * + * @default - no index actions. + */ + readonly indexActions?: BackupPlanIndexActionProps[]; } /** @@ -111,6 +119,34 @@ export interface BackupPlanCopyActionProps { readonly moveToColdStorageAfter?: Duration; } +/** + * Properties for a BackupPlanIndexAction + */ +export interface BackupPlanIndexActionProps { + /** + * Specifies the resource types to include in the index action. + * + * @default - no resource types are specified + */ + readonly resourceTypes?: IndexActionResourceType[]; +} + +/** + * The resource type to index. + * + * @see https://docs.aws.amazon.com/aws-backup/latest/devguide/API_IndexAction.html + */ +export enum IndexActionResourceType { + /** + * Simple Storage Service (S3) + */ + S3 = 'S3', + /** + * Elastic Block Store (EBS) + */ + EBS = 'EBS', +} + /** * A backup plan rule */ diff --git a/packages/aws-cdk-lib/aws-backup/test/plan.test.ts b/packages/aws-cdk-lib/aws-backup/test/plan.test.ts index 4d9c23700d651..77dcf19136210 100644 --- a/packages/aws-cdk-lib/aws-backup/test/plan.test.ts +++ b/packages/aws-cdk-lib/aws-backup/test/plan.test.ts @@ -1,7 +1,7 @@ import { Template } from '../../assertions'; import * as events from '../../aws-events'; import { App, Duration, Stack } from '../../core'; -import { BackupPlan, BackupPlanRule, BackupVault } from '../lib'; +import { BackupPlan, IndexActionResourceType, BackupPlanRule, BackupVault } from '../lib'; let stack: Stack; beforeEach(() => { @@ -373,6 +373,42 @@ test('create a plan and add rule with recoveryPointTags', () => { }); }); +test('create a plan and add rule with indexActions', () => { + // WHEN + new BackupPlan(stack, 'Plan', { + backupPlanRules: [ + new BackupPlanRule({ + indexActions: [{ resourceTypes: [IndexActionResourceType.S3] }], + }), + ], + }); + + // THEN + Template.fromStack(stack).hasResourceProperties('AWS::Backup::BackupPlan', { + BackupPlan: { + BackupPlanName: 'Plan', + BackupPlanRule: [ + { + RuleName: 'PlanRule0', + TargetBackupVault: { + 'Fn::GetAtt': [ + 'PlanVault0284B0C2', + 'BackupVaultName', + ], + }, + IndexActions: [ + { + ResourceTypes: [ + 'S3', + ], + }, + ], + }, + ], + }, + }); +}); + test('throws when deleteAfter is not greater than moveToColdStorageAfter', () => { expect(() => new BackupPlanRule({ deleteAfter: Duration.days(5),