[Alt](https://res.cloudinary.com/practicaldev/image/fetch/s--Vo4hWGPe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/uploads/articles/rv23ciie5kl5awezfw7e.jpg)

图片来自Peggy und Marco Lachmann-Anke来自Pixabay

在这篇博文中,我将讨论以下从 AWS Lambda 函数连接到数据库的场景:

  • 连接到 Amazon Aurora PostgreSQL 数据库**在私有子网中,公共可访问性设置为否在同一 AWS 账户中**。

  • 连接到**跨账户** Amazon Redshift 数据库**在公共子网** 中,公共可访问性设置为是。

在同一 AWS 账户中连接到私有子网中的 Amazon Aurora PostgreSQL 数据库,公共可访问性设置为否

在此设置中,Amazon Aurora PostgreSQL 数据库在私有子网中运行,公共可访问性设置为 No。连接性和安全性详细信息如下:

要连接到私有子网中的 Aurora PostgreSQL 数据库,您需要在虚拟私有云 (VPC) 中配置 Lambda 函数。让我们继续创建 Lambda 函数 -

AWS 服务 > Lambda > 函数 > 创建函数 > 从头开始创作

在基本信息下

  • 输入函数名

  • 选择您喜欢使用的语言。这里我选择了 Python 3.8。

  • 在 Permissions 部分中,您可以保留默认值 - 创建具有基本 Lambda 权限的新角色

在高级设置下

  • 在网络中输入详细信息

  • 选择运行 Aurora PostgreSQL 数据库的 VPC 名称

  • 至少选择 2 个私有子网。要访问私有 Amazon VPC 资源,例如数据库实例,您需要将您的 Lambda 函数与一个或多个私有子网相关联。如果您选择公有子网而不是私有子网,Lambda 函数将超时,因为它们不能有公有 IP 地址。

  • 选择默认安全组

完成详细信息后,单击创建功能。由于 Lambda 在 VPC 配置的每个子网中创建 ENI(弹性网络接口),函数创建可能需要一些时间。一个 ENI 代表一个虚拟网卡,您可以在此处阅读更多。

在这种情况下,Lambda 函数使用执行角色(IAM 角色)启动,默认情况下附加了 2 个托管策略:

  • AWSLambdaBasicExecutionRole

  • AWSLambdaVPCAccessExecutionRole

如果您在创建 Lambda 函数时选择使用现有角色,请确保附加 AWSLambdaVPCAccessExecutionRole 策略。此托管策略具有 Lambda 用于创建和管理网络接口的以下权限:

  • ec2:创建网络接口

  • ec2:描述网络接口

  • ec2:删除网络接口

下面是附加了 2 个私有子网的 Lambda 函数的 VPC 配置:

创建 lambda 函数后,我使用以下代码连接并针对 Amazon Aurora PostgreSQL 数据库执行 SQL。代码安装PostgreSQL接口库pg8000与数据库交互。处理程序创建到 PostgreSQL 数据库的连接,执行 SELECT sql 以从数据库中获取当前时间戳到 results 变量中,并将结果作为字符串返回。

导入系统

导入 boto3

导入日志

导入 urllib.parse

从 pip._internal 导入主

安装pg8000

main(['install', '-I', '-q', 'pg8000', '--target', '/tmp/', '--no-cache-dir', '--disable-pip -版本检查'])

sys.path.insert(0,'/tmp/')

进口pg8000

def lambda_handler(事件,上下文):

sql u003d """选择当前_timestamp"""

conn u003d pg8000.connect(

数据库u003d'demodb',

用户u003d'管理员',

密码u003d'xxxxxx',

主机u003d'cluster-demodb.cluster-cijke9kklkrh.us-east-1.rds.amazonaws.com',

端口u003d8192,

ssl_contextu003d真

)

dbcur u003d conn.cursor()

dbcur.execute(sql)

结果 u003d dbcur.fetchall()

dbcur.close()

返回str(结果)

输出:

连接到公共子网中的跨账户 Amazon Redshift 数据库,公共可访问设置为是

以下是在 Account A 中运行的 Amazon Redshift 连接详细信息。该数据库在公共子网中运行并且可以公开访问。安全组充当集群的虚拟防火墙以控制入站和出站流量。

Account B 中,我创建了一个新的 VPC“Cross-Account-Lambda-VPC”来测试这个用例。为了创建 Lambda 函数,我遵循了上一节中提到的相同步骤,只是在本例中选择的 VPC 是“Cross-Account-Lambda-VPC”(账户 B 中的 VPC)。下面的屏幕截图是来自账户 B 的 Lambda 函数,其中添加了 2 个私有子网。

私有子网附加到路由表。路由表需要附加一个 NAT 网关。

NAT 网关位于公共子网中,并具有与之关联的弹性 IP (EIP),该弹性 IP (EIP) 充当公共 IP 地址,可以通过 VPC 的互联网网关连接到互联网。

需要将此 EIP 地址添加到账户 A 中的 Amazon Redshift 数据库附加的安全组的入站规则中,如下所示。使用此配置设置,lambda 函数将能够跨帐户连接到数据库。

现在总结一下,在这篇博文中,我们逐步回顾了如何设置 Lambda 函数以连接到在同一 AWS 账户的私有子网中运行的数据库,并连接到在公共子网上运行的跨账户数据库。在下一篇博文中,我将展示一些我玩过的库,用于从 Lambda 函数连接和查询跨账户 Redshift 数据库。

Logo

华为、百度、京东云现已入驻,来创建你的专属开发者社区吧!

更多推荐