【问题标题】:AWS API Gateway to .NET Core Web Api running in ECS在 ECS 中运行的 AWS API Gateway 到 .NET Core Web Api
【发布时间】:2018-04-26 22:28:03
【问题描述】:

编辑

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

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

此证书允许 API Gateway 与实例建立 HTTPS 连接,并传递可验证的客户端证书。

原帖

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

这是我想要实现的目标:

  • Angular 网站通过 API Gateway 连接到后端 API(URL:gateway.company.com.au
  • API 网关配置有 4 个阶段 - DEV、UAT、PreProd 和 PROD
  • API Gateway 中的资源是通过网络负载均衡器连接到后端服务的 HTTP 代理。每个阶段的每个服务都会分配一个不同的端口:即 DEV 为 30,000、30,001 等,UAT 为 31,000、31,000 等
  • 网络负载平衡器的 DNS 为 services.company.com.au
  • AWS ECS 为后端服务托管 docker 容器。这些服务是 .NET Core 2.0 Web API 项目
  • ECS 任务定义指定要使用的容器镜像,并配置了端口映射 - 主机端口:0 容器端口:4430。主机端口 0 由 ECS 动态分配。
  • 网络负载均衡器对每个微服务端口都有一个监听器,并将请求转发到目标组。每个环境的每个服务都有一个目标群体。
  • 目标组包括 ECS 集群中的两个 EC2 实例,并且端口由 ECS 动态分配
  • 这个端口然后被ECS/Docker映射到容器端口4430

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

在我的 Web API 中,我按如下方式构建网络主机:

.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 是:

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

当我使用 Postman 尝试访问该服务时,我收到了 504 Gateway timeout。 CloudWatch 日志显示:

(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 网关
  • Application Load Balancer - 基于路径的路由以定向到正确的容器
  • ECS 管理负载均衡器上的端口
  • 容器监听 HTTP 80 端口

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

我不确定它在哪里失败,但我怀疑我没有正确配置 .NET Core/Kestrel 以使用客户端证书终止 SSL。

就整体架构而言,如果:

  1. 公共 Application Load Balancer 可与 HTTPS 侦听器一起使用,使用 API 网关的客户端证书终止 SSL 连接
  2. API 网关无需使用 Lambda 作为代理即可连接到内部负载均衡器

我们会考虑任何提示或建议,但目前的主要目标是让第一个架构工作。

如果需要更多信息,请告诉我,我会更新问题。

【问题讨论】:

    标签: amazon-web-services asp.net-core aws-api-gateway amazon-elb amazon-ecs


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2019-12-17
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 2016-04-30
      • 2018-05-08
      • 2021-04-19
      • 1970-01-01
      • 2018-07-03
      相关资源
      最近更新 更多