Цель
- Я использую «новый» сервис 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),
};
});
}
Используемые ресурсы: