Skip to content

Distribution ​

The Distribution resource lets you manage AWS CloudFront Distributions and their configuration settings for content delivery.

Minimal Example ​

Create a basic CloudFront Distribution with default settings and a sample origin.

ts
import AWS from "alchemy/aws/control";

const cloudFrontDistribution = await AWS.CloudFront.Distribution("basicDistribution", {
  DistributionConfig: {
    Origins: {
      Items: [{
        Id: "myOrigin",
        DomainName: "example.com",
        OriginPath: "",
        CustomOriginConfig: {
          HTTPPort: 80,
          HTTPSPort: 443,
          OriginProtocolPolicy: "https-only",
          OriginSslProtocols: {
            Quantity: 1,
            Items: ["TLSv1.2"]
          }
        }
      }],
      Quantity: 1
    },
    DefaultCacheBehavior: {
      TargetOriginId: "myOrigin",
      ViewerProtocolPolicy: "redirect-to-https",
      AllowedMethods: ["GET", "HEAD"],
      CachedMethods: ["GET", "HEAD"],
      MinTtl: 0,
      DefaultTtl: 86400,
      MaxTtl: 31536000
    },
    Enabled: true,
    PriceClass: "PriceClass_All",
    ViewerCertificate: {
      CloudFrontDefaultCertificate: true
    }
  },
  Tags: [{
    Key: "Environment",
    Value: "Production"
  }]
});

Advanced Configuration ​

Configure a CloudFront Distribution with multiple origins and advanced cache settings.

ts
const advancedDistribution = await AWS.CloudFront.Distribution("advancedDistribution", {
  DistributionConfig: {
    Origins: {
      Items: [{
        Id: "myOrigin1",
        DomainName: "origin1.example.com",
        CustomOriginConfig: {
          HTTPPort: 80,
          HTTPSPort: 443,
          OriginProtocolPolicy: "match-viewer",
          OriginSslProtocols: {
            Quantity: 3,
            Items: ["TLSv1.2", "TLSv1.1", "TLSv1"]
          }
        }
      }, {
        Id: "myOrigin2",
        DomainName: "origin2.example.com",
        CustomOriginConfig: {
          HTTPPort: 80,
          HTTPSPort: 443,
          OriginProtocolPolicy: "http-only",
          OriginSslProtocols: {
            Quantity: 1,
            Items: ["TLSv1.2"]
          }
        }
      }],
      Quantity: 2
    },
    DefaultCacheBehavior: {
      TargetOriginId: "myOrigin1",
      ViewerProtocolPolicy: "allow-all",
      AllowedMethods: ["GET", "HEAD", "OPTIONS"],
      CachedMethods: ["GET", "HEAD"],
      MinTtl: 3600,
      DefaultTtl: 86400,
      MaxTtl: 31536000,
      Compress: true
    },
    CacheBehaviors: {
      Items: [{
        PathPattern: "/images/*",
        TargetOriginId: "myOrigin2",
        ViewerProtocolPolicy: "redirect-to-https",
        AllowedMethods: ["GET", "HEAD"],
        CachedMethods: ["GET", "HEAD"],
        MinTtl: 600,
        DefaultTtl: 86400,
        MaxTtl: 31536000,
        Compress: true
      }],
      Quantity: 1
    },
    Enabled: true,
    PriceClass: "PriceClass_200"
  }
});

Custom Error Responses ​

Set up custom error responses for better user experience.

ts
const customErrorResponseDistribution = await AWS.CloudFront.Distribution("customErrorResponseDistribution", {
  DistributionConfig: {
    Origins: {
      Items: [{
        Id: "myOrigin",
        DomainName: "example.com",
        CustomOriginConfig: {
          HTTPPort: 80,
          HTTPSPort: 443,
          OriginProtocolPolicy: "https-only"
        }
      }],
      Quantity: 1
    },
    DefaultCacheBehavior: {
      TargetOriginId: "myOrigin",
      ViewerProtocolPolicy: "redirect-to-https",
      AllowedMethods: ["GET", "HEAD"],
      CachedMethods: ["GET", "HEAD"],
      MinTtl: 0,
      DefaultTtl: 86400,
      MaxTtl: 31536000
    },
    CustomErrorResponses: {
      Items: [{
        ErrorCode: 404,
        ResponsePagePath: "/404.html",
        ResponseCode: "404",
        ErrorCachingMinTtl: 300
      }],
      Quantity: 1
    },
    Enabled: true
  }
});

Distribution with Lambda@Edge ​

Create a CloudFront Distribution that integrates with Lambda@Edge for custom processing.

ts
const edgeLambdaDistribution = await AWS.CloudFront.Distribution("edgeLambdaDistribution", {
  DistributionConfig: {
    Origins: {
      Items: [{
        Id: "myOrigin",
        DomainName: "example.com",
        CustomOriginConfig: {
          HTTPPort: 80,
          HTTPSPort: 443,
          OriginProtocolPolicy: "https-only"
        }
      }],
      Quantity: 1
    },
    DefaultCacheBehavior: {
      TargetOriginId: "myOrigin",
      ViewerProtocolPolicy: "redirect-to-https",
      AllowedMethods: ["GET", "HEAD", "OPTIONS"],
      CachedMethods: ["GET", "HEAD"],
      MinTtl: 0,
      DefaultTtl: 86400,
      MaxTtl: 31536000,
      LambdaFunctionAssociations: {
        Items: [{
          LambdaFunctionARN: "arn:aws:lambda:us-east-1:123456789012:function:myEdgeFunction:1",
          EventType: "viewer-request"
        }],
        Quantity: 1
      }
    },
    Enabled: true
  }
});