Без сервера: AWS Custom Authorizer истекло
У меня есть бессерверная лямбда-функция (AWS), которая создает экспресс-сервер с использованием serverless-http. Custom Authorizer, который я использую для аутентификации запросов, истекает после успешного запуска. ниже приведена политика, возвращаемая согласно журналам cloudwatch:
2019-02-27T12: 06: 49.000Z Политика 7b138c38-b316-4ae0-97ad-36242833cefa [ { Action: 'execute-api:Invoke', эффект: 'Allow', ресурс: 'arn:aws:execute-api:eu-west-1:xxxx:xxxx/dev/GET/data/age' } ]
после этого я получаю этот журнал:
2019-02-27T12: 06: 54.778Z 7b138c38-b316-4ae0-97ad-36242833cefa Время ожидания истекло через 6,01 секунды
моя функция, которая должна была выполняться после аутентификации, даже не вызывается. я использую async/await, чтобы получить бизнес против токена авторизации в заголовке.
вот мой код авторизатора:
if (business) {
console.log(
"policy",
generatePolicy(business, "Allow", event.methodArn).policyDocument
.Statement
);
callback(null, generatePolicy(business, "Allow", event.methodArn));
return;} else {
callback(null, generatePolicy(null, "Deny", event.methodArn));
return;
}
Функция generatePolicy:
const generatePolicy = function(principalId, effect, resource) {
const authResponse = {};
authResponse.principalId = "Business";
if (effect && resource) {
const policyDocument = {};
policyDocument.Version = "2012-10-17";
policyDocument.Statement = [];
const statementOne = {};
statementOne.Action = "execute-api:Invoke";
statementOne.Effect = effect;
statementOne.Resource = resource;
policyDocument.Statement[0] = statementOne;
authResponse.policyDocument = policyDocument;
authResponse.context = {
business: principalId
};
}
return authResponse;
};
serverless.yaml:
myData:
handler: functions/myData.handler
events:
- http:
path: /data/{proxy+}
method: ANY
cors: true
authorizer: companyAuth
companyAuth:
handler: middleware/auth.company
cors: true
примечание: то же самое работает, если я запускаю его локально с помощью плагина без сервера
0 ответов
Глядя на проблему, может быть высокая вероятность того, что вы используете бессерверное развертывание, и любая из ваших функций использует роль выполнения VPC, и это правило должно быть также применено к вашей функции Authorizer. Теперь, если вы не настроили исходящее правило / общедоступную подсеть для vpc для получения http-вызова, вам необходимо явно выполнить одно из этих действий.
- Посетите лямбда-функцию. В VPC удалите все записи подсети или выберите НЕТ
- Настройте исходящий прокси для вашего vpc с использованием NAT / общедоступных подсетей. Если вы хотите, чтобы эта функция запускалась под vpc. Ссылка на руководство находится ниже. Процитирую несколько важных строк.
Экземпляры в общедоступной подсети могут отправлять исходящий трафик непосредственно в Интернет, а экземпляры в частной подсети - нет. Вместо этого экземпляры в частной подсети могут получить доступ к Интернету с помощью шлюза преобразования сетевых адресов (NAT), который находится в общедоступной подсети. Серверы баз данных могут подключаться к Интернету для обновлений программного обеспечения с помощью шлюза NAT, но Интернет не может устанавливать соединения с серверами баз данных.
Следуйте этому https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Scenario2.html