mrbusche.com

AWS CloudFront create redirect using CloudFormation

When decommissioning a website, it's ideal to set up a permanent redirect for the current domain, so users aren't left in the dark. Below is code to redirect a user from an existing CloudFront distribution to a new URL.

You can use any statusCode, but in this instance a 301 is appropriate because this is a permanent redirect.

# The Distribution should already exist. We just need to add the FunctionAssociations
Resources:
  rDistribution:
    Type: AWS::CloudFront::Distribution # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-distributionconfig.html
    Properties:
      DistributionConfig:
        Enabled: True
        DefaultRootObject: index.html
        DefaultCacheBehavior:
          TargetOriginId: BuscheOrigin
          ViewerProtocolPolicy: redirect-to-https
        ### new code ###
        FunctionAssociations:
          - EventType: viewer-request
            FunctionARN: !GetAtt BuscheRedirectFunction.FunctionMetadata.FunctionARN #name needs to match redirect function
        ### end new code ###
        HttpVersion: http2

### new function ###
BuscheRedirectFunction: # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-function.html
  Type: AWS::CloudFront::Function
  Properties:
    Name: 'busche-redirect'
    AutoPublish: true
    FunctionCode: |
      function handler(event) {
        return {
          statusCode: 301,
          statusDescription: 'Found',
          headers: {
            'cloudfront-functions': { value: 'generated-by-CloudFront-Functions' },
            'location': { value: 'https://mrbusche.com' }
          }
        };
      }
    FunctionConfig:
      Comment: rewrite requests from busche to mrbusche.com
      Runtime: cloudfront-js-1.0
### end new function ###