Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Réécriture d'une URI de demande en fonction de la KeyValueStore configuration d'un événement de demande du visualiseur de CloudFront fonctions
L'exemple de code suivant montre comment réécrire un URI de demande en fonction de la KeyValueStore configuration d'un événement de demande de l'afficheur CloudFront Functions.
- JavaScript
-
- JavaScript runtime 2.0 pour CloudFront Functions
-
import cf from 'cloudfront';
// (Optional) Replace KVS_ID with actual KVS ID
const kvsId = "KVS_ID";
// enable stickiness by setting a cookie from origin or using another edge function
const stickinessCookieName = "appversion";
// set to true to enable console logging
const loggingEnabled = false;
// function rewrites the request uri based on configuration in KVS
// example config in KVS in key:value format
// "latest": {"a_weightage": .8, "a_url": "v1", "b_url": "v2"}
// given above key and value in KVS the request uri will be rewritten
// for example http(s)://domain/latest/something/else will be rewritten as http(s)://domain/v1/something/else or http(s)://domain/v2/something/else depending on weightage
// if no configuration is found, then the request is returned as is
async function handler(event) {
// NOTE: This example function is for a viewer request event trigger.
// Choose viewer request for event trigger when you associate this function with a distribution.
const request = event.request;
const pathSegments = request.uri.split('/');
const key = pathSegments[1];
// if empty path segment or if there is valid stickiness cookie
// then skip call to KVS and let the request continue.
if (!key || hasValidSticknessCookie(request.cookies[stickinessCookieName], key)) {
return event.request;
}
try {
// get the prefix replacement from KVS
const replacement = await getPathPrefixByWeightage(key);
if (!replacement) {
return event.request;
}
//Replace the first path with the replacement
pathSegments[1] = replacement;
log(`using prefix ${pathSegments[1]}`)
const newUri = pathSegments.join('/');
log(`${request.uri} -> ${newUri}`);
request.uri = newUri;
return request;
} catch (err) {
// No change to the path if the key is not found or any other error
log(`request uri: ${request.uri}, error: ${err}`);
}
// no change to path - return request
return event.request;
}
// function to get the prefix from KVS
async function getPathPrefixByWeightage(key) {
const kvsHandle = cf.kvs(kvsId);
// get the weightage config from KVS
const kvsResponse = await kvsHandle.get(key);
const weightageConfig = JSON.parse(kvsResponse);
// no configuration - return null
if (!weightageConfig || !isFinite(weightageConfig.a_weightage)) {
return null;
}
// return the url based on weightage
// return null if no url is configured
if (Math.random() <= weightageConfig.a_weightage) {
return weightageConfig.a_url ? weightageConfig.a_url: null;
} else {
return weightageConfig.b_url ? weightageConfig.b_url : null;
}
}
// function to check if the stickiness cookie is valid
function hasValidSticknessCookie(stickinessCookie, pathSegment) {
// if the value exists and it matches pathSegment
return (stickinessCookie && stickinessCookie.value === pathSegment)
}
function log(message) {
if (loggingEnabled) {
console.log(message);
}
}
Pour obtenir la liste complète des guides de développement du AWS SDK et des exemples de code, consultezUtilisation CloudFront avec un AWS SDK. Cette rubrique comprend également des informations sur le démarrage et sur les versions précédentes de SDK.