2

我正在 AWS 中构建一个应用程序,其中包含很多要编写的 Lambda 函数 - 所有这些函数都将通过运行以下代码创建一个要查询的数据库实例:

mydb = mysql.connector.connect(
host="endpoint.rds.amazonaws.com",
user="user",
passwd="password",
database="dbname"
)

现在,我不想在每个 Lambda 函数中显式包含此代码 - 我宁愿将它放在其他地方(在层中或单独的 Lambda 函数中),这样可以简单地通过类似的东西来完成这个:

mydb = ConnectToDB()

关于如何做到这一点的任何想法?

4

2 回答 2

1

解决了!我创建了一个名为 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()

瞧。

于 2019-12-12T20:57:40.200 回答
1

您有正确的想法,假设您使用的是 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)

于 2019-12-12T20:58:04.220 回答