如何抽象 AWS Lambda 中的数据库连接?
How to abstract DB connection in AWS Lambda?
我正在 AWS 中构建一个应用程序,其中包含许多要编写的 Lambda 函数 - 所有这些函数都将创建一个数据库实例来查询,运行 以下代码:
mydb = mysql.connector.connect(
host="endpoint.rds.amazonaws.com",
user="user",
passwd="password",
database="dbname"
)
现在,我不想在每个 Lambda 函数中显式包含此代码 - 我宁愿将它放在其他地方(在层或单独的 Lambda 函数中),这样它就可以是简单地通过这样的事情完成:
mydb = ConnectToDB()
关于如何做到这一点有什么想法吗?
已解决!我创建了一个名为 DBConnections.py 的 python 文件,其中包含以下函数 - 我将其包含在我的 AWS Lambda 层的部署包中。
def Connect():
mydb = mysql.connector.connect(
host="endpoint.amazonaws.com",
user="user",
passwd="password",
database="mydbname"
)
return mydb
部署后,我唯一要做的就是调用它:
from DBConnections import Connect
mydb = Connect()
瞧。
你的想法是对的,假设你使用的是 python 我会创建一个类似下面的图层包:
python/
myPackage.py
mysql/
其中 mysql 包含 mysql 包,而 myPackage.py 包含一些变体:
import mysql
def ConnectToDB(**kwargs):
return mysql.connector.connect(
host=kwargs.get("YOUR_ENDPOINT"),
user=kwargs.get("YOUR_USER"),
passwd=kwargs.get("YOUR_PASSWORD"),
database=kwargs.get("YOUR_DBNAME")
)
然后使用这个脚本在 lambda 中创建一个层:
#!/bin/bash
#Required variables
LAYER_NAME="YOUR_LAYER_NAME"
LAYER_DESCRIPTION="YOUR_LAYER_DESCRIPTION"
LAYER_RUNTIMES="python3.6 python3.7"
S3_BUCKET="YOUR_S3_BUCKET"
#Zip Package Files
zip -r ${LAYER_NAME}.zip .
echo "Zipped ${LAYER_NAME}"
#Upload Package to Lambda
aws s3 cp ./${LAYER_NAME}.zip s3://${S3_BUCKET}
#Create new layer
aws lambda publish-layer-version --layer-name ${LAYER_NAME} --description "${LAYER_DESCRIPTION}" --content S3Bucket=${S3_BUCKET},S3Key=${LAYER_NAME}.zip --compatible-runtimes ${LAYER_RUNTIMES}
#Cleanup zip files
rm ${LAYER_NAME}.zip
然后您可以将该层与您的 lambda 函数相关联,并使用以下语法将您的包导入 lambda 中:
from myPackage import ConnectToDB
connectionParams = {
"YOUR_ENDPOINT" : ...,
"YOUR_USER": ...,
"YOUR_PASSWORD": ...,
"YOUR_DBNAME": ...
}
mydb = ConnectToDB(**connectionParams)
我正在 AWS 中构建一个应用程序,其中包含许多要编写的 Lambda 函数 - 所有这些函数都将创建一个数据库实例来查询,运行 以下代码:
mydb = mysql.connector.connect(
host="endpoint.rds.amazonaws.com",
user="user",
passwd="password",
database="dbname"
)
现在,我不想在每个 Lambda 函数中显式包含此代码 - 我宁愿将它放在其他地方(在层或单独的 Lambda 函数中),这样它就可以是简单地通过这样的事情完成:
mydb = ConnectToDB()
关于如何做到这一点有什么想法吗?
已解决!我创建了一个名为 DBConnections.py 的 python 文件,其中包含以下函数 - 我将其包含在我的 AWS Lambda 层的部署包中。
def Connect():
mydb = mysql.connector.connect(
host="endpoint.amazonaws.com",
user="user",
passwd="password",
database="mydbname"
)
return mydb
部署后,我唯一要做的就是调用它:
from DBConnections import Connect
mydb = Connect()
瞧。
你的想法是对的,假设你使用的是 python 我会创建一个类似下面的图层包:
python/
myPackage.py
mysql/
其中 mysql 包含 mysql 包,而 myPackage.py 包含一些变体:
import mysql
def ConnectToDB(**kwargs):
return mysql.connector.connect(
host=kwargs.get("YOUR_ENDPOINT"),
user=kwargs.get("YOUR_USER"),
passwd=kwargs.get("YOUR_PASSWORD"),
database=kwargs.get("YOUR_DBNAME")
)
然后使用这个脚本在 lambda 中创建一个层:
#!/bin/bash
#Required variables
LAYER_NAME="YOUR_LAYER_NAME"
LAYER_DESCRIPTION="YOUR_LAYER_DESCRIPTION"
LAYER_RUNTIMES="python3.6 python3.7"
S3_BUCKET="YOUR_S3_BUCKET"
#Zip Package Files
zip -r ${LAYER_NAME}.zip .
echo "Zipped ${LAYER_NAME}"
#Upload Package to Lambda
aws s3 cp ./${LAYER_NAME}.zip s3://${S3_BUCKET}
#Create new layer
aws lambda publish-layer-version --layer-name ${LAYER_NAME} --description "${LAYER_DESCRIPTION}" --content S3Bucket=${S3_BUCKET},S3Key=${LAYER_NAME}.zip --compatible-runtimes ${LAYER_RUNTIMES}
#Cleanup zip files
rm ${LAYER_NAME}.zip
然后您可以将该层与您的 lambda 函数相关联,并使用以下语法将您的包导入 lambda 中:
from myPackage import ConnectToDB
connectionParams = {
"YOUR_ENDPOINT" : ...,
"YOUR_USER": ...,
"YOUR_PASSWORD": ...,
"YOUR_DBNAME": ...
}
mydb = ConnectToDB(**connectionParams)