gpt4 book ai didi

amazon-web-services - AWS ECS 私有(private)和公共(public)服务

转载 作者:行者123 更新时间:2023-12-04 23:35:51 28 4
gpt4 key购买 nike

我有一个场景,我必须在 AWS ECS 上部署多个微服务。我想让服务能够通过在每个微服务中开发的 API 相互通信。我也想在 AWS ECS 上部署前端,可以公开访问,也可以与部署在 AWS ECS 上的其他微服务进行通信。我怎样才能做到这一点?我可以通过将所有服务放在私有(private)子网中来启用它们之间的通信来使用 AWS ECS 服务发现吗?我是否可以使用 Elastic Load Balancer 使最终用户只能通过 HTTP/HTTPS 协议(protocol)通过 Internet 访问前端微服务,同时将其保留在私有(private)子网中?

最佳答案

AWS 负载均衡器(用于公共(public)访问)和 Amazon ECS 服务发现(用于内部通信)的组合是 Web 应用程序的完美选择。

Built-in service discovery in ECS is another feature that makes it easy to develop a dynamic container environment without needing to manage as many resources outside of your application. ECS and Route 53 combine to provide highly available, fully managed, and secure service discovery



服务发现是一种使用容器直接 IP 地址从一个容器获取流量到另一个容器的技术,而不是像负载均衡器这样的中介。它适用于各种用例:
  • 私有(private)的内部服务发现
  • 服务之间的低延迟通信
  • 长期存在的双向连接,例如 gRPC。

  • 是的,您可以使用 AWS ECS 服务发现 将所有服务都放在一个私有(private)子网中以实现它们之间的通信。

    This makes it possible for an ECS service to automatically register itself with a predictable and friendly DNS name in Amazon Route 53. As your services scale up or down in response to load or container health, the Route 53 hosted zone is kept up to date, allowing other services to lookup where they need to make connections based on the state of each service.



    是的,您可以使用 负载均衡器 使最终用户可以通过互联网访问前端微服务。您可以查看此图,该图显示了 ECS 中 Web 应用程序的 AWS LB 和服务发现。

    https://aws.amazon.com/blogs/aws/amazon-ecs-service-discovery/

    您可以看到位于私有(private)子网中的后端容器,通过 ALB 服务公共(public)请求,而容器的其余部分使用 AWS 服务发现。

    Amazon ECS 服务发现

    Let’s launch an application with service discovery! First, I’ll create two task definitions: “flask-backend” and “flask-worker”. Both are simple AWS Fargate tasks with a single container serving HTTP requests. I’ll have flask-backend ask worker.corp to do some work and I’ll return the response as well as the address Route 53 returned for worker. Something like the code below:


    @app.route("/")
    namespace = os.getenv("namespace")
    worker_host = "worker" + namespace
    def backend():
    r = requests.get("http://"+worker_host)
    worker = socket.gethostbyname(worker_host)
    return "Worker Message: {]\nFrom: {}".format(r.content, worker)

    请注意,在此 私有(private)建筑 没有公共(public)子网,只有私有(private)子网。子网内的容器可以使用它们的内部 IP 地址相互通信。但他们需要某种方式来发现彼此的 IP 地址。

    AWS 服务发现提供两种方法:
  • 基于 DNS(Route 53 创建并维护一个自定义 DNS 名称
    解析为其他容器的一个或多个 IP 地址,例如
    例如,http://nginx.service.production然后其他容器可以
    只需使用打开连接即可将流量发送到目的地
    此 DNS 名称)
  • 基于 API(容器可以查询 API 以获取 IP 地址列表
    目标可用,然后直接打开到其中一个目标的连接
    其他容器。)

  • 您可以阅读有关 AWS 服务发现和使用案例的更多信息 amazon-ecs-service-discoveryhere

    关于amazon-web-services - AWS ECS 私有(private)和公共(public)服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57445666/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com