为什么从 Amazon ECS 容器发送电子邮件时会出现超时错误?

Why am I getting time out errors when sending emails from Amazon ECS container?

我有一个 Spring Boot API,它有发送电子邮件的服务。当我在本地 运行 应用程序或在 EC2 实例中使用简单的 docker-compose 时,此服务有效。但是,当我将应用程序移动到 Amazon ECS 时,它停止工作了。

错误:

org.springframework.mail.MailSendException: Mail server connection failed; nested exception is
com.sun.mail.util.MailConnectException: Couldn't connect to host, port: email-smtp.us-east-
1.amazonaws.com, 587; timeout -1;

我的application.yml(邮件部分):

spring:
    mail:
    host: ${MAIL_HOST}
    port: ${MAIL_PORT:587}
    username: ${MAIL_USER}
    password: ${MAIL_PASSWORD}
    properties:
      mail:
        smtp:
          auth: true
          starttls.enable: true

我已经尝试在我的安全组中打开 tcp 端口 587,但它也没有用。

有关 ECS 的更多信息:
我正在使用具有 EC2 启动类型的 ECS 和一个位于它前面的应用程序负载均衡器。

想通了!

问题的公式:

problem = (ECS with EC2 launch type) + (Task definition with awsvpc network mode) + (public subnet) + (not reading the AWS manual)^999   

Running a Task Using the EC2 Launch Type Guide

中所述

Only private subnets are supported for the awsvpc network mode. Because tasks do not receive public IP addresses, a NAT gateway is required for outbound internet access, and inbound internet traffic should be routed through a load balancer.

为了解决这个问题,我更新了任务定义以使用 bridge 网络模式。

Ps: 我不关心 运行 同一实例中的多个容器。

TL;DR

  • 查看文档 here 并决定您希望如何访问出站服务,使用 public 子网 + 互联网网关或使用私有子网 + NAT。
  • 进入您服务的安全组并为您想要的端口添加出站规则。

这里是similar question to the problem.

我的类似问题以及我是如何解决的

我遇到了一个类似的问题,我从 ECS 服务中收到超时错误,我花了一些时间来修复它,所以我决定 post 这个答案供未来的读者使用。

首先,您需要采用以下两种方式之一从 Amazon Elastic Container Service - Connecting to the internet (Networking Outbound)

就我而言,我使用的是 ECS Fargate,Using a public subnet and internet gateway 已经在设置 ​​Fargate 的过程中完成。
如果未完成,或者您使用的是不同的东西(EC2 实例),您需要做的一件事是创建一个 public 或私有子网并了解更多相关信息,您可以查看 this answer .

所以在那之后,我认为一切都完成了并且应该可以工作,但是缺少一件事我不知道。

您需要在安全组中为您要使用的端口启用出站路由。
This question 对我帮助很大,可能有你的答案。

对于我来说,我想启用 SMTPS(端口 465),所以我所做的是

  • 进入我的ECS容器使用的安全组
  • 进入出站规则
  • 为 SMTPS 添加规则(它会自动添加端口 465)

它奏效了。