0

편집AWS API 게이트웨이 .NET에 핵심 웹 API

내가 지금은 서버에 인증서를 설치하고 별도로 클라이언트 인증서의 유효성을 검사 할 필요가 있음을 알고 있습니다. 내가 https://github.com/xavierjohn/ClientCertificateMiddleware

찾고 있어요 나는 인증서 중 하나이어야한다 생각 CA의 AWS의 DOCO에 나열된 - http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-supported-certificate-authorities-for-http-endpoints.html

이 인증서는 API 게이트웨이 인스턴스에 대한 HTTPS 연결을 설정 할 수 있으며 그것은 함께 통과 유효성을 검사 할 수있는 클라이언트 인증서.

ORIGINAL POST 나는 새로운 microservices 환경을 구성하려고 나는 몇 가지 문제에 봉착했습니다. 여기

내가 달성하기 위해 노력하고있어입니다 :

  • 각도의 웹 사이트가 API 게이트웨이를 통해 백엔드 API에 연결 (URL : gateway.company.com.au) 게이트웨이는 4 단계로 구성되어
  • API - DEV, UAT, PreProd PROD
  • API 게이트웨이의 리소스는 네트워크 부하 분산 장치를 통한 백 엔드 서비스에 대한 HTTP 프록시입니다. 30,000, 30,001, 즉 등이
  • 네트워크 부하 분산 services.company.com.au
  • AWS ECS의 DNS를 가지고 UAT에 대한 DEV, 31000, 31000 등을 위해 대한 고정 표시기 용기를 호스팅 : 각 단계의 각 서비스는 할당 된 다른 포트를 얻을 것이다 백엔드 서비스 이러한 서비스는 .NET Core 2.0 웹 API 프로젝트입니다.
  • ECS 작업 정의는 사용할 컨테이너 이미지를 지정하며 포트 매핑이 구성되어 있습니다. - 호스트 포트 : 0 컨테이너 포트 : 4430. 호스트 포트 0은 ECS에 의해 동적으로 할당됩니다.
  • 네트워크 부하 분산 장치에는 각 마이크로 서비스 포트에 대한 수신기가 있으며 요청을 대상 그룹에 전달합니다. 각 환경에 대한 각 서비스에 대한 대상 그룹이 있습니다.
  • 대상 그룹은 ECS 클러스터 모두 EC2 인스턴스를 포함하고, 포트는 동적 ECS 의해 할당
  • 이 포트는 다음 클라이언트를 방지하기 위해

4430의 용기 포트 ECS/도커로 매핑된다

  • 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"] 
    

    , 내가 얻을 a 504 Gateway timeout.CloudWatch에서 로그를 보여줍니다

    • API 게이트웨이
    • 응용 프로그램로드 밸런서 - 경로 기반 라우팅 오른쪽 컨테이너
    • 에 지시하는 : 나는 다음과 같은 구조 작업을 얻을 수있었습니다

      (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 
      

    • 로드 균형 조정기의 포트를 관리하는 ECS
    • HTTP 포트 80에서 수신 대기중인 컨테이너

    아쉽게도 API 게이트웨이가 공용로드 균형 조정기에만 액세스 할 수 있으므로 응용 프로그램로드 균형 조정기의 DNS에 서비스가 열려 있습니다.

    어디서 실패했는지는 확실치 않지만 클라이언트 인증서를 사용하여 SSL을 종료하려면 .NET Core/Kestrel을 올바르게 구성하지 않았을 것으로 생각됩니다. 경우이 전체 아키텍처와 관련

    , 그것은 일을 더 쉽게 만들 것입니다 :

    1. 공공 응용 프로그램로드 밸런서가 SSL 연결을 종료하는 API 게이트웨이의 클라이언트 인증서를 사용하여 HTTPS 리스너를 사용할 수
    2. 게이트웨이는

    어떤 조언, 제안 사항이 고려 될 프록시로하지만 순간에 람다를 사용하지 않고 내부 부하 분산 장치에 연결할 수

  • API는 주요 목표는 첫째 아키텍처 작업을 얻는 것입니다.

    더 많은 정보를 알고 싶습니다. 질문을 업데이트 할 것입니다.

  • 답변

    0

    이 문제는 올바른 포트 범위를 허용하지 않는 ECS 클러스터를 구성하는 EC2 인스턴스에 연결된 보안 그룹으로 인해 발생했습니다. 클러스터의 각 EC2 인스턴스에 대한 보안 그룹은 ECS 동적 포트 범위를 허용해야합니다.

    관련 문제