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)