#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 этого лямбда-кода.