为什么从 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)
它奏效了。
我有一个 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)
它奏效了。