为什么我在从 Amazon ECS 容器发送电子邮件时收到超时错误?

问题描述 投票:0回答:2

我有一个 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 启动类型,并且前面有一个应用程序负载均衡器。

amazon-web-services smtp amazon-ecs connection-timeout
2个回答
1
投票

想通了!

问题的公式:

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

使用 EC2 启动类型指南运行任务

中所述

awsvpc 网络模式仅支持私有子网。由于任务不接收公共 IP 地址,因此出站 Internet 访问需要 NAT 网关,并且入站 Internet 流量应通过负载均衡器进行路由。

为了解决这个问题,我更新了任务定义以使用

bridge
网络模式。

Ps: 不过,我并不担心在同一个实例中运行多个容器。


1
投票

TL;博士

  • 查看文档此处并决定如何访问出站服务,使用公共子网 + Internet 网关还是使用私有子网 + NAT。
  • 进入您服务的安全组,为您想要的端口添加出站规则。

这是一个与该问题类似的问题

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

我遇到了一个类似的问题,我从 ECS 服务中收到超时错误,我花了一段时间才修复它,所以我决定为未来的读者发布这个答案。

首先,您需要执行以下两种方法之一,从 Amazon Elastic Container Service - 连接到 获得出站流量(从容器内部向外部发送请求,例如电子邮件,例如互联网上的外部服务)互联网(网络出站)

就我而言,我使用的是 ECS Fargate,并且在设置 Fargate 的过程中已经完成了使用公共子网和互联网网关
如果尚未完成,或者您正在使用不同的东西(EC2 实例),您需要做的一件事是创建一个公共或私有子网并了解更多信息,您可以检查这个答案

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

您需要在安全组中为您要使用的端口启用出站路由。
这个问题对我帮助很大,也许你已经有了答案。

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

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

并且成功了。

© www.soinside.com 2019 - 2024. All rights reserved.