【问题标题】:Cross Stack Reference in AWS for SPA & API GatewayAWS 中针对 SPA 和 API 网关的交叉堆栈参考
【发布时间】:2019-07-07 21:03:43
【问题描述】:

我在下面提到了两个 AWS 服务

  • 堆栈 1: Api 网关 + Lambda(无服务器)
  • 堆栈 2: 使用 AWS S3 的 SPA(单页应用程序)。

我想单独公开Stack 1'或'同时部署Stack 1 & Stack 2,这样两个堆栈就可以无缝地相互通信。

我目前的解决方案:
我正在考虑使用Cross Stack reference(使用导出/导入),以便Stack 1 将输出其URL,以便将来可以引用它(如果我想在将来部署Stack 2)。

我的问题:

  1. 如何将 API 和 SPA 绑定在一起?
  2. 虽然我知道如何在 SPA (AWS S3) 中引用 Cross Stack 的 Exported URL 值,但我不确定如何在 AWS S3 中使我的代码 (index.html) 动态化,以便调用 @ 987654330@的API。

更新:
想知道我的问题是否足够清楚。问我问题的另一种方式是“我如何在 Javascript/Ruby 等代码中使用从Stack 1 吐出的URL?”。我知道如何在另一个 cloudformation 模板中引用 URL 而不是在代码中。

【问题讨论】:

  • 您能否将 API Gateway 资源移动到您的 Stack 2 中?
  • 我不认为这对我的方案是最好的,因为我试图将Stack 1Stack 1 + Stack 2 公开为两个不同的服务。在我只需要Stack1 的情况下,您的建议将适合我的情况。 @yorodm
  • 顺便说一句,如果我把它移到 Stack 2,你有什么建议? @yorodm
  • 好的,如果你想公开 Stack 1,比如说一个 REST API,并通过导出它的 API Gateway URL 从 Stack 2 使用它,你需要从这方面获得一些东西,将它转换成你总是可以知道的东西.另一个 API 网关或带有一堆 HTTP 解析器的 Appsync 端点
  • 我认为我没有关注您的评论。您有什么解决问题的建议?

标签: amazon-web-services amazon-s3 aws-lambda amazon-cloudformation aws-api-gateway


【解决方案1】:

两个想法:

  1. 正如您所提到的,如果您能够导出 API Base Endpoint,或者如果您可以导出变量 api-idregionstage,那么您可以在 SPA 代码中动态构建 URL。

基本端点是

https://{api-id}.execute-api.{region}.amazonaws.com/{stage}

并使用 AJAX 库发出 HTTP 请求。

此方法中最重要的是每次删除和部署stack-1时都要重新构建和部署stack-2

  1. 如果您不想在每次更改 stack-1 时都部署 stack-2,则将 API 服务映射到自定义域。即,您的 API 端点可以映射到自定义 URL,例如 https://api.example.com,并且每次重建堆栈时,新端点都会映射到现有的自定义 URL,从而保护您的 stack-2 免于失败。当然,在您的 stack-2 中,您将向 https://api.example.comhttps://api.example.com/myservice 等发出 HTTP 请求。

参考:https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-custom-domains.html

如果您使用的是serverless-framework,您可以参考此答案了解如何实现此解决方案:https://github.com/serverless/serverless/issues/2074#issuecomment-323370777

【讨论】:

  • 我对如何处理dynamically build the URL in the SPA code. 感兴趣。假设我从Stack 1 得到导入的URL。我知道如何在 cloudformation 模板中引用 URL,但是如何在我的 html/js 代码中使用 URL 变量?
  • 如果您使用 JS 并希望在前端代码上动态处理此问题,则可以使用 AWS JS SDK。您可以创建一个 AWS 实例并从 aws.cloudformation 中查找导出的值。参考:docs.aws.amazon.com/AWSJavaScriptSDK
  • 您也可以在本地进行静态构建,在这里您可以从构建器脚本访问导出的变量(例如,您可以将 boto3 用于 python 脚本)。然后 URL 将被硬编码到 html 中。这意味着您必须在每次重新部署 API 堆栈时重新部署此堆栈
  • 哦 .. 有任何示例 sn-p 用于执行此功能吗?因为我的问题是关于如何在代码中使用导出的变量。我被困在这一点上
猜你喜欢
  • 1970-01-01
  • 2020-04-14
  • 2020-12-13
  • 1970-01-01
  • 2020-03-03
  • 2021-08-14
  • 1970-01-01
  • 2018-12-13
  • 2012-01-17
相关资源
最近更新 更多