Skip to main content

DNS Utilities

Domain name generation utilities for consistent subdomain creation across different deployment stages and AWS services.

Overview

The DNS utilities module provides functions for generating consistent domain names and subdomains for different deployment environments and AWS services:

  • API Subdomains: Generate stage-specific API subdomains with consistent naming
  • Web Subdomains: Create web application subdomains with stage separation
  • Auth Domains: Generate authentication subdomains for stage-specific auth services
  • Cognito Domains: Create proper Amazon Cognito User Pool domain URLs

API Subdomains

Generate stage-specific API subdomains with consistent naming conventions.

import { generateApiSubDomain } from '@leighton-digital/lambda-toolkit';

// Production uses clean 'api' subdomain
const prodApi = generateApiSubDomain({ stageName: 'prod', domainName: 'example.com' });
// Returns: 'api.example.com'

// Other stages include stage name
const devApi = generateApiSubDomain({ stageName: 'develop', domainName: 'example.com' });
// Returns: 'api-develop.example.com'

const stagingApi = generateApiSubDomain({ stageName: 'staging', domainName: 'example.com' });
// Returns: 'api-staging.example.com'

// Custom stages follow the same pattern
const featureApi = generateApiSubDomain({ stageName: 'feature-auth', domainName: 'example.com' });
// Returns: 'api-feature-auth.example.com'

Supported Stages

  • Production (prod): api.domain.com
  • Development (develop): api-develop.domain.com
  • Staging (staging): api-staging.domain.com
  • Test (test): api-test.domain.com
  • Custom stages: api-{stage}.domain.com

Web Subdomains

Generate web application subdomains with proper stage separation.

import { generateWebSubDomain } from '@leighton-digital/lambda-toolkit';

// Production uses root domain
const prodWeb = generateWebSubDomain({ stageName: 'prod', domainName: 'example.com' });
// Returns: `{ stage: 'www', subDomain: 'example.com' }`

// Development environment
const devWeb = generateWebSubDomain({ stageName: 'develop', domainName: 'example.com' });
// Returns: `{ stage: 'develop', subDomain: 'develop.example.com' }`

// Staging environment
const stagingWeb = generateWebSubDomain({ stageName: 'staging', domainName: 'example.com' });
// Returns: `{ stage: 'staging', subDomain: 'staging.example.com' }`

// Custom stages
const featureWeb = generateWebSubDomain({ stageName: 'feature-ui', domainName: 'example.com' });
// Returns: `{ stage: 'feature-ui', subDomain: 'feature-ui.example.com' }`

Return Object

The function returns an object with:

  • stage: Stage identifier (useful for configuration)
  • subDomain: Complete subdomain URL

Naming Convention

  • Production (prod): Uses root domain with www as stage identifier
  • Other stages: Uses {stage}.domain.com format

Authentication Domains

Generate authentication subdomains for stage-specific authentication services.

import { generateAuthDomain } from '@leighton-digital/lambda-toolkit';

// Production auth domain
const prodAuth = generateAuthDomain({ stageName: 'prod', domainName: 'example.com' });
// Returns: `{ stage: 'www', subDomain: 'auth.example.com' }`

// Development auth domain
const devAuth = generateAuthDomain({ stageName: 'develop', domainName: 'example.com' });
// Returns: `{ stage: 'develop', subDomain: 'auth-develop.example.com' }`

// Custom stage auth domain
const featureAuth = generateAuthDomain({ stageName: 'feature-oauth', domainName: 'example.com' });
// Returns: `{ stage: 'feature-oauth', subDomain: 'auth-feature-oauth.example.com' }`

Use Cases

  • Authentication service endpoints
  • OAuth callback URLs
  • Stage-specific authentication configurations
  • Identity provider configurations

Cognito Domains

Generate proper Amazon Cognito User Pool domain URLs following AWS conventions.

import { generateCognitoDomain } from '@leighton-digital/lambda-toolkit';

// Generate Cognito domain for US East
const cognitoDomain = generateCognitoDomain({ domainPrefix: 'my-app', region: 'us-east-1' });
// Returns: 'my-app.auth.us-east-1.amazoncognito.com'

// Generate for EU region
const euCognito = generateCognitoDomain({ domainPrefix: 'company-portal', region: 'eu-west-1' });
// Returns: 'company-portal.auth.eu-west-1.amazoncognito.com'

// Stage-specific Cognito domains
const stagingCognito = generateCognitoDomain({ domainPrefix: 'myapp-staging', region: 'us-east-1' });
// Returns: 'myapp-staging.auth.us-east-1.amazoncognito.com'

Requirements

  • Domain prefix: Must be globally unique within the AWS region
  • Region: Valid AWS region identifier
  • Naming: Can contain lowercase letters, numbers, and hyphens

Complete Example

import {
generateApiSubDomain,
generateWebSubDomain,
generateAuthDomain,
generateCognitoDomain,
} from '@leighton-digital/lambda-toolkit';

const stage = 'develop';
const baseDomain = 'mycompany.com';
const region = 'us-east-1';

// Generate all domain types for a stage
const domains = {
api: generateApiSubDomain({ stageName: stage, domainName: baseDomain }),
// 'api-develop.mycompany.com'

web: generateWebSubDomain({ stageName: stage, domainName: baseDomain }),
// `{ stage: 'develop', subDomain: 'develop.mycompany.com' }`

auth: generateAuthDomain({ stageName: stage, domainName: baseDomain }),
// `{ stage: 'develop', subDomain: 'auth-develop.mycompany.com' }`

cognito: generateCognitoDomain({ domainPrefix: `myapp-${stage}`, region }),
// 'myapp-develop.auth.us-east-1.amazoncognito.com'
};

console.log('Stage domains:', domains);

CDK Integration Example

import { Stack, StackProps } from 'aws-cdk-lib';
import { Certificate } from 'aws-cdk-lib/aws-certificatemanager';
import {
generateApiSubDomain,
generateWebSubDomain,
generateCognitoDomain,
} from '@leighton-digital/lambda-toolkit';

export class MyAppStack extends Stack {
constructor(scope: Construct, id: string, props: StackProps & {
stage: string;
baseDomain: string;
}) {
super(scope, id, props);

const { stage, baseDomain } = props;

// Generate consistent domain names
const apiDomain = generateApiSubDomain({ stageName: stage, domainName: baseDomain });
const webConfig = generateWebSubDomain({ stageName: stage, domainName: baseDomain });
const cognitoDomain = generateCognitoDomain({ domainPrefix: `myapp-${stage}`, region: this.region });

// Use in CDK constructs
const certificate = Certificate.fromCertificateArn(
this,
'Certificate',
`arn:aws:acm:${this.region}:${this.account}:certificate/...`
);

// API Gateway custom domain
const api = new RestApi(this, 'Api', {
domainName: {
domainName: apiDomain,
certificate,
},
});

// CloudFront distribution for web app
const distribution = new Distribution(this, 'WebApp', {
domainNames: [webConfig.subDomain],
certificate,
});
}
}

Best Practices

  • Consistency: Use the same stage names across all domain generation functions
  • Uniqueness: Ensure Cognito domain prefixes are unique within your AWS region
  • DNS Validation: Validate generated domains against your DNS requirements
  • Certificate Management: Ensure SSL certificates cover all generated subdomains
  • Stage Naming: Use consistent, lowercase stage names for DNS compatibility