diff --git a/.gitignore b/.gitignore
index e2d7198..3ee15fd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -48,5 +48,4 @@ junit.xml
.jsii
tsconfig.json
!/API.md
-.DS_Store
!/.projenrc.js
diff --git a/.projenrc.js b/.projenrc.js
index 62c80e7..7f0ab6a 100644
--- a/.projenrc.js
+++ b/.projenrc.js
@@ -41,5 +41,4 @@ const project = new AwsCdkConstructLibrary({
// devDeps: [], /* Build dependencies for this module. */
// packageName: undefined, /* The "name" in package.json. */
});
-project.gitignore.addPatterns('.DS_Store');
project.synth();
diff --git a/API.md b/API.md
index 7a3e927..f0db2be 100644
--- a/API.md
+++ b/API.md
@@ -2,978 +2,6 @@
## Constructs
-### HostedZoneStack
-
-#### Initializers
-
-```typescript
-import { HostedZoneStack } from '@smallcase/cdk-vpc-module'
-
-new HostedZoneStack(scope: Construct, id: string, props: HostedZoneStackProps)
-```
-
-| **Name** | **Type** | **Description** |
-| --- | --- | --- |
-| scope | constructs.Construct | *No description.* |
-| id | string | *No description.* |
-| props | HostedZoneStackProps | *No description.* |
-
----
-
-##### `scope`Required
-
-- *Type:* constructs.Construct
-
----
-
-##### `id`Required
-
-- *Type:* string
-
----
-
-##### `props`Required
-
-- *Type:* HostedZoneStackProps
-
----
-
-#### Methods
-
-| **Name** | **Description** |
-| --- | --- |
-| toString | Returns a string representation of this construct. |
-| addDependency | Add a dependency between this stack and another stack. |
-| addMetadata | Adds an arbitrary key-value pair, with information you want to record about the stack. |
-| addStackTag | Configure a stack tag. |
-| addTransform | Add a Transform to this stack. A Transform is a macro that AWS CloudFormation uses to process your template. |
-| exportStringListValue | Create a CloudFormation Export for a string list value. |
-| exportValue | Create a CloudFormation Export for a string value. |
-| formatArn | Creates an ARN from components. |
-| getLogicalId | Allocates a stack-unique CloudFormation-compatible logical identity for a specific resource. |
-| regionalFact | Look up a fact value for the given fact for the region of this stack. |
-| removeStackTag | Remove a stack tag. |
-| renameLogicalId | Rename a generated logical identities. |
-| reportMissingContextKey | Indicate that a context key was expected. |
-| resolve | Resolve a tokenized value in the context of the current stack. |
-| splitArn | Splits the provided ARN into its components. |
-| toJsonString | Convert an object, potentially containing tokens, to a JSON string. |
-| toYamlString | Convert an object, potentially containing tokens, to a YAML string. |
-| setParameter | Assign a value to one of the nested stack parameters. |
-
----
-
-##### `toString`
-
-```typescript
-public toString(): string
-```
-
-Returns a string representation of this construct.
-
-##### `addDependency`
-
-```typescript
-public addDependency(target: Stack, reason?: string): void
-```
-
-Add a dependency between this stack and another stack.
-
-This can be used to define dependencies between any two stacks within an
-app, and also supports nested stacks.
-
-###### `target`Required
-
-- *Type:* aws-cdk-lib.Stack
-
----
-
-###### `reason`Optional
-
-- *Type:* string
-
----
-
-##### `addMetadata`
-
-```typescript
-public addMetadata(key: string, value: any): void
-```
-
-Adds an arbitrary key-value pair, with information you want to record about the stack.
-
-These get translated to the Metadata section of the generated template.
-
-> [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/metadata-section-structure.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/metadata-section-structure.html)
-
-###### `key`Required
-
-- *Type:* string
-
----
-
-###### `value`Required
-
-- *Type:* any
-
----
-
-##### `addStackTag`
-
-```typescript
-public addStackTag(tagName: string, tagValue: string): void
-```
-
-Configure a stack tag.
-
-At deploy time, CloudFormation will automatically apply all stack tags to all resources in the stack.
-
-###### `tagName`Required
-
-- *Type:* string
-
----
-
-###### `tagValue`Required
-
-- *Type:* string
-
----
-
-##### `addTransform`
-
-```typescript
-public addTransform(transform: string): void
-```
-
-Add a Transform to this stack. A Transform is a macro that AWS CloudFormation uses to process your template.
-
-Duplicate values are removed when stack is synthesized.
-
-> [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/transform-section-structure.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/transform-section-structure.html)
-
-*Example*
-
-```typescript
-declare const stack: Stack;
-
-stack.addTransform('AWS::Serverless-2016-10-31')
-```
-
-
-###### `transform`Required
-
-- *Type:* string
-
-The transform to add.
-
----
-
-##### `exportStringListValue`
-
-```typescript
-public exportStringListValue(exportedValue: any, options?: ExportValueOptions): string[]
-```
-
-Create a CloudFormation Export for a string list value.
-
-Returns a string list representing the corresponding `Fn.importValue()`
-expression for this Export. The export expression is automatically wrapped with an
-`Fn::Join` and the import value with an `Fn::Split`, since CloudFormation can only
-export strings. You can control the name for the export by passing the `name` option.
-
-If you don't supply a value for `name`, the value you're exporting must be
-a Resource attribute (for example: `bucket.bucketName`) and it will be
-given the same name as the automatic cross-stack reference that would be created
-if you used the attribute in another Stack.
-
-One of the uses for this method is to *remove* the relationship between
-two Stacks established by automatic cross-stack references. It will
-temporarily ensure that the CloudFormation Export still exists while you
-remove the reference from the consuming stack. After that, you can remove
-the resource and the manual export.
-
-See `exportValue` for an example of this process.
-
-###### `exportedValue`Required
-
-- *Type:* any
-
----
-
-###### `options`Optional
-
-- *Type:* aws-cdk-lib.ExportValueOptions
-
----
-
-##### `exportValue`
-
-```typescript
-public exportValue(exportedValue: any, options?: ExportValueOptions): string
-```
-
-Create a CloudFormation Export for a string value.
-
-Returns a string representing the corresponding `Fn.importValue()`
-expression for this Export. You can control the name for the export by
-passing the `name` option.
-
-If you don't supply a value for `name`, the value you're exporting must be
-a Resource attribute (for example: `bucket.bucketName`) and it will be
-given the same name as the automatic cross-stack reference that would be created
-if you used the attribute in another Stack.
-
-One of the uses for this method is to *remove* the relationship between
-two Stacks established by automatic cross-stack references. It will
-temporarily ensure that the CloudFormation Export still exists while you
-remove the reference from the consuming stack. After that, you can remove
-the resource and the manual export.
-
-Here is how the process works. Let's say there are two stacks,
-`producerStack` and `consumerStack`, and `producerStack` has a bucket
-called `bucket`, which is referenced by `consumerStack` (perhaps because
-an AWS Lambda Function writes into it, or something like that).
-
-It is not safe to remove `producerStack.bucket` because as the bucket is being
-deleted, `consumerStack` might still be using it.
-
-Instead, the process takes two deployments:
-
-**Deployment 1: break the relationship**:
-
-- Make sure `consumerStack` no longer references `bucket.bucketName` (maybe the consumer
- stack now uses its own bucket, or it writes to an AWS DynamoDB table, or maybe you just
- remove the Lambda Function altogether).
-- In the `ProducerStack` class, call `this.exportValue(this.bucket.bucketName)`. This
- will make sure the CloudFormation Export continues to exist while the relationship
- between the two stacks is being broken.
-- Deploy (this will effectively only change the `consumerStack`, but it's safe to deploy both).
-
-**Deployment 2: remove the bucket resource**:
-
-- You are now free to remove the `bucket` resource from `producerStack`.
-- Don't forget to remove the `exportValue()` call as well.
-- Deploy again (this time only the `producerStack` will be changed -- the bucket will be deleted).
-
-###### `exportedValue`Required
-
-- *Type:* any
-
----
-
-###### `options`Optional
-
-- *Type:* aws-cdk-lib.ExportValueOptions
-
----
-
-##### `formatArn`
-
-```typescript
-public formatArn(components: ArnComponents): string
-```
-
-Creates an ARN from components.
-
-If `partition`, `region` or `account` are not specified, the stack's
-partition, region and account will be used.
-
-If any component is the empty string, an empty string will be inserted
-into the generated ARN at the location that component corresponds to.
-
-The ARN will be formatted as follows:
-
- arn:{partition}:{service}:{region}:{account}:{resource}{sep}{resource-name}
-
-The required ARN pieces that are omitted will be taken from the stack that
-the 'scope' is attached to. If all ARN pieces are supplied, the supplied scope
-can be 'undefined'.
-
-###### `components`Required
-
-- *Type:* aws-cdk-lib.ArnComponents
-
----
-
-##### `getLogicalId`
-
-```typescript
-public getLogicalId(element: CfnElement): string
-```
-
-Allocates a stack-unique CloudFormation-compatible logical identity for a specific resource.
-
-This method is called when a `CfnElement` is created and used to render the
-initial logical identity of resources. Logical ID renames are applied at
-this stage.
-
-This method uses the protected method `allocateLogicalId` to render the
-logical ID for an element. To modify the naming scheme, extend the `Stack`
-class and override this method.
-
-###### `element`Required
-
-- *Type:* aws-cdk-lib.CfnElement
-
-The CloudFormation element for which a logical identity is needed.
-
----
-
-##### `regionalFact`
-
-```typescript
-public regionalFact(factName: string, defaultValue?: string): string
-```
-
-Look up a fact value for the given fact for the region of this stack.
-
-Will return a definite value only if the region of the current stack is resolved.
-If not, a lookup map will be added to the stack and the lookup will be done at
-CDK deployment time.
-
-What regions will be included in the lookup map is controlled by the
-`@aws-cdk/core:target-partitions` context value: it must be set to a list
-of partitions, and only regions from the given partitions will be included.
-If no such context key is set, all regions will be included.
-
-This function is intended to be used by construct library authors. Application
-builders can rely on the abstractions offered by construct libraries and do
-not have to worry about regional facts.
-
-If `defaultValue` is not given, it is an error if the fact is unknown for
-the given region.
-
-###### `factName`Required
-
-- *Type:* string
-
----
-
-###### `defaultValue`Optional
-
-- *Type:* string
-
----
-
-##### `removeStackTag`
-
-```typescript
-public removeStackTag(tagName: string): void
-```
-
-Remove a stack tag.
-
-At deploy time, CloudFormation will automatically apply all stack tags to all resources in the stack.
-
-###### `tagName`Required
-
-- *Type:* string
-
----
-
-##### `renameLogicalId`
-
-```typescript
-public renameLogicalId(oldId: string, newId: string): void
-```
-
-Rename a generated logical identities.
-
-To modify the naming scheme strategy, extend the `Stack` class and
-override the `allocateLogicalId` method.
-
-###### `oldId`Required
-
-- *Type:* string
-
----
-
-###### `newId`Required
-
-- *Type:* string
-
----
-
-##### `reportMissingContextKey`
-
-```typescript
-public reportMissingContextKey(report: MissingContext): void
-```
-
-Indicate that a context key was expected.
-
-Contains instructions which will be emitted into the cloud assembly on how
-the key should be supplied.
-
-###### `report`Required
-
-- *Type:* aws-cdk-lib.cloud_assembly_schema.MissingContext
-
-The set of parameters needed to obtain the context.
-
----
-
-##### `resolve`
-
-```typescript
-public resolve(obj: any): any
-```
-
-Resolve a tokenized value in the context of the current stack.
-
-###### `obj`Required
-
-- *Type:* any
-
----
-
-##### `splitArn`
-
-```typescript
-public splitArn(arn: string, arnFormat: ArnFormat): ArnComponents
-```
-
-Splits the provided ARN into its components.
-
-Works both if 'arn' is a string like 'arn:aws:s3:::bucket',
-and a Token representing a dynamic CloudFormation expression
-(in which case the returned components will also be dynamic CloudFormation expressions,
-encoded as Tokens).
-
-###### `arn`Required
-
-- *Type:* string
-
-the ARN to split into its components.
-
----
-
-###### `arnFormat`Required
-
-- *Type:* aws-cdk-lib.ArnFormat
-
-the expected format of 'arn' - depends on what format the service 'arn' represents uses.
-
----
-
-##### `toJsonString`
-
-```typescript
-public toJsonString(obj: any, space?: number): string
-```
-
-Convert an object, potentially containing tokens, to a JSON string.
-
-###### `obj`Required
-
-- *Type:* any
-
----
-
-###### `space`Optional
-
-- *Type:* number
-
----
-
-##### `toYamlString`
-
-```typescript
-public toYamlString(obj: any): string
-```
-
-Convert an object, potentially containing tokens, to a YAML string.
-
-###### `obj`Required
-
-- *Type:* any
-
----
-
-##### `setParameter`
-
-```typescript
-public setParameter(name: string, value: string): void
-```
-
-Assign a value to one of the nested stack parameters.
-
-###### `name`Required
-
-- *Type:* string
-
-The parameter name (ID).
-
----
-
-###### `value`Required
-
-- *Type:* string
-
-The value to assign.
-
----
-
-#### Static Functions
-
-| **Name** | **Description** |
-| --- | --- |
-| isConstruct | Checks if `x` is a construct. |
-| isStack | Return whether the given object is a Stack. |
-| of | Looks up the first stack scope in which `construct` is defined. |
-| isNestedStack | Checks if `x` is an object of type `NestedStack`. |
-
----
-
-##### ~~`isConstruct`~~
-
-```typescript
-import { HostedZoneStack } from '@smallcase/cdk-vpc-module'
-
-HostedZoneStack.isConstruct(x: any)
-```
-
-Checks if `x` is a construct.
-
-###### `x`Required
-
-- *Type:* any
-
-Any object.
-
----
-
-##### `isStack`
-
-```typescript
-import { HostedZoneStack } from '@smallcase/cdk-vpc-module'
-
-HostedZoneStack.isStack(x: any)
-```
-
-Return whether the given object is a Stack.
-
-We do attribute detection since we can't reliably use 'instanceof'.
-
-###### `x`Required
-
-- *Type:* any
-
----
-
-##### `of`
-
-```typescript
-import { HostedZoneStack } from '@smallcase/cdk-vpc-module'
-
-HostedZoneStack.of(construct: IConstruct)
-```
-
-Looks up the first stack scope in which `construct` is defined.
-
-Fails if there is no stack up the tree.
-
-###### `construct`Required
-
-- *Type:* constructs.IConstruct
-
-The construct to start the search from.
-
----
-
-##### `isNestedStack`
-
-```typescript
-import { HostedZoneStack } from '@smallcase/cdk-vpc-module'
-
-HostedZoneStack.isNestedStack(x: any)
-```
-
-Checks if `x` is an object of type `NestedStack`.
-
-###### `x`Required
-
-- *Type:* any
-
----
-
-#### Properties
-
-| **Name** | **Type** | **Description** |
-| --- | --- | --- |
-| node | constructs.Node | The tree node. |
-| account | string | The AWS account into which this stack will be deployed. |
-| artifactId | string | The ID of the cloud assembly artifact for this stack. |
-| availabilityZones | string[] | Returns the list of AZs that are available in the AWS environment (account/region) associated with this stack. |
-| bundlingRequired | boolean | Indicates whether the stack requires bundling or not. |
-| dependencies | aws-cdk-lib.Stack[] | Return the stacks this stack depends on. |
-| environment | string | The environment coordinates in which this stack is deployed. |
-| nested | boolean | Indicates if this is a nested stack, in which case `parentStack` will include a reference to it's parent. |
-| notificationArns | string[] | Returns the list of notification Amazon Resource Names (ARNs) for the current stack. |
-| partition | string | The partition in which this stack is defined. |
-| region | string | The AWS region into which this stack will be deployed (e.g. `us-west-2`). |
-| stackId | string | An attribute that represents the ID of the stack. |
-| stackName | string | An attribute that represents the name of the nested stack. |
-| synthesizer | aws-cdk-lib.IStackSynthesizer | Synthesis method for this stack. |
-| tags | aws-cdk-lib.TagManager | Tags to be applied to the stack. |
-| templateFile | string | The name of the CloudFormation template file emitted to the output directory during synthesis. |
-| templateOptions | aws-cdk-lib.ITemplateOptions | Options for CloudFormation template (like version, transform, description). |
-| urlSuffix | string | The Amazon domain suffix for the region in which this stack is defined. |
-| nestedStackParent | aws-cdk-lib.Stack | If this is a nested stack, returns it's parent stack. |
-| nestedStackResource | aws-cdk-lib.CfnResource | If this is a nested stack, this represents its `AWS::CloudFormation::Stack` resource. |
-| terminationProtection | boolean | Whether termination protection is enabled for this stack. |
-| certificateOutputs | {[ key: string ]: aws-cdk-lib.aws_certificatemanager.Certificate} | *No description.* |
-| hostedZoneOutputs | {[ key: string ]: aws-cdk-lib.aws_route53.IHostedZone} | *No description.* |
-
----
-
-##### `node`Required
-
-```typescript
-public readonly node: Node;
-```
-
-- *Type:* constructs.Node
-
-The tree node.
-
----
-
-##### `account`Required
-
-```typescript
-public readonly account: string;
-```
-
-- *Type:* string
-
-The AWS account into which this stack will be deployed.
-
-This value is resolved according to the following rules:
-
-1. The value provided to `env.account` when the stack is defined. This can
- either be a concrete account (e.g. `585695031111`) or the
- `Aws.ACCOUNT_ID` token.
-3. `Aws.ACCOUNT_ID`, which represents the CloudFormation intrinsic reference
- `{ "Ref": "AWS::AccountId" }` encoded as a string token.
-
-Preferably, you should use the return value as an opaque string and not
-attempt to parse it to implement your logic. If you do, you must first
-check that it is a concrete value an not an unresolved token. If this
-value is an unresolved token (`Token.isUnresolved(stack.account)` returns
-`true`), this implies that the user wishes that this stack will synthesize
-into an **account-agnostic template**. In this case, your code should either
-fail (throw an error, emit a synth error using `Annotations.of(construct).addError()`) or
-implement some other account-agnostic behavior.
-
----
-
-##### `artifactId`Required
-
-```typescript
-public readonly artifactId: string;
-```
-
-- *Type:* string
-
-The ID of the cloud assembly artifact for this stack.
-
----
-
-##### `availabilityZones`Required
-
-```typescript
-public readonly availabilityZones: string[];
-```
-
-- *Type:* string[]
-
-Returns the list of AZs that are available in the AWS environment (account/region) associated with this stack.
-
-If the stack is environment-agnostic (either account and/or region are
-tokens), this property will return an array with 2 tokens that will resolve
-at deploy-time to the first two availability zones returned from CloudFormation's
-`Fn::GetAZs` intrinsic function.
-
-If they are not available in the context, returns a set of dummy values and
-reports them as missing, and let the CLI resolve them by calling EC2
-`DescribeAvailabilityZones` on the target environment.
-
-To specify a different strategy for selecting availability zones override this method.
-
----
-
-##### `bundlingRequired`Required
-
-```typescript
-public readonly bundlingRequired: boolean;
-```
-
-- *Type:* boolean
-
-Indicates whether the stack requires bundling or not.
-
----
-
-##### `dependencies`Required
-
-```typescript
-public readonly dependencies: Stack[];
-```
-
-- *Type:* aws-cdk-lib.Stack[]
-
-Return the stacks this stack depends on.
-
----
-
-##### `environment`Required
-
-```typescript
-public readonly environment: string;
-```
-
-- *Type:* string
-
-The environment coordinates in which this stack is deployed.
-
-In the form
-`aws://account/region`. Use `stack.account` and `stack.region` to obtain
-the specific values, no need to parse.
-
-You can use this value to determine if two stacks are targeting the same
-environment.
-
-If either `stack.account` or `stack.region` are not concrete values (e.g.
-`Aws.ACCOUNT_ID` or `Aws.REGION`) the special strings `unknown-account` and/or
-`unknown-region` will be used respectively to indicate this stack is
-region/account-agnostic.
-
----
-
-##### `nested`Required
-
-```typescript
-public readonly nested: boolean;
-```
-
-- *Type:* boolean
-
-Indicates if this is a nested stack, in which case `parentStack` will include a reference to it's parent.
-
----
-
-##### `notificationArns`Required
-
-```typescript
-public readonly notificationArns: string[];
-```
-
-- *Type:* string[]
-
-Returns the list of notification Amazon Resource Names (ARNs) for the current stack.
-
----
-
-##### `partition`Required
-
-```typescript
-public readonly partition: string;
-```
-
-- *Type:* string
-
-The partition in which this stack is defined.
-
----
-
-##### `region`Required
-
-```typescript
-public readonly region: string;
-```
-
-- *Type:* string
-
-The AWS region into which this stack will be deployed (e.g. `us-west-2`).
-
-This value is resolved according to the following rules:
-
-1. The value provided to `env.region` when the stack is defined. This can
- either be a concrete region (e.g. `us-west-2`) or the `Aws.REGION`
- token.
-3. `Aws.REGION`, which is represents the CloudFormation intrinsic reference
- `{ "Ref": "AWS::Region" }` encoded as a string token.
-
-Preferably, you should use the return value as an opaque string and not
-attempt to parse it to implement your logic. If you do, you must first
-check that it is a concrete value an not an unresolved token. If this
-value is an unresolved token (`Token.isUnresolved(stack.region)` returns
-`true`), this implies that the user wishes that this stack will synthesize
-into a **region-agnostic template**. In this case, your code should either
-fail (throw an error, emit a synth error using `Annotations.of(construct).addError()`) or
-implement some other region-agnostic behavior.
-
----
-
-##### `stackId`Required
-
-```typescript
-public readonly stackId: string;
-```
-
-- *Type:* string
-
-An attribute that represents the ID of the stack.
-
-This is a context aware attribute:
-- If this is referenced from the parent stack, it will return `{ "Ref": "LogicalIdOfNestedStackResource" }`.
-- If this is referenced from the context of the nested stack, it will return `{ "Ref": "AWS::StackId" }`
-
-Example value: `arn:aws:cloudformation:us-east-2:123456789012:stack/mystack-mynestedstack-sggfrhxhum7w/f449b250-b969-11e0-a185-5081d0136786`
-
----
-
-##### `stackName`Required
-
-```typescript
-public readonly stackName: string;
-```
-
-- *Type:* string
-
-An attribute that represents the name of the nested stack.
-
-This is a context aware attribute:
-- If this is referenced from the parent stack, it will return a token that parses the name from the stack ID.
-- If this is referenced from the context of the nested stack, it will return `{ "Ref": "AWS::StackName" }`
-
-Example value: `mystack-mynestedstack-sggfrhxhum7w`
-
----
-
-##### `synthesizer`Required
-
-```typescript
-public readonly synthesizer: IStackSynthesizer;
-```
-
-- *Type:* aws-cdk-lib.IStackSynthesizer
-
-Synthesis method for this stack.
-
----
-
-##### `tags`Required
-
-```typescript
-public readonly tags: TagManager;
-```
-
-- *Type:* aws-cdk-lib.TagManager
-
-Tags to be applied to the stack.
-
----
-
-##### `templateFile`Required
-
-```typescript
-public readonly templateFile: string;
-```
-
-- *Type:* string
-
-The name of the CloudFormation template file emitted to the output directory during synthesis.
-
-Example value: `MyStack.template.json`
-
----
-
-##### `templateOptions`Required
-
-```typescript
-public readonly templateOptions: ITemplateOptions;
-```
-
-- *Type:* aws-cdk-lib.ITemplateOptions
-
-Options for CloudFormation template (like version, transform, description).
-
----
-
-##### `urlSuffix`Required
-
-```typescript
-public readonly urlSuffix: string;
-```
-
-- *Type:* string
-
-The Amazon domain suffix for the region in which this stack is defined.
-
----
-
-##### `nestedStackParent`Optional
-
-```typescript
-public readonly nestedStackParent: Stack;
-```
-
-- *Type:* aws-cdk-lib.Stack
-
-If this is a nested stack, returns it's parent stack.
-
----
-
-##### `nestedStackResource`Optional
-
-```typescript
-public readonly nestedStackResource: CfnResource;
-```
-
-- *Type:* aws-cdk-lib.CfnResource
-
-If this is a nested stack, this represents its `AWS::CloudFormation::Stack` resource.
-
-`undefined` for top-level (non-nested) stacks.
-
----
-
-##### `terminationProtection`Required
-
-```typescript
-public readonly terminationProtection: boolean;
-```
-
-- *Type:* boolean
-
-Whether termination protection is enabled for this stack.
-
----
-
-##### `certificateOutputs`Required
-
-```typescript
-public readonly certificateOutputs: {[ key: string ]: Certificate};
-```
-
-- *Type:* {[ key: string ]: aws-cdk-lib.aws_certificatemanager.Certificate}
-
----
-
-##### `hostedZoneOutputs`Required
-
-```typescript
-public readonly hostedZoneOutputs: {[ key: string ]: IHostedZone};
-```
-
-- *Type:* {[ key: string ]: aws-cdk-lib.aws_route53.IHostedZone}
-
----
-
-
### Network
#### Initializers
@@ -1092,7 +120,6 @@ Any object.
| natProvider | aws-cdk-lib.aws_ec2.NatProvider | *No description.* |
| securityGroupOutputs | {[ key: string ]: aws-cdk-lib.aws_ec2.SecurityGroup} | *No description.* |
| vpc | aws-cdk-lib.aws_ec2.Vpc | *No description.* |
-| hostedZoneStack | HostedZoneStack | *No description.* |
| natSubnets | aws-cdk-lib.aws_ec2.PublicSubnet[] | *No description.* |
| pbSubnets | aws-cdk-lib.aws_ec2.PublicSubnet[] | *No description.* |
| pvSubnets | aws-cdk-lib.aws_ec2.PrivateSubnet[] | *No description.* |
@@ -1152,16 +179,6 @@ public readonly vpc: Vpc;
---
-##### `hostedZoneStack`Optional
-
-```typescript
-public readonly hostedZoneStack: HostedZoneStack;
-```
-
-- *Type:* HostedZoneStack
-
----
-
##### `natSubnets`Required
```typescript
@@ -2263,216 +1280,6 @@ public readonly routerId: string;
---
-### HostedZoneConfig
-
-#### Initializer
-
-```typescript
-import { HostedZoneConfig } from '@smallcase/cdk-vpc-module'
-
-const hostedZoneConfig: HostedZoneConfig = { ... }
-```
-
-#### Properties
-
-| **Name** | **Type** | **Description** |
-| --- | --- | --- |
-| publicZone | boolean | *No description.* |
-| zoneName | string | *No description.* |
-| certificateValidationZoneName | string | *No description.* |
-| createAcmCertificate | boolean | *No description.* |
-| tags | {[ key: string ]: string} | *No description.* |
-
----
-
-##### `publicZone`Required
-
-```typescript
-public readonly publicZone: boolean;
-```
-
-- *Type:* boolean
-
----
-
-##### `zoneName`Required
-
-```typescript
-public readonly zoneName: string;
-```
-
-- *Type:* string
-
----
-
-##### `certificateValidationZoneName`Optional
-
-```typescript
-public readonly certificateValidationZoneName: string;
-```
-
-- *Type:* string
-
----
-
-##### `createAcmCertificate`Optional
-
-```typescript
-public readonly createAcmCertificate: boolean;
-```
-
-- *Type:* boolean
-
----
-
-##### `tags`Optional
-
-```typescript
-public readonly tags: {[ key: string ]: string};
-```
-
-- *Type:* {[ key: string ]: string}
-
----
-
-### HostedZoneStackProps
-
-#### Initializer
-
-```typescript
-import { HostedZoneStackProps } from '@smallcase/cdk-vpc-module'
-
-const hostedZoneStackProps: HostedZoneStackProps = { ... }
-```
-
-#### Properties
-
-| **Name** | **Type** | **Description** |
-| --- | --- | --- |
-| description | string | A description of the stack. |
-| notificationArns | string[] | The Simple Notification Service (SNS) topics to publish stack related events. |
-| parameters | {[ key: string ]: string} | The set value pairs that represent the parameters passed to CloudFormation when this nested stack is created. |
-| removalPolicy | aws-cdk-lib.RemovalPolicy | Policy to apply when the nested stack is removed. |
-| timeout | aws-cdk-lib.Duration | The length of time that CloudFormation waits for the nested stack to reach the CREATE_COMPLETE state. |
-| hostedZones | HostedZoneConfig[] | *No description.* |
-| hostedZoneTags | {[ key: string ]: string} | *No description.* |
-| vpc | aws-cdk-lib.aws_ec2.IVpc | *No description.* |
-
----
-
-##### `description`Optional
-
-```typescript
-public readonly description: string;
-```
-
-- *Type:* string
-- *Default:* No description.
-
-A description of the stack.
-
----
-
-##### `notificationArns`Optional
-
-```typescript
-public readonly notificationArns: string[];
-```
-
-- *Type:* string[]
-- *Default:* notifications are not sent for this stack.
-
-The Simple Notification Service (SNS) topics to publish stack related events.
-
----
-
-##### `parameters`Optional
-
-```typescript
-public readonly parameters: {[ key: string ]: string};
-```
-
-- *Type:* {[ key: string ]: string}
-- *Default:* no user-defined parameters are passed to the nested stack
-
-The set value pairs that represent the parameters passed to CloudFormation when this nested stack is created.
-
-Each parameter has a name corresponding
-to a parameter defined in the embedded template and a value representing
-the value that you want to set for the parameter.
-
-The nested stack construct will automatically synthesize parameters in order
-to bind references from the parent stack(s) into the nested stack.
-
----
-
-##### `removalPolicy`Optional
-
-```typescript
-public readonly removalPolicy: RemovalPolicy;
-```
-
-- *Type:* aws-cdk-lib.RemovalPolicy
-- *Default:* RemovalPolicy.DESTROY
-
-Policy to apply when the nested stack is removed.
-
-The default is `Destroy`, because all Removal Policies of resources inside the
-Nested Stack should already have been set correctly. You normally should
-not need to set this value.
-
----
-
-##### `timeout`Optional
-
-```typescript
-public readonly timeout: Duration;
-```
-
-- *Type:* aws-cdk-lib.Duration
-- *Default:* no timeout
-
-The length of time that CloudFormation waits for the nested stack to reach the CREATE_COMPLETE state.
-
-When CloudFormation detects that the nested stack has reached the
-CREATE_COMPLETE state, it marks the nested stack resource as
-CREATE_COMPLETE in the parent stack and resumes creating the parent stack.
-If the timeout period expires before the nested stack reaches
-CREATE_COMPLETE, CloudFormation marks the nested stack as failed and rolls
-back both the nested stack and parent stack.
-
----
-
-##### `hostedZones`Required
-
-```typescript
-public readonly hostedZones: HostedZoneConfig[];
-```
-
-- *Type:* HostedZoneConfig[]
-
----
-
-##### `hostedZoneTags`Optional
-
-```typescript
-public readonly hostedZoneTags: {[ key: string ]: string};
-```
-
-- *Type:* {[ key: string ]: string}
-
----
-
-##### `vpc`Optional
-
-```typescript
-public readonly vpc: IVpc;
-```
-
-- *Type:* aws-cdk-lib.aws_ec2.IVpc
-
----
-
### LoadBalancerConfig
#### Initializer
@@ -3247,8 +2054,6 @@ const vPCProps: VPCProps = { ... }
| --- | --- | --- |
| subnets | ISubnetsProps[] | *No description.* |
| vpc | aws-cdk-lib.aws_ec2.VpcProps | *No description.* |
-| hostedZones | HostedZoneConfig[] | *No description.* |
-| hostedZoneTags | {[ key: string ]: string} | *No description.* |
| natEipAllocationIds | string[] | *No description.* |
| peeringConfigs | {[ key: string ]: PeeringConfig} | *No description.* |
| useNestedStacks | boolean | *No description.* |
@@ -3277,26 +2082,6 @@ public readonly vpc: VpcProps;
---
-##### `hostedZones`Optional
-
-```typescript
-public readonly hostedZones: HostedZoneConfig[];
-```
-
-- *Type:* HostedZoneConfig[]
-
----
-
-##### `hostedZoneTags`Optional
-
-```typescript
-public readonly hostedZoneTags: {[ key: string ]: string};
-```
-
-- *Type:* {[ key: string ]: string}
-
----
-
##### `natEipAllocationIds`Optional
```typescript
diff --git a/README.md b/README.md
index d38c1f9..f11d824 100644
--- a/README.md
+++ b/README.md
@@ -7,7 +7,6 @@ cdk-vpc-module construct library is an open-source extension of the AWS Cloud De
- :white_check_mark: VPC Peering with route table entry
- :white_check_mark: Configurable NACL as per subnet group
- :white_check_mark: NATGateway as per availabilityZones
-- :white_check_mark: Public/private Route 53 hosted zones with optional public ACM certificate
Using cdk a vpc can be deployed using the following sample code snippet:
@@ -196,32 +195,6 @@ app.synth();
```
Please refer [here](/API.md) to check how to use individual resource constructs.
-## Route 53 hosted zones
-
-Hosted zones are modeled separately from the `Network` construct. For private
-hosted zones, pass the VPC from the network stack and the zone is associated
-with that VPC automatically. ACM certificate creation is supported only for
-public hosted zones and creates a certificate for both `` and `*.`.
-
-```typescript
-import { HostedZoneStack } from '@smallcase/cdk-vpc-module/lib/constructs/hosted-zone';
-
-const hostedZones = new HostedZoneStack(this, 'HostedZones', {
- vpc: network.vpc,
- hostedZones: [
- {
- zoneName: 'example.smallcase.com',
- publicZone: true,
- createAcmCertificate: true,
- },
- {
- zoneName: 'internal.example.smallcase.com',
- publicZone: false,
- },
- ],
-});
-```
-
## :clapper: Quick Start
The quick start shows you how to create an **AWS-VPC** using this module.
@@ -323,4 +296,4 @@ Here’s a breakdown of the configuration options available:
-- :white_check_mark: Configurable route table entry naming for subnet routes via `routeTableStringFormat`
+- :white_check_mark: Configurable route table entry naming for subnet routes via `routeTableStringFormat`
\ No newline at end of file
diff --git a/src/constructs/hosted-zone.ts b/src/constructs/hosted-zone.ts
deleted file mode 100644
index d280af9..0000000
--- a/src/constructs/hosted-zone.ts
+++ /dev/null
@@ -1,132 +0,0 @@
-import {
- aws_certificatemanager as acm,
- aws_ec2 as ec2,
- aws_route53 as route53,
- CfnOutput,
- Fn,
- NestedStack,
- NestedStackProps,
- Tags,
-} from 'aws-cdk-lib';
-import { Construct } from 'constructs';
-
-export interface HostedZoneConfig {
- readonly zoneName: string;
- readonly publicZone: boolean;
- readonly createAcmCertificate?: boolean;
- readonly certificateValidationZoneName?: string;
- readonly tags?: Record;
-}
-
-export interface HostedZoneStackProps extends NestedStackProps {
- readonly hostedZones: HostedZoneConfig[];
- readonly vpc?: ec2.IVpc;
- readonly hostedZoneTags?: Record;
-}
-
-export class HostedZoneStack extends NestedStack {
- public readonly hostedZoneOutputs: { [key: string]: route53.IHostedZone } = {};
- public readonly certificateOutputs: { [key: string]: acm.Certificate } = {};
- private readonly publicValidationHostedZones: { [key: string]: route53.IHostedZone } = {};
-
- constructor(scope: Construct, id: string, props: HostedZoneStackProps) {
- super(scope, id, props);
-
- props.hostedZones.forEach((hostedZoneConfig) => {
- this.addHostedZone(hostedZoneConfig, props.vpc, props.hostedZoneTags);
- });
- props.hostedZones.forEach((hostedZoneConfig) => {
- this.addCertificate(hostedZoneConfig, props.hostedZoneTags);
- });
- }
-
- private addHostedZone(hostedZoneConfig: HostedZoneConfig, vpc?: ec2.IVpc, hostedZoneTags?: Record) {
- const idPrefix = hostedZoneConfig.zoneName.replace(/[^A-Za-z0-9]/g, '');
- if (!hostedZoneConfig.publicZone && !vpc) {
- throw new Error(
- `Private hosted zone requires a VPC association: ${hostedZoneConfig.zoneName}`,
- );
- }
- const hostedZone = hostedZoneConfig.publicZone
- ? new route53.PublicHostedZone(this, `${idPrefix}PublicHostedZone`, {
- zoneName: hostedZoneConfig.zoneName,
- })
- : new route53.PrivateHostedZone(this, `${idPrefix}PrivateHostedZone`, {
- zoneName: hostedZoneConfig.zoneName,
- vpc: vpc!,
- });
-
- this.hostedZoneOutputs[hostedZoneConfig.zoneName] = hostedZone;
- this.applyTags(hostedZone, this.resolveTags(hostedZoneTags, hostedZoneConfig.tags));
- new CfnOutput(this, `${idPrefix}HostedZoneId`, {
- value: hostedZone.hostedZoneId,
- description: `Hosted zone ID for ${hostedZoneConfig.zoneName}`,
- });
- if (hostedZoneConfig.publicZone) {
- this.publicValidationHostedZones[hostedZoneConfig.zoneName] = hostedZone;
- new CfnOutput(this, `${idPrefix}NameServers`, {
- value: Fn.join(',', hostedZone.hostedZoneNameServers ?? []),
- description: `Name servers for ${hostedZoneConfig.zoneName}`,
- });
- }
- }
-
- private addCertificate(hostedZoneConfig: HostedZoneConfig, hostedZoneTags?: Record) {
- if (hostedZoneConfig.createAcmCertificate) {
- const idPrefix = hostedZoneConfig.zoneName.replace(/[^A-Za-z0-9]/g, '');
- const validationHostedZone = this.getCertificateValidationHostedZone(hostedZoneConfig);
- const certificate = new acm.Certificate(this, `${idPrefix}Certificate`, {
- domainName: hostedZoneConfig.zoneName,
- subjectAlternativeNames: [`*.${hostedZoneConfig.zoneName}`],
- validation: acm.CertificateValidation.fromDns(validationHostedZone),
- });
- this.applyTags(certificate, this.resolveTags(hostedZoneTags, hostedZoneConfig.tags));
- this.certificateOutputs[hostedZoneConfig.zoneName] = certificate;
- new CfnOutput(this, `${idPrefix}CertificateArn`, {
- value: certificate.certificateArn,
- description: `ACM certificate ARN for ${hostedZoneConfig.zoneName}`,
- });
- }
- }
-
- private getCertificateValidationHostedZone(hostedZoneConfig: HostedZoneConfig): route53.IHostedZone {
- const validationZoneName = hostedZoneConfig.publicZone
- ? hostedZoneConfig.zoneName
- : hostedZoneConfig.certificateValidationZoneName;
-
- if (!validationZoneName) {
- throw new Error(
- `ACM certificate generation for private hosted zone requires certificateValidationZoneName: ${hostedZoneConfig.zoneName}`,
- );
- }
-
- if (this.publicValidationHostedZones[validationZoneName]) {
- return this.publicValidationHostedZones[validationZoneName];
- }
-
- const idPrefix = validationZoneName.replace(/[^A-Za-z0-9]/g, '');
- const validationHostedZone = route53.HostedZone.fromLookup(this, `${idPrefix}CertificateValidationHostedZone`, {
- domainName: validationZoneName,
- privateZone: false,
- });
- this.publicValidationHostedZones[validationZoneName] = validationHostedZone;
- return validationHostedZone;
- }
-
- private applyTags(scope: Construct, tags?: Record) {
- if (!tags) {
- return;
- }
-
- Object.entries(tags).forEach(([key, value]) => {
- Tags.of(scope).add(key, value);
- });
- }
-
- private resolveTags(hostedZoneTags?: Record, hostedZoneConfigTags?: Record) {
- return {
- ...hostedZoneTags,
- ...hostedZoneConfigTags,
- };
- }
-}
diff --git a/src/constructs/network.ts b/src/constructs/network.ts
index 73c722e..bbb57e4 100644
--- a/src/constructs/network.ts
+++ b/src/constructs/network.ts
@@ -1,13 +1,6 @@
-import {
- aws_ec2 as ec2,
- CfnOutput,
- Tags,
- aws_iam as iam,
- Stack,
-} from 'aws-cdk-lib';
+import { aws_ec2 as ec2, CfnOutput, Tags, aws_iam as iam, Stack } from 'aws-cdk-lib';
import { AwsCustomResource, AwsCustomResourcePolicy, PhysicalResourceId } from 'aws-cdk-lib/custom-resources';
import { Construct } from 'constructs';
-import { HostedZoneConfig, HostedZoneStack } from './hosted-zone';
import { SubnetStack } from './subnet-stack';
import { VpcEndpointServiceNestedStack, VpcEndpontServiceConfig } from './vpc-endpoint-service';
import { ObjToStrMap } from '../utils/common';
@@ -78,8 +71,6 @@ export interface VPCProps {
readonly vpcEndpoints?: VpcEndpointConfig[]; // List of VPC endpoints to configure
readonly natEipAllocationIds?: string[];
readonly subnets: ISubnetsProps[];
- readonly hostedZones?: HostedZoneConfig[];
- readonly hostedZoneTags?: Record;
readonly vpcEndpointServices?: VpcEndpontServiceConfig[]; // List of VPC endpoint Service to configure
readonly useNestedStacks?: boolean;
}
@@ -127,7 +118,6 @@ export class Network extends Construct {
public readonly vpc!: ec2.Vpc;
public readonly securityGroupOutputs: { [key: string]: ec2.SecurityGroup } = {}; // Store Security Group outputs
public readonly endpointOutputs: { [key: string]: ec2.InterfaceVpcEndpoint | ec2.GatewayVpcEndpoint } = {}; // Store Endpoint outputs
- public readonly hostedZoneStack?: HostedZoneStack;
private peeringConnectionIds: PeeringConnectionInternalType = {};
public readonly natProvider!: ec2.NatProvider;
constructor(scope: Construct, id: string, props: VPCProps) {
@@ -208,13 +198,6 @@ export class Network extends Construct {
});
}
new CfnOutput(this, 'VpcId', { value: this.vpc.vpcId });
- if (props.hostedZones) {
- this.hostedZoneStack = new HostedZoneStack(this, 'HostedZones', {
- hostedZones: props.hostedZones,
- hostedZoneTags: props.hostedZoneTags,
- vpc: this.vpc,
- });
- }
// Add VPC endpoints if specified in the props
if (props?.vpcEndpoints) {
for (const endpointConfig of props.vpcEndpoints) {
@@ -517,3 +500,5 @@ export class Network extends Construct {
});
}
}
+
+
diff --git a/src/index.ts b/src/index.ts
index 15aac08..98987c3 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -1,3 +1,2 @@
-export * from './constructs/hosted-zone';
export * from './constructs/network';
-export * from './constructs/vpc-endpoint-service';
+export * from './constructs/vpc-endpoint-service';
\ No newline at end of file