【问题标题】:How to communicate Frontend Angular Application and Multiple Backend APIs in AWS?如何在 AWS 中通信前端 Angular 应用程序和多个后端 API?
【发布时间】:2020-02-13 20:52:50
【问题描述】:

我还是 AWS 新手,目前正在尝试使用 AWS Elastic Beanstalk 部署我的应用程序。我的私有 Dockerhub 上有 4 个后端 API 可用,并且我有一个应该与这 4 个后端微服务通信的前端 API。我可以按照位于here 的指南将 4 个后端服务部署到 AWS Elastic Beanstalk。我的主要问题或我无法理解的部分是如何让我的前端应用程序与这 4 个其他服务进行通信?

我正在研究的当前选项是将我的前端 Angular 应用程序添加到 Dockerrun.aws.json 中,以便我的 json 文件看起来像您在下面看到的那样:

{
  "AWSEBDockerrunVersion": 2,
  "volumes": [
    {
      "name": "backend-svc-1",
      "host": {
        "sourcePath": "/var/app/current/backend-svc-1"
      }
    },
        {
      "name": "backend-svc-2",
      "host": {
        "sourcePath": "/var/app/current/backend-svc-2"
      }
    },
    {
      "name": "angular-frontend-app",
      "host": {
        "sourcePath": "/var/app/current/angular-frontend-app"
      }
    }
  ],
  "containerDefinitions": [
    {
      "name": "angular-frontend-app",
      "image": "angular-frontend-app",
      "environment": [
        {
          "name": "Container",
          "value": "angular-frontend-app"
        }
      ],
      "essential": true,
      "memory": 128,
      "portMappings": [
        {
          "hostPort": 80,
          "containerPort": 4200
        }
      ],
      "links": [
        "backend-svc-1",
        "backend-svc-2"
      ]
    },
    {
      "name": "backend-svc-1",
      "image": "backend-svc-1",
      "environment": [
        {
          "name": "Container",
          "value": "backend-svc-1"
        }
      ],
      "essential": true,
      "memory": 128,
    }
    {
      "name": "backend-svc-2",
      "image": "backend-svc-2",
      "environment": [
        {
          "name": "Container",
          "value": "backend-svc-2"
        }
      ],
      "essential": true,
      "memory": 128
    }
  ]
}

当我这样做时,如何在我的 Angular 应用程序中检索有关 backend-svc-1 的主机名的信息?例如,如果在我的 Angular 应用程序中我调用 http://backend-svc-1/endpoint,那么这个 url 在部署时会变成什么?我应该对值进行硬编码吗?或者它会通过链接数组作为环境变量传递给我的前端应用程序?

您对如何最好地实施我提议的架构有何建议?我读过很多文章,有人说我应该将我的 Angular 应用程序作为静态站点托管在 S3 中,并通过 API Gateway 路由我的请求。我看到其他网站说我应该为每个服务管理自己的 ECS 实例并通过 API 网关路由请求。所以总的来说,我对如何使用 AWS 有点困惑,我希望有人能在这件事上为我提供任何指导。

提前谢谢你!

【问题讨论】:

    标签: angular amazon-web-services docker aws-api-gateway amazon-elastic-beanstalk


    【解决方案1】:

    这个问题似乎很宽泛,但在使用 AWS 中的容器时可以考虑一些事情。

    当我这样做时,如何在我的 Angular 应用程序中检索信息 backend-svc-1 的主机名是什么?

    您需要在这些服务的顶部放置应用负载均衡器,并在从前端应用请求路由时根据主机名或请求路径将请求路由到后端服务。

    现有 s3 Angular 应用的高级外观类似于

    或者它会通过链接传达给我的前端应用程序 数组作为环境变量?

    链接是使用服务进行通信的服务,例如后端 api 想要与 Redis 通信,然后链接套装,但是当你的应用程序是 Web 时,你的 Angular 应用程序需要后端 API 应该可以从互联网访问,所以链接不会在这工作,但 LBalancer 可以正常工作。

    我看到其他网站说我应该管理自己的 ECS 实例 每个服务并通过 API Gateway 路由请求。

    在容器方面我更喜欢ECS,现在ECS提供了像fargate这样的不同风格,你不需要管理或担心基础设施。

    创建 3 个服务所需的一切

    • 前端
    • 后端-svc-1
    • 后端-svc-2

    将 LB 放在这些服务之上。前端将使用 LB 端点与后端服务通信,服务到服务的通信可以使用 lining 或service discovery.

    但是如果 backend-svc 相同意味着共享相同的基本代码,您可以应该为每个任务运行两个服务,而不是运行两个单独的容器。

    一个高级的外观将是

    【讨论】:

    • 您认为答案对您没有帮助吗?至少可以期待评论或进一步的建议
    • 嗨,Adii,对不起,我在工作,刚下班。但是这个答案非常有帮助。今晚我会看看实现它。
    • 在同样的情况下,如果我们在 ALB 中有身份验证 - OIDC,那么我的 Angular 应用程序不会被重定向到 OIDC 登录页面。但是,如果我删除 ALB 身份验证,那么它工作正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    • 2019-02-01
    • 2022-07-12
    • 2014-07-20
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    相关资源
    最近更新 更多