【问题标题】:Lambda function cannot connect to RDS instance on same subnet and in same security gorupLambda 函数无法连接到同一子网和同一安全组中的 RDS 实例
【发布时间】:2018-07-05 14:29:02
【问题描述】:

我在 AWS 上有一个 lambda 函数和一个 RDS 实例。 我尝试了以下方法以使其连接:

将它们放在同一个 VPC、同一个安全组和同一个子网中。当我尝试从 lambda 函数连接到 RDS 实例 (MariaDB) 时,我得到一个 Error: connect ETIMEDOUT。 我还为 Lambda 函数赋予了一个角色,该角色拥有完整的 EC2、RDS、VPC 和 Lambda 权限。

但是,如果我允许所有流量进入 RDS 实例安全组(不好,我知道!)并从 VPC 中删除 Lambda 函数,那么它可以连接(验证凭据等是否正确)

编辑: 我已根据您的 cmets 进行了更改,并包含有关设置的角色和安全组的额外信息。请看下面的屏幕截图。 配置截图如下:

Lambda 函数 VPC 设置:

RDS 实例 VPC 设置:

安全组入站设置:

lambda 函数的作用:

【问题讨论】:

  • 你能显示代码吗?
  • 安全组是否允许与自己对话?
  • 我添加了额外信息

标签: amazon-web-services lambda


【解决方案1】:

您是否按照此 URL 中的说明配置了角色?

https://docs.aws.amazon.com/lambda/latest/dg/vpc-rds-create-iam-role.html

尝试按照https://docs.aws.amazon.com/lambda/latest/dg/vpc.html 中的说明将“--vpc-config SubnetIds=comma-separated-vpc-subnet-ids,SecurityGroupIds=comma-separated-security-group-ids \”添加到 lambda 函数。

此外,RDS 是公开的。你需要这个设计吗?

【讨论】:

  • 我已经包含了角色的屏幕截图(等)
【解决方案2】:

我在使用mysql npm 包时遇到了类似的问题。在调试过程中,我尝试查看主机名解析为哪个 IP 地址:

const { lookup: lc } = require('dns');
const { promisify } = require('util');

const lookup = promisify(lc);
const { address } = await lookup('<my-hostname.com>');

然后我检查了 IP 地址是否在为 RDS 实例和子网指定的范围内,并且它与可用区匹配。

问题是mysql 可能试图从公共 DNS 解析主机名。因此,我没有传递主机名,而是将解析的 IP 地址传递到 mysql 的初始化中,并且它起作用了。

【讨论】:

    猜你喜欢
    • 2020-12-02
    • 2019-10-02
    • 1970-01-01
    • 2018-09-09
    • 2021-03-06
    • 1970-01-01
    • 2021-11-27
    • 2020-01-23
    • 2016-01-23
    相关资源
    最近更新 更多