Основная функция AWS Lambda .NET - общедоступный запрос HTTP приводит к ошибке временно недоступного ресурса на VPC - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь настроить базовую функцию .NET Core 2.1 Lambda, которая может получать доступ к частным веб-API VPC, а также к общедоступным веб-API Интернета.Однако, как только функция связана с VPC, она больше не может получить доступ к общедоступному Интернету.

Я попробовал следующее (основываясь на этом руководстве YouTube ):

  • Создана новая частная подсеть с блоком CIDR 172.18.10.0/24.
  • Создан новый шлюз NAT и связан с общедоступной подсетью, которая уже включена в таблицу маршрутов с интернет-шлюзом в 0.0.0.0 / 0 и создала новый EIP для шлюза NAT.
  • Создала новую таблицу маршрутов, добавила пункт назначения 0.0.0.0/0 к шлюзу NAT и связала таблицу маршрутов с вновь созданной частной подсетью.

В функции Lambda:

  • Добавлена ​​функция в VPC.
  • Добавлена ​​функция во вновь созданной частной подсети.
  • Добавленагруппа безопасности со следующими параметрами: входящий порт 0 - 65535, исходящие порты, все назначения, 0.0.0.0/0.

. Вот лямбда-функция, которую я тестирую:

using System.Net.Http;
using System.Net;
using System;

using Amazon.Lambda.Core;
using Amazon.Lambda.SQSEvents;

// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]

namespace MyFunction
{
    public class Function
    {
        public void FunctionHandler(SQSEvent sqsEvent, ILambdaContext context)
        {
            using (HttpClient client = new HttpClient())
            {
                Console.WriteLine($"Sending HTTP request.");
                HttpResponseMessage response = client.GetAsync($"http://dummy.restapiexample.com/api/v1/employee/18677").Result;
                Console.WriteLine($"Response received.");
                var content = response.Content.ReadAsStringAsync().Result;
                Console.WriteLine($"Response content: {content}");
            }
        }
    }
}

Когдавызывая эту функциювывод будет следующим:

Sending HTTP request.
One or more errors occurred. (Resource temporarily unavailable): AggregateException 
  at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification) 
  at MyFunction.Function.FunctionHandler(SQSEvent sqsEvent, ILambdaContext context) 
  in C:\__temp__\basic_lambda_func\Function.cs:line 20 at System.

Когда лямбда-функция отсутствует на VPC, она работает нормально.Есть идеи, что может вызвать проблемы на VPC?

Ответы [ 3 ]

0 голосов
/ 10 июня 2019

Для меня чаще всего проблемы с VPC связаны с тем, что я пропустил или упустил из виду.Вот почему я создал следующее изображение:

enter image description here

Дважды и трижды проверьте следующее:

  1. Лямбда-подсети (те, которые будут использоваться для лямбда-функций), связаны с «частной» таблицей маршрутизации
  2. Частная таблица маршрутизации должна иметь место назначения для шлюза NAT (я предполагаю, что для этого сценария будет работать экземпляр NAT,но я никогда не пробовал)
  3. NAT должен находиться в общедоступной подсети
  4. Общедоступная подсеть должна быть связана с "публичной" таблицей маршрутизации
  5. Публичная таблица маршрутизациидолжен иметь пункт назначения для интернет-шлюза

Если вы можете вызвать функцию, но она останавливается при выполнении сетевых вызовов, это обычно проблема с группами безопасности (источник и / или пункт назначения)или отсутствующая конечная точка (при использовании сервисов AWS, если вы не используете шлюз NAT).

Хотя это, безусловно, не ответ на ваш вопрос, я надеюсь, что это поможет вам устранить неполадкичто происходит.

0 голосов
/ 11 июня 2019

Это закончилось проблемой DNS.В VPC была некоторая конфигурация DNS, о которой я не знал изначально.Оказывается, что лямбда-функция должна была включать другую группу безопасности, чтобы DNS разрешался правильно.Спасибо другим ответам за совет отладки.

0 голосов
/ 08 июня 2019

Дважды проверьте таблицу маршрутов к Интернет-шлюзу.IGW отвечает за исходящие подключения к Интернету.

Как я могу предоставить доступ в Интернет для моей функции VPC Lambda?

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