AWS Lambda Snowflake Python 连接器在尝试连接时挂起
Posted
技术标签:
【中文标题】AWS Lambda Snowflake Python 连接器在尝试连接时挂起【英文标题】:AWS Lambda Snowflake Python Connector hangs attempting to connect 【发布时间】:2020-09-26 06:28:25 【问题描述】:我有一个看起来像这样的小型 AWS Lambda 函数:
它从 SSM 参数存储中获取连接到 Snowflake 的凭据,然后调用 snowflake.connector.connect
。这显然是为了从我的雪花数据仓库中获取数据。但是,代码挂起并且永远不会完成snowflake.connector.connect
调用。
我相信我的子网和网络设置正确:
只是为了测试和开发,我将我的安全组设置为允许所有端口上的所有入站和出站流量。 我的 Lambda 在私有子网中运行,路由表将0.0.0.0/0
定向到 NAT 网关实例。在我的代码中,我print(requests.get('http://216.58.192.142'))
只是为了证明我确实有互联网连接。
我有许多大型依赖项不适合 Lambdas 的 200MB 部署包,因此我将依赖项安装在 /mnt/efs
路径的 EFS 文件系统中,并将 /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 函数已连接到互联网(它从requests.get
调用接收[200 OK]
)。
安全组尽可能宽松(允许所有入站和出站端口上的所有流量)
我没有碰过NACL
真的,我不知道为什么会发生这种情况,特别是考虑到代码在我的本地机器上运行良好 - 有人可以尝试为我指出正确的方向吗?
【问题讨论】:
您可以做的一件事是检查当您在 vpc 中启动常规实例时,它是否可以连接到 SF。这样您就可以验证这是 lambda 特定问题,还是范围更广。 Marcin 有一个好主意,另一个故障排除步骤是模拟“SnowCD”工具正在做什么,但在 Python 中,看起来您已经习惯于调用请求,所以不应该太难。 docs.snowflake.com/en/user-guide/snowcd.html 您的 Snowflake 实例是否设置了任何可能限制您连接到特定 IP 范围的网络策略? docs.snowflake.com/en/user-guide/… 【参考方案1】:Lambda 可以响应 200,但日志中可能存在异常。查看此 lambda 的 CloudWatch 日志。
【讨论】:
以上是关于AWS Lambda Snowflake Python 连接器在尝试连接时挂起的主要内容,如果未能解决你的问题,请参考以下文章
在 AWS 上为 Databricks 和 Snowflake 使用 Spark 连接器
SnowFlake 可以用作 AWS 的数据迁移服务中的源端点吗?
从 AWS S3 复制到 Snowflake 需要比平时更多的时间
AWS Snowflake 连接中的 MWAA Airflow 2.0 未显示
从 AWS S3 复制到 <Snowflake table>
[AWS Lambda] Scheduling Events with AWS Lambda (a.k.a. Lambda cron jobs)