AWS API ECS 中 .NET Core Web Api 运行 的网关
AWS API Gateway to .NET Core Web Api running in ECS
编辑
我现在意识到我需要在服务器上安装证书并单独验证客户端证书。我在看 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 网关与实例建立 HTTPS 连接,并传递可验证的客户端证书。
原版POST
我正在尝试配置新的微服务环境,但遇到了一些问题。
这是我想要实现的目标:
- Angular 网站通过 API 网关连接到后端 API (URL:
gateway.company.com.au
)
- API 网关配置了 4 个阶段 - DEV、UAT、PreProd 和 PROD
- API 网关中的资源是通过网络负载平衡器到后端服务的 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网关配置了客户端证书。
在我的网站 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 网关只能访问 public 个负载均衡器,这会使应用程序负载均衡器的 DNS 上的服务保持打开状态。
我不确定哪里出了问题,但我怀疑我没有正确配置 .NET Core/Kestrel 以使用客户端证书终止 SSL。
关于这个整体架构,如果:
- public Application Load Balancer 可以与使用 API 网关的客户端证书的 HTTPS 侦听器一起使用以终止 SSL 连接
- API 网关可以在不使用 Lambda 作为代理的情况下连接到内部负载均衡器
我们会考虑任何提示或建议,但目前的主要目标是让第一个架构正常工作。
我需要更多信息让我知道,我会更新问题。
问题是由附加到构成 ECS 集群的 EC2 实例的安全组不允许正确的端口范围引起的。集群中每个 EC2 实例的安全组需要允许 ECS 动态端口范围。
编辑
我现在意识到我需要在服务器上安装证书并单独验证客户端证书。我在看 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 网关与实例建立 HTTPS 连接,并传递可验证的客户端证书。
原版POST
我正在尝试配置新的微服务环境,但遇到了一些问题。
这是我想要实现的目标:
- Angular 网站通过 API 网关连接到后端 API (URL:
gateway.company.com.au
) - API 网关配置了 4 个阶段 - DEV、UAT、PreProd 和 PROD
- API 网关中的资源是通过网络负载平衡器到后端服务的 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网关配置了客户端证书。
在我的网站 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 网关只能访问 public 个负载均衡器,这会使应用程序负载均衡器的 DNS 上的服务保持打开状态。
我不确定哪里出了问题,但我怀疑我没有正确配置 .NET Core/Kestrel 以使用客户端证书终止 SSL。
关于这个整体架构,如果:
- public Application Load Balancer 可以与使用 API 网关的客户端证书的 HTTPS 侦听器一起使用以终止 SSL 连接
- API 网关可以在不使用 Lambda 作为代理的情况下连接到内部负载均衡器
我们会考虑任何提示或建议,但目前的主要目标是让第一个架构正常工作。
我需要更多信息让我知道,我会更新问题。
问题是由附加到构成 ECS 集群的 EC2 实例的安全组不允许正确的端口范围引起的。集群中每个 EC2 实例的安全组需要允许 ECS 动态端口范围。