Функция лямбда-запуска AWS только при соблюдении условий - PullRequest
0 голосов
/ 25 октября 2019

Я только начал свой путь обучения с AWS Lambda и CloudFront. Мне показалось довольно простым манипулировать запросом и ответом, но я заблокирован, чтобы выполнить простую задачу.

Учитывая приведенный ниже код, я хотел инициировать действия только в случае, когда у пользователя нет / it/ или / en / в request.uri

У меня нет проблем с разбором строки URI, но я не уверен, как добиться этой очень простой логики:

if(uri contains 'it' or 'en') {
  proceed as normal and forward request to origin
} else {
  return a 301 response with '/it' or '/en' based on user language
}

нижеприведенная функциянаписанный в node.js выполняет эту работу частично, он запускается в Viewer Request в моем дистрибутиве CloudFront:

exports.handler = async (event, context, callback) => {

    // const
    const request = event.Records[0].cf.request;
    const headers = request.headers;

    // non IT url
    let url = '/en/';
    if (headers['cloudfront-viewer-country']) {
        const countryCode = headers['cloudfront-viewer-country'][0].value;
        if (countryCode === 'IT') {
            url = '/it/';
        }
    }

    const response = {
        status: '301',
        statusDescription: 'geolocation',
        headers: {
            location: [{
                key: 'Location',
                value: url,
            }],
        },
    };

    callback(null, response);  
};

1 Ответ

0 голосов
/ 06 ноября 2019

Если я не ошибаюсь, то часть, которую вам не хватает, это if, так как у вас есть только else.

exports.handler = async (event, context, callback) => {

    // const
    const request = event.Records[0].cf.request;
    const headers = request.headers;


    if (headers['cloudfront-viewer-country']) {
        // non IT url
        let url = '/en/';
        const countryCode = headers['cloudfront-viewer-country'][0].value;
        if (countryCode === 'IT') {
            url = '/it/';
        }

        const response = {
            status: '301',
            statusDescription: 'geolocation',
            headers: {
                location: [{
                    key: 'Location',
                    value: url,
                }],
            },
        };

        callback(null, response); 
    }

    // There is no need to redirect
    callback(null, request);

};

Так что, в основном, если в URL есть IT или EN, просто дайте емуcallback(null, request);

Вы можете найти этот пример из документации, полезной для вашего случая

...