我有一个 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 的更多信息:
我正在使用 ECS 和 EC2 启动类型,并且前面有一个应用程序负载均衡器。
想通了!
问题的公式:
problem = (ECS with EC2 launch type) + (Task definition with awsvpc network mode) + (public subnet) + (not reading the AWS manual)^999
中所述
awsvpc 网络模式仅支持私有子网。由于任务不接收公共 IP 地址,因此出站 Internet 访问需要 NAT 网关,并且入站 Internet 流量应通过负载均衡器进行路由。
为了解决这个问题,我更新了任务定义以使用
bridge
网络模式。
Ps: 不过,我并不担心在同一个实例中运行多个容器。
这是一个与该问题类似的问题。
我遇到了一个类似的问题,我从 ECS 服务中收到超时错误,我花了一段时间才修复它,所以我决定为未来的读者发布这个答案。
首先,您需要执行以下两种方法之一,从 Amazon Elastic Container Service - 连接到 获得出站流量(从容器内部向外部发送请求,例如电子邮件,例如互联网上的外部服务)互联网(网络出站)
就我而言,我使用的是 ECS Fargate,并且在设置 Fargate 的过程中已经完成了使用公共子网和互联网网关。
如果尚未完成,或者您正在使用不同的东西(EC2 实例),您需要做的一件事是创建一个公共或私有子网并了解更多信息,您可以检查这个答案。
所以在那之后,我认为一切都完成了并且应该可以工作,但是缺少一件事我不知道。
您需要在安全组中为您要使用的端口启用出站路由。
这个问题对我帮助很大,也许你已经有了答案。
对于我来说,我想启用 SMTPS(端口 465),所以我所做的是
并且成功了。