自动连接 Lambda 函数和数据库实例 - Amazon Relational Database Service

自动连接 Lambda 函数和数据库实例

您可以使用 Amazon RDS 控制台来简化在 Lambda 函数和数据库实例之间设置连接的过程。通常,您的数据库实例位于 VPC 内的私有子网中。应用程序可以使用 Lambda 函数访问您的私有数据库实例

有关在 Lambda 函数和多可用区数据库集群之间设置连接的说明,请参阅自动连接 Lambda 函数和多可用区数据库集群

下图显示了数据库实例与您的 Lambda 函数之间的直接连接。


        
        自动连接数据库实例和 Lambda 函数

您可以通过 RDS 代理在 Lambda 函数和数据库实例之间设置连接,以提高数据库性能和弹性。通常,Lambda 函数会进行频繁的短期数据库连接,此类连接受益于 RDS 代理提供的连接池。您可以利用已为 Lambda 函数提供的任何 AWS Identity and Access Management(IAM)身份验证,而不是在 Lambda 应用程序代码中管理数据库凭证。有关更多信息,请参阅将 Amazon RDS 代理

当您使用控制台通过现有代理进行连接时,Amazon RDS 会更新代理安全组,以允许来自数据库实例和 Lambda 函数的连接。

您也可以从同一个控制台页面创建新的代理。当您在控制台中创建代理时,要访问数据库实例,必须输入数据库凭证或选择 AWS Secrets Manager 密钥。


        
        通过 RDS 代理自动连接数据库实例和 Lambda 函数

与 Lambda 函数的自动连接概述

以下是将 Lambda 函数与 RDS 数据库实例连接的要求:

  • Lambda 函数必须与数据库实例位于同一 VPC 中。

  • 设置连接的用户必须具有执行以下 Amazon RDS、Amazon EC2、Lambda、Secrets Manager 和 IAM 操作的权限:

    • Amazon RDS

      • rds:CreateDBProxies

      • rds:DescribeDBInstances

      • rds:DescribeDBProxies

      • rds:ModifyDBInstance

      • rds:ModifyDBProxy

      • rds:RegisterProxyTargets

    • Amazon EC2

      • ec2:AuthorizeSecurityGroupEgress

      • ec2:AuthorizeSecurityGroupIngress

      • ec2:CreateSecurityGroup

      • ec2:DeleteSecurityGroup

      • ec2:DescribeSecurityGroups

      • ec2:RevokeSecurityGroupEgress

      • ec2:RevokeSecurityGroupIngress

    • Lambda

      • lambda:CreateFunctions

      • lambda:ListFunctions

      • lambda:UpdateFunctionConfiguration

    • Secrets Manager

      • secretsmanager:CreateSecret

      • secretsmanager:DescribeSecret

    • IAM

      • iam:AttachPolicy

      • iam:CreateRole

      • iam:CreatePolicy

    • AWS KMS

      • kms:describeKey

注意

如果数据库实例与 Lambda 函数位于不同的可用区,您的账户可能会产生跨可用区成本。

当您在 Lambda 函数和 RDS 数据库之间设置连接时,Amazon RDS 会为您的函数和数据库实例配置 VPC 安全组。如果您使用 RDS 代理,则 Amazon RDS 还会为代理配置 VPC 安全组。Amazon RDS 根据与数据库实例、Lambda 函数和代理关联的安全组的当前配置执行操作,如下表所述。

当前 RDS 安全组配置 当前 Lambda 安全组配置 当前代理安全组配置 RDS 操作

有一个或多个安全组与数据库实例关联,其名称与模式 rds-lambda-n 匹配,或者,如果代理已连接到您的数据库实例,则 RDS 将检查关联代理的 TargetHealth 是否为 AVAILABLE

尚未修改与此模式匹配的安全组。该安全组只具有一条以 Lambda 函数或代理的 VPC 安全组作为源的入站规则。

有一个或多个安全组与 Lambda 函数关联,此函数的名称与模式 lambda-rds-nlambda-rdsproxy-n(其中 n 是数字)相匹配。

尚未修改与此模式匹配的安全组。此安全组只有一条出站规则,此规则以数据库实例或代理的 VPC 安全组作为目标。

有一个或多个安全组与代理关联,此代理的名称与模式 rdsproxy-lambda-n(其中 n 是数字)相匹配。

尚未修改与此模式匹配的安全组。此安全组具有入站和出站规则,这些规则具有 Lambda 函数和数据库实例的 VPC 安全组。

Amazon RDS 不执行任何操作。

已在 Lambda 函数、代理(可选)和数据库实例之间自动配置了连接。由于函数、代理和数据库之间已经存在连接,因此不会修改安全组。

以下任一条件适用:

  • 没有与数据库实例(名称与模式 rds-lambda-n 匹配或关联代理的 TargetHealthAVAILABLE)相关联的安全组。

  • 有一个或多个与数据库实例(名称与模式 rds-lambda-n 匹配或关联代理的 TargetHealthAVAILABLE)相关联的安全组。但是,这些安全组都不能用于连接 Lambda 函数。

如果安全组没有一条以 Lambda 函数或代理的 VPC 安全组作为源的入站规则,则 Amazon RDS 无法使用该安全组。Amazon RDS 也无法使用经过修改的安全组。修改示例包括添加规则或更改现有规则的端口。

以下任一条件适用:

  • 没有与 Lambda 函数(名称与模式 lambda-rds-nlambda-rdsproxy-n 匹配)关联的安全组。

  • 有一个或多个安全组与 Lambda 函数关联,此函数的名称与模式 lambda-rds-nlambda-rdsproxy-n 相匹配。但是,Amazon RDS 不能使用这些安全组中的任何一个来连接数据库实例

如果安全组没有一条以数据库实例或代理的 VPC 安全组作为目标的出站规则,则 Amazon RDS 无法使用该安全组。Amazon RDS 也无法使用经过修改的安全组。

以下任一条件适用:

  • 没有与代理(名称与模式 rdsproxy-lambda-n 匹配)关联的安全组。

  • 有一个或多个安全组与代理关联,此代理的名称与 rdsproxy-lambda-n 相匹配。但是,Amazon RDS 不能使用这些安全组中的任何一个来连接数据库实例或 Lambda 函数。

如果安全组没有入站和出站规则(这些规则具有数据库实例和 Lambda 函数的 VPC 安全组),则 Amazon RDS 无法使用该安全组。Amazon RDS 也无法使用经过修改的安全组。
RDS action: create new security groups

有一个或多个与数据库实例(名称与模式 rds-lambda-n 匹配或关联代理的 TargetHealthAVAILABLE)相关联的安全组。

尚未修改与此模式匹配的安全组。该安全组只具有一条以 Lambda 函数或代理的 VPC 安全组作为源的入站规则。

有一个或多个安全组与 Lambda 函数关联,此函数的名称与模式 lambda-rds-nlambda-rdsproxy-n 相匹配。

但是,Amazon RDS 不能使用这些安全组中的任何一个来连接数据库实例。如果安全组没有一条以数据库实例或代理的 VPC 安全组作为目标的出站规则,则 Amazon RDS 无法使用该安全组。Amazon RDS 也无法使用经过修改的安全组。

有一个或多个安全组与代理关联,此代理的名称与模式 rdsproxy-lambda-n 相匹配。

但是,Amazon RDS 不能使用这些安全组中的任何一个来连接数据库实例或 Lambda 函数。如果安全组没有入站和出站规则(这些规则具有数据库实例和 Lambda 函数的 VPC 安全组),则 Amazon RDS 无法使用该安全组。Amazon RDS 也无法使用经过修改的安全组。

RDS action: create new security groups

有一个或多个与数据库实例(名称与模式 rds-lambda-n 匹配或关联代理的 TargetHealthAVAILABLE)相关联的安全组。

尚未修改与此模式匹配的安全组。该安全组只具有一条以 Lambda 函数或代理的 VPC 安全组作为源的入站规则。

存在用于连接的有效 Lambda 安全组,但它与 Lambda 函数不关联。此安全组的名称与模式 lambda-rds-nlambda-rdsproxy-n 相匹配。尚未修改它。它只有一条出站规则,此规则以数据库实例或代理的 VPC 安全组作为目标。

存在用于连接的有效代理安全组,但它与代理不关联。此安全组的名称与模式 rdsproxy-lambda-n 相匹配。尚未修改它。它具有入站和出站规则,这些规则具有数据库实例和 Lambda 函数的 VPC 安全组。

RDS action: associate Lambda security group

以下任一条件适用:

  • 没有与数据库实例(名称与模式 rds-lambda-n 匹配或关联代理的 TargetHealthAVAILABLE)相关联的安全组。

  • 有一个或多个与数据库实例(名称与模式 rds-lambda-n 匹配或关联代理的 TargetHealthAVAILABLE)相关联的安全组。但是,Amazon RDS 不能使用这些安全组中的任何一个来连接 Lambda 函数或代理。

如果安全组没有一条以 Lambda 函数或代理的 VPC 安全组作为源的入站规则,则 Amazon RDS 无法使用该安全组。Amazon RDS 也无法使用经过修改的安全组。

有一个或多个安全组与 Lambda 函数关联,此函数的名称与模式 lambda-rds-nlambda-rdsproxy-n 相匹配。

尚未修改与此模式匹配的安全组。此安全组只有一条出站规则,此规则以数据库实例或代理的 VPC 安全组作为目标。

有一个或多个安全组与代理关联,此代理的名称与模式 rdsproxy-lambda-n 相匹配。

尚未修改与此模式匹配的安全组。此安全组具有入站和出站规则,这些规则具有数据库实例和 Lambda 函数的 VPC 安全组。

RDS action: create new security groups

以下任一条件适用:

  • 没有与数据库实例(名称与模式 rds-lambda-n 匹配或关联代理的 TargetHealthAVAILABLE)相关联的安全组。

  • 有一个或多个与数据库实例(名称与模式 rds-lambda-n 匹配或关联代理的 TargetHealthAVAILABLE)相关联的安全组。但是,Amazon RDS 不能使用这些安全组中的任何一个来连接 Lambda 函数或代理。

如果安全组没有一条以 Lambda 函数或代理的 VPC 安全组作为源的入站规则,则 Amazon RDS 无法使用该安全组。Amazon RDS 也无法使用经过修改的安全组。

以下任一条件适用:

  • 没有与 Lambda 函数(名称与模式 lambda-rds-nlambda-rdsproxy-n 匹配)关联的安全组。

  • 有一个或多个安全组与 Lambda 函数关联,此函数的名称与模式 lambda-rds-nlambda-rdsproxy-n 相匹配。但是,Amazon RDS 不能使用这些安全组中的任何一个来连接数据库实例

如果安全组没有一条以数据库实例或代理的 VPC 安全组作为源的出站规则,则 Amazon RDS 无法使用该安全组。Amazon RDS 也无法使用经过修改的安全组。

以下任一条件适用:

  • 没有与代理(名称与模式 rdsproxy-lambda-n 匹配)关联的安全组。

  • 有一个或多个安全组与代理关联,此代理的名称与 rdsproxy-lambda-n 相匹配。但是,Amazon RDS 不能使用这些安全组中的任何一个来连接数据库实例或 Lambda 函数。

如果安全组没有入站和出站规则(这些规则具有数据库实例和 Lambda 函数的 VPC 安全组),则 Amazon RDS 无法使用该安全组。Amazon RDS 也无法使用经过修改的安全组。
RDS action: create new security groups
RDS 操作:创建新的安全组

Amazon RDS 执行以下操作:

  • 创建与模式 rds-lambda-nrds-rdsproxy-n 匹配的新安全组(如果您选择使用 RDS 代理)。该安全组具有一条以 Lambda 函数或代理的 VPC 安全组作为源的入站规则。该安全组与数据库实例相关联,并允许函数或代理访问数据库实例

  • 创建与模式 lambda-rds-nlambda-rdsproxy-n 匹配的新安全组。此安全组具有一条出站规则,此规则以数据库实例或代理的 VPC 安全组作为目标。此安全组与 Lambda 函数相关联,并允许该函数将流量发送到数据库实例或者通过代理发送流量。

  • 创建与模式 rdsproxy-lambda-n 匹配的新安全组。此安全组具有入站和出站规则,这些规则具有数据库实例和 Lambda 函数的 VPC 安全组。

RDS 操作:关联 Lambda 安全组

Amazon RDS 将有效的现有的 Lambda 安全组与 Lambda 函数关联。此安全组允许该函数将流量发送到数据库实例或者通过代理发送流量。

自动连接 Lambda 函数和 RDS 数据库

您可以使用 Amazon RDS 控制台自动将 Lambda 函数连接到您的数据库实例。这简化了在这些资源之间设置连接的过程。

您也可以使用 RDS 代理在连接中包含代理。Lambda 函数会进行频繁的短期数据库连接,此类连接受益于 RDS 代理提供的连接池。您还可以使用已经为 Lambda 函数设置的任何 IAM 身份验证,而不是在 Lambda 应用程序代码中管理数据库凭证。

您可以使用设置 Lambda 连接页面将现有的数据库实例连接到新的和现有的 Lambda 函数。设置过程会自动为您设置所需的安全组。

在 Lambda 函数和数据库实例之间设置连接之前,请确保:

如果您在配置连接后更改安全组,则这些更改可能会影响 Lambda 函数与数据库实例之间的连接。

注意

您只能在 AWS Management Console中自动设置数据库实例和 Lambda 函数之间的连接。要连接 Lambda 函数,数据库实例必须处于可用状态。

自动连接 Lambda 函数和数据库实例
  1. 登录 AWS Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/

  2. 在导航窗格中,选择数据库,然后选择要连接到 Lambda 函数的数据库实例

  3. 对于操作,选择设置 Lambda 连接

  4. 设置 Lambda 连接页面上,在选择 Lambda 函数下方,执行以下任一操作:

    • 如果您在与数据库实例相同的 VPC 中有一个现有的 Lambda 函数,请选择选择现有函数,然后选择该函数。

    • 如果您在同一 VPC 中没有 Lambda 函数,请选择创建新函数,然后输入函数名称。原定设置运行时系统设置为 Nodejs.18。完成连接设置后,您可以在 Lambda 控制台中修改新 Lambda 函数的设置。

  5. (可选)在 RDS 代理下,选择使用 RDS 代理进行连接,然后执行以下任一操作:

    • 如果您有要使用的现有代理,请选择选择现有代理,然后选择此代理。

    • 如果您没有代理,并且希望 Amazon RDS 自动为您创建代理,请选择创建新代理。然后,对于数据库凭证,执行以下任一操作:

      1. 选择数据库用户名和密码,然后为您的数据库实例输入用户名密码

      2. 选择 Secrets Manager 密钥。然后,对于选择密钥,选择一个 AWS Secrets Manager 密钥。如果您没有 Secrets Manager 密钥,请选择创建新的 Secrets Manager 密钥创建新密钥。创建密钥后,对于选择密钥,选择新密钥。

      创建新代理后,选择选择现有代理,然后选择该代理。请注意,您的代理可能需要一些时间才能用于连接。

  6. (可选)扩展连接摘要并验证您的资源的突出显示更新。

  7. 选择 Set up (设置)

查看连接的计算资源

您可以使用 AWS Management Console查看连接到数据库实例的 Lambda 函数。显示的资源包括 Amazon RDS 自动设置的计算资源连接。

列出的计算资源不包括手动连接到数据库实例的计算资源。例如,您可以通过向与数据库关联的 VPC 安全组添加规则,来允许计算资源手动访问数据库实例

要使控制台列出 Lambda 函数,必须满足以下条件:

  • 与计算资源关联的安全组的名称与模式 lambda-rds-nlambda-rdsproxy-n(其中 n 是数字)相匹配。

  • 与计算资源关联的安全组具有出站规则,其端口范围设置为数据库实例或关联代理的端口。出站规则的目标必须设置为与数据库实例或关联代理关联的安全组。

  • 如果配置包含代理,则连接到与您数据库关联的代理的安全组名称与模式 rdsproxy-lambda-n(其中 n 是一个数字)相匹配。

  • 与函数关联的安全组具有出站规则,其端口设置为数据库实例或关联代理使用的端口。目标必须设置为与数据库实例或关联代理关联的安全组。

查看自动连接到数据库实例的计算资源
  1. 登录 AWS Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/

  2. 在导航窗格中,选择数据库,然后选择数据库集群

  3. 连接和安全选项卡上,在连接的计算资源下查看计算资源。