главная/AWS Lambda HTTP basic авторизация
aws lambda function http auth

AWS Lambda HTTP basic авторизация

Допустим у вас есть статическая приложуха на Amazon S3 и проброшена она через cloudfront. Но вы хотите закрыть прямой доступ на бакет амазона и при этом поставить авторизацию для cloudfront. Что-бы юзеры могли заходить только по логин паролю. Самый простой способ сделать это пробросить Lambda Functions и уже в ней поставить HTTP Basic Authorization.

Шаг 1

Создаем новую функцию в лямбде и вставляем в нее приведенный ниже код. Да и выбираем в качестве языка Node JS.

Код авторизация AWS Lambda

exports.handler = async (event) => {
    let isAllowedAccess = false;
    const request = event.Records[0].cf.request;
    
    if (request && request.headers && request.headers.authorization) {
        const basicAuthHeader = request.headers.authorization[0].value;
        const authString = 'Basic ' + new Buffer('admin' + ':' + 'password').toString('base64');
        isAllowedAccess = (basicAuthHeader === authString);
    }
    
    if ( ! isAllowedAccess ) {
        const response = {
            status: 401,
            body: JSON.stringify('Denied'),
            headers: {
                'www-authenticate': [{ key: 'WWW-Authenticate', value: 'Basic'}]
            },
        };
        return response;
    } else {
        return request;
    }
    
};

Шаг 2

Делаем деплой кода нажатием кнопки Deploy. Переходим в Configuration > Permissions > Execution Role

AWS Lambda Permissions

Идем далее во вкладку Trust Relationships > Edit relationships

AWS Lambda Permissions

После чего добавляем новый атрибут в Service добавляя в массив строковое значение edgelambda.amazonaws.com

aws lambda edgelambda

Сохраняем. Возвращаемся в Lambda и делаем Publish New Version.

aws lambda publish

Копируем Function ARN убедившись, что в конце строки мы видим номер новой версии

aws lambda function arn

Именно это строку мы должны указать в настройках Cloudfront Event на Viewer Request как на изображении ниже

aws cloudfront lambda

На этом все настройки завершены и можно проверять результат.