我有一个运行在Docker上的容器化ASP.NETMVC应用程序,在try 从该应用程序向外部API发送HTTP请求时遇到了一个问题.有趣的是,当我在本地运行Docker镜像时,该请求成功执行.然而,在将应用程序部署到ECS(弹性容器服务)时,我遇到了超时错误.值得注意的是,ECS服务在负载均衡器之后运行.

在上下文中,ECS服务部署到端口80上的目标组,而负载平衡器侦听器配置在端口443上.值得注意的是,应用程序部署时没有任何故障,我可以很容易地访问它的网页,没有任何问题.尽管如此,挑战仍然持续存在,特别是对于这个特定的HTTP请求.

为了解决这个问题,我仔细判断了负载均衡器的安全组和ECS任务的安全组的配置设置.我已经彻底确认了端口80和443已为入站和出站流量正确配置.此外,我还努力通过在公用子网上部署ECS服务来进一步解决问题.此外,作为诊断过程的一部分,我try 向端口80上的外部HTTP地址发送请求.不幸的是,尽管采取了这些额外措施,这个问题仍然没有得到解决.

此外,值得注意的是,我还试验了ECS任务的IAM(身份和访问管理)权限.作为临时措施,我授予了任务管理员权限,但遗憾的是,这种调整也没有产生问题的解决方案.

推荐答案

应用程序的入站请求到达负载均衡器,然后从负载均衡器到达ECS服务器.来自您的应用程序的出站请求根本不涉及负载平衡器,因此这里关注负载平衡器是死胡同.

此外,您的ECS服务的出站网络请求中不涉及IAM权限.这些权限在连接到其他AWS服务时使用,而不是在对非AWS服务进行外部API调用时使用.

首先,您需要确保分配给ECS服务的安全组允许任何地址的出站流量.如果这不能解决问题,则说明您尚未将ECS任务配置为具有互联网访问权限.您可以通过以下两种方式之一为您的ECS任务提供互联网访问权限:

  1. 在您的公网私有网络子网中添加NAT Gateway(S).在您的私有网络中配置具有到NAT网关的路由的内网.将您的ECS任务部署到only个具有到NAT网关的路由的私有子网.来自ECS服务的出站请求现在将通过NAT网关并出站到Internet.

  2. 确保将ECS任务only部署到公共vPC子网(具有到vPC Internet网关的路由的子网).在ECS服务网络配置中,启用分配公网IP.


请注意,如果您正在部署到EC2实例(不是Fargate),并且您正在对ECS任务使用awsvpc网络模式,则必须使用NAT网关方法,因为您不能为您的任务in that scenario分配公共IP.

Asp.net相关问答推荐

如何在 ASP.​NET Core 中使用 jquery

如何从 JavaScript 调用 C# 函数?

此版本的 SQL Server 不支持用户实例登录标志.连接将关闭

某些黑客能否从用户那里窃取 Web 浏览器 cookie 并在网站上使用该名称登录?

在哪里可以记录 ASP.NET Core 应用程序的启动/停止/错误事件?

如何在 FileUpload 控件中限制文件类型

如何检测 ASP.net 应用程序中的 SqlServer 连接泄漏?

ASP.NET IIS - 请求何时排队?

Web Api 参数始终为空

如何使用 asp.net 获取 html Select 的选定值

在 ASP.NET 中使用 Messenger Connect 客户端库时出现 Javascript 错误

如何配置 ELMAH 以使用 Windows Azure?我在 Elmah.axd 上得到 404

在asp.net控件之间动态添加

您使用哪个 .NET Memcached 客户端,EnyimMemcached 与 BeITMemcached?

如何在 ASP.Net MVC 3 中返回 HttpNotFound() 的视图?

盒式磁带包与 MVC4 包

ASP.NET 网格视图与列表视图

如何使用 int ID 列更改 ASP.net Identity 2.0 的表名?

如何创建代表 colored颜色 的随机十六进制字符串?

在 ASP.NET 中写入文件以响应后回发不起作用