Introducing Amazon CloudFront KeyValueStore: A low-latency datastore for CloudFront Features

Spread the love

Voiced by Polly

Amazon CloudFront means that you can securely ship static and dynamic content material with low latency and excessive switch speeds. With CloudFront Features, you’ll be able to carry out latency-sensitive customizations for hundreds of thousands of requests per second. For instance, you should use CloudFront Features to switch headers, normalize cache keys, rewrite URLs, or authorize requests.

At this time, we’re introducing CloudFront KeyValueStore, a safe world low-latency key worth datastore that permits learn entry from inside CloudFront Features, enabling superior customizable logic on the CloudFront edge places.

Beforehand, you needed to embed configuration information contained in the operate code. For instance, information for figuring out if a URL needs to be redirected and which URL to redirect the viewer to. When embedding configuration information with the operate code, each small change in configuration requires a code change and a redeployment of the operate code. Updating and deploying code for each new lookup addition introduces the danger of creating inadvertent adjustments to code. Additionally, the most operate dimension is 10 KB, making it troublesome for a lot of use instances to suit all the info inside the code.

With CloudFront KeyValueStore, now you can replace the info related to a operate and the operate code independently from one another. This simplifies operate code and makes it simple to replace information with out the necessity to deploy code adjustments.

Let’s see how this works in apply.

Making a CloudFront key worth retailer
Within the CloudFront console, I select Features from the navigation pane. Within the KeyValueStores tab, I select Create KeyValueStore.

Right here, I’ve the choice to import key worth pairs from a JSON file in an Amazon Easy Storage Service (Amazon S3) bucket. I’m not doing that now as a result of I wish to begin with no keys. I enter a reputation and outline and full the creation of the important thing worth retailer.

Console screenshot.

When the important thing worth retailer has been created, I select Edit within the Key worth pairs part after which Add pair. I sort hi there for the important thing and Hey World for the worth and save the adjustments. I can add extra keys and values, however one secret is sufficient for now.

Console screenshot.

After I replace a key worth retailer, adjustments are propagated to all CloudFront edge places in a couple of seconds in order that it may be used with low latency by the capabilities which are related to the important thing worth retailer. Let’s see how that works.

Utilizing CloudFront KeyValueStore from CloudFront Features
Within the CloudFront console, I select Features within the navigation pane after which Create operate. I sort a reputation for the operate, choose the cloudfront-js-2.0 runtime, and full the creation of the operate. Then, I take advantage of the brand new choice to affiliate the important thing worth retailer with this operate.

Console screenshot.

I copy the important thing worth retailer ID from the console to make use of it within the following operate code:

import cf from 'cloudfront';

const kvsId = '<KEY_VALUE_STORE_ID>';

// This fails if the important thing worth retailer is just not related to the operate
const kvsHandle = cf.kvs(kvsId);

async operate handler(occasion) {
    // Use the primary a part of the pathname as key, for instance http(s)://area/<key>/one thing/else
    const key = occasion.request.uri.cut up('/')[1]
    let worth = "Not discovered" // Default worth
    strive {
        worth = await kvsHandle.get(key);
    } catch (err) {
        console.log(`Kvs key lookup failed for ${key}: ${err}`);
    var response = {
        statusCode: 200,
        statusDescription: 'OK',
        physique: {
            encoding: 'textual content',
            information: `Key: ${key} Worth: ${worth}n`
    return response;

This operate makes use of the primary a part of the trail of the request as key and responds with the title of the important thing and its worth.

I save the adjustments and publish the operate. Within the Publish tab of the operate, I affiliate the operate with a CloudFront distribution that I created earlier than. I take advantage of the Viewer Request occasion sort and Default (*) cache conduct to intercept all requests to the distribution.

Within the console, I’m going again to the listing of capabilities and look forward to the operate to be deployed. Then, I take advantage of curl from the command line to obtain content material from the distribution and check the results of the operate.

First, I strive with a few paths that invoke the operate and lookup the important thing I created earlier than (hi there):

curl https://distribution-domain.cloudfront.internet/hi there
Key: hi there Worth: Hey World

curl https://distribution-domain.cloudfront.internet/hi there/world
Key: hi there Worth: Hey World

It really works! Then, I strive with a distinct path to see that the default worth I take advantage of within the code is returned when the bottom line is not discovered.

curl https://distribution-domain.cloudfront.internet/hello
Key: hello Worth: Not discovered

Now that this primary instance works, let’s strive one thing extra superior and helpful.

Rewriting the URL utilizing configuration information in CloudFront KeyValueStore
Let’s construct a operate that makes use of the content material of the URL within the HTTP request to lookup in a key worth retailer the customized path that CloudFront ought to use to make the precise request. This operate can assist handle the a number of providers which are a part of a web site.

For instance, I wish to replace the weblog platform I take advantage of for my web site. The previous weblog has origin path /blog-v1 whereas the brand new weblog has origin path /blog-v2.

Architectural diagram.

At first, I’m nonetheless utilizing the previous weblog. Within the CloudFormation console, I add the weblog key to the important thing worth retailer with worth blog-v1.

Then, I create the next operate and affiliate it with the distribution utilizing Viewer Request occasion and Default (*) cache conduct to intercept all requests to the distribution.

import cf from 'cloudfront';

const kvsId = "<KEY_VALUE_STORE_ID>";

// This fails if the important thing worth retailer is just not related to the operate
const kvsHandle = cf.kvs(kvsId);

async operate handler(occasion) {
    const request = occasion.request;
    // Use the primary section of the pathname as key
    // For instance http(s)://area/<key>/one thing/else
    const pathSegments = request.uri.cut up('/')
    const key = pathSegments[1]
    strive {
        // Substitute the primary path of the pathname with the worth of the important thing
        // For instance http(s)://area/<worth>/one thing/else
        pathSegments[1] = await kvsHandle.get(key);
        const newUri = a part of('/');
        console.log(`${request.uri} -> ${newUri}`)
        request.uri = newUri;
    } catch (err) {
        // No change to the pathname if the bottom line is not discovered
        console.log(`${request.uri} | ${err}`);
    return request;

Now, once I sort weblog in the beginning of the URL path, the request will really go to the blog-v1 path. CloudFront will make the HTTP request to the previous weblog as a result of blog-v1 is the origin path utilized by the previous weblog.

For instance, if I sort https://distribution-domain.cloudfront.internet/weblog/index.html in a browser, I see the previous weblog (V1).

Browser screenshot showing blog V1.

Within the console, I replace the weblog key with worth blog-v2. I entry the identical URL after a couple of seconds, and now I attain the brand new weblog (V2).

Browser screenshot showing blog V2.

As you’ll be able to see, the general public URL is similar, however the content material has modified. Extra typically, this operate assumes that URLs don’t change between the 2 weblog variations.

I can now add extra keys for the completely different providers which are a part of my web site (weblog, assist, assist, commerce, and so forth) and set their values to make use of the proper URL path for every of them. After I add a brand new model for considered one of them (for instance, I migrate to a brand new commerce platform), I can configure a brand new origin and replace the corresponding key to make use of the brand new origin path.

That is simply an instance of the flexibleness you get whenever you separate configuration information from code. In case you are already utilizing CloudFront Features, you’ll be able to simplify your code through the use of CloudFront KeyValueStore.

Issues to know
CloudFront KeyValueStore is out there at the moment in all edge places globally. With CloudFront KeyValueStore, you pay just for what you employ primarily based on the learn/write operations from the general public API and the learn operations from inside CloudFront Features. For extra info, see CloudFront pricing.

You possibly can handle a key worth retailer utilizing the AWS Administration Console, AWS Command Line Interface (AWS CLI), and AWS SDKs. AWS CloudFormation assist is coming quickly. The utmost dimension of a key worth retailer is 5 MB, and you’ll affiliate a single key worth retailer to every operate. The utmost dimension of a secret is 512 bytes. Values could be as much as 1KB in dimension. When making a key worth retailer, you’ll be able to import key/worth information throughout creation utilizing a supply file on Amazon S3 with this JSON construction:


Importing key/worth information at creation can assist automate the setup of a brand new setting (comparable to check or dev) and simply replicate the configuration from one setting to a different (comparable to preproduction to manufacturing).

Simplify the best way you add customized logic on the edge utilizing CloudFront KeyValueStore.


Leave a Reply

Your email address will not be published. Required fields are marked *