AWS API Gateway не работает с личным доменом

Я создал API-интерфейс expressjs и разместил его в AWS lambda с шлюзом API для того же. Он работает нормально, как и ожидалось, с URL-адресом:

https://[api-id].execute-api.[regionvisible.amazonaws.com/prod/api/v1/todos

Но я хочу вызвать его, используя собственный домен, и я настроил его, используя опцию пользовательского домена шлюза api. Я зарегистрировал свой домен с помощью доменов Google и добавил запись CNAME в конфигурацию DNS, чтобы сопоставить ее с именем целевого домена облачного интерфейса. Все идет нормально.

введите описание изображения здесь

Конфигурация личного домена шлюза API выглядит следующим образом с соответствующими сопоставлениями.

введите описание изображения здесь

Моя проблема в том, что я получаю сообщение Cannot GET /aprod/api/v1/todos при вызове с URL:

https://apis.mydomain.com/aprod/api/v1/todos

и forbidden в

https://apis.mydomain.com/api/v1/todos

.

Мои журналы облачных часов выглядят следующим образом. Если я не вызываю пользовательский домен, он работает нормально (зеленый блок), иначе нет конкретного сообщения (красный блок).

введите описание изображения здесь

Я уже потратил два выходных на эту проблему, любая помощь приветствуется.


person Krishna Mohan    schedule 15.09.2019    source источник
comment
вы использовали prod/api, но он внезапно изменился aprod/api, это правильно?   -  person Lamanus    schedule 15.09.2019
comment
Я добавил отображение в конфигурации личного домена (второй рисунок).   -  person Krishna Mohan    schedule 15.09.2019
comment
Конфигурация личного домена выглядит нормально. Попробуйте отладить свой лямбда-код, чтобы узнать разницу.   -  person Kane    schedule 16.09.2019
comment
Вы тестировали свой API через сам API-шлюз? Кажется, ваша конфигурация верна и должна работать с apis.mydomain.com/aprod/api/v1/todos. Если вы получаете Cannot Get ошибку, это означает, что внутренний ресурс недоступен или сервер не поддерживает этот метод. Убедитесь, что вы настроили GET метод в API, если его метод get для бэкэнда.   -  person Mahattam    schedule 20.09.2019
comment
Невозможно GET / aprod / api / v1 / todos означает, что ответ возвращается от express, поэтому он определенно достигает приложения, просто из любопытства попробуйте достичь / aprod / aprod / api / v1 / todos   -  person Sándor Bakos    schedule 23.09.2019
comment
@ SándorBakos Не удается получить / aprod / aprod / api / v1 / todos. Если доходит до экспресса, проверю код. Но никакой сложной логики здесь нет, это простой api 'hello world'.   -  person Krishna Mohan    schedule 23.09.2019
comment
@KrishnaMohan Вы когда-нибудь это исправляли. У меня такая же проблема. Если вы попытаетесь добавить пользовательский домен с сопоставлением пути, он вернет ошибку POST / GET / etc ... Если у меня нет сопоставления пути, пользовательский домен работает.   -  person Hans-Eric Lippke    schedule 19.05.2020
comment
@ Hans-EricLippke К сожалению, нет. Это было для моего стороннего проекта, и я завершил его без шлюза.   -  person Krishna Mohan    schedule 20.05.2020
comment
@KrishnaMohan А, не беспокойтесь. Я смог придумать решение. Мне нужно было убедиться, что какой бы путь я ни установил в домене шлюза API, я должен был включить его в свою маршрутизацию в экспресс-приложении. Пример: если вы добавили сопоставление пути aprod для этапа производства на apis.mydomain.com/aprod В экспрессе я должен добавить путь включения в маршрутизацию, например. app.post ('/ aprod / v1 / todos', ...)   -  person Hans-Eric Lippke    schedule 20.05.2020


Ответы (2)


Исходя из моего опыта, есть две возможные причины.

Ссылка VPC

Если ваш исходный сервер находится внутри частного VPC, необходимо создать VPC Link и Network Load Balancer (NLB) вместо Application Load Balancer (ALB).

См. Более подробную информацию: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-private-integration.html.

Укажите на конечную точку шлюза API

CNAME должен указывать на конечную точку шлюза API, а не на CloudFront. В этом случае значение CNAME должно быть таким.

https://[api-id].execute-api.[region].amazonaws.com

В противном случае доступ через личный домен передается непосредственно в CloudFront.

(Другая возможная причина) Использование записи

В моем случае запись A используется для указания псевдонима NLB. Это функциональные возможности Route53, но вместо CNAME может потребоваться запись A.

person Kai Sasaki    schedule 16.09.2019

Код ошибки «Не удается получить» не является кодом ошибки Lambda или API-шлюза и выглядит специфичным для Express JS.

Опубликованные вами журналы выглядят как лямбда-журналы, и если это так, то либо лямбда-функция вызывается чем-то еще, либо вы успешно вызвали свою лямбда-функцию через вызов API, используя "https://apis.mydomain.com/aprod/api/v1/todos", как предложил пользователь "Sándor Bakos".

Это означает, что вы не имеете дело с ошибкой пользовательского домена или шлюза API, а вместо этого видите эту ошибку из кода функции Lambda. Некоторый быстрый поиск в Google доказывает это, и мне интересно, поможет ли этот пост SO? Узел, экспресс - НЕВОЗМОЖНО ПОЛУЧИТЬ маршрут

Для более подробной информации, если вы должны были вызвать URI в API-шлюзе, который не существует, если вы успешно не используете SIGV4 (IAM Auth), вы получите 403 с сообщением об ошибке «Missing Authentication Token», и даже тогда он не будет возвращать сообщение об ошибке «Cannot GET», если вы специально не назначили для него ответ шлюза.

person NoPathInParticular    schedule 25.09.2019