Без сервера: 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-вызова, вам необходимо явно выполнить одно из этих действий.

  1. Посетите лямбда-функцию. В VPC удалите все записи подсети или выберите НЕТ
  2. Настройте исходящий прокси для вашего vpc с использованием NAT / общедоступных подсетей. Если вы хотите, чтобы эта функция запускалась под vpc. Ссылка на руководство находится ниже. Процитирую несколько важных строк.

Экземпляры в общедоступной подсети могут отправлять исходящий трафик непосредственно в Интернет, а экземпляры в частной подсети - нет. Вместо этого экземпляры в частной подсети могут получить доступ к Интернету с помощью шлюза преобразования сетевых адресов (NAT), который находится в общедоступной подсети. Серверы баз данных могут подключаться к Интернету для обновлений программного обеспечения с помощью шлюза NAT, но Интернет не может устанавливать соединения с серверами баз данных.

Следуйте этому https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Scenario2.html

Другие вопросы по тегам