#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?