@fjall/components-infrastructure 0.89.5 → 0.94.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +50 -21
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -18
- package/dist/lib/app.d.ts +12 -12
- package/dist/lib/app.js +61 -56
- package/dist/lib/aspects/index.d.ts +1 -1
- package/dist/lib/aspects/index.js +1 -6
- package/dist/lib/aspects/resourceInventory.js +6 -13
- package/dist/lib/config/audit.js +1 -5
- package/dist/lib/config/aws/accessAnalyser.d.ts +11 -0
- package/dist/lib/config/aws/accessAnalyser.js +17 -0
- package/dist/lib/config/aws/accountAuditRole.js +11 -15
- package/dist/lib/config/aws/accountMonitoringRole.js +25 -29
- package/dist/lib/config/aws/alarmTopic.d.ts +8 -0
- package/dist/lib/config/aws/alarmTopic.js +19 -0
- package/dist/lib/config/aws/cloudTrail.js +4 -9
- package/dist/lib/config/aws/configRecorder.d.ts +16 -0
- package/dist/lib/config/aws/configRecorder.js +51 -0
- package/dist/lib/config/aws/configRulePreset.d.ts +13 -0
- package/dist/lib/config/aws/configRulePreset.js +62 -0
- package/dist/lib/config/aws/disasterRecovery.d.ts +1 -1
- package/dist/lib/config/aws/disasterRecovery.js +56 -73
- package/dist/lib/config/aws/ebsDefaultEncryption.d.ts +8 -0
- package/dist/lib/config/aws/ebsDefaultEncryption.js +41 -0
- package/dist/lib/config/aws/ecrDefaultImage.js +25 -30
- package/dist/lib/config/aws/eventBus.js +8 -11
- package/dist/lib/config/aws/guardDutyDetector.d.ts +16 -0
- package/dist/lib/config/aws/guardDutyDetector.js +26 -0
- package/dist/lib/config/aws/identityCenter.d.ts +1 -1
- package/dist/lib/config/aws/identityCenter.js +23 -25
- package/dist/lib/config/aws/identityCenterGroupMembership.js +18 -22
- package/dist/lib/config/aws/index.d.ts +19 -8
- package/dist/lib/config/aws/index.js +19 -25
- package/dist/lib/config/aws/inspectorEnablement.d.ts +9 -0
- package/dist/lib/config/aws/inspectorEnablement.js +51 -0
- package/dist/lib/config/aws/ipam.js +9 -13
- package/dist/lib/config/aws/oidcConnector.js +8 -12
- package/dist/lib/config/aws/platform.js +1 -5
- package/dist/lib/config/aws/s3BlockPublicAccess.d.ts +9 -0
- package/dist/lib/config/aws/s3BlockPublicAccess.js +55 -0
- package/dist/lib/config/aws/scpPreset.d.ts +21 -0
- package/dist/lib/config/aws/scpPreset.js +311 -0
- package/dist/lib/config/aws/securityBaseline.d.ts +15 -0
- package/dist/lib/config/aws/securityBaseline.js +27 -0
- package/dist/lib/config/aws/securityHubHub.d.ts +15 -0
- package/dist/lib/config/aws/securityHubHub.js +28 -0
- package/dist/lib/config/aws/securityServicesAdmin.d.ts +20 -0
- package/dist/lib/config/aws/securityServicesAdmin.js +115 -0
- package/dist/lib/config/index.d.ts +2 -2
- package/dist/lib/config/index.js +2 -21
- package/dist/lib/index.d.ts +4 -4
- package/dist/lib/index.js +5 -26
- package/dist/lib/patterns/aws/account.d.ts +17 -1
- package/dist/lib/patterns/aws/account.js +60 -33
- package/dist/lib/patterns/aws/apexDomainPattern.d.ts +26 -0
- package/dist/lib/patterns/aws/apexDomainPattern.js +91 -0
- package/dist/lib/patterns/aws/auditRole.js +13 -16
- package/dist/lib/patterns/aws/buildkite.d.ts +1 -1
- package/dist/lib/patterns/aws/buildkite.js +70 -75
- package/dist/lib/patterns/aws/cdn.d.ts +5 -5
- package/dist/lib/patterns/aws/cdn.js +22 -28
- package/dist/lib/patterns/aws/compute.d.ts +1 -1
- package/dist/lib/patterns/aws/compute.js +31 -44
- package/dist/lib/patterns/aws/computeEc2.d.ts +1 -1
- package/dist/lib/patterns/aws/computeEc2.js +11 -14
- package/dist/lib/patterns/aws/computeEcs.d.ts +18 -2
- package/dist/lib/patterns/aws/computeEcs.js +41 -31
- package/dist/lib/patterns/aws/computeLambda.d.ts +2 -2
- package/dist/lib/patterns/aws/computeLambda.js +24 -31
- package/dist/lib/patterns/aws/database.d.ts +16 -7
- package/dist/lib/patterns/aws/database.js +81 -73
- package/dist/lib/patterns/aws/delegatedDomainPattern.d.ts +17 -0
- package/dist/lib/patterns/aws/delegatedDomainPattern.js +54 -0
- package/dist/lib/patterns/aws/dnsRecordComposer.d.ts +25 -0
- package/dist/lib/patterns/aws/dnsRecordComposer.js +225 -0
- package/dist/lib/patterns/aws/domain.d.ts +32 -0
- package/dist/lib/patterns/aws/domain.js +115 -0
- package/dist/lib/patterns/aws/domainDelegation.d.ts +3 -3
- package/dist/lib/patterns/aws/domainDelegation.js +28 -37
- package/dist/lib/patterns/aws/domainFactory.d.ts +20 -5
- package/dist/lib/patterns/aws/domainFactory.js +48 -10
- package/dist/lib/patterns/aws/domainValidation.d.ts +11 -0
- package/dist/lib/patterns/aws/domainValidation.js +145 -0
- package/dist/lib/patterns/aws/externalRecordsPattern.d.ts +18 -0
- package/dist/lib/patterns/aws/externalRecordsPattern.js +141 -0
- package/dist/lib/patterns/aws/fivetranProxy.d.ts +1 -1
- package/dist/lib/patterns/aws/fivetranProxy.js +6 -11
- package/dist/lib/patterns/aws/index.d.ts +21 -19
- package/dist/lib/patterns/aws/index.js +25 -36
- package/dist/lib/patterns/aws/interfaces/cdn.js +1 -5
- package/dist/lib/patterns/aws/interfaces/compute.js +4 -11
- package/dist/lib/patterns/aws/interfaces/connector.js +1 -15
- package/dist/lib/patterns/aws/interfaces/database.d.ts +1 -1
- package/dist/lib/patterns/aws/interfaces/database.js +6 -15
- package/dist/lib/patterns/aws/interfaces/domain.d.ts +80 -2
- package/dist/lib/patterns/aws/interfaces/domain.js +1 -6
- package/dist/lib/patterns/aws/interfaces/index.js +8 -41
- package/dist/lib/patterns/aws/interfaces/messaging.js +4 -11
- package/dist/lib/patterns/aws/interfaces/organisation.d.ts +1 -1
- package/dist/lib/patterns/aws/interfaces/organisation.js +4 -11
- package/dist/lib/patterns/aws/interfaces/pattern.js +2 -7
- package/dist/lib/patterns/aws/interfaces/storage.js +1 -5
- package/dist/lib/patterns/aws/managedIdentityCenter.js +7 -12
- package/dist/lib/patterns/aws/messaging.d.ts +7 -7
- package/dist/lib/patterns/aws/messaging.js +22 -33
- package/dist/lib/patterns/aws/network.d.ts +2 -2
- package/dist/lib/patterns/aws/network.js +9 -14
- package/dist/lib/patterns/aws/organisation.d.ts +6 -2
- package/dist/lib/patterns/aws/organisation.js +34 -35
- package/dist/lib/patterns/aws/organisationFactory.d.ts +3 -3
- package/dist/lib/patterns/aws/organisationFactory.js +7 -12
- package/dist/lib/patterns/aws/pattern.js +6 -12
- package/dist/lib/patterns/aws/payload.js +73 -63
- package/dist/lib/patterns/aws/platform.d.ts +6 -3
- package/dist/lib/patterns/aws/platform.js +15 -15
- package/dist/lib/patterns/aws/storage.d.ts +6 -4
- package/dist/lib/patterns/aws/storage.js +35 -40
- package/dist/lib/patterns/aws/subdomainHostedZone.js +11 -16
- package/dist/lib/patterns/aws/targets/fjallTargets.d.ts +37 -0
- package/dist/lib/patterns/aws/targets/fjallTargets.js +66 -0
- package/dist/lib/patterns/aws/targets/index.d.ts +2 -0
- package/dist/lib/patterns/aws/targets/index.js +2 -0
- package/dist/lib/patterns/aws/targets/targetResolution.d.ts +76 -0
- package/dist/lib/patterns/aws/targets/targetResolution.js +119 -0
- package/dist/lib/patterns/index.d.ts +1 -0
- package/dist/lib/patterns/index.js +1 -0
- package/dist/lib/resources/aws/analytics/clickhouse.d.ts +15 -0
- package/dist/lib/resources/aws/analytics/clickhouse.js +292 -0
- package/dist/lib/resources/aws/analytics/clickhouseConstants.d.ts +73 -0
- package/dist/lib/resources/aws/analytics/clickhouseConstants.js +87 -0
- package/dist/lib/resources/aws/analytics/clickhouseSecurityGroup.d.ts +13 -0
- package/dist/lib/resources/aws/analytics/clickhouseSecurityGroup.js +28 -0
- package/dist/lib/resources/aws/analytics/clickhouseTypes.d.ts +47 -0
- package/dist/lib/resources/aws/analytics/clickhouseTypes.js +1 -0
- package/dist/lib/resources/aws/analytics/clickhouseUserData.d.ts +5 -0
- package/dist/lib/resources/aws/analytics/clickhouseUserData.js +248 -0
- package/dist/lib/resources/aws/analytics/index.d.ts +2 -0
- package/dist/lib/resources/aws/analytics/index.js +1 -0
- package/dist/lib/resources/aws/audit/auditRole.js +10 -15
- package/dist/lib/resources/aws/audit/index.d.ts +1 -1
- package/dist/lib/resources/aws/audit/index.js +1 -6
- package/dist/lib/resources/aws/backup/backupPlan.d.ts +1 -1
- package/dist/lib/resources/aws/backup/backupPlan.js +14 -16
- package/dist/lib/resources/aws/backup/backupVault.d.ts +1 -1
- package/dist/lib/resources/aws/backup/backupVault.js +13 -15
- package/dist/lib/resources/aws/backup/index.d.ts +2 -2
- package/dist/lib/resources/aws/backup/index.js +2 -19
- package/dist/lib/resources/aws/base/awsStack.js +17 -19
- package/dist/lib/resources/aws/base/index.d.ts +1 -1
- package/dist/lib/resources/aws/base/index.js +1 -18
- package/dist/lib/resources/aws/cdn/cloudFront.js +40 -42
- package/dist/lib/resources/aws/cdn/index.d.ts +1 -1
- package/dist/lib/resources/aws/cdn/index.js +1 -18
- package/dist/lib/resources/aws/compute/ec2.js +39 -39
- package/dist/lib/resources/aws/compute/ecs.d.ts +18 -396
- package/dist/lib/resources/aws/compute/ecs.js +105 -976
- package/dist/lib/resources/aws/compute/ecsCapacityProviderAspect.d.ts +22 -0
- package/dist/lib/resources/aws/compute/ecsCapacityProviderAspect.js +35 -0
- package/dist/lib/resources/aws/compute/ecsConstants.d.ts +20 -0
- package/dist/lib/resources/aws/compute/ecsConstants.js +49 -0
- package/dist/lib/resources/aws/compute/ecsContext.d.ts +12 -0
- package/dist/lib/resources/aws/compute/ecsContext.js +1 -0
- package/dist/lib/resources/aws/compute/ecsImages.d.ts +4 -0
- package/dist/lib/resources/aws/compute/ecsImages.js +35 -0
- package/dist/lib/resources/aws/compute/ecsNetworking.d.ts +28 -0
- package/dist/lib/resources/aws/compute/ecsNetworking.js +290 -0
- package/dist/lib/resources/aws/compute/ecsRoles.d.ts +15 -0
- package/dist/lib/resources/aws/compute/ecsRoles.js +110 -0
- package/dist/lib/resources/aws/compute/ecsServiceFactory.d.ts +33 -0
- package/dist/lib/resources/aws/compute/ecsServiceFactory.js +183 -0
- package/dist/lib/resources/aws/compute/ecsTaskDefinition.d.ts +30 -0
- package/dist/lib/resources/aws/compute/ecsTaskDefinition.js +168 -0
- package/dist/lib/resources/aws/compute/ecsTypes.d.ts +337 -0
- package/dist/lib/resources/aws/compute/ecsTypes.js +10 -0
- package/dist/lib/resources/aws/compute/ecsValidation.d.ts +18 -0
- package/dist/lib/resources/aws/compute/ecsValidation.js +72 -0
- package/dist/lib/resources/aws/compute/index.d.ts +3 -3
- package/dist/lib/resources/aws/compute/index.js +3 -20
- package/dist/lib/resources/aws/compute/lambda.d.ts +10 -2
- package/dist/lib/resources/aws/compute/lambda.js +81 -71
- package/dist/lib/resources/aws/database/dynamodb.js +24 -27
- package/dist/lib/resources/aws/database/index.d.ts +7 -7
- package/dist/lib/resources/aws/database/index.js +14 -33
- package/dist/lib/resources/aws/database/rdsAurora.d.ts +10 -2
- package/dist/lib/resources/aws/database/rdsAurora.js +76 -61
- package/dist/lib/resources/aws/database/rdsAuroraGlobal.d.ts +2 -2
- package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +24 -21
- package/dist/lib/resources/aws/database/rdsDefaults.js +3 -7
- package/dist/lib/resources/aws/database/rdsHelpers.d.ts +2 -2
- package/dist/lib/resources/aws/database/rdsHelpers.js +21 -29
- package/dist/lib/resources/aws/database/rdsInstance.d.ts +11 -3
- package/dist/lib/resources/aws/database/rdsInstance.js +101 -83
- package/dist/lib/resources/aws/database/rdsProxyOutput.js +5 -9
- package/dist/lib/resources/aws/iam/delegationRole.d.ts +18 -0
- package/dist/lib/resources/aws/iam/delegationRole.js +60 -0
- package/dist/lib/resources/aws/iam/identityCenter/assignment.js +4 -9
- package/dist/lib/resources/aws/iam/identityCenter/group.js +5 -9
- package/dist/lib/resources/aws/iam/identityCenter/index.d.ts +3 -3
- package/dist/lib/resources/aws/iam/identityCenter/index.js +3 -20
- package/dist/lib/resources/aws/iam/identityCenter/permissionSet.d.ts +1 -1
- package/dist/lib/resources/aws/iam/identityCenter/permissionSet.js +5 -9
- package/dist/lib/resources/aws/iam/index.d.ts +5 -4
- package/dist/lib/resources/aws/iam/index.js +5 -21
- package/dist/lib/resources/aws/iam/instanceProfile.js +2 -7
- package/dist/lib/resources/aws/iam/managedPolicy.js +2 -7
- package/dist/lib/resources/aws/iam/policy.js +2 -7
- package/dist/lib/resources/aws/iam/role.js +2 -7
- package/dist/lib/resources/aws/index.d.ts +7 -7
- package/dist/lib/resources/aws/index.js +7 -24
- package/dist/lib/resources/aws/logging/cloudTrail.d.ts +1 -1
- package/dist/lib/resources/aws/logging/cloudTrail.js +18 -22
- package/dist/lib/resources/aws/logging/index.d.ts +2 -2
- package/dist/lib/resources/aws/logging/index.js +2 -19
- package/dist/lib/resources/aws/logging/logGroup.js +4 -10
- package/dist/lib/resources/aws/messaging/eventbridge.js +11 -14
- package/dist/lib/resources/aws/messaging/index.d.ts +4 -4
- package/dist/lib/resources/aws/messaging/index.js +4 -21
- package/dist/lib/resources/aws/messaging/sns.js +11 -14
- package/dist/lib/resources/aws/messaging/sqs.js +32 -34
- package/dist/lib/resources/aws/messaging/utils.d.ts +1 -1
- package/dist/lib/resources/aws/messaging/utils.js +1 -6
- package/dist/lib/resources/aws/monitoring/alarmDefaults.d.ts +36 -0
- package/dist/lib/resources/aws/monitoring/alarmDefaults.js +34 -0
- package/dist/lib/resources/aws/monitoring/ecsAlarms.d.ts +21 -0
- package/dist/lib/resources/aws/monitoring/ecsAlarms.js +88 -0
- package/dist/lib/resources/aws/monitoring/index.d.ts +4 -0
- package/dist/lib/resources/aws/monitoring/index.js +4 -5
- package/dist/lib/resources/aws/monitoring/lambdaAlarms.d.ts +18 -0
- package/dist/lib/resources/aws/monitoring/lambdaAlarms.js +44 -0
- package/dist/lib/resources/aws/monitoring/rdsAlarms.d.ts +20 -0
- package/dist/lib/resources/aws/monitoring/rdsAlarms.js +52 -0
- package/dist/lib/resources/aws/networking/crossAccountDelegationRecord.d.ts +17 -0
- package/dist/lib/resources/aws/networking/crossAccountDelegationRecord.js +26 -0
- package/dist/lib/resources/aws/networking/dnsRecord/aRecord.d.ts +12 -0
- package/dist/lib/resources/aws/networking/dnsRecord/aRecord.js +21 -0
- package/dist/lib/resources/aws/networking/dnsRecord/aaaaRecord.d.ts +12 -0
- package/dist/lib/resources/aws/networking/dnsRecord/aaaaRecord.js +22 -0
- package/dist/lib/resources/aws/networking/dnsRecord/aliasRecord.d.ts +12 -0
- package/dist/lib/resources/aws/networking/dnsRecord/aliasRecord.js +23 -0
- package/dist/lib/resources/aws/networking/dnsRecord/caaRecord.d.ts +17 -0
- package/dist/lib/resources/aws/networking/dnsRecord/caaRecord.js +21 -0
- package/dist/lib/resources/aws/networking/dnsRecord/cnameRecord.d.ts +12 -0
- package/dist/lib/resources/aws/networking/dnsRecord/cnameRecord.js +22 -0
- package/dist/lib/resources/aws/networking/dnsRecord/dnsRecordBase.d.ts +17 -0
- package/dist/lib/resources/aws/networking/dnsRecord/dnsRecordBase.js +17 -0
- package/dist/lib/resources/aws/networking/dnsRecord/index.d.ts +10 -0
- package/dist/lib/resources/aws/networking/dnsRecord/index.js +10 -0
- package/dist/lib/resources/aws/networking/dnsRecord/mxRecord.d.ts +16 -0
- package/dist/lib/resources/aws/networking/dnsRecord/mxRecord.js +21 -0
- package/dist/lib/resources/aws/networking/dnsRecord/nsRecord.d.ts +12 -0
- package/dist/lib/resources/aws/networking/dnsRecord/nsRecord.js +21 -0
- package/dist/lib/resources/aws/networking/dnsRecord/srvRecord.d.ts +18 -0
- package/dist/lib/resources/aws/networking/dnsRecord/srvRecord.js +21 -0
- package/dist/lib/resources/aws/networking/dnsRecord/txtRecord.d.ts +12 -0
- package/dist/lib/resources/aws/networking/dnsRecord/txtRecord.js +21 -0
- package/dist/lib/resources/aws/networking/domain.d.ts +1 -1
- package/dist/lib/resources/aws/networking/domain.js +32 -34
- package/dist/lib/resources/aws/networking/domainCertificate.d.ts +8 -3
- package/dist/lib/resources/aws/networking/domainCertificate.js +22 -16
- package/dist/lib/resources/aws/networking/hostedZone.d.ts +23 -19
- package/dist/lib/resources/aws/networking/hostedZone.js +70 -134
- package/dist/lib/resources/aws/networking/index.d.ts +8 -7
- package/dist/lib/resources/aws/networking/index.js +8 -24
- package/dist/lib/resources/aws/networking/ipam.js +2 -7
- package/dist/lib/resources/aws/networking/ipamPool.d.ts +1 -1
- package/dist/lib/resources/aws/networking/ipamPool.js +45 -55
- package/dist/lib/resources/aws/networking/securityGroup.js +2 -7
- package/dist/lib/resources/aws/networking/vpc.d.ts +1 -1
- package/dist/lib/resources/aws/networking/vpc.js +17 -21
- package/dist/lib/resources/aws/organisation/costAllocationTagActivator.d.ts +1 -1
- package/dist/lib/resources/aws/organisation/costAllocationTagActivator.js +11 -15
- package/dist/lib/resources/aws/organisation/index.d.ts +5 -5
- package/dist/lib/resources/aws/organisation/index.js +4 -12
- package/dist/lib/resources/aws/organisation/organisation.js +5 -7
- package/dist/lib/resources/aws/organisation/organisationAccount.js +7 -10
- package/dist/lib/resources/aws/organisation/organisationPolicy.js +5 -9
- package/dist/lib/resources/aws/organisation/organisationalUnit.js +1 -3
- package/dist/lib/resources/aws/secrets/alias.js +2 -7
- package/dist/lib/resources/aws/secrets/index.d.ts +4 -4
- package/dist/lib/resources/aws/secrets/index.js +4 -21
- package/dist/lib/resources/aws/secrets/kms.js +15 -18
- package/dist/lib/resources/aws/secrets/parameter.d.ts +3 -3
- package/dist/lib/resources/aws/secrets/parameter.js +19 -22
- package/dist/lib/resources/aws/secrets/secret.d.ts +2 -2
- package/dist/lib/resources/aws/secrets/secret.js +12 -14
- package/dist/lib/resources/aws/storage/ecr.d.ts +2 -2
- package/dist/lib/resources/aws/storage/ecr.js +7 -13
- package/dist/lib/resources/aws/storage/index.d.ts +2 -2
- package/dist/lib/resources/aws/storage/index.js +2 -19
- package/dist/lib/resources/aws/storage/s3.d.ts +1 -1
- package/dist/lib/resources/aws/storage/s3.js +24 -12
- package/dist/lib/resources/aws/utilities/awsCustomResource.js +3 -7
- package/dist/lib/resources/aws/utilities/codeBuild.js +7 -12
- package/dist/lib/resources/aws/utilities/customResource.js +14 -17
- package/dist/lib/resources/aws/utilities/customResourceProvider.js +2 -7
- package/dist/lib/resources/aws/utilities/index.d.ts +5 -5
- package/dist/lib/resources/aws/utilities/index.js +5 -22
- package/dist/lib/resources/aws/utilities/resourceShare.js +2 -7
- package/dist/lib/resources/index.d.ts +1 -1
- package/dist/lib/resources/index.js +1 -18
- package/dist/lib/types.js +1 -3
- package/dist/lib/utils/accountsUtils.d.ts +5 -0
- package/dist/lib/utils/accountsUtils.js +18 -0
- package/dist/lib/utils/addSuffixToEmail.js +1 -5
- package/dist/lib/utils/backupTierMapping.js +2 -6
- package/dist/lib/utils/capitaliseString.js +1 -10
- package/dist/lib/utils/connections.js +9 -13
- package/dist/lib/utils/connector.js +10 -23
- package/dist/lib/utils/constructMap.d.ts +33 -0
- package/dist/lib/utils/constructMap.js +154 -0
- package/dist/lib/utils/databaseTypes.js +4 -10
- package/dist/lib/utils/dnsRecords.d.ts +1 -1
- package/dist/lib/utils/dnsRecords.js +23 -27
- package/dist/lib/utils/domainTypes.d.ts +0 -1
- package/dist/lib/utils/domainTypes.js +2 -10
- package/dist/lib/utils/env.js +14 -26
- package/dist/lib/utils/getAccountId.js +3 -7
- package/dist/lib/utils/getAsync.js +7 -10
- package/dist/lib/utils/getConfig.d.ts +0 -2
- package/dist/lib/utils/getConfig.js +29 -47
- package/dist/lib/utils/getStackOutput.js +4 -8
- package/dist/lib/utils/index.d.ts +12 -12
- package/dist/lib/utils/index.js +12 -29
- package/dist/lib/utils/manifestWriter.d.ts +14 -3
- package/dist/lib/utils/manifestWriter.js +60 -43
- package/dist/lib/utils/orgConfigParser.d.ts +14 -0
- package/dist/lib/utils/orgConfigParser.js +49 -0
- package/dist/lib/utils/removalPolicy.js +5 -9
- package/dist/lib/utils/resourceNaming.js +11 -16
- package/dist/lib/utils/standardTagsAspect.js +9 -16
- package/dist/lib/utils/stripAndCamelCase.js +1 -5
- package/dist/lib/utils/validationLogger.js +12 -18
- package/dist/lib/utils/vpcUtils.js +5 -10
- package/package.json +25 -8
- package/dist/lib/config/aws/accountId.d.ts +0 -6
- package/dist/lib/config/aws/accountId.js +0 -32
- package/dist/lib/config/aws/backupGlobalSettings.d.ts +0 -29
- package/dist/lib/config/aws/backupGlobalSettings.js +0 -49
- package/dist/lib/config/aws/costAllocationTags.d.ts +0 -12
- package/dist/lib/config/aws/costAllocationTags.js +0 -47
- package/dist/lib/config/aws/ipamDelegateAdmin.d.ts +0 -8
- package/dist/lib/config/aws/ipamDelegateAdmin.js +0 -57
- package/dist/lib/config/aws/ipamPoolId.d.ts +0 -16
- package/dist/lib/config/aws/ipamPoolId.js +0 -42
- package/dist/lib/config/aws/organisation.d.ts +0 -30
- package/dist/lib/config/aws/organisation.js +0 -92
- package/dist/lib/config/aws/organisationId.d.ts +0 -7
- package/dist/lib/config/aws/organisationId.js +0 -45
- package/dist/lib/config/aws/organisationsAccess.d.ts +0 -10
- package/dist/lib/config/aws/organisationsAccess.js +0 -49
- package/dist/lib/config/aws/ramSharing.d.ts +0 -4
- package/dist/lib/config/aws/ramSharing.js +0 -34
- package/dist/lib/config/monitoring.d.ts +0 -18
- package/dist/lib/config/monitoring.js +0 -22
- package/dist/lib/patterns/aws/connections.d.ts +0 -46
- package/dist/lib/patterns/aws/connections.js +0 -159
- package/dist/lib/patterns/aws/hostedZone.d.ts +0 -28
- package/dist/lib/patterns/aws/hostedZone.js +0 -150
- package/dist/lib/patterns/aws/managedAccount.d.ts +0 -9
- package/dist/lib/patterns/aws/managedAccount.js +0 -55
- package/dist/lib/patterns/aws/managedOrganisation.d.ts +0 -36
- package/dist/lib/patterns/aws/managedOrganisation.js +0 -97
- package/dist/lib/patterns/aws/managedPlatform.d.ts +0 -12
- package/dist/lib/patterns/aws/managedPlatform.js +0 -29
- package/dist/lib/resources/aws/database/database.d.ts +0 -14
- package/dist/lib/resources/aws/database/database.js +0 -28
- package/dist/lib/resources/aws/database/databaseInstance.d.ts +0 -15
- package/dist/lib/resources/aws/database/databaseInstance.js +0 -30
- package/dist/lib/resources/aws/database/migrationLambda.d.ts +0 -80
- package/dist/lib/resources/aws/database/migrationLambda.js +0 -119
- package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.d.ts +0 -13
- package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.js +0 -51
- package/dist/lib/resources/aws/iam/securityGroup.d.ts +0 -5
- package/dist/lib/resources/aws/iam/securityGroup.js +0 -14
- package/dist/lib/resources/aws/monitoring/monitoringRole.d.ts +0 -29
- package/dist/lib/resources/aws/monitoring/monitoringRole.js +0 -120
- package/dist/lib/utils/capitalizeString.d.ts +0 -12
- package/dist/lib/utils/capitalizeString.js +0 -30
|
@@ -1,18 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
exports.addMultiUserSecretRotation = addMultiUserSecretRotation;
|
|
8
|
-
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
9
|
-
const aws_secretsmanager_1 = require("aws-cdk-lib/aws-secretsmanager");
|
|
10
|
-
const secrets_1 = require("../secrets");
|
|
11
|
-
const resourceNaming_1 = require("../../../utils/resourceNaming");
|
|
12
|
-
const rdsDefaults_1 = require("./rdsDefaults");
|
|
13
|
-
const databaseTypes_1 = require("../../../utils/databaseTypes");
|
|
1
|
+
import { Duration } from "aws-cdk-lib";
|
|
2
|
+
import { SecretRotation, SecretRotationApplication } from "aws-cdk-lib/aws-secretsmanager";
|
|
3
|
+
import { CustomerManagedKey, Secret } from "../secrets/index.js";
|
|
4
|
+
import { ResourceNaming } from "../../../utils/resourceNaming.js";
|
|
5
|
+
import { RDS_DEFAULTS } from "./rdsDefaults.js";
|
|
6
|
+
import { isAwsManagedKey, isCMKRequested } from "../../../utils/databaseTypes.js";
|
|
14
7
|
/** Default PostgreSQL engine configuration used by both Aurora and Instance constructs. */
|
|
15
|
-
|
|
8
|
+
export const DEFAULT_POSTGRES_ENGINE_CONFIG = {
|
|
16
9
|
defaultUsername: "postgres",
|
|
17
10
|
sslParameters: { "rds.force_ssl": "1" },
|
|
18
11
|
rotationAppName: "SecretsManagerRDSPostgreSQLRotationMultiUser"
|
|
@@ -23,11 +16,11 @@ exports.DEFAULT_POSTGRES_ENGINE_CONFIG = {
|
|
|
23
16
|
* - AWS managed / undefined → returns undefined (CDK default)
|
|
24
17
|
* - IKey → returns the key as-is
|
|
25
18
|
*/
|
|
26
|
-
function resolveStorageEncryptionKey(scope, databaseName, storageKey) {
|
|
27
|
-
if (
|
|
28
|
-
return new
|
|
19
|
+
export function resolveStorageEncryptionKey(scope, databaseName, storageKey) {
|
|
20
|
+
if (isCMKRequested(storageKey)) {
|
|
21
|
+
return new CustomerManagedKey(scope, `${databaseName}ClusterEncryptionKey`, { aliasName: `cmk/rds/${databaseName}/encryptionKey` }).key;
|
|
29
22
|
}
|
|
30
|
-
if (
|
|
23
|
+
if (isAwsManagedKey(storageKey) || storageKey === undefined) {
|
|
31
24
|
return undefined;
|
|
32
25
|
}
|
|
33
26
|
return storageKey;
|
|
@@ -36,14 +29,14 @@ function resolveStorageEncryptionKey(scope, databaseName, storageKey) {
|
|
|
36
29
|
* Resolve a Performance Insights encryption key spec into an IKey or undefined.
|
|
37
30
|
* Only creates a CMK when PI is enabled and CMK is requested.
|
|
38
31
|
*/
|
|
39
|
-
function resolvePerformanceInsightsKey(scope, databaseName, piEnabled, encryptionKey) {
|
|
40
|
-
if (piEnabled &&
|
|
41
|
-
return new
|
|
32
|
+
export function resolvePerformanceInsightsKey(scope, databaseName, piEnabled, encryptionKey) {
|
|
33
|
+
if (piEnabled && isCMKRequested(encryptionKey)) {
|
|
34
|
+
return new CustomerManagedKey(scope, `${databaseName}PerformanceInsightsKey`, { aliasName: `cmk/rds/${databaseName}/InsightsKey` }).key;
|
|
42
35
|
}
|
|
43
36
|
return undefined;
|
|
44
37
|
}
|
|
45
38
|
/** Resolve the databaseInsights prop into an enabled flag and optional config object. */
|
|
46
|
-
function resolveDatabaseInsights(databaseInsights) {
|
|
39
|
+
export function resolveDatabaseInsights(databaseInsights) {
|
|
47
40
|
const piEnabled = databaseInsights !== false;
|
|
48
41
|
const piConfig = piEnabled && typeof databaseInsights === "object"
|
|
49
42
|
? databaseInsights
|
|
@@ -54,16 +47,16 @@ function resolveDatabaseInsights(databaseInsights) {
|
|
|
54
47
|
* Add multi-user secret rotation to a database construct.
|
|
55
48
|
* Shared between RdsAurora and RdsInstance.
|
|
56
49
|
*/
|
|
57
|
-
function addMultiUserSecretRotation(params) {
|
|
50
|
+
export function addMultiUserSecretRotation(params) {
|
|
58
51
|
const rotationConfig = params.credentialsConfig?.secretRotation;
|
|
59
52
|
const rotationPeriod = (typeof rotationConfig === "object" &&
|
|
60
53
|
rotationConfig?.automaticallyAfter) ||
|
|
61
|
-
|
|
62
|
-
const masterSecret = new
|
|
63
|
-
secretName:
|
|
54
|
+
Duration.days(30);
|
|
55
|
+
const masterSecret = new Secret(params.scope, `${params.databaseName}MasterSecret`, {
|
|
56
|
+
secretName: ResourceNaming.masterSecretName(params.constructId)
|
|
64
57
|
});
|
|
65
|
-
new
|
|
66
|
-
application: new
|
|
58
|
+
new SecretRotation(params.scope, `${params.databaseName}SecretRotation`, {
|
|
59
|
+
application: new SecretRotationApplication(params.engineConfig.rotationAppName, RDS_DEFAULTS.ROTATION_APP_VERSION, { isMultiUser: true }),
|
|
67
60
|
secret: params.databaseSecret,
|
|
68
61
|
masterSecret: masterSecret.secret,
|
|
69
62
|
target: params.target,
|
|
@@ -72,4 +65,3 @@ function addMultiUserSecretRotation(params) {
|
|
|
72
65
|
});
|
|
73
66
|
return masterSecret;
|
|
74
67
|
}
|
|
75
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmRzSGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYi9yZXNvdXJjZXMvYXdzL2RhdGFiYXNlL3Jkc0hlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBa0NBLGtFQWdCQztBQU1ELHNFQWNDO0FBR0QsMERBWUM7QUFNRCxnRUFzQ0M7QUFqSUQsNkNBQXVDO0FBSXZDLHVFQUd3QztBQUV4Qyx3Q0FBd0Q7QUFDeEQsa0VBQStEO0FBQy9ELCtDQUE2QztBQUM3QyxnRUFPc0M7QUFFdEMsMkZBQTJGO0FBQzlFLFFBQUEsOEJBQThCLEdBQWlCO0lBQzFELGVBQWUsRUFBRSxVQUFVO0lBQzNCLGFBQWEsRUFBRSxFQUFFLGVBQWUsRUFBRSxHQUFHLEVBQUU7SUFDdkMsZUFBZSxFQUFFLDhDQUE4QztDQUNoRSxDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDSCxTQUFnQiwyQkFBMkIsQ0FDekMsS0FBZ0IsRUFDaEIsWUFBZ0MsRUFDaEMsVUFBeUM7SUFFekMsSUFBSSxJQUFBLDhCQUFjLEVBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUMvQixPQUFPLElBQUksNEJBQWtCLENBQzNCLEtBQUssRUFDTCxHQUFHLFlBQVksc0JBQXNCLEVBQ3JDLEVBQUUsU0FBUyxFQUFFLFdBQVcsWUFBWSxnQkFBZ0IsRUFBRSxDQUN2RCxDQUFDLEdBQUcsQ0FBQztJQUNSLENBQUM7SUFDRCxJQUFJLElBQUEsK0JBQWUsRUFBQyxVQUFVLENBQUMsSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDNUQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQiw2QkFBNkIsQ0FDM0MsS0FBZ0IsRUFDaEIsWUFBZ0MsRUFDaEMsU0FBa0IsRUFDbEIsYUFBNEM7SUFFNUMsSUFBSSxTQUFTLElBQUksSUFBQSw4QkFBYyxFQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7UUFDL0MsT0FBTyxJQUFJLDRCQUFrQixDQUMzQixLQUFLLEVBQ0wsR0FBRyxZQUFZLHdCQUF3QixFQUN2QyxFQUFFLFNBQVMsRUFBRSxXQUFXLFlBQVksY0FBYyxFQUFFLENBQ3JELENBQUMsR0FBRyxDQUFDO0lBQ1IsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRCx5RkFBeUY7QUFDekYsU0FBZ0IsdUJBQXVCLENBQ3JDLGdCQUE0RDtJQUs1RCxNQUFNLFNBQVMsR0FBRyxnQkFBZ0IsS0FBSyxLQUFLLENBQUM7SUFDN0MsTUFBTSxRQUFRLEdBQ1osU0FBUyxJQUFJLE9BQU8sZ0JBQWdCLEtBQUssUUFBUTtRQUMvQyxDQUFDLENBQUMsZ0JBQWdCO1FBQ2xCLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDaEIsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsQ0FBQztBQUNqQyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsMEJBQTBCLENBQUMsTUFTMUM7SUFDQyxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsY0FBYyxDQUFDO0lBQ2hFLE1BQU0sY0FBYyxHQUNsQixDQUFDLE9BQU8sY0FBYyxLQUFLLFFBQVE7UUFDakMsY0FBYyxFQUFFLGtCQUFrQixDQUFDO1FBQ3JDLHNCQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRXBCLE1BQU0sWUFBWSxHQUFHLElBQUksZ0JBQU0sQ0FDN0IsTUFBTSxDQUFDLEtBQUssRUFDWixHQUFHLE1BQU0sQ0FBQyxZQUFZLGNBQWMsRUFDcEM7UUFDRSxVQUFVLEVBQUUsK0JBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO0tBQ2hFLENBQ0YsQ0FBQztJQUVGLElBQUksbUNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsTUFBTSxDQUFDLFlBQVksZ0JBQWdCLEVBQUU7UUFDdkUsV0FBVyxFQUFFLElBQUksOENBQXlCLENBQ3hDLE1BQU0sQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUNuQywwQkFBWSxDQUFDLG9CQUFvQixFQUNqQyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FDdEI7UUFDRCxNQUFNLEVBQUUsTUFBTSxDQUFDLGNBQWM7UUFDN0IsWUFBWSxFQUFFLFlBQVksQ0FBQyxNQUFNO1FBQ2pDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtRQUNyQixHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUc7UUFDZixrQkFBa0IsRUFBRSxjQUFjO0tBQ25DLENBQUMsQ0FBQztJQUVILE9BQU8sWUFBWSxDQUFDO0FBQ3RCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgdHlwZSBJS2V5IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1rbXNcIjtcbmltcG9ydCB7IHR5cGUgSVZwYywgdHlwZSBJQ29ubmVjdGFibGUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHsgdHlwZSBJU2VjcmV0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlclwiO1xuaW1wb3J0IHtcbiAgU2VjcmV0Um90YXRpb24sXG4gIFNlY3JldFJvdGF0aW9uQXBwbGljYXRpb25cbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgQ3VzdG9tZXJNYW5hZ2VkS2V5LCBTZWNyZXQgfSBmcm9tIFwiLi4vc2VjcmV0c1wiO1xuaW1wb3J0IHsgUmVzb3VyY2VOYW1pbmcgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvcmVzb3VyY2VOYW1pbmdcIjtcbmltcG9ydCB7IFJEU19ERUZBVUxUUyB9IGZyb20gXCIuL3Jkc0RlZmF1bHRzXCI7XG5pbXBvcnQge1xuICB0eXBlIERhdGFiYXNlSW5zaWdodHNDb25maWcsXG4gIHR5cGUgRW5naW5lQ29uZmlnLFxuICB0eXBlIEVuY3J5cHRpb25LZXlTcGVjLFxuICB0eXBlIENyZWRlbnRpYWxzQ29uZmlnLFxuICBpc0F3c01hbmFnZWRLZXksXG4gIGlzQ01LUmVxdWVzdGVkXG59IGZyb20gXCIuLi8uLi8uLi91dGlscy9kYXRhYmFzZVR5cGVzXCI7XG5cbi8qKiBEZWZhdWx0IFBvc3RncmVTUUwgZW5naW5lIGNvbmZpZ3VyYXRpb24gdXNlZCBieSBib3RoIEF1cm9yYSBhbmQgSW5zdGFuY2UgY29uc3RydWN0cy4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1BPU1RHUkVTX0VOR0lORV9DT05GSUc6IEVuZ2luZUNvbmZpZyA9IHtcbiAgZGVmYXVsdFVzZXJuYW1lOiBcInBvc3RncmVzXCIsXG4gIHNzbFBhcmFtZXRlcnM6IHsgXCJyZHMuZm9yY2Vfc3NsXCI6IFwiMVwiIH0sXG4gIHJvdGF0aW9uQXBwTmFtZTogXCJTZWNyZXRzTWFuYWdlclJEU1Bvc3RncmVTUUxSb3RhdGlvbk11bHRpVXNlclwiXG59O1xuXG4vKipcbiAqIFJlc29sdmUgYSBzdG9yYWdlIGVuY3J5cHRpb24ga2V5IHNwZWMgaW50byBhbiBJS2V5IG9yIHVuZGVmaW5lZC5cbiAqIC0gQ01LIG1hcmtlciDihpIgY3JlYXRlcyBhIG5ldyBDdXN0b21lck1hbmFnZWRLZXlcbiAqIC0gQVdTIG1hbmFnZWQgLyB1bmRlZmluZWQg4oaSIHJldHVybnMgdW5kZWZpbmVkIChDREsgZGVmYXVsdClcbiAqIC0gSUtleSDihpIgcmV0dXJucyB0aGUga2V5IGFzLWlzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU3RvcmFnZUVuY3J5cHRpb25LZXkoXG4gIHNjb3BlOiBDb25zdHJ1Y3QsXG4gIGRhdGFiYXNlTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBzdG9yYWdlS2V5OiBFbmNyeXB0aW9uS2V5U3BlYyB8IHVuZGVmaW5lZFxuKTogSUtleSB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc0NNS1JlcXVlc3RlZChzdG9yYWdlS2V5KSkge1xuICAgIHJldHVybiBuZXcgQ3VzdG9tZXJNYW5hZ2VkS2V5KFxuICAgICAgc2NvcGUsXG4gICAgICBgJHtkYXRhYmFzZU5hbWV9Q2x1c3RlckVuY3J5cHRpb25LZXlgLFxuICAgICAgeyBhbGlhc05hbWU6IGBjbWsvcmRzLyR7ZGF0YWJhc2VOYW1lfS9lbmNyeXB0aW9uS2V5YCB9XG4gICAgKS5rZXk7XG4gIH1cbiAgaWYgKGlzQXdzTWFuYWdlZEtleShzdG9yYWdlS2V5KSB8fCBzdG9yYWdlS2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBzdG9yYWdlS2V5O1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSBQZXJmb3JtYW5jZSBJbnNpZ2h0cyBlbmNyeXB0aW9uIGtleSBzcGVjIGludG8gYW4gSUtleSBvciB1bmRlZmluZWQuXG4gKiBPbmx5IGNyZWF0ZXMgYSBDTUsgd2hlbiBQSSBpcyBlbmFibGVkIGFuZCBDTUsgaXMgcmVxdWVzdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVBlcmZvcm1hbmNlSW5zaWdodHNLZXkoXG4gIHNjb3BlOiBDb25zdHJ1Y3QsXG4gIGRhdGFiYXNlTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBwaUVuYWJsZWQ6IGJvb2xlYW4sXG4gIGVuY3J5cHRpb25LZXk6IEVuY3J5cHRpb25LZXlTcGVjIHwgdW5kZWZpbmVkXG4pOiBJS2V5IHwgdW5kZWZpbmVkIHtcbiAgaWYgKHBpRW5hYmxlZCAmJiBpc0NNS1JlcXVlc3RlZChlbmNyeXB0aW9uS2V5KSkge1xuICAgIHJldHVybiBuZXcgQ3VzdG9tZXJNYW5hZ2VkS2V5KFxuICAgICAgc2NvcGUsXG4gICAgICBgJHtkYXRhYmFzZU5hbWV9UGVyZm9ybWFuY2VJbnNpZ2h0c0tleWAsXG4gICAgICB7IGFsaWFzTmFtZTogYGNtay9yZHMvJHtkYXRhYmFzZU5hbWV9L0luc2lnaHRzS2V5YCB9XG4gICAgKS5rZXk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqIFJlc29sdmUgdGhlIGRhdGFiYXNlSW5zaWdodHMgcHJvcCBpbnRvIGFuIGVuYWJsZWQgZmxhZyBhbmQgb3B0aW9uYWwgY29uZmlnIG9iamVjdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRGF0YWJhc2VJbnNpZ2h0cyhcbiAgZGF0YWJhc2VJbnNpZ2h0czogRGF0YWJhc2VJbnNpZ2h0c0NvbmZpZyB8IGZhbHNlIHwgdW5kZWZpbmVkXG4pOiB7XG4gIHBpRW5hYmxlZDogYm9vbGVhbjtcbiAgcGlDb25maWc6IERhdGFiYXNlSW5zaWdodHNDb25maWcgfCB1bmRlZmluZWQ7XG59IHtcbiAgY29uc3QgcGlFbmFibGVkID0gZGF0YWJhc2VJbnNpZ2h0cyAhPT0gZmFsc2U7XG4gIGNvbnN0IHBpQ29uZmlnID1cbiAgICBwaUVuYWJsZWQgJiYgdHlwZW9mIGRhdGFiYXNlSW5zaWdodHMgPT09IFwib2JqZWN0XCJcbiAgICAgID8gZGF0YWJhc2VJbnNpZ2h0c1xuICAgICAgOiB1bmRlZmluZWQ7XG4gIHJldHVybiB7IHBpRW5hYmxlZCwgcGlDb25maWcgfTtcbn1cblxuLyoqXG4gKiBBZGQgbXVsdGktdXNlciBzZWNyZXQgcm90YXRpb24gdG8gYSBkYXRhYmFzZSBjb25zdHJ1Y3QuXG4gKiBTaGFyZWQgYmV0d2VlbiBSZHNBdXJvcmEgYW5kIFJkc0luc3RhbmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkTXVsdGlVc2VyU2VjcmV0Um90YXRpb24ocGFyYW1zOiB7XG4gIHNjb3BlOiBDb25zdHJ1Y3Q7XG4gIGRhdGFiYXNlTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBjb25zdHJ1Y3RJZDogc3RyaW5nO1xuICBlbmdpbmVDb25maWc6IEVuZ2luZUNvbmZpZztcbiAgY3JlZGVudGlhbHNDb25maWc6IENyZWRlbnRpYWxzQ29uZmlnIHwgdW5kZWZpbmVkO1xuICBkYXRhYmFzZVNlY3JldDogSVNlY3JldDtcbiAgdGFyZ2V0OiBJQ29ubmVjdGFibGU7XG4gIHZwYzogSVZwYztcbn0pOiBTZWNyZXQge1xuICBjb25zdCByb3RhdGlvbkNvbmZpZyA9IHBhcmFtcy5jcmVkZW50aWFsc0NvbmZpZz8uc2VjcmV0Um90YXRpb247XG4gIGNvbnN0IHJvdGF0aW9uUGVyaW9kID1cbiAgICAodHlwZW9mIHJvdGF0aW9uQ29uZmlnID09PSBcIm9iamVjdFwiICYmXG4gICAgICByb3RhdGlvbkNvbmZpZz8uYXV0b21hdGljYWxseUFmdGVyKSB8fFxuICAgIER1cmF0aW9uLmRheXMoMzApO1xuXG4gIGNvbnN0IG1hc3RlclNlY3JldCA9IG5ldyBTZWNyZXQoXG4gICAgcGFyYW1zLnNjb3BlLFxuICAgIGAke3BhcmFtcy5kYXRhYmFzZU5hbWV9TWFzdGVyU2VjcmV0YCxcbiAgICB7XG4gICAgICBzZWNyZXROYW1lOiBSZXNvdXJjZU5hbWluZy5tYXN0ZXJTZWNyZXROYW1lKHBhcmFtcy5jb25zdHJ1Y3RJZClcbiAgICB9XG4gICk7XG5cbiAgbmV3IFNlY3JldFJvdGF0aW9uKHBhcmFtcy5zY29wZSwgYCR7cGFyYW1zLmRhdGFiYXNlTmFtZX1TZWNyZXRSb3RhdGlvbmAsIHtcbiAgICBhcHBsaWNhdGlvbjogbmV3IFNlY3JldFJvdGF0aW9uQXBwbGljYXRpb24oXG4gICAgICBwYXJhbXMuZW5naW5lQ29uZmlnLnJvdGF0aW9uQXBwTmFtZSxcbiAgICAgIFJEU19ERUZBVUxUUy5ST1RBVElPTl9BUFBfVkVSU0lPTixcbiAgICAgIHsgaXNNdWx0aVVzZXI6IHRydWUgfVxuICAgICksXG4gICAgc2VjcmV0OiBwYXJhbXMuZGF0YWJhc2VTZWNyZXQsXG4gICAgbWFzdGVyU2VjcmV0OiBtYXN0ZXJTZWNyZXQuc2VjcmV0LFxuICAgIHRhcmdldDogcGFyYW1zLnRhcmdldCxcbiAgICB2cGM6IHBhcmFtcy52cGMsXG4gICAgYXV0b21hdGljYWxseUFmdGVyOiByb3RhdGlvblBlcmlvZFxuICB9KTtcblxuICByZXR1cm4gbWFzdGVyU2VjcmV0O1xufVxuIl19
|
|
@@ -3,9 +3,11 @@ import { Connections, type IConnectable, type IVpc } from "aws-cdk-lib/aws-ec2";
|
|
|
3
3
|
import { type IInstanceEngine } from "aws-cdk-lib/aws-rds";
|
|
4
4
|
import { Construct } from "constructs";
|
|
5
5
|
import { SecurityGroup } from "../networking/securityGroup.js";
|
|
6
|
-
import { Secret } from "../secrets";
|
|
7
|
-
import { type StackBuilder } from "../base/awsStack";
|
|
8
|
-
import { type EngineConfig, type ProxyConfig, type ReadReplicaConfig, type CredentialsConfig, type EncryptionConfig, type DatabaseInsightsConfig } from "../../../utils/databaseTypes";
|
|
6
|
+
import { Secret } from "../secrets/index.js";
|
|
7
|
+
import { type StackBuilder } from "../base/awsStack.js";
|
|
8
|
+
import { type EngineConfig, type ProxyConfig, type ReadReplicaConfig, type CredentialsConfig, type EncryptionConfig, type DatabaseInsightsConfig } from "../../../utils/databaseTypes.js";
|
|
9
|
+
import type { ITopic } from "aws-cdk-lib/aws-sns";
|
|
10
|
+
import { type RdsAlarmThresholds } from "../monitoring/index.js";
|
|
9
11
|
interface RdsProps {
|
|
10
12
|
vpc: IVpc;
|
|
11
13
|
databaseName?: string;
|
|
@@ -33,6 +35,12 @@ interface RdsProps {
|
|
|
33
35
|
snapshotIdentifier?: string;
|
|
34
36
|
/** Username from the snapshot (required when restoring from snapshot to reset password) */
|
|
35
37
|
snapshotUsername?: string;
|
|
38
|
+
/** SNS topic for alarm notifications. Required for alarm creation. */
|
|
39
|
+
alertsTopic?: ITopic;
|
|
40
|
+
/** Alarm thresholds. false to disable, undefined for defaults, object to override. */
|
|
41
|
+
alarms?: RdsAlarmThresholds | false;
|
|
42
|
+
/** Application ID for alarm tagging. */
|
|
43
|
+
applicationId?: string;
|
|
36
44
|
}
|
|
37
45
|
export declare class RdsInstance extends Construct implements IConnectable {
|
|
38
46
|
connections: Connections;
|
|
@@ -1,29 +1,39 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
1
|
+
import { Duration, RemovalPolicy } from "aws-cdk-lib";
|
|
2
|
+
import { Connections, InstanceType, Port, SubnetType } from "aws-cdk-lib/aws-ec2";
|
|
3
|
+
import { CaCertificate, Credentials, DatabaseInstance, DatabaseInstanceFromSnapshot, DatabaseInstanceEngine, DatabaseInstanceReadReplica, DatabaseProxy, ParameterGroup, PostgresEngineVersion, ProxyTarget, SnapshotCredentials, StorageType } from "aws-cdk-lib/aws-rds";
|
|
4
|
+
import { Runtime } from "aws-cdk-lib/aws-lambda";
|
|
5
|
+
import { PolicyStatement, Effect } from "aws-cdk-lib/aws-iam";
|
|
6
|
+
import { Construct } from "constructs";
|
|
7
|
+
import { SecurityGroup } from "../networking/securityGroup.js";
|
|
8
|
+
import { CustomerManagedKey, Secret } from "../secrets/index.js";
|
|
9
|
+
import { CustomResource } from "../utilities/customResource.js";
|
|
10
|
+
import { getDatabaseInsightsRetention } from "./index.js";
|
|
11
|
+
import { RDS_DEFAULTS } from "./rdsDefaults.js";
|
|
12
|
+
import { DEFAULT_POSTGRES_ENGINE_CONFIG, resolveDatabaseInsights, resolveStorageEncryptionKey, resolvePerformanceInsightsKey, addMultiUserSecretRotation } from "./rdsHelpers.js";
|
|
13
|
+
import { isCMKRequested } from "../../../utils/databaseTypes.js";
|
|
14
|
+
import { ResourceNaming } from "../../../utils/resourceNaming.js";
|
|
15
|
+
import { addProxyCfnOutput } from "./rdsProxyOutput.js";
|
|
16
|
+
import { createRdsAlarms } from "../monitoring/index.js";
|
|
17
|
+
export class RdsInstance extends Construct {
|
|
18
|
+
connections;
|
|
19
|
+
databaseSecurityGroup;
|
|
20
|
+
vpc;
|
|
21
|
+
port;
|
|
22
|
+
engineConfig;
|
|
23
|
+
databaseCredentials;
|
|
24
|
+
database;
|
|
25
|
+
masterSecret;
|
|
26
|
+
databaseProxy;
|
|
27
|
+
databaseProxySecurityGroup;
|
|
28
|
+
readReplicaSecurityGroup;
|
|
29
|
+
constructId;
|
|
20
30
|
constructor(scope, id, props) {
|
|
21
31
|
super(scope, id);
|
|
22
32
|
this.constructId = id;
|
|
23
|
-
this.port = props.port ||
|
|
33
|
+
this.port = props.port || RDS_DEFAULTS.DEFAULT_PORT;
|
|
24
34
|
this.vpc = props.vpc;
|
|
25
35
|
// PostgreSQL fallback for direct usage - ensure engine and engineConfig match
|
|
26
|
-
this.engineConfig = props.engineConfig ??
|
|
36
|
+
this.engineConfig = props.engineConfig ?? DEFAULT_POSTGRES_ENGINE_CONFIG;
|
|
27
37
|
this.addDatabase(props);
|
|
28
38
|
// Secret rotation enabled by default (opt-out with secretRotation: false)
|
|
29
39
|
const secretRotationDisabled = props.credentials?.secretRotation === false;
|
|
@@ -36,14 +46,24 @@ class RdsInstance extends constructs_1.Construct {
|
|
|
36
46
|
if (props.readReplica !== undefined && props.readReplica !== false) {
|
|
37
47
|
this.addReadReplica(props);
|
|
38
48
|
}
|
|
49
|
+
if (props.alertsTopic && props.alarms !== false) {
|
|
50
|
+
createRdsAlarms({
|
|
51
|
+
scope: this,
|
|
52
|
+
databaseName: this.constructId,
|
|
53
|
+
database: this.database,
|
|
54
|
+
config: typeof props.alarms === "object" ? props.alarms : {},
|
|
55
|
+
alarmTopic: props.alertsTopic,
|
|
56
|
+
applicationId: props.applicationId
|
|
57
|
+
});
|
|
58
|
+
}
|
|
39
59
|
}
|
|
40
60
|
addDatabase(props) {
|
|
41
61
|
// Username priority: snapshotUsername > credentials.username > engine default
|
|
42
62
|
const username = props.snapshotIdentifier && props.snapshotUsername
|
|
43
63
|
? props.snapshotUsername
|
|
44
64
|
: (props.credentials?.username ?? this.engineConfig.defaultUsername);
|
|
45
|
-
this.databaseCredentials = new
|
|
46
|
-
secretName:
|
|
65
|
+
this.databaseCredentials = new Secret(this, `${props.databaseName}Credentials`, {
|
|
66
|
+
secretName: ResourceNaming.credentialsSecretName(this.constructId),
|
|
47
67
|
generateSecretString: {
|
|
48
68
|
secretStringTemplate: JSON.stringify({
|
|
49
69
|
username
|
|
@@ -53,36 +73,36 @@ class RdsInstance extends constructs_1.Construct {
|
|
|
53
73
|
generateStringKey: "password"
|
|
54
74
|
}
|
|
55
75
|
});
|
|
56
|
-
this.databaseSecurityGroup = new
|
|
76
|
+
this.databaseSecurityGroup = new SecurityGroup(this, `${props.databaseName}SecurityGroup`, {
|
|
57
77
|
vpc: this.vpc,
|
|
58
78
|
description: `Security group for RDS database instance ${props.databaseName}`
|
|
59
79
|
});
|
|
60
80
|
// Self-referencing rule for multi-AZ communication
|
|
61
|
-
this.databaseSecurityGroup.addIngressRule(this.databaseSecurityGroup,
|
|
62
|
-
this.connections = new
|
|
81
|
+
this.databaseSecurityGroup.addIngressRule(this.databaseSecurityGroup, Port.tcp(this.port));
|
|
82
|
+
this.connections = new Connections({
|
|
63
83
|
securityGroups: [this.databaseSecurityGroup],
|
|
64
|
-
defaultPort:
|
|
84
|
+
defaultPort: Port.tcp(this.port)
|
|
65
85
|
});
|
|
66
|
-
const storageEncryptionKey =
|
|
67
|
-
const { piEnabled, piConfig } =
|
|
68
|
-
const performanceInsightsEncryptionKey =
|
|
86
|
+
const storageEncryptionKey = resolveStorageEncryptionKey(this, props.databaseName, props.encryption?.storageKey);
|
|
87
|
+
const { piEnabled, piConfig } = resolveDatabaseInsights(props.databaseInsights);
|
|
88
|
+
const performanceInsightsEncryptionKey = resolvePerformanceInsightsKey(this, props.databaseName, piEnabled, piConfig?.encryptionKey);
|
|
69
89
|
const diMode = piConfig?.mode ?? "standard";
|
|
70
90
|
const performanceInsightsRetention = piEnabled
|
|
71
|
-
?
|
|
91
|
+
? getDatabaseInsightsRetention(diMode)
|
|
72
92
|
: undefined;
|
|
73
93
|
const engine = props.engine ||
|
|
74
|
-
|
|
75
|
-
version:
|
|
94
|
+
DatabaseInstanceEngine.postgres({
|
|
95
|
+
version: PostgresEngineVersion.VER_17_5
|
|
76
96
|
});
|
|
77
|
-
const parameterGroup = new
|
|
97
|
+
const parameterGroup = new ParameterGroup(this, `${props.databaseName}ParameterGroup`, {
|
|
78
98
|
engine,
|
|
79
99
|
description: `Parameter group for ${props.databaseName} with security defaults`,
|
|
80
100
|
parameters: this.engineConfig.sslParameters
|
|
81
101
|
});
|
|
82
102
|
// Use PUBLIC subnet for publiclyAccessible databases (e.g., tinkerer tier without NAT)
|
|
83
103
|
const subnetType = props.publiclyAccessible
|
|
84
|
-
?
|
|
85
|
-
:
|
|
104
|
+
? SubnetType.PUBLIC
|
|
105
|
+
: SubnetType.PRIVATE_WITH_EGRESS;
|
|
86
106
|
const commonInstanceProps = {
|
|
87
107
|
vpc: this.vpc,
|
|
88
108
|
vpcSubnets: {
|
|
@@ -92,50 +112,50 @@ class RdsInstance extends constructs_1.Construct {
|
|
|
92
112
|
engine,
|
|
93
113
|
parameterGroup,
|
|
94
114
|
allocatedStorage: props.allocatedStorage,
|
|
95
|
-
backupRetention: props.backupRetention ||
|
|
115
|
+
backupRetention: props.backupRetention || Duration.days(14),
|
|
96
116
|
preferredBackupWindow: props.preferredBackupWindow || "02:00-03:00",
|
|
97
117
|
storageEncrypted: true,
|
|
98
118
|
storageEncryptionKey,
|
|
99
|
-
storageType:
|
|
100
|
-
caCertificate:
|
|
101
|
-
removalPolicy:
|
|
119
|
+
storageType: StorageType.GP3,
|
|
120
|
+
caCertificate: CaCertificate.RDS_CA_RSA4096_G1,
|
|
121
|
+
removalPolicy: RemovalPolicy.SNAPSHOT,
|
|
102
122
|
deleteAutomatedBackups: false,
|
|
103
123
|
enablePerformanceInsights: piEnabled,
|
|
104
124
|
performanceInsightEncryptionKey: performanceInsightsEncryptionKey,
|
|
105
125
|
performanceInsightRetention: performanceInsightsRetention,
|
|
106
|
-
instanceIdentifier:
|
|
126
|
+
instanceIdentifier: ResourceNaming.dbInstanceId(this.constructId),
|
|
107
127
|
instanceType: props.instanceType
|
|
108
|
-
? new
|
|
109
|
-
: new
|
|
128
|
+
? new InstanceType(props.instanceType)
|
|
129
|
+
: new InstanceType("t4g.large"),
|
|
110
130
|
maxAllocatedStorage: props.maxAllocatedStorage || 500,
|
|
111
|
-
monitoringInterval: props.monitoringInterval ||
|
|
131
|
+
monitoringInterval: props.monitoringInterval || RDS_DEFAULTS.MONITORING_INTERVAL,
|
|
112
132
|
multiAz: props.multiAz !== false,
|
|
113
133
|
port: this.port,
|
|
114
134
|
deletionProtection: props.deletionProtection ?? true,
|
|
115
135
|
preferredMaintenanceWindow: props.preferredMaintenanceWindow ||
|
|
116
|
-
|
|
136
|
+
RDS_DEFAULTS.PREFERRED_MAINTENANCE_WINDOW,
|
|
117
137
|
publiclyAccessible: props.publiclyAccessible ?? false
|
|
118
138
|
};
|
|
119
139
|
if (props.snapshotIdentifier) {
|
|
120
140
|
// Create from snapshot
|
|
121
|
-
this.database = new
|
|
141
|
+
this.database = new DatabaseInstanceFromSnapshot(this, `${props.databaseName}Database`, {
|
|
122
142
|
...commonInstanceProps,
|
|
123
143
|
snapshotIdentifier: props.snapshotIdentifier,
|
|
124
144
|
// For snapshots, credentials are used to reset the password
|
|
125
|
-
credentials:
|
|
145
|
+
credentials: SnapshotCredentials.fromSecret(this.databaseCredentials.secret)
|
|
126
146
|
});
|
|
127
147
|
}
|
|
128
148
|
else {
|
|
129
149
|
// Create new instance
|
|
130
|
-
this.database = new
|
|
150
|
+
this.database = new DatabaseInstance(this, `${props.databaseName}Database`, {
|
|
131
151
|
...commonInstanceProps,
|
|
132
152
|
databaseName: props.databaseName,
|
|
133
|
-
credentials:
|
|
153
|
+
credentials: Credentials.fromSecret(this.databaseCredentials.secret)
|
|
134
154
|
});
|
|
135
155
|
}
|
|
136
156
|
}
|
|
137
157
|
rotateSecret(props) {
|
|
138
|
-
this.masterSecret =
|
|
158
|
+
this.masterSecret = addMultiUserSecretRotation({
|
|
139
159
|
scope: this,
|
|
140
160
|
databaseName: props.databaseName,
|
|
141
161
|
constructId: this.constructId,
|
|
@@ -151,55 +171,55 @@ class RdsInstance extends constructs_1.Construct {
|
|
|
151
171
|
return;
|
|
152
172
|
const proxyConfig = props.proxy;
|
|
153
173
|
const vpcSubnets = proxyConfig.vpcSubnets ?? {
|
|
154
|
-
subnetType:
|
|
174
|
+
subnetType: SubnetType.PRIVATE_WITH_EGRESS
|
|
155
175
|
};
|
|
156
|
-
this.databaseProxySecurityGroup = new
|
|
176
|
+
this.databaseProxySecurityGroup = new SecurityGroup(this, `${props.databaseName}ProxySecurityGroup`, {
|
|
157
177
|
vpc: this.vpc,
|
|
158
178
|
description: `Security group for RDS Proxy for ${props.databaseName}`
|
|
159
179
|
});
|
|
160
180
|
// Allow proxy to connect to database
|
|
161
|
-
this.databaseSecurityGroup.addIngressRule(this.databaseProxySecurityGroup,
|
|
162
|
-
this.databaseProxy = new
|
|
163
|
-
dbProxyName:
|
|
164
|
-
proxyTarget:
|
|
181
|
+
this.databaseSecurityGroup.addIngressRule(this.databaseProxySecurityGroup, Port.tcp(this.port), "Allow RDS Proxy to connect to database");
|
|
182
|
+
this.databaseProxy = new DatabaseProxy(this, `${props.databaseName}DatabaseProxy`, {
|
|
183
|
+
dbProxyName: ResourceNaming.proxyName(this.constructId),
|
|
184
|
+
proxyTarget: ProxyTarget.fromInstance(this.database),
|
|
165
185
|
secrets: [this.databaseCredentials.secret],
|
|
166
186
|
securityGroups: [this.databaseProxySecurityGroup],
|
|
167
187
|
vpc: this.vpc,
|
|
168
188
|
vpcSubnets,
|
|
169
189
|
requireTLS: proxyConfig.requireTLS ?? true,
|
|
170
190
|
borrowTimeout: proxyConfig.connectionBorrowTimeout
|
|
171
|
-
?
|
|
172
|
-
:
|
|
191
|
+
? Duration.seconds(proxyConfig.connectionBorrowTimeout)
|
|
192
|
+
: Duration.seconds(120),
|
|
173
193
|
maxConnectionsPercent: proxyConfig.maxConnections,
|
|
174
194
|
maxIdleConnectionsPercent: proxyConfig.maxIdleConnections
|
|
175
195
|
});
|
|
176
|
-
|
|
196
|
+
addProxyCfnOutput(this, this.constructId, props.databaseName, this.databaseProxy);
|
|
177
197
|
}
|
|
178
198
|
addReadReplica(props) {
|
|
179
199
|
if (!props.readReplica)
|
|
180
200
|
return;
|
|
181
201
|
const replicaConfig = props.readReplica;
|
|
182
202
|
const replicaInstanceType = replicaConfig.instanceType ?? props.instanceType ?? "t4g.large";
|
|
183
|
-
const { piEnabled, piConfig } =
|
|
184
|
-
const readReplicaPerformanceInsightsKey = piEnabled &&
|
|
185
|
-
? new
|
|
203
|
+
const { piEnabled, piConfig } = resolveDatabaseInsights(props.databaseInsights);
|
|
204
|
+
const readReplicaPerformanceInsightsKey = piEnabled && isCMKRequested(piConfig?.encryptionKey)
|
|
205
|
+
? new CustomerManagedKey(this, `${props.databaseName}ReadReplicaReaderInsightsKey`, {
|
|
186
206
|
aliasName: `cmk/rds/${props.databaseName}/ReadReplicaInsightsKey`
|
|
187
207
|
}).key
|
|
188
208
|
: undefined;
|
|
189
|
-
this.readReplicaSecurityGroup = new
|
|
209
|
+
this.readReplicaSecurityGroup = new SecurityGroup(this, `${props.databaseName}ReadReplicaSecurityGroup`, {
|
|
190
210
|
vpc: this.vpc,
|
|
191
211
|
description: `Security group for RDS read replica of ${props.databaseName}`
|
|
192
212
|
});
|
|
193
213
|
// Allow primary database to replicate to read replica
|
|
194
|
-
this.readReplicaSecurityGroup.addIngressRule(this.databaseSecurityGroup,
|
|
214
|
+
this.readReplicaSecurityGroup.addIngressRule(this.databaseSecurityGroup, Port.tcp(this.port), "Allow primary database to replicate to read replica");
|
|
195
215
|
// Deletion waiter ensures primary is "available" before CloudFormation deletes it.
|
|
196
216
|
// When the read replica is deleted, the primary enters "modifying" state.
|
|
197
217
|
// Without this waiter, the final snapshot creation fails.
|
|
198
|
-
const instanceId =
|
|
199
|
-
const waiterTimeout =
|
|
200
|
-
const deletionWaiter = new
|
|
201
|
-
runtime:
|
|
202
|
-
timeout: waiterTimeout.plus(
|
|
218
|
+
const instanceId = ResourceNaming.dbInstanceId(this.constructId);
|
|
219
|
+
const waiterTimeout = Duration.minutes(10);
|
|
220
|
+
const deletionWaiter = new CustomResource(this, `${props.databaseName}DeletionWaiter`, {
|
|
221
|
+
runtime: Runtime.NODEJS_22_X,
|
|
222
|
+
timeout: waiterTimeout.plus(Duration.seconds(30)),
|
|
203
223
|
lambdaDescription: `${props.databaseName} deletion waiter`,
|
|
204
224
|
inlineCode: `
|
|
205
225
|
const { RDSClient } = require('@aws-sdk/client-rds');
|
|
@@ -234,8 +254,8 @@ exports.handler = async (event) => {
|
|
|
234
254
|
};
|
|
235
255
|
`,
|
|
236
256
|
inlinePolicy: [
|
|
237
|
-
new
|
|
238
|
-
effect:
|
|
257
|
+
new PolicyStatement({
|
|
258
|
+
effect: Effect.ALLOW,
|
|
239
259
|
actions: ["rds:DescribeDBInstances"],
|
|
240
260
|
resources: ["*"]
|
|
241
261
|
})
|
|
@@ -246,34 +266,34 @@ exports.handler = async (event) => {
|
|
|
246
266
|
}
|
|
247
267
|
});
|
|
248
268
|
deletionWaiter.resource.node.addDependency(this.database);
|
|
249
|
-
const readReplica = new
|
|
269
|
+
const readReplica = new DatabaseInstanceReadReplica(this, `${props.databaseName}ReadReplica`, {
|
|
250
270
|
sourceDatabaseInstance: this.database,
|
|
251
271
|
vpc: this.vpc,
|
|
252
272
|
vpcSubnets: {
|
|
253
|
-
subnetType:
|
|
273
|
+
subnetType: SubnetType.PRIVATE_WITH_EGRESS
|
|
254
274
|
},
|
|
255
275
|
securityGroups: [this.readReplicaSecurityGroup],
|
|
256
276
|
allocatedStorage: props.allocatedStorage,
|
|
257
277
|
storageEncrypted: true,
|
|
258
|
-
storageType:
|
|
259
|
-
caCertificate:
|
|
260
|
-
removalPolicy:
|
|
278
|
+
storageType: StorageType.GP3,
|
|
279
|
+
caCertificate: CaCertificate.RDS_CA_RSA4096_G1,
|
|
280
|
+
removalPolicy: RemovalPolicy.DESTROY,
|
|
261
281
|
deleteAutomatedBackups: false,
|
|
262
282
|
enablePerformanceInsights: piEnabled,
|
|
263
283
|
performanceInsightEncryptionKey: readReplicaPerformanceInsightsKey,
|
|
264
284
|
performanceInsightRetention: piEnabled
|
|
265
|
-
?
|
|
285
|
+
? getDatabaseInsightsRetention(piConfig?.mode ?? "standard")
|
|
266
286
|
: undefined,
|
|
267
|
-
instanceIdentifier:
|
|
268
|
-
instanceType: new
|
|
287
|
+
instanceIdentifier: ResourceNaming.readReplicaId(this.constructId),
|
|
288
|
+
instanceType: new InstanceType(replicaInstanceType),
|
|
269
289
|
availabilityZone: replicaConfig.availabilityZone,
|
|
270
290
|
maxAllocatedStorage: props.maxAllocatedStorage || 500,
|
|
271
|
-
monitoringInterval: props.monitoringInterval ||
|
|
291
|
+
monitoringInterval: props.monitoringInterval || RDS_DEFAULTS.MONITORING_INTERVAL,
|
|
272
292
|
multiAz: props.multiAz !== false,
|
|
273
293
|
port: this.port,
|
|
274
294
|
deletionProtection: props.deletionProtection ?? true,
|
|
275
295
|
preferredMaintenanceWindow: props.preferredMaintenanceWindow ||
|
|
276
|
-
|
|
296
|
+
RDS_DEFAULTS.PREFERRED_MAINTENANCE_WINDOW
|
|
277
297
|
});
|
|
278
298
|
readReplica.node.addDependency(deletionWaiter.resource);
|
|
279
299
|
}
|
|
@@ -305,5 +325,3 @@ exports.handler = async (event) => {
|
|
|
305
325
|
};
|
|
306
326
|
}
|
|
307
327
|
}
|
|
308
|
-
exports.RdsInstance = RdsInstance;
|
|
309
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmRzSW5zdGFuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9kYXRhYmFzZS9yZHNJbnN0YW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBc0Q7QUFDdEQsaURBUTZCO0FBQzdCLGlEQWU2QjtBQUM3Qix1REFBaUQ7QUFDakQsaURBQThEO0FBQzlELDJDQUF1QztBQUN2QyxxRUFBK0Q7QUFDL0Qsd0NBQXdEO0FBQ3hELGdFQUE2RDtBQUU3RCx5QkFBa0Q7QUFDbEQsK0NBQTZDO0FBQzdDLDZDQU1zQjtBQUN0QixnRUFRc0M7QUFDdEMsa0VBQStEO0FBQy9ELHFEQUFxRDtBQStCckQsTUFBYSxXQUFZLFNBQVEsc0JBQVM7SUFnQnhDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBZTtRQUN2RCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksSUFBSSwwQkFBWSxDQUFDLFlBQVksQ0FBQztRQUNwRCxJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUM7UUFFckIsOEVBQThFO1FBQzlFLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksSUFBSSwyQ0FBOEIsQ0FBQztRQUV6RSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXhCLDBFQUEwRTtRQUMxRSxNQUFNLHNCQUFzQixHQUFHLEtBQUssQ0FBQyxXQUFXLEVBQUUsY0FBYyxLQUFLLEtBQUssQ0FBQztRQUMzRSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLENBQUM7UUFFRCxJQUFJLEtBQUssQ0FBQyxLQUFLLEtB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QUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELGNBQWM7UUFDWixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztJQUNsQyxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFVLEVBQUUsS0FBZTtRQUN0QyxPQUFPLENBQUMsRUFBZ0IsRUFBRSxFQUFFO1lBQzFCLE1BQU0sUUFBUSxHQUFhO2dCQUN6QixHQUFHLEtBQUs7Z0JBQ1IsR0FBRztvQkFDRCxHQUFHLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxJQUFJLEtBQUssQ0FBQyxHQUFHO29CQUNqQyxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLElBQUksRUFBRTtvQkFDL0MsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZLElBQUksR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRTtpQkFDL0Q7YUFDRixDQUFDO1lBRUYsT0FBTyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQy9DLENBQUMsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQXJhRCxrQ0FxYUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEdXJhdGlvbiwgUmVtb3ZhbFBvbGljeSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHtcbiAgQ29ubmVjdGlvbnMsXG4gIHR5cGUgSUNvbm5lY3RhYmxlLFxuICBJbnN0YW5jZVR5cGUsXG4gIHR5cGUgSVZwYyxcbiAgUG9ydCxcbiAgdHlwZSBTdWJuZXRTZWxlY3Rpb24sXG4gIFN1Ym5ldFR5cGVcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7XG4gIENhQ2VydGlmaWNhdGUsXG4gIENyZWRlbnRpYWxzLFxuICBEYXRhYmFzZUluc3RhbmNlLFxuICBEYXRhYmFzZUluc3RhbmNlRnJvbVNuYXBzaG90LFxuICBEYXRhYmFzZUluc3RhbmNlRW5naW5lLFxuICBEYXRhYmFzZUluc3RhbmNlUmVhZFJlcGxpY2EsXG4gIERhdGFiYXNlUHJveHksXG4gIHR5cGUgSURhdGFiYXNlSW5zdGFuY2UsXG4gIHR5cGUgSUluc3RhbmNlRW5naW5lLFxuICBQYXJhbWV0ZXJHcm91cCxcbiAgUG9zdGdyZXNFbmdpbmVWZXJzaW9uLFxuICBQcm94eVRhcmdldCxcbiAgU25hcHNob3RDcmVkZW50aWFscyxcbiAgU3RvcmFnZVR5cGVcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yZHNcIjtcbmltcG9ydCB7IFJ1bnRpbWUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0IHsgUG9saWN5U3RhdGVtZW50LCBFZmZlY3QgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IFNlY3VyaXR5R3JvdXAgfSBmcm9tIFwiLi4vbmV0d29ya2luZy9zZWN1cml0eUdyb3VwLmpzXCI7XG5pbXBvcnQgeyBDdXN0b21lck1hbmFnZWRLZXksIFNlY3JldCB9IGZyb20gXCIuLi9zZWNyZXRzXCI7XG5pbXBvcnQgeyBDdXN0b21SZXNvdXJjZSB9IGZyb20gXCIuLi91dGlsaXRpZXMvY3VzdG9tUmVzb3VyY2VcIjtcbmltcG9ydCB7IHR5cGUgU3RhY2tCdWlsZGVyIH0gZnJvbSBcIi4uL2Jhc2UvYXdzU3RhY2tcIjtcbmltcG9ydCB7IGdldERhdGFiYXNlSW5zaWdodHNSZXRlbnRpb24gfSBmcm9tIFwiLi9cIjtcbmltcG9ydCB7IFJEU19ERUZBVUxUUyB9IGZyb20gXCIuL3Jkc0RlZmF1bHRzXCI7XG5pbXBvcnQge1xuICBERUZBVUxUX1BPU1RHUkVTX0VOR0lORV9DT05GSUcsXG4gIHJlc29sdmVEYXRhYmFzZUluc2lnaHRzLFxuICByZXNvbHZlU3RvcmFnZUVuY3J5cHRpb25LZXksXG4gIHJlc29sdmVQZXJmb3JtYW5jZUluc2lnaHRzS2V5LFxuICBhZGRNdWx0aVVzZXJTZWNyZXRSb3RhdGlvblxufSBmcm9tIFwiLi9yZHNIZWxwZXJzXCI7XG5pbXBvcnQge1xuICB0eXBlIEVuZ2luZUNvbmZpZyxcbiAgdHlwZSBQcm94eUNvbmZpZyxcbiAgdHlwZSBSZWFkUmVwbGljYUNvbmZpZyxcbiAgdHlwZSBDcmVkZW50aWFsc0NvbmZpZyxcbiAgdHlwZSBFbmNyeXB0aW9uQ29uZmlnLFxuICB0eXBlIERhdGFiYXNlSW5zaWdodHNDb25maWcsXG4gIGlzQ01LUmVxdWVzdGVkXG59IGZyb20gXCIuLi8uLi8uLi91dGlscy9kYXRhYmFzZVR5cGVzXCI7XG5pbXBvcnQgeyBSZXNvdXJjZU5hbWluZyB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9yZXNvdXJjZU5hbWluZ1wiO1xuaW1wb3J0IHsgYWRkUHJveHlDZm5PdXRwdXQgfSBmcm9tIFwiLi9yZHNQcm94eU91dHB1dFwiO1xuXG5pbnRlcmZhY2UgUmRzUHJvcHMge1xuICB2cGM6IElWcGM7XG4gIGRhdGFiYXNlTmFtZT86IHN0cmluZztcbiAgZW5naW5lPzogSUluc3RhbmNlRW5naW5lO1xuICBlbmdpbmVDb25maWc/OiBFbmdpbmVDb25maWc7XG4gIGluc3RhbmNlVHlwZT86IHN0cmluZztcbiAgbWF4QWxsb2NhdGVkU3RvcmFnZT86IG51bWJlcjtcbiAgYWxsb2NhdGVkU3RvcmFnZT86IG51bWJlcjtcbiAgYmFja3VwUmV0ZW50aW9uPzogRHVyYXRpb247XG4gIHByZWZlcnJlZEJhY2t1cFdpbmRvdz86IHN0cmluZztcbiAgY2x1c3RlcklkZW50aWZpZXI/OiBzdHJpbmc7XG4gIG1vbml0b3JpbmdJbnRlcnZhbD86IER1cmF0aW9uO1xuICBwcmVmZXJyZWRNYWludGVuYW5jZVdpbmRvdz86IHN0cmluZztcbiAgcG9ydD86IG51bWJlcjtcbiAgZGF0YWJhc2VJbnNpZ2h0cz86IERhdGFiYXNlSW5zaWdodHNDb25maWcgfCBmYWxzZTtcbiAgc2VjdXJpdHlHcm91cElkcz86IHN0cmluZ1tdO1xuICBtdWx0aUF6PzogYm9vbGVhbjtcbiAgcHJveHk/OiBQcm94eUNvbmZpZyB8IGZhbHNlO1xuICByZWFkUmVwbGljYT86IFJlYWRSZXBsaWNhQ29uZmlnIHwgZmFsc2U7XG4gIGNyZWRlbnRpYWxzPzogQ3JlZGVudGlhbHNDb25maWc7XG4gIGVuY3J5cHRpb24/OiBFbmNyeXB0aW9uQ29uZmlnO1xuICBwdWJsaWNseUFjY2Vzc2libGU/OiBib29sZWFuO1xuICBkZWxldGlvblByb3RlY3Rpb24/OiBib29sZWFuO1xuICAvKiogQVJOIG9yIGlkZW50aWZpZXIgb2YgREIgaW5zdGFuY2Ugc25hcHNob3QgdG8gcmVzdG9yZSBmcm9tICovXG4gIHNuYXBzaG90SWRlbnRpZmllcj86IHN0cmluZztcbiAgLyoqIFVzZXJuYW1lIGZyb20gdGhlIHNuYXBzaG90IChyZXF1aXJlZCB3aGVuIHJlc3RvcmluZyBmcm9tIHNuYXBzaG90IHRvIHJlc2V0IHBhc3N3b3JkKSAqL1xuICBzbmFwc2hvdFVzZXJuYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgUmRzSW5zdGFuY2UgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJQ29ubmVjdGFibGUge1xuICBwdWJsaWMgY29ubmVjdGlvbnMhOiBDb25uZWN0aW9ucztcbiAgcHVibGljIGRhdGFiYXNlU2VjdXJpdHlHcm91cCE6IFNlY3VyaXR5R3JvdXA7XG4gIHB1YmxpYyB2cGMhOiBJVnBjO1xuXG4gIHByaXZhdGUgcG9ydCE6IG51bWJlcjtcbiAgcHJpdmF0ZSBlbmdpbmVDb25maWchOiBFbmdpbmVDb25maWc7XG4gIHByaXZhdGUgZGF0YWJhc2VDcmVkZW50aWFscyE6IFNlY3JldDtcbiAgcHJpdmF0ZSBkYXRhYmFzZSE6IElEYXRhYmFzZUluc3RhbmNlO1xuICBwcml2YXRlIG1hc3RlclNlY3JldD86IFNlY3JldDtcbiAgcHJpdmF0ZSBkYXRhYmFzZVByb3h5PzogRGF0YWJhc2VQcm94eTtcbiAgcHJpdmF0ZSBkYXRhYmFzZVByb3h5U2VjdXJpdHlHcm91cD86IFNlY3VyaXR5R3JvdXA7XG4gIHByaXZhdGUgcmVhZFJlcGxpY2FTZWN1cml0eUdyb3VwPzogU2VjdXJpdHlHcm91cDtcblxuICBwcml2YXRlIHJlYWRvbmx5IGNvbnN0cnVjdElkOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFJkc1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMuY29uc3RydWN0SWQgPSBpZDtcbiAgICB0aGlzLnBvcnQgPSBwcm9wcy5wb3J0IHx8IFJEU19ERUZBVUxUUy5ERUZBVUxUX1BPUlQ7XG4gICAgdGhpcy52cGMgPSBwcm9wcy52cGM7XG5cbiAgICAvLyBQb3N0Z3JlU1FMIGZhbGxiYWNrIGZvciBkaXJlY3QgdXNhZ2UgLSBlbnN1cmUgZW5naW5lIGFuZCBlbmdpbmVDb25maWcgbWF0Y2hcbiAgICB0aGlzLmVuZ2luZUNvbmZpZyA9IHByb3BzLmVuZ2luZUNvbmZpZyA/PyBERUZBVUxUX1BPU1RHUkVTX0VOR0lORV9DT05GSUc7XG5cbiAgICB0aGlzLmFkZERhdGFiYXNlKHByb3BzKTtcblxuICAgIC8vIFNlY3JldCByb3RhdGlvbiBlbmFibGVkIGJ5IGRlZmF1bHQgKG9wdC1vdXQgd2l0aCBzZWNyZXRSb3RhdGlvbjogZmFsc2UpXG4gICAgY29uc3Qgc2VjcmV0Um90YXRpb25EaXNhYmxlZCA9IHByb3BzLmNyZWRlbnRpYWxzPy5zZWNyZXRSb3RhdGlvbiA9PT0gZmFsc2U7XG4gICAgaWYgKCFzZWNyZXRSb3RhdGlvbkRpc2FibGVkKSB7XG4gICAgICB0aGlzLnJvdGF0ZVNlY3JldChwcm9wcyk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLnByb3h5ICE9PSB1bmRlZmluZWQgJiYgcHJvcHMucHJveHkgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmFkZFByb3h5KHByb3BzKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMucmVhZFJlcGxpY2EgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5yZWFkUmVwbGljYSAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuYWRkUmVhZFJlcGxpY2EocHJvcHMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkRGF0YWJhc2UocHJvcHM6IFJkc1Byb3BzKSB7XG4gICAgLy8gVXNlcm5hbWUgcHJpb3JpdHk6IHNuYXBzaG90VXNlcm5hbWUgPiBjcmVkZW50aWFscy51c2VybmFtZSA+IGVuZ2luZSBkZWZhdWx0XG4gICAgY29uc3QgdXNlcm5hbWUgPVxuICAgICAgcHJvcHMuc25hcHNob3RJZGVudGlmaWVyICYmIHByb3BzLnNuYXBzaG90VXNlcm5hbWVcbiAgICAgICAgPyBwcm9wcy5zbmFwc2hvdFVzZXJuYW1lXG4gICAgICAgIDogKHByb3BzLmNyZWRlbnRpYWxzPy51c2VybmFtZSA/PyB0aGlzLmVuZ2luZUNvbmZpZy5kZWZhdWx0VXNlcm5hbWUpO1xuICAgIHRoaXMuZGF0YWJhc2VDcmVkZW50aWFscyA9IG5ldyBTZWNyZXQoXG4gICAgICB0aGlzLFxuICAgICAgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfUNyZWRlbnRpYWxzYCxcbiAgICAgIHtcbiAgICAgICAgc2VjcmV0TmFtZTogUmVzb3VyY2VOYW1pbmcuY3JlZGVudGlhbHNTZWNyZXROYW1lKHRoaXMuY29uc3RydWN0SWQpLFxuICAgICAgICBnZW5lcmF0ZVNlY3JldFN0cmluZzoge1xuICAgICAgICAgIHNlY3JldFN0cmluZ1RlbXBsYXRlOiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICB1c2VybmFtZVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGV4Y2x1ZGVQdW5jdHVhdGlvbjogdHJ1ZSxcbiAgICAgICAgICBpbmNsdWRlU3BhY2U6IGZhbHNlLFxuICAgICAgICAgIGdlbmVyYXRlU3RyaW5nS2V5OiBcInBhc3N3b3JkXCJcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG5cbiAgICB0aGlzLmRhdGFiYXNlU2VjdXJpdHlHcm91cCA9IG5ldyBTZWN1cml0eUdyb3VwKFxuICAgICAgdGhpcyxcbiAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1TZWN1cml0eUdyb3VwYCxcbiAgICAgIHtcbiAgICAgICAgdnBjOiB0aGlzLnZwYyxcbiAgICAgICAgZGVzY3JpcHRpb246IGBTZWN1cml0eSBncm91cCBmb3IgUkRTIGRhdGFiYXNlIGluc3RhbmNlICR7cHJvcHMuZGF0YWJhc2VOYW1lfWBcbiAgICAgIH1cbiAgICApO1xuXG4gICAgLy8gU2VsZi1yZWZlcmVuY2luZyBydWxlIGZvciBtdWx0aS1BWiBjb21tdW5pY2F0aW9uXG4gICAgdGhpcy5kYXRhYmFzZVNlY3VyaXR5R3JvdXAuYWRkSW5ncmVzc1J1bGUoXG4gICAgICB0aGlzLmRhdGFiYXNlU2VjdXJpdHlHcm91cCxcbiAgICAgIFBvcnQudGNwKHRoaXMucG9ydClcbiAgICApO1xuXG4gICAgdGhpcy5jb25uZWN0aW9ucyA9IG5ldyBDb25uZWN0aW9ucyh7XG4gICAgICBzZWN1cml0eUdyb3VwczogW3RoaXMuZGF0YWJhc2VTZWN1cml0eUdyb3VwXSxcbiAgICAgIGRlZmF1bHRQb3J0OiBQb3J0LnRjcCh0aGlzLnBvcnQpXG4gICAgfSk7XG5cbiAgICBjb25zdCBzdG9yYWdlRW5jcnlwdGlvbktleSA9IHJlc29sdmVTdG9yYWdlRW5jcnlwdGlvbktleShcbiAgICAgIHRoaXMsXG4gICAgICBwcm9wcy5kYXRhYmFzZU5hbWUsXG4gICAgICBwcm9wcy5lbmNyeXB0aW9uPy5zdG9yYWdlS2V5XG4gICAgKTtcblxuICAgIGNvbnN0IHsgcGlFbmFibGVkLCBwaUNvbmZpZyB9ID0gcmVzb2x2ZURhdGFiYXNlSW5zaWdodHMoXG4gICAgICBwcm9wcy5kYXRhYmFzZUluc2lnaHRzXG4gICAgKTtcblxuICAgIGNvbnN0IHBlcmZvcm1hbmNlSW5zaWdodHNFbmNyeXB0aW9uS2V5ID0gcmVzb2x2ZVBlcmZvcm1hbmNlSW5zaWdodHNLZXkoXG4gICAgICB0aGlzLFxuICAgICAgcHJvcHMuZGF0YWJhc2VOYW1lLFxuICAgICAgcGlFbmFibGVkLFxuICAgICAgcGlDb25maWc/LmVuY3J5cHRpb25LZXlcbiAgICApO1xuXG4gICAgY29uc3QgZGlNb2RlID0gcGlDb25maWc/Lm1vZGUgPz8gXCJzdGFuZGFyZFwiO1xuICAgIGNvbnN0IHBlcmZvcm1hbmNlSW5zaWdodHNSZXRlbnRpb24gPSBwaUVuYWJsZWRcbiAgICAgID8gZ2V0RGF0YWJhc2VJbnNpZ2h0c1JldGVudGlvbihkaU1vZGUpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGVuZ2luZSA9XG4gICAgICBwcm9wcy5lbmdpbmUgfHxcbiAgICAgIERhdGFiYXNlSW5zdGFuY2VFbmdpbmUucG9zdGdyZXMoe1xuICAgICAgICB2ZXJzaW9uOiBQb3N0Z3Jlc0VuZ2luZVZlcnNpb24uVkVSXzE3XzVcbiAgICAgIH0pO1xuXG4gICAgY29uc3QgcGFyYW1ldGVyR3JvdXAgPSBuZXcgUGFyYW1ldGVyR3JvdXAoXG4gICAgICB0aGlzLFxuICAgICAgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVBhcmFtZXRlckdyb3VwYCxcbiAgICAgIHtcbiAgICAgICAgZW5naW5lLFxuICAgICAgICBkZXNjcmlwdGlvbjogYFBhcmFtZXRlciBncm91cCBmb3IgJHtwcm9wcy5kYXRhYmFzZU5hbWV9IHdpdGggc2VjdXJpdHkgZGVmYXVsdHNgLFxuICAgICAgICBwYXJhbWV0ZXJzOiB0aGlzLmVuZ2luZUNvbmZpZy5zc2xQYXJhbWV0ZXJzXG4gICAgICB9XG4gICAgKTtcblxuICAgIC8vIFVzZSBQVUJMSUMgc3VibmV0IGZvciBwdWJsaWNseUFjY2Vzc2libGUgZGF0YWJhc2VzIChlLmcuLCB0aW5rZXJlciB0aWVyIHdpdGhvdXQgTkFUKVxuICAgIGNvbnN0IHN1Ym5ldFR5cGUgPSBwcm9wcy5wdWJsaWNseUFjY2Vzc2libGVcbiAgICAgID8gU3VibmV0VHlwZS5QVUJMSUNcbiAgICAgIDogU3VibmV0VHlwZS5QUklWQVRFX1dJVEhfRUdSRVNTO1xuXG4gICAgY29uc3QgY29tbW9uSW5zdGFuY2VQcm9wcyA9IHtcbiAgICAgIHZwYzogdGhpcy52cGMsXG4gICAgICB2cGNTdWJuZXRzOiB7XG4gICAgICAgIHN1Ym5ldFR5cGVcbiAgICAgIH0sXG4gICAgICBzZWN1cml0eUdyb3VwczogW3RoaXMuZGF0YWJhc2VTZWN1cml0eUdyb3VwXSxcbiAgICAgIGVuZ2luZSxcbiAgICAgIHBhcmFtZXRlckdyb3VwLFxuICAgICAgYWxsb2NhdGVkU3RvcmFnZTogcHJvcHMuYWxsb2NhdGVkU3RvcmFnZSxcbiAgICAgIGJhY2t1cFJldGVudGlvbjogcHJvcHMuYmFja3VwUmV0ZW50aW9uIHx8IER1cmF0aW9uLmRheXMoMTQpLFxuICAgICAgcHJlZmVycmVkQmFja3VwV2luZG93OiBwcm9wcy5wcmVmZXJyZWRCYWNrdXBXaW5kb3cgfHwgXCIwMjowMC0wMzowMFwiLFxuICAgICAgc3RvcmFnZUVuY3J5cHRlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2VFbmNyeXB0aW9uS2V5LFxuICAgICAgc3RvcmFnZVR5cGU6IFN0b3JhZ2VUeXBlLkdQMyxcbiAgICAgIGNhQ2VydGlmaWNhdGU6IENhQ2VydGlmaWNhdGUuUkRTX0NBX1JTQTQwOTZfRzEsXG4gICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LlNOQVBTSE9ULFxuICAgICAgZGVsZXRlQXV0b21hdGVkQmFja3VwczogZmFsc2UsXG4gICAgICBlbmFibGVQZXJmb3JtYW5jZUluc2lnaHRzOiBwaUVuYWJsZWQsXG4gICAgICBwZXJmb3JtYW5jZUluc2lnaHRFbmNyeXB0aW9uS2V5OiBwZXJmb3JtYW5jZUluc2lnaHRzRW5jcnlwdGlvbktleSxcbiAgICAgIHBlcmZvcm1hbmNlSW5zaWdodFJldGVudGlvbjogcGVyZm9ybWFuY2VJbnNpZ2h0c1JldGVudGlvbixcbiAgICAgIGluc3RhbmNlSWRlbnRpZmllcjogUmVzb3VyY2VOYW1pbmcuZGJJbnN0YW5jZUlkKHRoaXMuY29uc3RydWN0SWQpLFxuICAgICAgaW5zdGFuY2VUeXBlOiBwcm9wcy5pbnN0YW5jZVR5cGVcbiAgICAgICAgPyBuZXcgSW5zdGFuY2VUeXBlKHByb3BzLmluc3RhbmNlVHlwZSlcbiAgICAgICAgOiBuZXcgSW5zdGFuY2VUeXBlKFwidDRnLmxhcmdlXCIpLFxuICAgICAgbWF4QWxsb2NhdGVkU3RvcmFnZTogcHJvcHMubWF4QWxsb2NhdGVkU3RvcmFnZSB8fCA1MDAsXG4gICAgICBtb25pdG9yaW5nSW50ZXJ2YWw6XG4gICAgICAgIHByb3BzLm1vbml0b3JpbmdJbnRlcnZhbCB8fCBSRFNfREVGQVVMVFMuTU9OSVRPUklOR19JTlRFUlZBTCxcbiAgICAgIG11bHRpQXo6IHByb3BzLm11bHRpQXogIT09IGZhbHNlLFxuICAgICAgcG9ydDogdGhpcy5wb3J0LFxuICAgICAgZGVsZXRpb25Qcm90ZWN0aW9uOiBwcm9wcy5kZWxldGlvblByb3RlY3Rpb24gPz8gdHJ1ZSxcbiAgICAgIHByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93OlxuICAgICAgICBwcm9wcy5wcmVmZXJyZWRNYWludGVuYW5jZVdpbmRvdyB8fFxuICAgICAgICBSRFNfREVGQVVMVFMuUFJFRkVSUkVEX01BSU5URU5BTkNFX1dJTkRPVyxcbiAgICAgIHB1YmxpY2x5QWNjZXNzaWJsZTogcHJvcHMucHVibGljbHlBY2Nlc3NpYmxlID8/IGZhbHNlXG4gICAgfTtcblxuICAgIGlmIChwcm9wcy5zbmFwc2hvdElkZW50aWZpZXIpIHtcbiAgICAgIC8vIENyZWF0ZSBmcm9tIHNuYXBzaG90XG4gICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IERhdGFiYXNlSW5zdGFuY2VGcm9tU25hcHNob3QoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1EYXRhYmFzZWAsXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5jb21tb25JbnN0YW5jZVByb3BzLFxuICAgICAgICAgIHNuYXBzaG90SWRlbnRpZmllcjogcHJvcHMuc25hcHNob3RJZGVudGlmaWVyLFxuICAgICAgICAgIC8vIEZvciBzbmFwc2hvdHMsIGNyZWRlbnRpYWxzIGFyZSB1c2VkIHRvIHJlc2V0IHRoZSBwYXNzd29yZFxuICAgICAgICAgIGNyZWRlbnRpYWxzOiBTbmFwc2hvdENyZWRlbnRpYWxzLmZyb21TZWNyZXQoXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlQ3JlZGVudGlhbHMuc2VjcmV0XG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDcmVhdGUgbmV3IGluc3RhbmNlXG4gICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IERhdGFiYXNlSW5zdGFuY2UoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1EYXRhYmFzZWAsXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5jb21tb25JbnN0YW5jZVByb3BzLFxuICAgICAgICAgIGRhdGFiYXNlTmFtZTogcHJvcHMuZGF0YWJhc2VOYW1lLFxuICAgICAgICAgIGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscy5mcm9tU2VjcmV0KHRoaXMuZGF0YWJhc2VDcmVkZW50aWFscy5zZWNyZXQpXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByb3RhdGVTZWNyZXQocHJvcHM6IFJkc1Byb3BzKSB7XG4gICAgdGhpcy5tYXN0ZXJTZWNyZXQgPSBhZGRNdWx0aVVzZXJTZWNyZXRSb3RhdGlvbih7XG4gICAgICBzY29wZTogdGhpcyxcbiAgICAgIGRhdGFiYXNlTmFtZTogcHJvcHMuZGF0YWJhc2VOYW1lLFxuICAgICAgY29uc3RydWN0SWQ6IHRoaXMuY29uc3RydWN0SWQsXG4gICAgICBlbmdpbmVDb25maWc6IHRoaXMuZW5naW5lQ29uZmlnLFxuICAgICAgY3JlZGVudGlhbHNDb25maWc6IHByb3BzLmNyZWRlbnRpYWxzLFxuICAgICAgZGF0YWJhc2VTZWNyZXQ6IHRoaXMuZGF0YWJhc2VDcmVkZW50aWFscy5zZWNyZXQsXG4gICAgICB0YXJnZXQ6IHRoaXMuZGF0YWJhc2UsXG4gICAgICB2cGM6IHRoaXMudnBjXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFkZFByb3h5KHByb3BzOiBSZHNQcm9wcykge1xuICAgIGlmICghcHJvcHMucHJveHkpIHJldHVybjtcbiAgICBjb25zdCBwcm94eUNvbmZpZyA9IHByb3BzLnByb3h5O1xuICAgIGNvbnN0IHZwY1N1Ym5ldHM6IFN1Ym5ldFNlbGVjdGlvbiA9IHByb3h5Q29uZmlnLnZwY1N1Ym5ldHMgPz8ge1xuICAgICAgc3VibmV0VHlwZTogU3VibmV0VHlwZS5QUklWQVRFX1dJVEhfRUdSRVNTXG4gICAgfTtcblxuICAgIHRoaXMuZGF0YWJhc2VQcm94eVNlY3VyaXR5R3JvdXAgPSBuZXcgU2VjdXJpdHlHcm91cChcbiAgICAgIHRoaXMsXG4gICAgICBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9UHJveHlTZWN1cml0eUdyb3VwYCxcbiAgICAgIHtcbiAgICAgICAgdnBjOiB0aGlzLnZwYyxcbiAgICAgICAgZGVzY3JpcHRpb246IGBTZWN1cml0eSBncm91cCBmb3IgUkRTIFByb3h5IGZvciAke3Byb3BzLmRhdGFiYXNlTmFtZX1gXG4gICAgICB9XG4gICAgKTtcblxuICAgIC8vIEFsbG93IHByb3h5IHRvIGNvbm5lY3QgdG8gZGF0YWJhc2VcbiAgICB0aGlzLmRhdGFiYXNlU2VjdXJpdHlHcm91cC5hZGRJbmdyZXNzUnVsZShcbiAgICAgIHRoaXMuZGF0YWJhc2VQcm94eVNlY3VyaXR5R3JvdXAsXG4gICAgICBQb3J0LnRjcCh0aGlzLnBvcnQpLFxuICAgICAgXCJBbGxvdyBSRFMgUHJveHkgdG8gY29ubmVjdCB0byBkYXRhYmFzZVwiXG4gICAgKTtcblxuICAgIHRoaXMuZGF0YWJhc2VQcm94eSA9IG5ldyBEYXRhYmFzZVByb3h5KFxuICAgICAgdGhpcyxcbiAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1EYXRhYmFzZVByb3h5YCxcbiAgICAgIHtcbiAgICAgICAgZGJQcm94eU5hbWU6IFJlc291cmNlTmFtaW5nLnByb3h5TmFtZSh0aGlzLmNvbnN0cnVjdElkKSxcbiAgICAgICAgcHJveHlUYXJnZXQ6IFByb3h5VGFyZ2V0LmZyb21JbnN0YW5jZSh0aGlzLmRhdGFiYXNlKSxcbiAgICAgICAgc2VjcmV0czogW3RoaXMuZGF0YWJhc2VDcmVkZW50aWFscy5zZWNyZXRdLFxuICAgICAgICBzZWN1cml0eUdyb3VwczogW3RoaXMuZGF0YWJhc2VQcm94eVNlY3VyaXR5R3JvdXBdLFxuICAgICAgICB2cGM6IHRoaXMudnBjLFxuICAgICAgICB2cGNTdWJuZXRzLFxuICAgICAgICByZXF1aXJlVExTOiBwcm94eUNvbmZpZy5yZXF1aXJlVExTID8/IHRydWUsXG4gICAgICAgIGJvcnJvd1RpbWVvdXQ6IHByb3h5Q29uZmlnLmNvbm5lY3Rpb25Cb3Jyb3dUaW1lb3V0XG4gICAgICAgICAgPyBEdXJhdGlvbi5zZWNvbmRzKHByb3h5Q29uZmlnLmNvbm5lY3Rpb25Cb3Jyb3dUaW1lb3V0KVxuICAgICAgICAgIDogRHVyYXRpb24uc2Vjb25kcygxMjApLFxuICAgICAgICBtYXhDb25uZWN0aW9uc1BlcmNlbnQ6IHByb3h5Q29uZmlnLm1heENvbm5lY3Rpb25zLFxuICAgICAgICBtYXhJZGxlQ29ubmVjdGlvbnNQZXJjZW50OiBwcm94eUNvbmZpZy5tYXhJZGxlQ29ubmVjdGlvbnNcbiAgICAgIH1cbiAgICApO1xuXG4gICAgYWRkUHJveHlDZm5PdXRwdXQoXG4gICAgICB0aGlzLFxuICAgICAgdGhpcy5jb25zdHJ1Y3RJZCxcbiAgICAgIHByb3BzLmRhdGFiYXNlTmFtZSxcbiAgICAgIHRoaXMuZGF0YWJhc2VQcm94eVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFkZFJlYWRSZXBsaWNhKHByb3BzOiBSZHNQcm9wcykge1xuICAgIGlmICghcHJvcHMucmVhZFJlcGxpY2EpIHJldHVybjtcbiAgICBjb25zdCByZXBsaWNhQ29uZmlnID0gcHJvcHMucmVhZFJlcGxpY2E7XG4gICAgY29uc3QgcmVwbGljYUluc3RhbmNlVHlwZSA9XG4gICAgICByZXBsaWNhQ29uZmlnLmluc3RhbmNlVHlwZSA/PyBwcm9wcy5pbnN0YW5jZVR5cGUgPz8gXCJ0NGcubGFyZ2VcIjtcblxuICAgIGNvbnN0IHsgcGlFbmFibGVkLCBwaUNvbmZpZyB9ID0gcmVzb2x2ZURhdGFiYXNlSW5zaWdodHMoXG4gICAgICBwcm9wcy5kYXRhYmFzZUluc2lnaHRzXG4gICAgKTtcblxuICAgIGNvbnN0IHJlYWRSZXBsaWNhUGVyZm9ybWFuY2VJbnNpZ2h0c0tleSA9XG4gICAgICBwaUVuYWJsZWQgJiYgaXNDTUtSZXF1ZXN0ZWQocGlDb25maWc/LmVuY3J5cHRpb25LZXkpXG4gICAgICAgID8gbmV3IEN1c3RvbWVyTWFuYWdlZEtleShcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9UmVhZFJlcGxpY2FSZWFkZXJJbnNpZ2h0c0tleWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFsaWFzTmFtZTogYGNtay9yZHMvJHtwcm9wcy5kYXRhYmFzZU5hbWV9L1JlYWRSZXBsaWNhSW5zaWdodHNLZXlgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKS5rZXlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICB0aGlzLnJlYWRSZXBsaWNhU2VjdXJpdHlHcm91cCA9IG5ldyBTZWN1cml0eUdyb3VwKFxuICAgICAgdGhpcyxcbiAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1SZWFkUmVwbGljYVNlY3VyaXR5R3JvdXBgLFxuICAgICAge1xuICAgICAgICB2cGM6IHRoaXMudnBjLFxuICAgICAgICBkZXNjcmlwdGlvbjogYFNlY3VyaXR5IGdyb3VwIGZvciBSRFMgcmVhZCByZXBsaWNhIG9mICR7cHJvcHMuZGF0YWJhc2VOYW1lfWBcbiAgICAgIH1cbiAgICApO1xuXG4gICAgLy8gQWxsb3cgcHJpbWFyeSBkYXRhYmFzZSB0byByZXBsaWNhdGUgdG8gcmVhZCByZXBsaWNhXG4gICAgdGhpcy5yZWFkUmVwbGljYVNlY3VyaXR5R3JvdXAuYWRkSW5ncmVzc1J1bGUoXG4gICAgICB0aGlzLmRhdGFiYXNlU2VjdXJpdHlHcm91cCxcbiAgICAgIFBvcnQudGNwKHRoaXMucG9ydCksXG4gICAgICBcIkFsbG93IHByaW1hcnkgZGF0YWJhc2UgdG8gcmVwbGljYXRlIHRvIHJlYWQgcmVwbGljYVwiXG4gICAgKTtcblxuICAgIC8vIERlbGV0aW9uIHdhaXRlciBlbnN1cmVzIHByaW1hcnkgaXMgXCJhdmFpbGFibGVcIiBiZWZvcmUgQ2xvdWRGb3JtYXRpb24gZGVsZXRlcyBpdC5cbiAgICAvLyBXaGVuIHRoZSByZWFkIHJlcGxpY2EgaXMgZGVsZXRlZCwgdGhlIHByaW1hcnkgZW50ZXJzIFwibW9kaWZ5aW5nXCIgc3RhdGUuXG4gICAgLy8gV2l0aG91dCB0aGlzIHdhaXRlciwgdGhlIGZpbmFsIHNuYXBzaG90IGNyZWF0aW9uIGZhaWxzLlxuICAgIGNvbnN0IGluc3RhbmNlSWQgPSBSZXNvdXJjZU5hbWluZy5kYkluc3RhbmNlSWQodGhpcy5jb25zdHJ1Y3RJZCk7XG4gICAgY29uc3Qgd2FpdGVyVGltZW91dCA9IER1cmF0aW9uLm1pbnV0ZXMoMTApO1xuICAgIGNvbnN0IGRlbGV0aW9uV2FpdGVyID0gbmV3IEN1c3RvbVJlc291cmNlKFxuICAgICAgdGhpcyxcbiAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1EZWxldGlvbldhaXRlcmAsXG4gICAgICB7XG4gICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICAgIHRpbWVvdXQ6IHdhaXRlclRpbWVvdXQucGx1cyhEdXJhdGlvbi5zZWNvbmRzKDMwKSksXG4gICAgICAgIGxhbWJkYURlc2NyaXB0aW9uOiBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9IGRlbGV0aW9uIHdhaXRlcmAsXG4gICAgICAgIGlubGluZUNvZGU6IGBcbmNvbnN0IHsgUkRTQ2xpZW50IH0gPSByZXF1aXJlKCdAYXdzLXNkay9jbGllbnQtcmRzJyk7XG5jb25zdCB7IHdhaXRVbnRpbERCSW5zdGFuY2VBdmFpbGFibGUgfSA9IHJlcXVpcmUoJ0Bhd3Mtc2RrL2NsaWVudC1yZHMnKTtcblxuZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKGV2ZW50KSA9PiB7XG4gIGNvbnNvbGUubG9nKCdFdmVudDonLCBKU09OLnN0cmluZ2lmeShldmVudCwgbnVsbCwgMikpO1xuICBjb25zdCBpbnN0YW5jZUlkID0gZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLkluc3RhbmNlSWRlbnRpZmllcjtcbiAgY29uc3QgcGh5c2ljYWxSZXNvdXJjZUlkID0gZXZlbnQuUGh5c2ljYWxSZXNvdXJjZUlkIHx8IGV2ZW50LkxvZ2ljYWxSZXNvdXJjZUlkIHx8ICdyZHMtZGVsZXRpb24td2FpdGVyJztcblxuICBpZiAoZXZlbnQuUmVxdWVzdFR5cGUgPT09ICdEZWxldGUnKSB7XG4gICAgY29uc29sZS5sb2coJ1dhaXRpbmcgZm9yIGluc3RhbmNlIHRvIGJlIGF2YWlsYWJsZTonLCBpbnN0YW5jZUlkKTtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgUkRTQ2xpZW50KHt9KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgd2FpdFVudGlsREJJbnN0YW5jZUF2YWlsYWJsZShcbiAgICAgICAgeyBjbGllbnQsIG1heFdhaXRUaW1lOiAke3dhaXRlclRpbWVvdXQudG9TZWNvbmRzKCl9LCBtaW5EZWxheTogMTAsIG1heERlbGF5OiAzMCB9LFxuICAgICAgICB7IERCSW5zdGFuY2VJZGVudGlmaWVyOiBpbnN0YW5jZUlkIH1cbiAgICAgICk7XG4gICAgICBjb25zb2xlLmxvZygnSW5zdGFuY2UgaXMgYXZhaWxhYmxlLCBkZWxldGlvbiBjYW4gcHJvY2VlZCcpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IubmFtZSA9PT0gJ1Jlc291cmNlTm90Rm91bmRFcnJvcicgfHxcbiAgICAgICAgICBlcnJvci5tZXNzYWdlPy5pbmNsdWRlcygnREJJbnN0YW5jZU5vdEZvdW5kJykgfHxcbiAgICAgICAgICBlcnJvci5zdGF0ZSA9PT0gJ0ZBSUxVUkUnKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdJbnN0YW5jZSBub3QgZm91bmQgb3Igd2FpdGVyIGZhaWxlZCwgcHJvY2VlZGluZyB3aXRoIGRlbGV0aW9uJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciB3YWl0aW5nIGZvciBpbnN0YW5jZTonLCBlcnJvcik7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4geyBQaHlzaWNhbFJlc291cmNlSWQ6IHBoeXNpY2FsUmVzb3VyY2VJZCB9O1xufTtcbiAgICAgICAgYCxcbiAgICAgICAgaW5saW5lUG9saWN5OiBbXG4gICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgICAgIGFjdGlvbnM6IFtcInJkczpEZXNjcmliZURCSW5zdGFuY2VzXCJdLFxuICAgICAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdXG4gICAgICAgICAgfSlcbiAgICAgICAgXSxcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIEluc3RhbmNlSWRlbnRpZmllcjogaW5zdGFuY2VJZCxcbiAgICAgICAgICBWZXJzaW9uOiBcIjEuMC4wXCJcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG5cbiAgICBkZWxldGlvbldhaXRlci5yZXNvdXJjZS5ub2RlLmFkZERlcGVuZGVuY3kodGhpcy5kYXRhYmFzZSk7XG5cbiAgICBjb25zdCByZWFkUmVwbGljYSA9IG5ldyBEYXRhYmFzZUluc3RhbmNlUmVhZFJlcGxpY2EoXG4gICAgICB0aGlzLFxuICAgICAgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVJlYWRSZXBsaWNhYCxcbiAgICAgIHtcbiAgICAgICAgc291cmNlRGF0YWJhc2VJbnN0YW5jZTogdGhpcy5kYXRhYmFzZSxcbiAgICAgICAgdnBjOiB0aGlzLnZwYyxcbiAgICAgICAgdnBjU3VibmV0czoge1xuICAgICAgICAgIHN1Ym5ldFR5cGU6IFN1Ym5ldFR5cGUuUFJJVkFURV9XSVRIX0VHUkVTU1xuICAgICAgICB9LFxuICAgICAgICBzZWN1cml0eUdyb3VwczogW3RoaXMucmVhZFJlcGxpY2FTZWN1cml0eUdyb3VwXSxcbiAgICAgICAgYWxsb2NhdGVkU3RvcmFnZTogcHJvcHMuYWxsb2NhdGVkU3RvcmFnZSxcbiAgICAgICAgc3RvcmFnZUVuY3J5cHRlZDogdHJ1ZSxcbiAgICAgICAgc3RvcmFnZVR5cGU6IFN0b3JhZ2VUeXBlLkdQMyxcbiAgICAgICAgY2FDZXJ0aWZpY2F0ZTogQ2FDZXJ0aWZpY2F0ZS5SRFNfQ0FfUlNBNDA5Nl9HMSxcbiAgICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgICBkZWxldGVBdXRvbWF0ZWRCYWNrdXBzOiBmYWxzZSxcbiAgICAgICAgZW5hYmxlUGVyZm9ybWFuY2VJbnNpZ2h0czogcGlFbmFibGVkLFxuICAgICAgICBwZXJmb3JtYW5jZUluc2lnaHRFbmNyeXB0aW9uS2V5OiByZWFkUmVwbGljYVBlcmZvcm1hbmNlSW5zaWdodHNLZXksXG4gICAgICAgIHBlcmZvcm1hbmNlSW5zaWdodFJldGVudGlvbjogcGlFbmFibGVkXG4gICAgICAgICAgPyBnZXREYXRhYmFzZUluc2lnaHRzUmV0ZW50aW9uKHBpQ29uZmlnPy5tb2RlID8/IFwic3RhbmRhcmRcIilcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgaW5zdGFuY2VJZGVudGlmaWVyOiBSZXNvdXJjZU5hbWluZy5yZWFkUmVwbGljYUlkKHRoaXMuY29uc3RydWN0SWQpLFxuICAgICAgICBpbnN0YW5jZVR5cGU6IG5ldyBJbnN0YW5jZVR5cGUocmVwbGljYUluc3RhbmNlVHlwZSksXG4gICAgICAgIGF2YWlsYWJpbGl0eVpvbmU6IHJlcGxpY2FDb25maWcuYXZhaWxhYmlsaXR5Wm9uZSxcbiAgICAgICAgbWF4QWxsb2NhdGVkU3RvcmFnZTogcHJvcHMubWF4QWxsb2NhdGVkU3RvcmFnZSB8fCA1MDAsXG4gICAgICAgIG1vbml0b3JpbmdJbnRlcnZhbDpcbiAgICAgICAgICBwcm9wcy5tb25pdG9yaW5nSW50ZXJ2YWwgfHwgUkRTX0RFRkFVTFRTLk1PTklUT1JJTkdfSU5URVJWQUwsXG4gICAgICAgIG11bHRpQXo6IHByb3BzLm11bHRpQXogIT09IGZhbHNlLFxuICAgICAgICBwb3J0OiB0aGlzLnBvcnQsXG4gICAgICAgIGRlbGV0aW9uUHJvdGVjdGlvbjogcHJvcHMuZGVsZXRpb25Qcm90ZWN0aW9uID8/IHRydWUsXG4gICAgICAgIHByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93OlxuICAgICAgICAgIHByb3BzLnByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93IHx8XG4gICAgICAgICAgUkRTX0RFRkFVTFRTLlBSRUZFUlJFRF9NQUlOVEVOQU5DRV9XSU5ET1dcbiAgICAgIH1cbiAgICApO1xuXG4gICAgcmVhZFJlcGxpY2Eubm9kZS5hZGREZXBlbmRlbmN5KGRlbGV0aW9uV2FpdGVyLnJlc291cmNlKTtcbiAgfVxuXG4gIGdldEhvc3RFbmRwb2ludCgpIHtcbiAgICBpZiAodGhpcy5kYXRhYmFzZVByb3h5KSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZVByb3h5LmVuZHBvaW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5kYkluc3RhbmNlRW5kcG9pbnRBZGRyZXNzO1xuICAgIH1cbiAgfVxuXG4gIGdldEhvc3RQb3J0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFN0cmluZyh0aGlzLnBvcnQpO1xuICB9XG5cbiAgZ2V0Q3JlZGVudGlhbHMoKTogU2VjcmV0IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhYmFzZUNyZWRlbnRpYWxzO1xuICB9XG5cbiAgc3RhdGljIGJ1aWxkKGlkOiBzdHJpbmcsIHByb3BzOiBSZHNQcm9wcyk6IChzYjogU3RhY2tCdWlsZGVyKSA9PiBDb25zdHJ1Y3Qge1xuICAgIHJldHVybiAoc2I6IFN0YWNrQnVpbGRlcikgPT4ge1xuICAgICAgY29uc3QgbmV3UHJvcHM6IFJkc1Byb3BzID0ge1xuICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgLi4ue1xuICAgICAgICAgIHZwYzogc2IuZ2V0TmV0d29yaygpIHx8IHByb3BzLnZwYyxcbiAgICAgICAgICBzZWN1cml0eUdyb3VwSWRzOiBwcm9wcz8uc2VjdXJpdHlHcm91cElkcyA/PyBbXSxcbiAgICAgICAgICBkYXRhYmFzZU5hbWU6IHByb3BzLmRhdGFiYXNlTmFtZSB8fCBgJHtpZC5yZXBsYWNlKFwiUmRzXCIsIFwiXCIpfWBcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIG5ldyB0aGlzKHNiLmdldFN0YWNrKCksIGlkLCBuZXdQcm9wcyk7XG4gICAgfTtcbiAgfVxufVxuIl19
|
|
@@ -1,18 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.addProxyCfnOutput = addProxyCfnOutput;
|
|
4
|
-
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
5
|
-
const capitaliseString_1 = require("../../../utils/capitaliseString");
|
|
1
|
+
import { CfnOutput } from "aws-cdk-lib";
|
|
2
|
+
import { toPascalCase } from "../../../utils/capitaliseString.js";
|
|
6
3
|
/**
|
|
7
4
|
* Add a CfnOutput for the RDS proxy endpoint.
|
|
8
5
|
* Shared by RdsAurora and RdsInstance constructs.
|
|
9
6
|
*/
|
|
10
|
-
function addProxyCfnOutput(scope, constructId, databaseName, proxy) {
|
|
11
|
-
const outputName =
|
|
12
|
-
new
|
|
7
|
+
export function addProxyCfnOutput(scope, constructId, databaseName, proxy) {
|
|
8
|
+
const outputName = toPascalCase(databaseName || constructId);
|
|
9
|
+
new CfnOutput(scope, `${outputName}ProxyEndpointOutput`, {
|
|
13
10
|
key: `${outputName}ProxyEndpoint`,
|
|
14
11
|
exportName: `${outputName}ProxyEndpoint`,
|
|
15
12
|
value: proxy.endpoint
|
|
16
13
|
});
|
|
17
14
|
}
|
|
18
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmRzUHJveHlPdXRwdXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9kYXRhYmFzZS9yZHNQcm94eU91dHB1dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVNBLDhDQVlDO0FBckJELDZDQUF3QztBQUd4QyxzRUFBK0Q7QUFFL0Q7OztHQUdHO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQy9CLEtBQWdCLEVBQ2hCLFdBQW1CLEVBQ25CLFlBQWdDLEVBQ2hDLEtBQW9CO0lBRXBCLE1BQU0sVUFBVSxHQUFHLElBQUEsK0JBQVksRUFBQyxZQUFZLElBQUksV0FBVyxDQUFDLENBQUM7SUFDN0QsSUFBSSx1QkFBUyxDQUFDLEtBQUssRUFBRSxHQUFHLFVBQVUscUJBQXFCLEVBQUU7UUFDdkQsR0FBRyxFQUFFLEdBQUcsVUFBVSxlQUFlO1FBQ2pDLFVBQVUsRUFBRSxHQUFHLFVBQVUsZUFBZTtRQUN4QyxLQUFLLEVBQUUsS0FBSyxDQUFDLFFBQVE7S0FDdEIsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENmbk91dHB1dCB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZVByb3h5IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yZHNcIjtcbmltcG9ydCB7IHRvUGFzY2FsQ2FzZSB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9jYXBpdGFsaXNlU3RyaW5nXCI7XG5cbi8qKlxuICogQWRkIGEgQ2ZuT3V0cHV0IGZvciB0aGUgUkRTIHByb3h5IGVuZHBvaW50LlxuICogU2hhcmVkIGJ5IFJkc0F1cm9yYSBhbmQgUmRzSW5zdGFuY2UgY29uc3RydWN0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFByb3h5Q2ZuT3V0cHV0KFxuICBzY29wZTogQ29uc3RydWN0LFxuICBjb25zdHJ1Y3RJZDogc3RyaW5nLFxuICBkYXRhYmFzZU5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgcHJveHk6IERhdGFiYXNlUHJveHlcbik6IHZvaWQge1xuICBjb25zdCBvdXRwdXROYW1lID0gdG9QYXNjYWxDYXNlKGRhdGFiYXNlTmFtZSB8fCBjb25zdHJ1Y3RJZCk7XG4gIG5ldyBDZm5PdXRwdXQoc2NvcGUsIGAke291dHB1dE5hbWV9UHJveHlFbmRwb2ludE91dHB1dGAsIHtcbiAgICBrZXk6IGAke291dHB1dE5hbWV9UHJveHlFbmRwb2ludGAsXG4gICAgZXhwb3J0TmFtZTogYCR7b3V0cHV0TmFtZX1Qcm94eUVuZHBvaW50YCxcbiAgICB2YWx1ZTogcHJveHkuZW5kcG9pbnRcbiAgfSk7XG59XG4iXX0=
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Construct } from "constructs";
|
|
2
|
+
import { type IRole } from "aws-cdk-lib/aws-iam";
|
|
3
|
+
import type { IHostedZone } from "aws-cdk-lib/aws-route53";
|
|
4
|
+
export interface DelegationRoleProps {
|
|
5
|
+
readonly zoneName: string;
|
|
6
|
+
readonly hostedZone: IHostedZone;
|
|
7
|
+
readonly organisationIdExportName?: string;
|
|
8
|
+
readonly description?: string;
|
|
9
|
+
readonly costAllocationEnvironment?: string;
|
|
10
|
+
readonly costAllocationDomain?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare class DelegationRole extends Construct {
|
|
13
|
+
readonly role: IRole;
|
|
14
|
+
readonly roleArn: string;
|
|
15
|
+
readonly description: string;
|
|
16
|
+
readonly exportName: string;
|
|
17
|
+
constructor(scope: Construct, id: string, props: DelegationRoleProps);
|
|
18
|
+
}
|