我有一个小的AWS Lambda函数,如下所示:
它从SSM参数存储中获取连接到Snowflake的凭据,然后调用
snowflake.connector.connect
. 它的目的显然是从我的雪花数据仓库中获取数据。但是,代码挂起并且永远不会完成
snowflake.connector.connect连接
打电话。
-
为了测试和开发,我将我的安全组设置为允许所有端口上的所有入站和出站流量。
-
0.0.0.0/0
到NAT网关实例。在我的代码里,我
print(requests.get('http://216.58.192.142'))
只是为了证明我确实有互联网连接。
-
我有许多不适合Lambdas的200mbdeploy包的大型依赖项,因此我将依赖项装载在一个EFS文件系统中
/mnt/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函数连接到互联网(它接收
[200 OK]
requests.get
电话)。
-
安全组尽可能地允许(允许所有端口上的所有入站和出站流量)
-
真的,我不知道为什么会发生这种情况,特别是考虑到代码在我的本地机器上运行良好-有人能给我指出正确的方向吗?