Шлюз API AWS — возвращает 403 запрещенных для промежуточного ПО Express Proxy

#amazon-web-services #express #aws-lambda #aws-api-gateway #react-apollo

#amazon-web-services #экспресс #aws-lambda #aws-api-gateway #реагировать-apollo

Вопрос:

У меня есть экспресс-сервер. Я пытаюсь перенаправить все запросы на path /grqphql к конечной точке шлюза AWS.

Для достижения этой цели я использую express-http-proxy

 const proxy = require('express-http-proxy');

const app = express();
app.use('/graphql', proxy('https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/graphql'));
  

/grapql Конечная точка вызывается через a apollo-graphql-client во интерфейсе react. Запрос POST grapql возвращает Forbidden ошибку.

Следует отметить несколько моментов.

  • Функция lambda является частной (в vpc)
  • Шлюз api защищен пользовательской функцией авторизации (проверяет заголовок авторизации). Но я передаю этот заголовок, проблема не в этом.
  • Я развернул api gateway на стадии разработки.

Это происходит от AWS Gateway. Ответ имеет заголовок x-amzn-errortype: ForbiddenException . Я сослался на документацию, касающуюся ошибок 403. Я подозреваю, что проблема заключается в «неправильном вызове частного API с использованием общедоступных DNS-имен» — в связанном документе.

Был бы признателен за некоторые указания по поиску обходного пути.

Редактировать: Возможно, проблема с промежуточным программным обеспечением express-proxy. В качестве обходного пути я вручную маршрутизировал с помощью axios. Следующее соответствует моим требованиям, поскольку это graphql конечная точка.

 router.post('/', (req, res) => {
const headers = {
    'Content-Type': 'application/json',
    'Authorization': req.get('Authorization')
}
axios({
    method: 'post',
    url: apiUrl,
    headers: headers,
    data: req.body
}).then((axiosResponse) => {
    res.status(axiosResponse.status).send(axiosResponse.data);
}).catch((error) => {
    res.status(error.response.status).send(error.response.data);
});
  

Комментарии:

1. Можете ли вы показать шаблон, который вы используете для развертывания своего стека?

2. @Elbert Я использую бессерверный фреймворк. И он довольно большой, с большим количеством конфигураций. Могу ли я узнать, что вы ищете в храме?

3. Вывод API Gateway для бессерверного API. При настройке ресурса у него будет свойство StageName . Я уже сталкивался с этой проблемой раньше, когда имя этапа не соответствовало URL, используемому в запросе (например, чувствительность к регистру). Cloudfront 403 обычно связан с неправильным корневым путем или неудачной авторизацией с x-api-key помощью заголовка. Видя, что вы получаете сообщение об ошибке, я предполагаю, что VPC настроен правильно, потому что, если я помню, неправильная настройка часто приводит к таймауту.

4. Да, я изучил это (на основе аналогичных вопросов stackoverflow). API развертывается с именем этапа ‘dev’, и оно правильно добавляется к URL конечной точки. 'https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/graphql

5. Можете ли вы дополнить свой вопрос примером шлюза API для бессерверного шаблона (или бессерверного Api) и ресурса lambda?