AWS Lambda Ruby на VPC - Seahorse :: Клиент :: NetworkingError - PullRequest
0 голосов
/ 21 февраля 2019

После добавления функции Ruby Lambda к VPC и присоединения соответствующих групп безопасности у меня возникают проблемы с получением учетных данных SSM для извлечения конфигурации из хранилища параметров SSM aws, и я сталкиваюсь с этой странной сетевой ошибкой после истечения времени ожидания.

Это происходит при попытке получить учетные данные SSM через ssm.get_parameters_by_path, но трассировка выглядит так, как будто бы это произошло при любом другом вызове AWS.

{
  "errorMessage": "execution expired",
  "errorType": "Function<Seahorse::Client::NetworkingError>",
  "stackTrace": [
    "/var/lang/lib/ruby/2.5.0/net/http.rb:937:in `initialize'",
    "/var/lang/lib/ruby/2.5.0/net/http.rb:937:in `open'",
    "/var/lang/lib/ruby/2.5.0/net/http.rb:937:in `block in connect'",
    "/var/lang/lib/ruby/2.5.0/timeout.rb:103:in `timeout'",
    "/var/lang/lib/ruby/2.5.0/net/http.rb:935:in `connect'",
    "/var/lang/lib/ruby/2.5.0/net/http.rb:920:in `do_start'",
    "/var/lang/lib/ruby/2.5.0/net/http.rb:915:in `start'",
    "/var/lang/lib/ruby/2.5.0/delegate.rb:83:in `method_missing'",
    "/var/runtime/gems/aws-sdk-core-3.40.0/lib/seahorse/client/net_http/connection_pool.rb:297:in `start_session'",
    "/var/runtime/gems/aws-sdk-core-3.40.0/lib/seahorse/client/net_http/connection_pool.rb:96:in `session_for'",
    "/var/runtime/gems/aws-sdk-core-3.40.0/lib/seahorse/client/net_http/handler.rb:121:in `session'",
    "/var/runtime/gems/aws-sdk-core-3.40.0/lib/seahorse/client/net_http/handler.rb:73:in `transmit'",
    "/var/runtime/gems/aws-sdk-core-3.40.0/lib/seahorse/client/net_http/handler.rb:47:in `call'",
    "/var/runtime/gems/aws-sdk-core-3.40.0/lib/seahorse/client/plugins/content_length.rb:12:in `call'",
    "/var/runtime/gems/aws-sdk-core-3.40.0/lib/aws-sdk-core/json/error_handler.rb:8:in `call'",
    "/var/runtime/gems/aws-sdk-core-3.40.0/lib/aws-sdk-core/plugins/signature_v4.rb:66:in `call'",
    "/var/runtime/gems/aws-sdk-core-3.40.0/lib/aws-sdk-core/plugins/helpful_socket_errors.rb:10:in `call'",
    "/var/runtime/gems/aws-sdk-core-3.40.0/lib/aws-sdk-core/plugins/retry_errors.rb:171:in `call'",
    "/var/runtime/gems/aws-sdk-core-3.40.0/lib/aws-sdk-core/plugins/retry_errors.rb:202:in `retry_request'",
    "/var/runtime/gems/aws-sdk-core-3.40.0/lib/aws-sdk-core/plugins/retry_errors.rb:185:in `retry_if_possible'",
    "/var/runtime/gems/aws-sdk-core-3.40.0/lib/aws-sdk-core/plugins/retry_errors.rb:173:in `call'",
    "/var/runtime/gems/aws-sdk-core-3.40.0/lib/aws-sdk-core/plugins/retry_errors.rb:202:in `retry_request'",
    "/var/runtime/gems/aws-sdk-core-3.40.0/lib/aws-sdk-core/plugins/retry_errors.rb:185:in `retry_if_possible'",
    "/var/runtime/gems/aws-sdk-core-3.40.0/lib/aws-sdk-core/plugins/retry_errors.rb:173:in `call'",
    "/var/runtime/gems/aws-sdk-core-3.40.0/lib/aws-sdk-core/plugins/retry_errors.rb:202:in `retry_request'",
    "/var/runtime/gems/aws-sdk-core-3.40.0/lib/aws-sdk-core/plugins/retry_errors.rb:185:in `retry_if_possible'",
    "/var/runtime/gems/aws-sdk-core-3.40.0/lib/aws-sdk-core/plugins/retry_errors.rb:173:in `call'",
    "/var/runtime/gems/aws-sdk-core-3.40.0/lib/aws-sdk-core/json/handler.rb:11:in `call'",
    "/var/runtime/gems/aws-sdk-core-3.40.0/lib/aws-sdk-core/plugins/user_agent.rb:13:in `call'",
    "/var/runtime/gems/aws-sdk-core-3.40.0/lib/aws-sdk-core/plugins/endpoint_pattern.rb:28:in `call'",
    "/var/runtime/gems/aws-sdk-core-3.40.0/lib/aws-sdk-core/plugins/endpoint_discovery.rb:78:in `call'",
    "/var/runtime/gems/aws-sdk-core-3.40.0/lib/seahorse/client/plugins/endpoint.rb:45:in `call'",
    "/var/runtime/gems/aws-sdk-core-3.40.0/lib/aws-sdk-core/plugins/param_validator.rb:24:in `call'",
    "/var/runtime/gems/aws-sdk-core-3.40.0/lib/seahorse/client/plugins/raise_response_errors.rb:14:in `call'",
    "/var/runtime/gems/aws-sdk-core-3.40.0/lib/aws-sdk-core/plugins/jsonvalue_converter.rb:20:in `call'",
    "/var/runtime/gems/aws-sdk-core-3.40.0/lib/aws-sdk-core/plugins/idempotency_token.rb:17:in `call'",
    "/var/runtime/gems/aws-sdk-core-3.40.0/lib/aws-sdk-core/plugins/param_converter.rb:24:in `call'",
    "/var/runtime/gems/aws-sdk-core-3.40.0/lib/aws-sdk-core/plugins/response_paging.rb:10:in `call'",
    "/var/runtime/gems/aws-sdk-core-3.40.0/lib/seahorse/client/plugins/response_target.rb:23:in `call'",
    "/var/runtime/gems/aws-sdk-core-3.40.0/lib/seahorse/client/request.rb:70:in `send_request'",
    "/var/runtime/gems/aws-sdk-ssm-1.34.0/lib/aws-sdk-ssm/client.rb:4495:in `get_parameters_by_path'",

Если я удаляю функцию из VPC, все работает нормально.Что пошло не так ?(Обратите внимание, что я добавил разрешение VPC к своей роли лямбды, а также доступ к SSM)

Мой клиент SSM инициализируется таким образом

def ssm
  @ssm ||= Aws::SSM::Client.new
end

1 Ответ

0 голосов
/ 21 февраля 2019

РЕДАКТИРОВАТЬ : Я неправильно понял вопрос OP, поэтому я отредактировал соответственно, пытаясь объяснить, почему он может не работать.

Когда вашему Lambda нужно получить доступдругие службы AWS из VPC, для вашей функции потребуется доступ к вашему VPC и Интернету.Этого можно достичь, подключив как публичные, так и частные подсети.Общедоступная подсеть - это та, к которой подключен интернет-шлюз и, следовательно, она может получить доступ к общедоступному Интернету, а частная подсеть - это та, к которой осуществляется доступ через шлюз NAT, видимый только внутри AWS VPC.

Такжеимейте в виду, что ваши группы безопасности должны разрешать входящие TCP-соединения с 0.0.0.0/0 (или просто вносить белый список хоста, который вы хотите разрешить).

Если вы можете, избегайте помещения вашей лямбда-функции в VPC какНасколько вы можете, так как это может значительно увеличить холодные запуски (иногда это добавляет 10 секунд к вашему запросу, что приведет к превышению времени ожидания большинства ваших функций Lambda, если они не настроены должным образом)

Надеюсь, это поможет!

РЕДАКТИРОВАТЬ 2 : я постараюсь провести вас через процесс создания нового VPC с помощью мастера с двумя подсетями (общедоступной и частной), позволяющей входящийправила для SG и, наконец, присоединение SN и SG к функции Lambda

Пожалуйста, заранее создайте Elastic IP

Через консоль нажмите VPC, затем нажмите Launch VPC Wizard enter image description here

Выберите VPC с публичными и частными подсетями enter image description here

Оставьте конфигурацию по умолчанию и добавьте только что созданный Elastic IP enter image description here

После создания VPC у вас должна быть открытая и закрытая подсети enter image description here

По умолчанию ваш SGуже будет принимать весь трафик enter image description here

Наконец, перейдите к функции Lambda и в разделе VPC добавьте свои подсети и группу безопасности.enter image description here

И voilá , теперь ваша Lambda должна иметь доступ к Интернету (или другим сервисам AWS)

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