@fjall/components-infrastructure 0.89.4 → 0.89.6
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 +61 -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 +82 -70
- package/dist/lib/resources/aws/database/dynamodb.js +27 -28
- 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,32 +1,27 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
10
|
-
const storage_1 = require("../../resources/aws/storage");
|
|
11
|
-
const validationLogger_js_1 = require("../../utils/validationLogger.js");
|
|
12
|
-
var storage_js_1 = require("./interfaces/storage.js");
|
|
13
|
-
Object.defineProperty(exports, "isStorage", { enumerable: true, get: function () { return storage_js_1.isStorage; } });
|
|
1
|
+
import { Construct } from "constructs";
|
|
2
|
+
import { BucketEncryption, HttpMethods } from "aws-cdk-lib/aws-s3";
|
|
3
|
+
import { BucketDeployment, Source, CacheControl } from "aws-cdk-lib/aws-s3-deployment";
|
|
4
|
+
import { Key } from "aws-cdk-lib/aws-kms";
|
|
5
|
+
import { CfnOutput, Duration, RemovalPolicy, Stack } from "aws-cdk-lib";
|
|
6
|
+
import { S3Bucket } from "../../resources/aws/storage/index.js";
|
|
7
|
+
import { FjallLogger } from "../../utils/validationLogger.js";
|
|
8
|
+
export { isStorage } from "./interfaces/storage.js";
|
|
14
9
|
function toBucketEncryption(encryption) {
|
|
15
10
|
if (!encryption)
|
|
16
11
|
return undefined;
|
|
17
12
|
return encryption === "AES256"
|
|
18
|
-
?
|
|
19
|
-
:
|
|
13
|
+
? BucketEncryption.S3_MANAGED
|
|
14
|
+
: BucketEncryption.KMS;
|
|
20
15
|
}
|
|
21
16
|
function toHttpMethod(method) {
|
|
22
17
|
const methodMap = {
|
|
23
|
-
GET:
|
|
24
|
-
PUT:
|
|
25
|
-
POST:
|
|
26
|
-
DELETE:
|
|
27
|
-
HEAD:
|
|
18
|
+
GET: HttpMethods.GET,
|
|
19
|
+
PUT: HttpMethods.PUT,
|
|
20
|
+
POST: HttpMethods.POST,
|
|
21
|
+
DELETE: HttpMethods.DELETE,
|
|
22
|
+
HEAD: HttpMethods.HEAD
|
|
28
23
|
};
|
|
29
|
-
return methodMap[method] ??
|
|
24
|
+
return methodMap[method] ?? HttpMethods.GET;
|
|
30
25
|
}
|
|
31
26
|
function toCorsRules(cors) {
|
|
32
27
|
if (!cors)
|
|
@@ -39,24 +34,26 @@ function toCorsRules(cors) {
|
|
|
39
34
|
...(rule.maxAge !== undefined && { maxAge: rule.maxAge })
|
|
40
35
|
}));
|
|
41
36
|
}
|
|
42
|
-
function validateStorageProps(props) {
|
|
37
|
+
export function validateStorageProps(props) {
|
|
43
38
|
if (props.encryption === "KMS" && !props.kmsKeyArn) {
|
|
44
|
-
|
|
39
|
+
FjallLogger.warn("'encryption' is set to 'KMS' but 'kmsKeyArn' is not provided. " +
|
|
45
40
|
"The bucket will use the default AWS managed key.");
|
|
46
41
|
}
|
|
47
42
|
if (props.kmsKeyArn && props.encryption !== "KMS") {
|
|
48
|
-
|
|
43
|
+
FjallLogger.warn("'kmsKeyArn' is provided but 'encryption' is not set to 'KMS'. " +
|
|
49
44
|
"The KMS key will be ignored. Set encryption: 'KMS' to use the key.");
|
|
50
45
|
}
|
|
51
46
|
}
|
|
52
|
-
class Storage extends
|
|
47
|
+
export class Storage extends Construct {
|
|
48
|
+
connectorType = "storage";
|
|
49
|
+
bucket;
|
|
50
|
+
bucketDeployment;
|
|
53
51
|
constructor(scope, id, props) {
|
|
54
52
|
super(scope, id);
|
|
55
|
-
this.connectorType = "storage";
|
|
56
53
|
const encryptionKey = props.kmsKeyArn
|
|
57
|
-
?
|
|
54
|
+
? Key.fromKeyArn(this, `${id}KmsKey`, props.kmsKeyArn)
|
|
58
55
|
: undefined;
|
|
59
|
-
this.bucket = new
|
|
56
|
+
this.bucket = new S3Bucket(this, `${id}Bucket`, {
|
|
60
57
|
bucketName: props.bucketName,
|
|
61
58
|
versioned: props.versioned,
|
|
62
59
|
encryption: toBucketEncryption(props.encryption),
|
|
@@ -64,7 +61,8 @@ class Storage extends constructs_1.Construct {
|
|
|
64
61
|
backupVaultTier: props.backupVaultTier,
|
|
65
62
|
publicReadAccess: props.publicReadAccess,
|
|
66
63
|
websiteHosting: props.websiteHosting,
|
|
67
|
-
...(props.cors && { cors: toCorsRules(props.cors) })
|
|
64
|
+
...(props.cors && { cors: toCorsRules(props.cors) }),
|
|
65
|
+
...(props.retain && { removalPolicy: RemovalPolicy.RETAIN })
|
|
68
66
|
});
|
|
69
67
|
if (props.deployment) {
|
|
70
68
|
this.bucketDeployment = this.createDeployment(id, props.deployment);
|
|
@@ -74,13 +72,13 @@ class Storage extends constructs_1.Construct {
|
|
|
74
72
|
createDeployment(id, config) {
|
|
75
73
|
const cacheControlHeaders = [];
|
|
76
74
|
if (config.cacheControl?.maxAge !== undefined) {
|
|
77
|
-
cacheControlHeaders.push(
|
|
75
|
+
cacheControlHeaders.push(CacheControl.maxAge(Duration.seconds(config.cacheControl.maxAge)));
|
|
78
76
|
}
|
|
79
77
|
if (config.cacheControl?.immutable) {
|
|
80
|
-
cacheControlHeaders.push(
|
|
78
|
+
cacheControlHeaders.push(CacheControl.immutable());
|
|
81
79
|
}
|
|
82
|
-
return new
|
|
83
|
-
sources: [
|
|
80
|
+
return new BucketDeployment(this, `${id}Deployment`, {
|
|
81
|
+
sources: [Source.asset(config.source)],
|
|
84
82
|
destinationBucket: this.bucket,
|
|
85
83
|
prune: config.prune ?? true,
|
|
86
84
|
...(cacheControlHeaders.length > 0 && {
|
|
@@ -89,14 +87,14 @@ class Storage extends constructs_1.Construct {
|
|
|
89
87
|
});
|
|
90
88
|
}
|
|
91
89
|
addOutputs(id) {
|
|
92
|
-
const stackName =
|
|
93
|
-
new
|
|
90
|
+
const stackName = Stack.of(this).stackName;
|
|
91
|
+
new CfnOutput(this, `${id}BucketArn`, {
|
|
94
92
|
key: `${stackName}${id}BucketArn`,
|
|
95
93
|
exportName: `${stackName}${id}BucketArn`,
|
|
96
94
|
value: this.bucket.bucketArn,
|
|
97
95
|
description: `S3 Bucket ARN for ${id}`
|
|
98
96
|
});
|
|
99
|
-
new
|
|
97
|
+
new CfnOutput(this, `${id}BucketName`, {
|
|
100
98
|
key: `${stackName}${id}BucketName`,
|
|
101
99
|
exportName: `${stackName}${id}BucketName`,
|
|
102
100
|
value: this.bucket.bucketName,
|
|
@@ -152,8 +150,7 @@ class Storage extends constructs_1.Construct {
|
|
|
152
150
|
this.bucket.addObjectRemovedNotification(dest, ...filters);
|
|
153
151
|
}
|
|
154
152
|
}
|
|
155
|
-
|
|
156
|
-
class StorageFactory {
|
|
153
|
+
export class StorageFactory {
|
|
157
154
|
static build(id, props = {}) {
|
|
158
155
|
const { stackPlacement, ...s3Props } = props;
|
|
159
156
|
const fn = (_app, scope) => {
|
|
@@ -166,5 +163,3 @@ class StorageFactory {
|
|
|
166
163
|
return fn;
|
|
167
164
|
}
|
|
168
165
|
}
|
|
169
|
-
exports.StorageFactory = StorageFactory;
|
|
170
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9wYXR0ZXJucy9hd3Mvc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUF5R0Esb0RBY0M7QUF2SEQsMkNBQXVDO0FBQ3ZDLCtDQVE0QjtBQUM1QixxRUFJdUM7QUFFdkMsaURBQTBDO0FBQzFDLDZDQUF5RDtBQUd6RCx5REFHcUM7QUFFckMseUVBQThEO0FBSTlELHNEQUFtRTtBQUEzQyx1R0FBQSxTQUFTLE9BQUE7QUE2Q2pDLFNBQVMsa0JBQWtCLENBQ3pCLFVBQTZCO0lBRTdCLElBQUksQ0FBQyxVQUFVO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDbEMsT0FBTyxVQUFVLEtBQUssUUFBUTtRQUM1QixDQUFDLENBQUMseUJBQWdCLENBQUMsVUFBVTtRQUM3QixDQUFDLENBQUMseUJBQWdCLENBQUMsR0FBRyxDQUFDO0FBQzNCLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxNQUFjO0lBQ2xDLE1BQU0sU0FBUyxHQUFnQztRQUM3QyxHQUFHLEVBQUUsb0JBQVcsQ0FBQyxHQUFHO1FBQ3BCLEdBQUcsRUFBRSxvQkFBVyxDQUFDLEdBQUc7UUFDcEIsSUFBSSxFQUFFLG9CQUFXLENBQUMsSUFBSTtRQUN0QixNQUFNLEVBQUUsb0JBQVcsQ0FBQyxNQUFNO1FBQzFCLElBQUksRUFBRSxvQkFBVyxDQUFDLElBQUk7S0FDdkIsQ0FBQztJQUNGLE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLG9CQUFXLENBQUMsR0FBRyxDQUFDO0FBQzlDLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxJQUFpQjtJQUNwQyxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzVCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN6QixjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWM7UUFDbkMsY0FB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IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQge1xuICB0eXBlIElCdWNrZXQsXG4gIHR5cGUgRXZlbnRUeXBlLFxuICB0eXBlIElCdWNrZXROb3RpZmljYXRpb25EZXN0aW5hdGlvbixcbiAgdHlwZSBOb3RpZmljYXRpb25LZXlGaWx0ZXIsXG4gIEJ1Y2tldEVuY3J5cHRpb24sXG4gIEh0dHBNZXRob2RzLFxuICB0eXBlIENvcnNSdWxlIGFzIENka0NvcnNSdWxlXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7XG4gIEJ1Y2tldERlcGxveW1lbnQsXG4gIFNvdXJjZSxcbiAgQ2FjaGVDb250cm9sXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczMtZGVwbG95bWVudFwiO1xuaW1wb3J0IHsgdHlwZSBJR3JhbnRhYmxlLCB0eXBlIEdyYW50IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7IEtleSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mta21zXCI7XG5pbXBvcnQgeyBDZm5PdXRwdXQsIER1cmF0aW9uLCBTdGFjayB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuXG5pbXBvcnQgdHlwZSBBcHAgZnJvbSBcIi4uLy4uL2FwcFwiO1xuaW1wb3J0IHtcbiAgUzNCdWNrZXQsXG4gIHR5cGUgV2Vic2l0ZUhvc3RpbmdDb25maWdcbn0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3Mvc3RvcmFnZVwiO1xuaW1wb3J0IHsgdHlwZSBCYWNrdXBUaWVyIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2JhY2t1cFRpZXJNYXBwaW5nXCI7XG5pbXBvcnQgeyBGamFsbExvZ2dlciB9IGZyb20gXCIuLi8uLi91dGlscy92YWxpZGF0aW9uTG9nZ2VyLmpzXCI7XG5pbXBvcnQgeyB0eXBlIElTdG9yYWdlIH0gZnJvbSBcIi4vaW50ZXJmYWNlcy9zdG9yYWdlLmpzXCI7XG5pbXBvcnQgeyB0eXBlIElTdG9yYWdlQ29ubmVjdG9yIH0gZnJvbSBcIi4vaW50ZXJmYWNlcy9jb25uZWN0b3IuanNcIjtcblxuZXhwb3J0IHsgdHlwZSBJU3RvcmFnZSwgaXNTdG9yYWdlIH0gZnJvbSBcIi4vaW50ZXJmYWNlcy9zdG9yYWdlLmpzXCI7XG5leHBvcnQgeyB0eXBlIFdlYnNpdGVIb3N0aW5nQ29uZmlnIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3Mvc3RvcmFnZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvcnNSdWxlIHtcbiAgcmVhZG9ubHkgYWxsb3dlZE9yaWdpbnM6IHN0cmluZ1tdO1xuICByZWFkb25seSBhbGxvd2VkTWV0aG9kczogc3RyaW5nW107XG4gIHJlYWRvbmx5IGFsbG93ZWRIZWFkZXJzPzogc3RyaW5nW107XG4gIHJlYWRvbmx5IGV4cG9zZWRIZWFkZXJzPzogc3RyaW5nW107XG4gIHJlYWRvbmx5IG1heEFnZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTM0RlcGxveW1lbnRDb25maWcge1xuICAvKiogUGF0aCB0byB0aGUgYXNzZXQgZGlyZWN0b3J5IChyZWxhdGl2ZSB0byBDREsgYXBwIHJvb3QpICovXG4gIHNvdXJjZTogc3RyaW5nO1xuICAvKiogV2hldGhlciB0byByZW1vdmUgZmlsZXMgZnJvbSBidWNrZXQgdGhhdCBhcmUgbm90IGluIHRoZSBzb3VyY2UuIERlZmF1bHQ6IHRydWUgKi9cbiAgcHJ1bmU/OiBib29sZWFuO1xuICAvKiogQ2FjaGUgY29udHJvbCBzZXR0aW5ncyBmb3IgdXBsb2FkZWQgZmlsZXMgKi9cbiAgY2FjaGVDb250cm9sPzoge1xuICAgIC8qKiBNYXggYWdlIGluIHNlY29uZHMgKGUuZy4sIDMxNTM2MDAwIGZvciAxIHllYXIpICovXG4gICAgbWF4QWdlPzogbnVtYmVyO1xuICAgIC8qKiBNYXJrIGFzIGltbXV0YWJsZSAoYnJvd3NlciB3aWxsIG5vdCByZXZhbGlkYXRlKSAqL1xuICAgIGltbXV0YWJsZT86IGJvb2xlYW47XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUzNQcm9wcyB7XG4gIHJlYWRvbmx5IGJ1Y2tldE5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHB1YmxpY1JlYWRBY2Nlc3M/OiBib29sZWFuO1xuICByZWFkb25seSB3ZWJzaXRlSG9zdGluZz86IFdlYnNpdGVIb3N0aW5nQ29uZmlnO1xuICByZWFkb25seSB2ZXJzaW9uZWQ/OiBib29sZWFuO1xuICByZWFkb25seSBlbmNyeXB0aW9uPzogXCJBRVMyNTZcIiB8IFwiS01TXCI7XG4gIHJlYWRvbmx5IGttc0tleUFybj86IHN0cmluZztcbiAgcmVhZG9ubHkgYmFja3VwVmF1bHRUaWVyPzogQmFja3VwVGllcjtcbiAgcmVhZG9ubHkgY29ycz86IENvcnNSdWxlW107XG4gIHJlYWRvbmx5IGRlcGxveW1lbnQ/OiBTM0RlcGxveW1lbnRDb25maWc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmFnZUJ1aWxkUHJvcHMgZXh0ZW5kcyBTM1Byb3BzIHtcbiAgcmVhZG9ubHkgc3RhY2tQbGFjZW1lbnQ/OiBcInN0b3JhZ2VcIiB8IFwiY2RuXCIgfCBcImNvbXB1dGVcIjtcbn1cblxuZXhwb3J0IHR5cGUgU3RvcmFnZUZhY3RvcnlGbiA9ICgoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IFN0b3JhZ2UpICYge1xuICBzdGFja1BsYWNlbWVudD86IFwic3RvcmFnZVwiIHwgXCJjZG5cIiB8IFwiY29tcHV0ZVwiO1xufTtcblxuZnVuY3Rpb24gdG9CdWNrZXRFbmNyeXB0aW9uKFxuICBlbmNyeXB0aW9uPzogXCJBRVMyNTZcIiB8IFwiS01TXCJcbik6IEJ1Y2tldEVuY3J5cHRpb24gfCB1bmRlZmluZWQge1xuICBpZiAoIWVuY3J5cHRpb24pIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBlbmNyeXB0aW9uID09PSBcIkFFUzI1NlwiXG4gICAgPyBCdWNrZXRFbmNyeXB0aW9uLlMzX01BTkFHRURcbiAgICA6IEJ1Y2tldEVuY3J5cHRpb24uS01TO1xufVxuXG5mdW5jdGlvbiB0b0h0dHBNZXRob2QobWV0aG9kOiBzdHJpbmcpOiBIdHRwTWV0aG9kcyB7XG4gIGNvbnN0IG1ldGhvZE1hcDogUmVjb3JkPHN0cmluZywgSHR0cE1ldGhvZHM+ID0ge1xuICAgIEdFVDogSHR0cE1ldGhvZHMuR0VULFxuICAgIFBVVDogSHR0cE1ldGhvZHMuUFVULFxuICAgIFBPU1Q6IEh0dHBNZXRob2RzLlBPU1QsXG4gICAgREVMRVRFOiBIdHRwTWV0aG9kcy5ERUxFVEUsXG4gICAgSEVBRDogSHR0cE1ldGhvZHMuSEVBRFxuICB9O1xuICByZXR1cm4gbWV0aG9kTWFwW21ldGhvZF0gPz8gSHR0cE1ldGhvZHMuR0VUO1xufVxuXG5mdW5jdGlvbiB0b0NvcnNSdWxlcyhjb3JzPzogQ29yc1J1bGVbXSk6IENka0NvcnNSdWxlW10gfCB1bmRlZmluZWQge1xuICBpZiAoIWNvcnMpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBjb3JzLm1hcCgocnVsZSkgPT4gKHtcbiAgICBhbGxvd2VkT3JpZ2luczogcnVsZS5hbGxvd2VkT3JpZ2lucyxcbiAgICBhbGxvd2VkTWV0aG9kczogcnVsZS5hbGxvd2VkTWV0aG9kcy5tYXAodG9IdHRwTWV0aG9kKSxcbiAgICAuLi4ocnVsZS5hbGxvd2VkSGVhZGVycyAmJiB7IGFsbG93ZWRIZWFkZXJzOiBydWxlLmFsbG93ZWRIZWFkZXJzIH0pLFxuICAgIC4uLihydWxlLmV4cG9zZWRIZWFkZXJzICYmIHsgZXhwb3NlZEhlYWRlcnM6IHJ1bGUuZXhwb3NlZEhlYWRlcnMgfSksXG4gICAgLi4uKHJ1bGUubWF4QWdlICE9PSB1bmRlZmluZWQgJiYgeyBtYXhBZ2U6IHJ1bGUubWF4QWdlIH0pXG4gIH0pKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU3RvcmFnZVByb3BzKHByb3BzOiBTM1Byb3BzKTogdm9pZCB7XG4gIGlmIChwcm9wcy5lbmNyeXB0aW9uID09PSBcIktNU1wiICYmICFwcm9wcy5rbXNLZXlBcm4pIHtcbiAgICBGamFsbExvZ2dlci53YXJuKFxuICAgICAgXCInZW5jcnlwdGlvbicgaXMgc2V0IHRvICdLTVMnIGJ1dCAna21zS2V5QXJuJyBpcyBub3QgcHJvdmlkZWQuIFwiICtcbiAgICAgICAgXCJUaGUgYnVja2V0IHdpbGwgdXNlIHRoZSBkZWZhdWx0IEFXUyBtYW5hZ2VkIGtleS5cIlxuICAgICk7XG4gIH1cblxuICBpZiAocHJvcHMua21zS2V5QXJuICYmIHByb3BzLmVuY3J5cHRpb24gIT09IFwiS01TXCIpIHtcbiAgICBGamFsbExvZ2dlci53YXJuKFxuICAgICAgXCIna21zS2V5QXJuJyBpcyBwcm92aWRlZCBidXQgJ2VuY3J5cHRpb24nIGlzIG5vdCBzZXQgdG8gJ0tNUycuIFwiICtcbiAgICAgICAgXCJUaGUgS01TIGtleSB3aWxsIGJlIGlnbm9yZWQuIFNldCBlbmNyeXB0aW9uOiAnS01TJyB0byB1c2UgdGhlIGtleS5cIlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN0b3JhZ2UgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJU3RvcmFnZSwgSVN0b3JhZ2VDb25uZWN0b3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdG9yVHlwZSA9IFwic3RvcmFnZVwiIGFzIGNvbnN0O1xuICBwcml2YXRlIHJlYWRvbmx5IGJ1Y2tldDogUzNCdWNrZXQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgYnVja2V0RGVwbG95bWVudD86IEJ1Y2tldERlcGxveW1lbnQ7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFMzUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3QgZW5jcnlwdGlvbktleSA9IHByb3BzLmttc0tleUFyblxuICAgICAgPyBLZXkuZnJvbUtleUFybih0aGlzLCBgJHtpZH1LbXNLZXlgLCBwcm9wcy5rbXNLZXlBcm4pXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIHRoaXMuYnVja2V0ID0gbmV3IFMzQnVja2V0KHRoaXMsIGAke2lkfUJ1Y2tldGAsIHtcbiAgICAgIGJ1Y2tldE5hbWU6IHByb3BzLmJ1Y2tldE5hbWUsXG4gICAgICB2ZXJzaW9uZWQ6IHByb3BzLnZlcnNpb25lZCxcbiAgICAgIGVuY3J5cHRpb246IHRvQnVja2V0RW5jcnlwdGlvbihwcm9wcy5lbmNyeXB0aW9uKSxcbiAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICBiYWNrdXBWYXVsdFRpZXI6IHByb3BzLmJhY2t1cFZhdWx0VGllcixcbiAgICAgIHB1YmxpY1JlYWRBY2Nlc3M6IHByb3BzLnB1YmxpY1JlYWRBY2Nlc3MsXG4gICAgICB3ZWJzaXRlSG9zdGluZzogcHJvcHMud2Vic2l0ZUhvc3RpbmcsXG4gICAgICAuLi4ocHJvcHMuY29ycyAmJiB7IGNvcnM6IHRvQ29yc1J1bGVzKHByb3BzLmNvcnMpIH0pXG4gICAgfSk7XG5cbiAgICBpZiAocHJvcHMuZGVwbG95bWVudCkge1xuICAgICAgdGhpcy5idWNrZXREZXBsb3ltZW50ID0gdGhpcy5jcmVhdGVEZXBsb3ltZW50KGlkLCBwcm9wcy5kZXBsb3ltZW50KTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZE91dHB1dHMoaWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEZXBsb3ltZW50KFxuICAgIGlkOiBzdHJpbmcsXG4gICAgY29uZmlnOiBTM0RlcGxveW1lbnRDb25maWdcbiAgKTogQnVja2V0RGVwbG95bWVudCB7XG4gICAgY29uc3QgY2FjaGVDb250cm9sSGVhZGVyczogQ2FjaGVDb250cm9sW10gPSBbXTtcblxuICAgIGlmIChjb25maWcuY2FjaGVDb250cm9sPy5tYXhBZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2FjaGVDb250cm9sSGVhZGVycy5wdXNoKFxuICAgICAgICBDYWNoZUNvbnRyb2wubWF4QWdlKER1cmF0aW9uLnNlY29uZHMoY29uZmlnLmNhY2hlQ29udHJvbC5tYXhBZ2UpKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5jYWNoZUNvbnRyb2w/LmltbXV0YWJsZSkge1xuICAgICAgY2FjaGVDb250cm9sSGVhZGVycy5wdXNoKENhY2hlQ29udHJvbC5pbW11dGFibGUoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBCdWNrZXREZXBsb3ltZW50KHRoaXMsIGAke2lkfURlcGxveW1lbnRgLCB7XG4gICAgICBzb3VyY2VzOiBbU291cmNlLmFzc2V0KGNvbmZpZy5zb3VyY2UpXSxcbiAgICAgIGRlc3RpbmF0aW9uQnVja2V0OiB0aGlzLmJ1Y2tldCxcbiAgICAgIHBydW5lOiBjb25maWcucHJ1bmUgPz8gdHJ1ZSxcbiAgICAgIC4uLihjYWNoZUNvbnRyb2xIZWFkZXJzLmxlbmd0aCA+IDAgJiYge1xuICAgICAgICBjYWNoZUNvbnRyb2w6IGNhY2hlQ29udHJvbEhlYWRlcnNcbiAgICAgIH0pXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFkZE91dHB1dHMoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHN0YWNrTmFtZSA9IFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZTtcblxuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7aWR9QnVja2V0QXJuYCwge1xuICAgICAga2V5OiBgJHtzdGFja05hbWV9JHtpZH1CdWNrZXRBcm5gLFxuICAgICAgZXhwb3J0TmFtZTogYCR7c3RhY2tOYW1lfSR7aWR9QnVja2V0QXJuYCxcbiAgICAgIHZhbHVlOiB0aGlzLmJ1Y2tldC5idWNrZXRBcm4sXG4gICAgICBkZXNjcmlwdGlvbjogYFMzIEJ1Y2tldCBBUk4gZm9yICR7aWR9YFxuICAgIH0pO1xuXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtpZH1CdWNrZXROYW1lYCwge1xuICAgICAga2V5OiBgJHtzdGFja05hbWV9JHtpZH1CdWNrZXROYW1lYCxcbiAgICAgIGV4cG9ydE5hbWU6IGAke3N0YWNrTmFtZX0ke2lkfUJ1Y2tldE5hbWVgLFxuICAgICAgdmFsdWU6IHRoaXMuYnVja2V0LmJ1Y2tldE5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogYFMzIEJ1Y2tldCBOYW1lIGZvciAke2lkfWBcbiAgICB9KTtcbiAgfVxuXG4gIGdldEJ1Y2tldCgpOiBJQnVja2V0IHtcbiAgICByZXR1cm4gdGhpcy5idWNrZXQ7XG4gIH1cblxuICBnZXRCdWNrZXROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0LmJ1Y2tldE5hbWU7XG4gIH1cblxuICBnZXRCdWNrZXRBcm4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5idWNrZXQuYnVja2V0QXJuO1xuICB9XG5cbiAgZ2V0QnVja2V0RG9tYWluTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldC5idWNrZXREb21haW5OYW1lO1xuICB9XG5cbiAgZ2V0QnVja2V0UmVnaW9uYWxEb21haW5OYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0LmJ1Y2tldFJlZ2lvbmFsRG9tYWluTmFtZTtcbiAgfVxuXG4gIGdldFdlYnNpdGVVcmwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5idWNrZXQuYnVja2V0V2Vic2l0ZVVybDtcbiAgfVxuXG4gIGdldERlcGxveW1lbnQoKTogQnVja2V0RGVwbG95bWVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0RGVwbG95bWVudDtcbiAgfVxuXG4gIGdyYW50UmVhZChncmFudGVlOiBJR3JhbnRhYmxlKTogR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldC5ncmFudFJlYWQoZ3JhbnRlZSk7XG4gIH1cblxuICBncmFudFdyaXRlKGdyYW50ZWU6IElHcmFudGFibGUpOiBHcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0LmdyYW50V3JpdGUoZ3JhbnRlZSk7XG4gIH1cblxuICBncmFudFJlYWRXcml0ZShncmFudGVlOiBJR3JhbnRhYmxlKTogR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldC5ncmFudFJlYWRXcml0ZShncmFudGVlKTtcbiAgfVxuXG4gIGdyYW50RGVsZXRlKGdyYW50ZWU6IElHcmFudGFibGUpOiBHcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0LmdyYW50RGVsZXRlKGdyYW50ZWUpO1xuICB9XG5cbiAgZ3JhbnRQdXQoZ3JhbnRlZTogSUdyYW50YWJsZSk6IEdyYW50IHtcbiAgICByZXR1cm4gdGhpcy5idWNrZXQuZ3JhbnRQdXQoZ3JhbnRlZSk7XG4gIH1cblxuICBncmFudFB1YmxpY0FjY2VzcyguLi5rZXlQcmVmaXg6IHN0cmluZ1tdKTogR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldC5ncmFudFB1YmxpY0FjY2VzcyguLi5rZXlQcmVmaXgpO1xuICB9XG5cbiAgYWRkRXZlbnROb3RpZmljYXRpb24oXG4gICAgZXZlbnQ6IEV2ZW50VHlwZSxcbiAgICBkZXN0OiBJQnVja2V0Tm90aWZpY2F0aW9uRGVzdGluYXRpb24sXG4gICAgLi4uZmlsdGVyczogTm90aWZpY2F0aW9uS2V5RmlsdGVyW11cbiAgKTogdm9pZCB7XG4gICAgdGhpcy5idWNrZXQuYWRkRXZlbnROb3RpZmljYXRpb24oZXZlbnQsIGRlc3QsIC4uLmZpbHRlcnMpO1xuICB9XG5cbiAgYWRkT2JqZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbihcbiAgICBkZXN0OiBJQnVja2V0Tm90aWZpY2F0aW9uRGVzdGluYXRpb24sXG4gICAgLi4uZmlsdGVyczogTm90aWZpY2F0aW9uS2V5RmlsdGVyW11cbiAgKTogdm9pZCB7XG4gICAgdGhpcy5idWNrZXQuYWRkT2JqZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbihkZXN0LCAuLi5maWx0ZXJzKTtcbiAgfVxuXG4gIGFkZE9iamVjdFJlbW92ZWROb3RpZmljYXRpb24oXG4gICAgZGVzdDogSUJ1Y2tldE5vdGlmaWNhdGlvbkRlc3RpbmF0aW9uLFxuICAgIC4uLmZpbHRlcnM6IE5vdGlmaWNhdGlvbktleUZpbHRlcltdXG4gICk6IHZvaWQge1xuICAgIHRoaXMuYnVja2V0LmFkZE9iamVjdFJlbW92ZWROb3RpZmljYXRpb24oZGVzdCwgLi4uZmlsdGVycyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN0b3JhZ2VGYWN0b3J5IHtcbiAgc3RhdGljIGJ1aWxkKGlkOiBzdHJpbmcsIHByb3BzOiBTdG9yYWdlQnVpbGRQcm9wcyA9IHt9KTogU3RvcmFnZUZhY3RvcnlGbiB7XG4gICAgY29uc3QgeyBzdGFja1BsYWNlbWVudCwgLi4uczNQcm9wcyB9ID0gcHJvcHM7XG4gICAgY29uc3QgZm46IFN0b3JhZ2VGYWN0b3J5Rm4gPSAoX2FwcDogQXBwLCBzY29wZTogQ29uc3RydWN0KSA9PiB7XG4gICAgICB2YWxpZGF0ZVN0b3JhZ2VQcm9wcyhzM1Byb3BzKTtcbiAgICAgIHJldHVybiBuZXcgU3RvcmFnZShzY29wZSwgaWQsIHMzUHJvcHMpO1xuICAgIH07XG4gICAgaWYgKHN0YWNrUGxhY2VtZW50KSB7XG4gICAgICBmbi5zdGFja1BsYWNlbWVudCA9IHN0YWNrUGxhY2VtZW50O1xuICAgIH1cbiAgICByZXR1cm4gZm47XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,24 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const getAccountId_1 = require("../../utils/getAccountId");
|
|
8
|
-
const app_1 = require("../../app");
|
|
9
|
-
class SubdomainHostedZone extends aws_cdk_lib_1.Stack {
|
|
1
|
+
import * as route53 from "aws-cdk-lib/aws-route53";
|
|
2
|
+
import { CfnOutput, Stack } from "aws-cdk-lib";
|
|
3
|
+
import { Role } from "../../resources/aws/iam/index.js";
|
|
4
|
+
import getAccountId from "../../utils/getAccountId.js";
|
|
5
|
+
import App from "../../app.js";
|
|
6
|
+
export class SubdomainHostedZone extends Stack {
|
|
10
7
|
constructor(id, props) {
|
|
11
|
-
super(
|
|
8
|
+
super(App.getInstance(), id);
|
|
12
9
|
// DelegationRoleArn
|
|
13
|
-
const delegationRoleArn =
|
|
14
|
-
account: (
|
|
10
|
+
const delegationRoleArn = Stack.of(this).formatArn({
|
|
11
|
+
account: getAccountId(props.parentAccountName),
|
|
15
12
|
region: "",
|
|
16
13
|
resource: "role",
|
|
17
14
|
resourceName: `${props.parentHostedZoneName.split(".", 1)}DelegateHostedZoneRole`,
|
|
18
15
|
service: "iam"
|
|
19
16
|
});
|
|
20
17
|
// Delegate Hosted Zone Role
|
|
21
|
-
const hostedZoneDelegationRole =
|
|
18
|
+
const hostedZoneDelegationRole = Role.fromRoleArn(this, "hostedZoneDelegationRole", delegationRoleArn);
|
|
22
19
|
// Subdomains
|
|
23
20
|
const delegatedHostedZone = new route53.HostedZone(this, `${props.delegatedZone}HostedZone`, {
|
|
24
21
|
zoneName: props.delegatedZone
|
|
@@ -28,12 +25,10 @@ class SubdomainHostedZone extends aws_cdk_lib_1.Stack {
|
|
|
28
25
|
delegatedZone: delegatedHostedZone,
|
|
29
26
|
parentHostedZoneName: props.parentHostedZoneName
|
|
30
27
|
});
|
|
31
|
-
new
|
|
28
|
+
new CfnOutput(this, `${props.delegatedZone.split(".").join("")}HostedZoneId`, {
|
|
32
29
|
key: `${props.delegatedZone.split(".").join("")}HostedZoneId`,
|
|
33
30
|
value: delegatedHostedZone.hostedZoneId,
|
|
34
31
|
exportName: `${props.delegatedZone.split(".").join("")}HostedZoneId`
|
|
35
32
|
});
|
|
36
33
|
}
|
|
37
34
|
}
|
|
38
|
-
exports.SubdomainHostedZone = SubdomainHostedZone;
|
|
39
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ViZG9tYWluSG9zdGVkWm9uZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9wYXR0ZXJucy9hd3Mvc3ViZG9tYWluSG9zdGVkWm9uZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtREFBbUQ7QUFDbkQsNkNBQStDO0FBQy9DLGlEQUErQztBQUMvQywyREFBb0Q7QUFDcEQsbUNBQTRCO0FBUTVCLE1BQWEsbUJBQW9CLFNBQVEsbUJBQUs7SUFDNUMsWUFBWSxFQUFVLEVBQUUsS0FBK0I7UUFDckQsS0FBSyxDQUFDLGFBQUcsQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUU3QixvQkFBb0I7UUFDcEIsTUFBTSxpQkFBaUIsR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDakQsT0FBTyxFQUFFLElBQUEsc0JBQVksRUFBQyxLQUFLLENBQUMsaUJBQWlCLENBQUM7WUFDOUMsTUFBTSxFQUFFLEVBQUU7WUFDVixRQUFRLEVBQUUsTUFBTTtZQUNoQixZQUFZLEVBQUUsR0FBRyxLQUFLLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUMvQyxHQUFHLEVBQ0gsQ0FBQyxDQUNGLHdCQUF3QjtZQUN6QixPQUFPLEVBQUUsS0FBSztTQUNmLENBQUMsQ0FBQztRQUVILDRCQUE0QjtRQUM1QixNQUFNLHdCQUF3QixHQUFHLFVBQUksQ0FBQyxXQUFXLENBQy9DLElBQUksRUFDSiwwQkFBMEIsRUFDMUIsaUJBQWlCLENBQ2xCLENBQUM7UUFFRixhQUFhO1FBQ2IsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQ2hELElBQUksRUFDSixHQUFHLEtBQUssQ0FBQyxhQUFhLFlBQVksRUFDbEM7WUFDRSxRQUFRLEVBQUUsS0FBSyxDQUFDLGFBQWE7U0FDOUIsQ0FDRixDQUFDO1FBRUYsSUFBSSxPQUFPLENBQUMsZ0NBQWdDLENBQzFDLElBQUksRUFDSixHQUFHLEtBQUssQ0FBQyxhQUFhLGdCQUFnQixFQUN0QztZQUNFLGNBQWMsRUFBRSx3QkFBd0I7WUFDeEMsYUFBYSxFQUFFLG1CQUFtQjtZQUNsQyxvQkFBb0IsRUFBRSxLQUFLLENBQUMsb0JBQW9CO1NBQ2pELENBQ0YsQ0FBQztRQUVGLElBQUksdUJBQVMsQ0FDWCxJQUFJLEVBQ0osR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGNBQWMsRUFDeEQ7WUFDRSxHQUFHLEVBQUUsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGNBQWM7WUFDN0QsS0FBSyxFQUFFLG1CQUFtQixDQUFDLFlBQVk7WUFDdkMsVUFBVSxFQUFFLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxjQUFjO1NBQ3JFLENBQ0YsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQXBERCxrREFvREMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyByb3V0ZTUzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtcm91dGU1M1wiO1xuaW1wb3J0IHsgQ2ZuT3V0cHV0LCBTdGFjayB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgUm9sZSB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvYXdzL2lhbVwiO1xuaW1wb3J0IGdldEFjY291bnRJZCBmcm9tIFwiLi4vLi4vdXRpbHMvZ2V0QWNjb3VudElkXCI7XG5pbXBvcnQgQXBwIGZyb20gXCIuLi8uLi9hcHBcIjtcblxuZXhwb3J0IGludGVyZmFjZSBzdWJkb21haW5Ib3N0ZWRab25lUHJvcHMge1xuICBkZWxlZ2F0ZWRab25lOiBzdHJpbmc7XG4gIHBhcmVudEhvc3RlZFpvbmVOYW1lOiBzdHJpbmc7XG4gIHBhcmVudEFjY291bnROYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBTdWJkb21haW5Ib3N0ZWRab25lIGV4dGVuZHMgU3RhY2sge1xuICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nLCBwcm9wczogc3ViZG9tYWluSG9zdGVkWm9uZVByb3BzKSB7XG4gICAgc3VwZXIoQXBwLmdldEluc3RhbmNlKCksIGlkKTtcblxuICAgIC8vIERlbGVnYXRpb25Sb2xlQXJuXG4gICAgY29uc3QgZGVsZWdhdGlvblJvbGVBcm4gPSBTdGFjay5vZih0aGlzKS5mb3JtYXRBcm4oe1xuICAgICAgYWNjb3VudDogZ2V0QWNjb3VudElkKHByb3BzLnBhcmVudEFjY291bnROYW1lKSxcbiAgICAgIHJlZ2lvbjogXCJcIixcbiAgICAgIHJlc291cmNlOiBcInJvbGVcIixcbiAgICAgIHJlc291cmNlTmFtZTogYCR7cHJvcHMucGFyZW50SG9zdGVkWm9uZU5hbWUuc3BsaXQoXG4gICAgICAgIFwiLlwiLFxuICAgICAgICAxXG4gICAgICApfURlbGVnYXRlSG9zdGVkWm9uZVJvbGVgLFxuICAgICAgc2VydmljZTogXCJpYW1cIlxuICAgIH0pO1xuXG4gICAgLy8gRGVsZWdhdGUgSG9zdGVkIFpvbmUgUm9sZVxuICAgIGNvbnN0IGhvc3RlZFpvbmVEZWxlZ2F0aW9uUm9sZSA9IFJvbGUuZnJvbVJvbGVBcm4oXG4gICAgICB0aGlzLFxuICAgICAgXCJob3N0ZWRab25lRGVsZWdhdGlvblJvbGVcIixcbiAgICAgIGRlbGVnYXRpb25Sb2xlQXJuXG4gICAgKTtcblxuICAgIC8vIFN1YmRvbWFpbnNcbiAgICBjb25zdCBkZWxlZ2F0ZWRIb3N0ZWRab25lID0gbmV3IHJvdXRlNTMuSG9zdGVkWm9uZShcbiAgICAgIHRoaXMsXG4gICAgICBgJHtwcm9wcy5kZWxlZ2F0ZWRab25lfUhvc3RlZFpvbmVgLFxuICAgICAge1xuICAgICAgICB6b25lTmFtZTogcHJvcHMuZGVsZWdhdGVkWm9uZVxuICAgICAgfVxuICAgICk7XG5cbiAgICBuZXcgcm91dGU1My5Dcm9zc0FjY291bnRab25lRGVsZWdhdGlvblJlY29yZChcbiAgICAgIHRoaXMsXG4gICAgICBgJHtwcm9wcy5kZWxlZ2F0ZWRab25lfURlbGVnYXRpb25Sb2xlYCxcbiAgICAgIHtcbiAgICAgICAgZGVsZWdhdGlvblJvbGU6IGhvc3RlZFpvbmVEZWxlZ2F0aW9uUm9sZSxcbiAgICAgICAgZGVsZWdhdGVkWm9uZTogZGVsZWdhdGVkSG9zdGVkWm9uZSxcbiAgICAgICAgcGFyZW50SG9zdGVkWm9uZU5hbWU6IHByb3BzLnBhcmVudEhvc3RlZFpvbmVOYW1lXG4gICAgICB9XG4gICAgKTtcblxuICAgIG5ldyBDZm5PdXRwdXQoXG4gICAgICB0aGlzLFxuICAgICAgYCR7cHJvcHMuZGVsZWdhdGVkWm9uZS5zcGxpdChcIi5cIikuam9pbihcIlwiKX1Ib3N0ZWRab25lSWRgLFxuICAgICAge1xuICAgICAgICBrZXk6IGAke3Byb3BzLmRlbGVnYXRlZFpvbmUuc3BsaXQoXCIuXCIpLmpvaW4oXCJcIil9SG9zdGVkWm9uZUlkYCxcbiAgICAgICAgdmFsdWU6IGRlbGVnYXRlZEhvc3RlZFpvbmUuaG9zdGVkWm9uZUlkLFxuICAgICAgICBleHBvcnROYW1lOiBgJHtwcm9wcy5kZWxlZ2F0ZWRab25lLnNwbGl0KFwiLlwiKS5qb2luKFwiXCIpfUhvc3RlZFpvbmVJZGBcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type IAliasRecordTarget } from "aws-cdk-lib/aws-route53";
|
|
2
|
+
import type { FjallTarget } from "../interfaces/domain.js";
|
|
3
|
+
/**
|
|
4
|
+
* Intersection of the introspectable `FjallTarget` discriminant (used for
|
|
5
|
+
* eject + deploy ordering) and CDK's `IAliasRecordTarget` (used for synth).
|
|
6
|
+
* Every helper in this module returns this intersection so downstream code
|
|
7
|
+
* can treat the same value as either without re-resolving.
|
|
8
|
+
*/
|
|
9
|
+
export type FjallAliasTarget = FjallTarget & IAliasRecordTarget;
|
|
10
|
+
/**
|
|
11
|
+
* Target helper for a Fjall ECS/ALB-fronted app.
|
|
12
|
+
*
|
|
13
|
+
* Requires the app stack to publish exports `${safeApp}AlbDnsName` and
|
|
14
|
+
* `${safeApp}AlbHostedZoneId`. Phase 2 wires these emitters; until then,
|
|
15
|
+
* deploys fail at CloudFormation execution with "No export named … found".
|
|
16
|
+
*/
|
|
17
|
+
export declare function fjallApp(appName: string): FjallAliasTarget;
|
|
18
|
+
/**
|
|
19
|
+
* Target helper for a Fjall CloudFront-fronted app.
|
|
20
|
+
*
|
|
21
|
+
* Requires the CDN stack to publish export `${safeApp}CdnDistributionDomainName`.
|
|
22
|
+
* Phase 2 wires the emitter.
|
|
23
|
+
*/
|
|
24
|
+
export declare function fjallCdn(appName: string): FjallAliasTarget;
|
|
25
|
+
/**
|
|
26
|
+
* Target helper for a Fjall S3 static-site bucket.
|
|
27
|
+
*
|
|
28
|
+
* Requires the bucket stack to publish exports `${safeBucket}WebsiteEndpoint`
|
|
29
|
+
* and `${safeBucket}WebsiteHostedZoneId`. Phase 2 wires these emitters.
|
|
30
|
+
*/
|
|
31
|
+
export declare function fjallBucket(bucketName: string): FjallAliasTarget;
|
|
32
|
+
/**
|
|
33
|
+
* Target helper for an arbitrary `(dnsName, hostedZoneId)` pair. Accepts
|
|
34
|
+
* literal strings or CDK tokens (e.g. a `CfnOutput.value`). No
|
|
35
|
+
* `Fn.importValue` wrapping — the values pass through verbatim.
|
|
36
|
+
*/
|
|
37
|
+
export declare function aliasTo(dnsName: string, hostedZoneId: string): FjallAliasTarget;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { resolveBucketTarget, resolveCdnTarget, resolveCustomTarget, resolveEcsTarget } from "./targetResolution.js";
|
|
2
|
+
/**
|
|
3
|
+
* Target helper for a Fjall ECS/ALB-fronted app.
|
|
4
|
+
*
|
|
5
|
+
* Requires the app stack to publish exports `${safeApp}AlbDnsName` and
|
|
6
|
+
* `${safeApp}AlbHostedZoneId`. Phase 2 wires these emitters; until then,
|
|
7
|
+
* deploys fail at CloudFormation execution with "No export named … found".
|
|
8
|
+
*/
|
|
9
|
+
export function fjallApp(appName) {
|
|
10
|
+
const resolved = resolveEcsTarget(appName);
|
|
11
|
+
return {
|
|
12
|
+
kind: "ecs",
|
|
13
|
+
appName,
|
|
14
|
+
bind(record, zone) {
|
|
15
|
+
return resolved.bind(record, zone);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Target helper for a Fjall CloudFront-fronted app.
|
|
21
|
+
*
|
|
22
|
+
* Requires the CDN stack to publish export `${safeApp}CdnDistributionDomainName`.
|
|
23
|
+
* Phase 2 wires the emitter.
|
|
24
|
+
*/
|
|
25
|
+
export function fjallCdn(appName) {
|
|
26
|
+
const resolved = resolveCdnTarget(appName);
|
|
27
|
+
return {
|
|
28
|
+
kind: "cdn",
|
|
29
|
+
appName,
|
|
30
|
+
bind(record, zone) {
|
|
31
|
+
return resolved.bind(record, zone);
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Target helper for a Fjall S3 static-site bucket.
|
|
37
|
+
*
|
|
38
|
+
* Requires the bucket stack to publish exports `${safeBucket}WebsiteEndpoint`
|
|
39
|
+
* and `${safeBucket}WebsiteHostedZoneId`. Phase 2 wires these emitters.
|
|
40
|
+
*/
|
|
41
|
+
export function fjallBucket(bucketName) {
|
|
42
|
+
const resolved = resolveBucketTarget(bucketName);
|
|
43
|
+
return {
|
|
44
|
+
kind: "bucket",
|
|
45
|
+
bucketName,
|
|
46
|
+
bind(record, zone) {
|
|
47
|
+
return resolved.bind(record, zone);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Target helper for an arbitrary `(dnsName, hostedZoneId)` pair. Accepts
|
|
53
|
+
* literal strings or CDK tokens (e.g. a `CfnOutput.value`). No
|
|
54
|
+
* `Fn.importValue` wrapping — the values pass through verbatim.
|
|
55
|
+
*/
|
|
56
|
+
export function aliasTo(dnsName, hostedZoneId) {
|
|
57
|
+
const resolved = resolveCustomTarget(dnsName, hostedZoneId);
|
|
58
|
+
return {
|
|
59
|
+
kind: "custom",
|
|
60
|
+
dnsName,
|
|
61
|
+
hostedZoneId,
|
|
62
|
+
bind(record, zone) {
|
|
63
|
+
return resolved.bind(record, zone);
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { type IAliasRecordTarget } from "aws-cdk-lib/aws-route53";
|
|
2
|
+
import type { FjallTarget } from "../interfaces/domain.js";
|
|
3
|
+
/**
|
|
4
|
+
* Cross-phase export-name contract.
|
|
5
|
+
*
|
|
6
|
+
* Phase 1 DEFINES these export names; Phase 2 is responsible for wiring the
|
|
7
|
+
* emitting stacks (`computeEcs.ts`, `cdn.ts`, `storage.ts`) to publish each
|
|
8
|
+
* `CfnOutput` with the matching `exportName`. Until Phase 2 lands the
|
|
9
|
+
* producers, a deploy of any `Domain` with a typed target fails at
|
|
10
|
+
* CloudFormation execution with "No export named … found" — the helpers
|
|
11
|
+
* compile and synthesise, but the cross-stack import resolves at deploy.
|
|
12
|
+
*
|
|
13
|
+
* Producer-consumer matrix (see Phase 1 plan §3, D6 / T0.5):
|
|
14
|
+
*
|
|
15
|
+
* | Producer (Phase 2) | Consumer (Phase 1) | Export name |
|
|
16
|
+
* |-----------------------------|-------------------------|------------------------------------------|
|
|
17
|
+
* | `computeEcs.ts` app stack | `resolveEcsTarget` | `${safeApp}AlbDnsName` |
|
|
18
|
+
* | `computeEcs.ts` app stack | `resolveEcsTarget` | `${safeApp}AlbHostedZoneId` |
|
|
19
|
+
* | `cdn.ts` CDN stack | `resolveCdnTarget` | `${safeApp}CdnDistributionDomainName` |
|
|
20
|
+
* | `storage.ts` bucket stack | `resolveBucketTarget` | `${safeBucket}WebsiteEndpoint` |
|
|
21
|
+
* | `storage.ts` bucket stack | `resolveBucketTarget` | `${safeBucket}WebsiteHostedZoneId` |
|
|
22
|
+
*/
|
|
23
|
+
export declare const EXPORT_NAMES: {
|
|
24
|
+
readonly ALB_DNS: (safeApp: string) => string;
|
|
25
|
+
readonly ALB_HOSTED_ZONE_ID: (safeApp: string) => string;
|
|
26
|
+
readonly CDN_DOMAIN: (safeApp: string) => string;
|
|
27
|
+
readonly BUCKET_WEBSITE_ENDPOINT: (safeBucket: string) => string;
|
|
28
|
+
readonly BUCKET_WEBSITE_HZ_ID: (safeBucket: string) => string;
|
|
29
|
+
};
|
|
30
|
+
/** Route53-reserved hosted-zone id for CloudFront distributions. */
|
|
31
|
+
export declare const CLOUDFRONT_HOSTED_ZONE_ID = "Z2FDTNDATAQYW2";
|
|
32
|
+
/**
|
|
33
|
+
* Resolve a Fjall ECS/ALB-fronted app to an `IAliasRecordTarget`.
|
|
34
|
+
*
|
|
35
|
+
* Requires the app stack to publish exports:
|
|
36
|
+
* - `${safeApp}AlbDnsName`
|
|
37
|
+
* - `${safeApp}AlbHostedZoneId`
|
|
38
|
+
*
|
|
39
|
+
* Phase 2 wires the emitters; until then, deploys of typed targets fail with
|
|
40
|
+
* "No export named … found".
|
|
41
|
+
*/
|
|
42
|
+
export declare function resolveEcsTarget(appName: string): IAliasRecordTarget;
|
|
43
|
+
/**
|
|
44
|
+
* Resolve a Fjall CloudFront-fronted app to an `IAliasRecordTarget`.
|
|
45
|
+
*
|
|
46
|
+
* Requires the CDN stack to publish export `${safeApp}CdnDistributionDomainName`.
|
|
47
|
+
* The CloudFront hosted-zone id is the globally fixed `Z2FDTNDATAQYW2`.
|
|
48
|
+
*
|
|
49
|
+
* Phase 2 wires the emitter; until then, deploys of typed targets fail with
|
|
50
|
+
* "No export named … found".
|
|
51
|
+
*/
|
|
52
|
+
export declare function resolveCdnTarget(appName: string): IAliasRecordTarget;
|
|
53
|
+
/**
|
|
54
|
+
* Resolve a Fjall S3 static-site bucket to an `IAliasRecordTarget`.
|
|
55
|
+
*
|
|
56
|
+
* Requires the bucket stack to publish exports:
|
|
57
|
+
* - `${safeBucket}WebsiteEndpoint`
|
|
58
|
+
* - `${safeBucket}WebsiteHostedZoneId`
|
|
59
|
+
*
|
|
60
|
+
* Phase 2 wires the emitters; until then, deploys of typed targets fail with
|
|
61
|
+
* "No export named … found".
|
|
62
|
+
*/
|
|
63
|
+
export declare function resolveBucketTarget(bucketName: string): IAliasRecordTarget;
|
|
64
|
+
/**
|
|
65
|
+
* Pure passthrough — accepts concrete DNS name + hosted-zone id (or CDK
|
|
66
|
+
* tokens) and forwards them unchanged. No `Fn.importValue` wrapping.
|
|
67
|
+
*/
|
|
68
|
+
export declare function resolveCustomTarget(dnsName: string, hostedZoneId: string): IAliasRecordTarget;
|
|
69
|
+
/**
|
|
70
|
+
* Resolve a `FjallTarget` to its raw DNS-name string. The return value is a
|
|
71
|
+
* CloudFormation token for the ECS/CDN/bucket variants — Phase 2 resolves the
|
|
72
|
+
* concrete host via `describeStackResources` after deploy. Used only by
|
|
73
|
+
* `externalRecordsPattern.ts` where no Route53 resource exists and manual
|
|
74
|
+
* record emission needs a string value.
|
|
75
|
+
*/
|
|
76
|
+
export declare function resolveTargetToDnsName(target: FjallTarget): string;
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { Fn } from "aws-cdk-lib";
|
|
2
|
+
import { toPascalCase } from "../../../utils/capitaliseString.js";
|
|
3
|
+
/**
|
|
4
|
+
* Cross-phase export-name contract.
|
|
5
|
+
*
|
|
6
|
+
* Phase 1 DEFINES these export names; Phase 2 is responsible for wiring the
|
|
7
|
+
* emitting stacks (`computeEcs.ts`, `cdn.ts`, `storage.ts`) to publish each
|
|
8
|
+
* `CfnOutput` with the matching `exportName`. Until Phase 2 lands the
|
|
9
|
+
* producers, a deploy of any `Domain` with a typed target fails at
|
|
10
|
+
* CloudFormation execution with "No export named … found" — the helpers
|
|
11
|
+
* compile and synthesise, but the cross-stack import resolves at deploy.
|
|
12
|
+
*
|
|
13
|
+
* Producer-consumer matrix (see Phase 1 plan §3, D6 / T0.5):
|
|
14
|
+
*
|
|
15
|
+
* | Producer (Phase 2) | Consumer (Phase 1) | Export name |
|
|
16
|
+
* |-----------------------------|-------------------------|------------------------------------------|
|
|
17
|
+
* | `computeEcs.ts` app stack | `resolveEcsTarget` | `${safeApp}AlbDnsName` |
|
|
18
|
+
* | `computeEcs.ts` app stack | `resolveEcsTarget` | `${safeApp}AlbHostedZoneId` |
|
|
19
|
+
* | `cdn.ts` CDN stack | `resolveCdnTarget` | `${safeApp}CdnDistributionDomainName` |
|
|
20
|
+
* | `storage.ts` bucket stack | `resolveBucketTarget` | `${safeBucket}WebsiteEndpoint` |
|
|
21
|
+
* | `storage.ts` bucket stack | `resolveBucketTarget` | `${safeBucket}WebsiteHostedZoneId` |
|
|
22
|
+
*/
|
|
23
|
+
export const EXPORT_NAMES = {
|
|
24
|
+
ALB_DNS: (safeApp) => `${safeApp}AlbDnsName`,
|
|
25
|
+
ALB_HOSTED_ZONE_ID: (safeApp) => `${safeApp}AlbHostedZoneId`,
|
|
26
|
+
CDN_DOMAIN: (safeApp) => `${safeApp}CdnDistributionDomainName`,
|
|
27
|
+
BUCKET_WEBSITE_ENDPOINT: (safeBucket) => `${safeBucket}WebsiteEndpoint`,
|
|
28
|
+
BUCKET_WEBSITE_HZ_ID: (safeBucket) => `${safeBucket}WebsiteHostedZoneId`
|
|
29
|
+
};
|
|
30
|
+
/** Route53-reserved hosted-zone id for CloudFront distributions. */
|
|
31
|
+
export const CLOUDFRONT_HOSTED_ZONE_ID = "Z2FDTNDATAQYW2";
|
|
32
|
+
/**
|
|
33
|
+
* Build an object satisfying CDK's `IAliasRecordTarget` shape. The
|
|
34
|
+
* `bind(record, zone?)` signature mirrors `aws-cdk-lib/aws-route53` exactly so
|
|
35
|
+
* future CDK tightenings of the interface continue to compile.
|
|
36
|
+
*/
|
|
37
|
+
function buildAliasTarget(dnsName, hostedZoneId) {
|
|
38
|
+
return {
|
|
39
|
+
bind(_record, _zone) {
|
|
40
|
+
return { dnsName, hostedZoneId };
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Resolve a Fjall ECS/ALB-fronted app to an `IAliasRecordTarget`.
|
|
46
|
+
*
|
|
47
|
+
* Requires the app stack to publish exports:
|
|
48
|
+
* - `${safeApp}AlbDnsName`
|
|
49
|
+
* - `${safeApp}AlbHostedZoneId`
|
|
50
|
+
*
|
|
51
|
+
* Phase 2 wires the emitters; until then, deploys of typed targets fail with
|
|
52
|
+
* "No export named … found".
|
|
53
|
+
*/
|
|
54
|
+
export function resolveEcsTarget(appName) {
|
|
55
|
+
const safeApp = toPascalCase(appName);
|
|
56
|
+
const dnsName = Fn.importValue(EXPORT_NAMES.ALB_DNS(safeApp));
|
|
57
|
+
const hostedZoneId = Fn.importValue(EXPORT_NAMES.ALB_HOSTED_ZONE_ID(safeApp));
|
|
58
|
+
return buildAliasTarget(dnsName, hostedZoneId);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Resolve a Fjall CloudFront-fronted app to an `IAliasRecordTarget`.
|
|
62
|
+
*
|
|
63
|
+
* Requires the CDN stack to publish export `${safeApp}CdnDistributionDomainName`.
|
|
64
|
+
* The CloudFront hosted-zone id is the globally fixed `Z2FDTNDATAQYW2`.
|
|
65
|
+
*
|
|
66
|
+
* Phase 2 wires the emitter; until then, deploys of typed targets fail with
|
|
67
|
+
* "No export named … found".
|
|
68
|
+
*/
|
|
69
|
+
export function resolveCdnTarget(appName) {
|
|
70
|
+
const safeApp = toPascalCase(appName);
|
|
71
|
+
const dnsName = Fn.importValue(EXPORT_NAMES.CDN_DOMAIN(safeApp));
|
|
72
|
+
return buildAliasTarget(dnsName, CLOUDFRONT_HOSTED_ZONE_ID);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Resolve a Fjall S3 static-site bucket to an `IAliasRecordTarget`.
|
|
76
|
+
*
|
|
77
|
+
* Requires the bucket stack to publish exports:
|
|
78
|
+
* - `${safeBucket}WebsiteEndpoint`
|
|
79
|
+
* - `${safeBucket}WebsiteHostedZoneId`
|
|
80
|
+
*
|
|
81
|
+
* Phase 2 wires the emitters; until then, deploys of typed targets fail with
|
|
82
|
+
* "No export named … found".
|
|
83
|
+
*/
|
|
84
|
+
export function resolveBucketTarget(bucketName) {
|
|
85
|
+
const safeBucket = toPascalCase(bucketName);
|
|
86
|
+
const dnsName = Fn.importValue(EXPORT_NAMES.BUCKET_WEBSITE_ENDPOINT(safeBucket));
|
|
87
|
+
const hostedZoneId = Fn.importValue(EXPORT_NAMES.BUCKET_WEBSITE_HZ_ID(safeBucket));
|
|
88
|
+
return buildAliasTarget(dnsName, hostedZoneId);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Pure passthrough — accepts concrete DNS name + hosted-zone id (or CDK
|
|
92
|
+
* tokens) and forwards them unchanged. No `Fn.importValue` wrapping.
|
|
93
|
+
*/
|
|
94
|
+
export function resolveCustomTarget(dnsName, hostedZoneId) {
|
|
95
|
+
return buildAliasTarget(dnsName, hostedZoneId);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Resolve a `FjallTarget` to its raw DNS-name string. The return value is a
|
|
99
|
+
* CloudFormation token for the ECS/CDN/bucket variants — Phase 2 resolves the
|
|
100
|
+
* concrete host via `describeStackResources` after deploy. Used only by
|
|
101
|
+
* `externalRecordsPattern.ts` where no Route53 resource exists and manual
|
|
102
|
+
* record emission needs a string value.
|
|
103
|
+
*/
|
|
104
|
+
export function resolveTargetToDnsName(target) {
|
|
105
|
+
switch (target.kind) {
|
|
106
|
+
case "ecs":
|
|
107
|
+
return Fn.importValue(EXPORT_NAMES.ALB_DNS(toPascalCase(target.appName)));
|
|
108
|
+
case "cdn":
|
|
109
|
+
return Fn.importValue(EXPORT_NAMES.CDN_DOMAIN(toPascalCase(target.appName)));
|
|
110
|
+
case "bucket":
|
|
111
|
+
return Fn.importValue(EXPORT_NAMES.BUCKET_WEBSITE_ENDPOINT(toPascalCase(target.bucketName)));
|
|
112
|
+
case "custom":
|
|
113
|
+
return target.dnsName;
|
|
114
|
+
default: {
|
|
115
|
+
const _exhaustive = target;
|
|
116
|
+
throw new Error(`Unsupported FjallTarget kind: ${String(_exhaustive.kind)}`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./aws/index.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./aws/index.js";
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Connections, type IConnectable } from "aws-cdk-lib/aws-ec2";
|
|
2
|
+
import { Construct } from "constructs";
|
|
3
|
+
import type { ClickHouseProps, ClickHouseOutputs } from "./clickhouseTypes.js";
|
|
4
|
+
/**
|
|
5
|
+
* ClickHouse analytics infrastructure.
|
|
6
|
+
*
|
|
7
|
+
* Creates a single-node ClickHouse instance on ECS EC2 with a dedicated
|
|
8
|
+
* gp3 EBS volume for data persistence. Designed for analytical workloads
|
|
9
|
+
* (cost aggregation, deployment metrics, audit logs) rather than OLTP.
|
|
10
|
+
*/
|
|
11
|
+
export default class ClickHouse extends Construct implements IConnectable {
|
|
12
|
+
readonly connections: Connections;
|
|
13
|
+
readonly outputs: ClickHouseOutputs;
|
|
14
|
+
constructor(scope: Construct, id: string, props: ClickHouseProps);
|
|
15
|
+
}
|