【问题标题】:Allow AWS Lambda to access RDS Database允许 AWS Lambda 访问 RDS 数据库
【发布时间】:2016-08-30 01:36:38
【问题描述】:

我正在尝试从 AWS Lambda (Java) 连接到 RDS 数据库。

我应该从 RDS 安全组规则中启用哪个 IP?

【问题讨论】:

  • 截至 2020 年,如果有问题的 RDS 数据库是 Aurora Serverless MySQL 或 PostgreSQL,那么我认为您应该能够通过 VPC 端点从 VPC 中的 Lambda 使用 data API 到 RDS,所以不需要用于 NAT(或持久数据库连接)。

标签: amazon-web-services aws-lambda amazon-vpc aws-security-group


【解决方案1】:

您无法通过 IP 启用此功能。首先,您需要为 Lambda 函数启用 VPC 访问,在此期间您将为其分配一个安全组。然后,在分配给 RDS 实例的安全组中,您将为分配给 Lambda 函数的安全组启用访问权限。

【讨论】:

  • 因为我也需要从 AWS Lambda 访问互联网,所以我必须创建一个带有子网的 VPC 到 NAT 网关...这只是连接到 RDS 的大量开销
  • 您注意到您的 RDS 实例不是公开可用的(尽管您出于某种原因删除了它),因此访问它的唯一方法是通过 VPC,这意味着您还需要创建一个您的 VPC 中的 NAT 网关,以允许 Lambda 函数访问 Internet。
  • 很抱歉,RDS 是公开可访问的,但它不符合安全组规则。因为我已将我的 IP 添加到安全组,所以我可以从我的家用电脑访问 RDS。但我无法从 AWS Lambda 访问,因为如果我不将它放在 VPC 中,我就无法拥有安全组
  • 好的,所以唯一的解决方案是为这个 AWS Lambda 创建一个 VPC 子网,为其分配一个 NAT 网关(成本)并拥有一个从 RDS 启用的安全组
  • 这太傻了。您基本上需要为 NAT 网关付费,以便您可以遵循安全最佳实践。我买不起 NAT 网关,所以我需要向整个互联网开放我的 RDS,以便我的 lambda 函数可以使用它。
【解决方案2】:

您可以配置 Lambda 以访问您的 RDS 实例。

您可以使用 Lambda 管理控制台启用此功能。 选择需要访问 RDS 实例的 Lambda 函数,然后转到配置 -> 高级设置并选择您需要访问的 VPC(即您的 RDS 实例所在的)。

在这里了解更多 http://docs.aws.amazon.com/lambda/latest/dg/vpc.html

【讨论】:

  • 如果我在 vpc 中的 rds 在另一个帐户中并且我想在 lambda 中的另一个帐户中访问它怎么办?
  • 这很好,但如果你需要调用 API,你会遇到困难
【解决方案3】:

对于寻找简洁解决方案或通过 SAM/Cloudformation 配置的 lambda 配置的其他人来说,对我有用的是:

我。创建一个安全组 (SG),允许您想要连接的所需端口上的出站流量(例如:5432 或 3306。请注意,入站规则对 lambda 没有影响,我相信目前)将该 SG 应用于您的 lambda。

二。在引用 lambda SG 的同一端口(例如 5432 或 3306)上创建一个允许入站流量的 SG,因此流量被锁定为仅 lambda。并在同一端口(5432 或 3306)上出站。将该 SG 应用到您的 RDS 实例。

更多细节:

Lambda SG:

Direction    Protocol    Port     Source
Outbound     TCP         5432     ALL

RDS SG:

Direction    Protocol    Port     Source
Inbound      TCP         5432     Lambda SG
Outbound     TCP         5432     ALL

SAM template.yaml 来配置您的 lambda:

  someLambda:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: !Sub ${AWS::StackName}-someLambda
      Runtime: nodejs14.x
      Handler: index.handler
      CodeUri: ./dist/someLambda
      MemorySize: 128
      Timeout: 5 # ensure matches your PG/ mySQL connection pool timeout
      ReservedConcurrentExecutions: 5
      Role: !GetAtt yourLambdaExecutionRole.Arn
      VpcConfig:
        SubnetIds: [subnet-1234, subnet-5678, subnet-9101112]
        SecurityGroupIds: [sg-your-lambda-sg]

【讨论】:

    【解决方案4】:

    这就是我所做的

    我为 Lambda 和 RDS 服务分配了相同的子网和 VPC。 现在,我创建了一个选择子网之一的 NAT 网关,以便 Lambda 可以使用该 NAT 网关与外界交互。

    最后一件事是在附加到 RDS 以及 Lambda 函数的安全组中添加入站条目。在我的情况下,将数据库端口 5432 列入 postgresql 的白名单,并在源中添加安全组名称。

    安全组通过在入站规则中添加条目以某种方式将自己列入白名单。

    这对我很有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-22
      • 1970-01-01
      • 1970-01-01
      • 2020-10-26
      • 1970-01-01
      • 1970-01-01
      • 2018-03-31
      • 2020-06-04
      相关资源
      最近更新 更多