【问题标题】:AWS Lambda triggers SES in VPCAWS Lambda 在 VPC 中触发 SES
【发布时间】:2021-05-03 03:08:39
【问题描述】:

我有一个位于 VPC 中的 lambda 函数,具有以下输入/输出绑定规则。

在函数内部,目标是触发一封电子邮件,所以是这样的:

const aws = require('aws-sdk');
const ses = new aws.SES({ region: 'us-west-2' });
                
ses.sendEmail(params, function (err, data) {
    if (err) {
        console.log(err);
    }
});

但是;当我触发该功能时,没有打印错误,并且任务超时。

原来这个函数在VPC之外,可以成功发送邮件。

我已经仔细检查了这个函数的权限,其中包括 AWSLambdaVPCAccessExecutionRole。

有人知道这里发生了什么吗?

【问题讨论】:

  • 如果从 tom_139 发布了可能的答案,则您无法实施或无法实施。我建议检查您的 lambda 网络接口的 VPC 流日志以获取更多详细信息。有时,如果是某个组织帐户,那么某些网络防火墙规则(例如安全组或 NACL,甚至您的 http 代理)会阻止此类网络流量。

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


【解决方案1】:

问题在于 lambda 函数的代码没有到达 SES 端点的路径。

解决此问题的最简单方法是让函数访问 Internet。 尽管您已授予安全组连接 Internet 的权限,但无法访问 SES 端点,因为它没有用于发送请求的公共 IP。

将函数置于 NAT 之后

解决此问题的最简单方法是:

  1. 在功能部署到的子网中放置一个NAT网关,
  2. 在子网的路由表中附加一条规则,将所有到 0.0.0.0/0 的流量定向到 NAT 网关。

更多关于NAT gateways的信息

请记住,这样做的好处是允许您的函数访问任何 Internet 资源,但也有通过公共 Internet 路由流量的缺点。

在您的 VPC 中创建终端节点

此解决方案虽然更简洁、更现代,但涉及许多步骤,我建议您坚持第一个解决方案。

VPC 终端节点本质上是一种访问 AWS 服务(或来自 AWS 市场的服务)的方式,而不会让您的流量离开您的 VPC。

这通过将您的 VPC 中的私有 IP 分配给该服务的“私有链接”来实现。

如果你想走这条路,从这个页面开始阅读Interface VPC endpoints。

【讨论】:

    【解决方案2】:

    我对如何解决“Lambda 无法访问互联网/SES/S3/...”问题进行了大量研究,因为 我不想在 NAT 网关上花钱。这是我的解决方案。

    1. 您需要 2 个 Lambda(1 个在 VPC 中,1 个在 VPC 外)
    2. 我的第一个 Lambda 执行 VPC 作业(在我的情况下请求 RDS)
    3. 我第一个 lambda 的结果我发布到一个 SNS 主题(您需要设置VPC endpoint for SNS)
    4. SQS 队列订阅了 SNS 主题
    5. 我的第二个 Lambda 监听 SQS 队列并完成其余的“Internet 工作”

    这样,我不必设置 NAT 网关并每月节省 30 美元?。像这样你可以调用像listIdentity这样的SES函数......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-18
      • 2015-12-13
      • 2019-01-11
      • 1970-01-01
      • 2020-12-20
      • 2021-05-13
      • 2018-04-23
      • 2020-10-24
      相关资源
      最近更新 更多