首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行在ECS中的.NET核心网络API的AWS网关

运行在ECS中的.NET核心网络API的AWS网关
EN

Stack Overflow用户
提问于 2017-11-14 04:52:13
回答 1查看 1.1K关注 0票数 0

编辑

我现在意识到,我需要在服务器上安装一个证书,并分别验证客户端证书。我在看https://github.com/xavierjohn/ClientCertificateMiddleware

我认为证书必须来自AWSdoco-http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-supported-certificate-authorities-for-http-endpoints.html中列出的CA之一

该证书允许API建立到实例的HTTPS连接,并沿着可以验证的客户端证书传递。

原始帖子

我正在尝试配置一个新的微服务环境,我遇到了一些问题。

以下是我想要达到的目标:

  • 通过API网关连接到后端API (网址:gateway.company.com.au)
  • API网关配置了四个阶段-- DEV、UAT、PreProd和PROD。
  • API网关中的资源是通过网络负载均衡器对后端服务的HTTP代理。每个阶段的每个服务都将分配一个不同的端口:例如,DEV的30,000,等等,UAT的31,000,等等
  • 网络负载均衡器的DNS为services.company.com.au
  • AWS ECS承载后端服务的码头容器。这些服务是.NET Core2.0WebAPI项目
  • ECS任务定义指定要使用的容器映像,并配置了端口映射--主机端口:0容器端口: 4430。ECS动态分配0的主机端口。
  • 网络负载均衡器对每个微服务端口都有一个侦听器,并将请求转发给目标组。每个环境的每个服务都有一个目标组。
  • 目标组包括ECS集群中的两个EC2实例,端口由ECS动态分配。
  • 然后,ECS/Docker将此端口映射到4430的集装箱港口。

为了防止客户端直接调用services.company.com.au,API配置了一个客户端证书。

在我的Web中,我正在构建web主机,如下所示:

代码语言:javascript
复制
.UseKestrel(options =>
{
    options.Listen(new IPEndPoint(IPAddress.Any, 4430), listenOptions =>
    {
        const string certBody = "-----BEGIN CERTIFICATE----- Copied from API Gateway Client certificate -----END CERTIFICATE-----";
        var cert = new X509Certificate2(Encoding.UTF8.GetBytes(certBody));

        var httpsConnectionAdapterOptions = new HttpsConnectionAdapterOptions
        {
            ClientCertificateMode = ClientCertificateMode.AllowCertificate,
            SslProtocols = System.Security.Authentication.SslProtocols.Tls,
            ServerCertificate = cert
        };
        listenOptions.UseHttps(httpsConnectionAdapterOptions);
    });
})

我的DockerFile是:

代码语言:javascript
复制
FROM microsoft/aspnetcore:2.0
ARG source
WORKDIR /app
EXPOSE 80 443
COPY ${source:-obj/Docker/publish} .
ENTRYPOINT ["dotnet", "microservice.company.com.au.dll"]

当我使用邮递员尝试访问该服务时,我会得到一个504 Gateway timeout。CloudWatch日志显示:

代码语言:javascript
复制
(e4d594b7-c8f3-11e7-8458-ef6f94e65b64) Sending request to http://microservice.company.com.au:30000/service
(e4d594b7-c8f3-11e7-8458-ef6f94e65b64) Execution failed due to an internal error
(e4d594b7-c8f3-11e7-8458-ef6f94e65b64) Method completed with status: 504

我已经能够让以下架构工作起来:

  • API网关
  • 应用程序负载均衡器-基于路径的路由以指向正确的容器
  • ECS管理负载均衡器上的端口
  • 侦听HTTP端口80的容器

不幸的是,由于API网关只能访问公共负载均衡器,这使得服务在应用程序负载均衡器的DNS上处于打开状态。

我不知道它在哪里失败,但我怀疑我没有正确地配置.NET核心/Kestrel来使用客户端证书终止SSL。

就这一总体架构而言,如果:

  1. 公共应用程序负载均衡器可与HTTPS侦听器一起使用,使用API网关的客户证书终止SSL连接
  2. API网关可以连接到内部负载平衡器,而无需使用Lambda作为代理。

任何提示或建议都将被考虑,但目前,主要目标是使第一个体系结构工作。

我需要更多的信息,让我知道,我会更新这个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-27 05:33:08

该问题是由附加到构成ECS集群的EC2实例的安全组造成的,该安全组不允许正确的端口范围。集群中每个EC2实例的安全组需要允许ECS动态端口范围。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47277897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档