Skip to content

Commit

Permalink
Adding a README
Browse files Browse the repository at this point in the history
  • Loading branch information
finnholland committed Jan 19, 2025
1 parent 317149a commit 47430b0
Show file tree
Hide file tree
Showing 5 changed files with 55 additions and 13 deletions.
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -77,4 +77,3 @@ cdk.out

# Used during the publish stage
.npmignore
*.tgz
55 changes: 52 additions & 3 deletions packages/geoip-redirect/README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,53 @@
# Geo-IP Redirect
This library provides a construct which creates a Lambda@Edge functions to perform GeoIP redirects.
# Geo-IP Redirect

These functions are intended to be added to an existing Cloudfront distribution
![TypeScript version](https://img.shields.io/github/package-json/dependency-version/aligent/cdk-constructs/dev/typescript?filename=packages/geoip-redirect/package.json&color=red) ![AWS CDK version](https://img.shields.io/github/package-json/dependency-version/aligent/cdk-constructs/dev/aws-cdk?filename=packages/geoip-redirect/package.json) ![NPM version](https://img.shields.io/npm/v/%40aligent%2Fcdk-geoip-redirect?color=green)

## Overview

This library provides a construct which creates a Lambda@Edge which is intended to be attached to the Origin Request in a CloudFront distribution. The construct allows a CloudFront website to perform GeoIP redirects to redirect users to a version of the website related to their location such as `.com` `.com.au` or `.co.nz` etc.

The Lambda@Edge function will check if the viewer's country code matches any supported regions. The user's country code for each request is pulled from the `cloudfront-viewer-country`. The construct will match the code to the record with the corresponding regex lookup.

## Usage and Default Geo-IP Redirect options

### `redirectHost` (string)

```
interface RedirectFunctionOptions {
supportedRegions?: Record<string, DomainOverwrite>;
defaultRegionCode: string;
defaultDomain: string;
}
```

| Property | Definition |
| ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------- |
| `supportedRegions` | A record with domain codes as a key (regex) and a domain to redirect to as a value |
| `defaultRegionCode` | The default region code(s) as regex. These are the regions supported by `defaultDomain`. When multiple codes are used the default will be the first code the default site eg. `AU | NZ`will treat`AU` as the default |
| `defaultDomain` | The website's main domain. This will act as a fallback for any unsupported regions |

### Using this package

The two main ways you can use this package are as follows:
First off your website has a basic domain let's say `www.iamawesome.com` and you serve all content for all regions of the world here such as `www.iamawesome.com/us` or `www.iamawesome.com/au`. For this approach you should use the below method

```
redirectBehaviourOptions: {
defaultDomain: "www.iamawesome.com",
defaultRegionCode: "AU|US",
}
```

Any region codes that are regexed to be `XX|YY` (note the pipe `|`) will automatically add the matching region as a path suffix to the url.

However perhaps you also have `www.iamawesome.co.nz`. How to redirect to a website that is different from the base domain? To achieve this, you can "hardcode" a domain for a region to use by using the `supportedRegions` value.

```
redirectBehaviourOptions: {
defaultDomain: "www.example.com",
defaultRegionCode: "AU|US",
supportedRegions: { "NZ": "www.example.co.nz" }
}
```

_this package has not been tested with interplanetary domains_
2 changes: 1 addition & 1 deletion packages/geoip-redirect/lib/handlers/redirect.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ export const handler = async (
options.defaultRegionCode = process.env.DEFAULT_REGION_CODE ?? "";
const defaultRegion = options.defaultRegionCode.split("|")[0].toLowerCase();
options.supportedRegions = {
...process.env.SUPPORTED_REGIONS as Record<string, DomainOverwrite> ?? "{}",
...process.env.SUPPORTED_REGIONS as Record<string, string> ?? "{}",
...{ [options.defaultRegionCode]: options.defaultDomain }
};

Expand Down
10 changes: 2 additions & 8 deletions packages/geoip-redirect/lib/redirect-construct.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@ import { Construct } from "constructs";
import { join } from "path";
import { Esbuild } from "@aligent/cdk-esbuild";

export type DomainOverwrite = string | null

/**
* The default region, domain, and other supported regions for a website to redirect to.
*/
Expand All @@ -15,7 +13,7 @@ export interface RedirectFunctionOptions {
* Regex formatted string to match region codes and redirect to the DomainOverwrite destination.
* @default undefined
*/
supportedRegions?: Record<string, DomainOverwrite>;
supportedRegions?: Record<string, string>;
/**
* Regex for supported domain paths on the default domain eg .com/au
*/
Expand Down Expand Up @@ -48,10 +46,6 @@ export class RedirectFunction extends Construct {
command,
image: DockerImage.fromRegistry("busybox"),
local: new Esbuild({

minify: false,
minifyWhitespace: false,
minifySyntax: false,
entryPoints: [join(__dirname, "handlers/redirect.ts")],
define: {
"process.env.DEFAULT_DOMAIN": JSON.stringify(options.defaultDomain),
Expand All @@ -68,7 +62,7 @@ export class RedirectFunction extends Construct {
}

public getFunctionVersion(): IVersion {
return Version.fromVersionArn( // SEE THE README ON YOUR DESKTOP (AND DELETE THESE COMMENTS)
return Version.fromVersionArn(
this,
"redirect-fn-version",
this.edgeFunction.currentVersion.edgeArn
Expand Down
Binary file removed smgb_stripped_prod_20241204.sql.gz
Binary file not shown.

0 comments on commit 47430b0

Please sign in to comment.