AWS Lambda Snowflake Python Connector зависает при попытке подключения

#python #amazon-web-services #aws-lambda #snowflake-cloud-data-platform

#python #amazon-web-services #aws-lambda #snowflake-cloud-data-platform

Вопрос:

У меня есть небольшая функция AWS Lambda, которая выглядит следующим образом:

Он получает учетные данные для подключения к Snowflake из хранилища параметров SSM, а затем вызывает snowflake.connector.connect . Очевидно, что он предназначен для получения данных из моего хранилища данных Snowflake. Однако код зависает и никогда не завершает snowflake.connector.connect вызов.

Я считаю, что мои подсети и сеть настроены правильно:

  • Просто для тестирования и разработки я настроил свою группу безопасности на разрешение всего входящего и исходящего трафика на всех портах.
  • У меня есть мой Lambda, работающий в частной подсети, и таблица маршрутов, которая направляет 0.0.0.0/0 к экземпляру шлюза NAT. В моем коде я print(requests.get('http://216.58.192.142')) просто хочу доказать, что у меня действительно есть подключение к Интернету.
  • У меня много больших зависимостей, которые не помещаются в пакет развертывания размером 200 МБ для лямбд, поэтому мои зависимости смонтированы в файловой системе EFS по адресу /mnt/efs path, и я добавляю /mnt/efs/python их в свой PYTHONPATH код, прежде чем начать импортировать эти зависимости.
 import boto3
import snowflake.connector
print("Getting snowflake creds")
session = boto3.session.Session()
ssm = session.client("ssm")
obj = ssm.get_parameter(Name="snowflake", WithDecryption=True)
sf_creds = json.loads(obj.get("Parameter").get("Value"))

def get_data(event, context):
    print(requests.get('http://216.58.192.142'))
    print("Executing")
    print("got parameter, connecting")
    con = snowflake.connector.connect(
        user=sf_creds["USER"],
        password=sf_creds["PASSWORD"],
        account=sf_creds["ACCOUNT"],
        ocsp_response_cache_filename="/tmp/ocsp_response_cache"
    )
    print("connected")
  

Когда я запускаю этот же точный код локально на своем MacBook, я могу подключиться довольно быстро, в течение секунды или двух. Моя snowflake-python-connector версия 2.3.2 .

Однако, независимо от того, как долго я пытаюсь, connect метод срабатывает, когда он выполняется в функции AWS Lambda. Я действительно не уверен, что происходит.

Я проверил, что

  • функция AWS Lambda подключена к Интернету (она получает [200 OK] ответ от requests.get вызова).
  • группы безопасности максимально разрешены (разрешают весь трафик на всех портах, как входящий, так и исходящий)
  • Я не коснулся NACL

Действительно, я не понимаю, почему это происходит, особенно учитывая, что код отлично работает на моем локальном компьютере — может кто-нибудь попытаться указать мне правильное направление?

Комментарии:

1. Одна вещь, которую вы могли бы сделать, это проверить, может ли он подключаться к SF при запуске обычного экземпляра в вашем vpc. Таким образом, вы можете проверить, является ли эта проблема специфичной для lambda или имеет более широкий охват.

2. У Марчина есть отличная идея, еще одним шагом по устранению неполадок было бы эмулировать то, что делает инструмент «SnowCD», но в Python, похоже, вам уже удобно вызывать запросы, поэтому это не должно быть слишком сложно. docs.snowflake.com/en/user-guide/snowcd.html

3. Установлены ли в вашем экземпляре Snowflake какие-либо сетевые политики, которые могут ограничивать ваше подключение к определенному диапазону IP-адресов? docs.snowflake.com/en/user-guide /…

Ответ №1:

Lambda может отвечать 200, но в журналах могут быть исключения. Ознакомьтесь с журналами CloudWatch этого лямбда-кода.