【问题标题】:How to abstract DB connection in AWS Lambda?如何在 AWS Lambda 中抽象数据库连接?
【发布时间】:2019-12-12 20:25:04
【问题描述】:

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

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

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

mydb = ConnectToDB()

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

【问题讨论】:

标签: aws-lambda aws-lambda-layers


【解决方案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)

【讨论】:

  • 谢谢 - 我做到了,这很容易。我将使用凭据和端点创建一个配置文件,然后从该文件中获取它们。
  • 不错!我唯一想说的是,既然您已经在使用 AWS lambda,我会使用 Secrets Manager 服务来存放您的连接字符串和 API 密钥,而不是存储在某处的配置文件
【解决方案2】:

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

瞧。

【讨论】:

    猜你喜欢
    • 2018-12-04
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    • 2020-09-04
    相关资源
    最近更新 更多