Доступ к API-шлюзу из Lambda в VPC - время ожидания запроса - PullRequest
0 голосов
/ 15 января 2019

Цель

  • Я использую «новый» сервис API-шлюза API-шлюза AWS
  • Я хочу подключиться с помощью клиента Websocket к лямбда-функции
  • Я хочу ответить клиенту, используя ApiGatewayManager
  • Лямбда-функция должна быть в VPC с моим RDS для лучшей безопасности (RDS не является общедоступным, кроме указанных IP-адресов в группе безопасности)
  • Я использую Node.js 8 в сочетании с Typescript

подход

Я создал региональный AWS API Gateway для Websockets и добавил лямбда-функцию для $connect, $disconnect и одну для действия subscribeChannel.

Я могу подключаться и отправлять сообщения подключенным клиентам.

Я также создал VPC с 3 частными подсетями, все они расположены в eu-central-1 каждая в другой зоне доступности (AZ).

Лямбда-функции теряют доступ к общедоступному Интернету, когда вы добавляете их в VPC, поэтому одним из подходов является добавление другой общедоступной подсети и добавление к ней шлюза NAT.

Теперь я изменяю таблицу маршрутизации в частной подсети, чтобы делегировать 0.0.0.0/0 в NAT, а в таблице маршрутизации в публичной подсети она 0.0.0.0/0 направляет в Интернет-шлюз.

Кажется, это работает, чтобы получить доступ к общедоступному Интернету, например, Я могу запросить https://google.com, но тайм-аут ApiGatewayManagement как будто не может разрешить службу AWS.

Затем я посмотрел на конечные точки VPC, так как они предназначены для обеспечения доступности общедоступных сервисов AWS в частных подсетях без маршрутизации через Интернет. Я могу настроить его и получить частные URL-адреса DNS. Но здесь я застрял, я не знаю, как использовать его в моей настройке / код.

Я управляю всем проектом, используя безсерверную инфраструктуру и ресурсы Cloud Formation.

Выпуск

Если обработчик действия для subscribeChannel связан с VPC, то время ожидания запроса XXXXXXXX.execute-api.eu-central-1.amazonaws.com/develop истекло, поскольку он не может достичь общедоступного Интернета.

Является ли NAT-шлюз правильным подходом или мне нужно использовать VPC Endpoint для execute-api? Как правильно настроить VPC для использования этого частного DNS?

Код

async function channelHandler(event, context) {
    return new aws_sdk_1.ApiGatewayManagementApi({
        apiVersion: "2018-11-29",
        endpoint: event.requestContext.domainName + "/" + event.requestContext.stage,
    })
    .postToConnection({
        ConnectionId: event.requestContext.connectionId,
        Data: "Hello, world!",
    }).promise()
    .then(() => {
        return {
            statusCode: 200,
            body: "Sent message!",
        };
    })
    .catch((error) => {
        return {
            statusCode: 500,
            body: JSON.stringify(error),
        };
    });
}

Используемые ресурсы:

1 Ответ

0 голосов
/ 17 января 2019

Я воссоздал полный проект из моей конфигурации и «волшебным образом» начал работать. Поэтому я могу только предположить, что происходит:

Каждая зона доступности имеет частную и общедоступную подсети. Согласно документации AWS для шлюзов NAT необходимо создать шлюз NAT в каждом из них, но у меня был настроен только один шлюз NAT в зоне А.

Я изменил конфигурацию своих функций Lambda, чтобы они размещались только в одном AZ (я не хочу иметь полное резервирование до тех пор, пока проект не будет запущен), и теперь шлюз NAT находится в том же.

Простой график:

Client --[AWS]--> Lambda --[Private Subnet]--> NAT --[Public Subnet]--> API Gateway 

Мне все еще интересно, возможно ли достичь шлюза API с помощью конечной точки VPC вместо шлюза API, но сейчас я останусь с этой конфигурацией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...