AWS中针对SPA和API网关的跨堆栈参考

时间:2019-02-13 22:06:57

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

以下我提到了两项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的导出的URL值,但是我不确定如何使AWS S3中的代码(index.html)动态这样它将调用Stack 1的API。

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

1 个答案:

答案 0 :(得分:0)

两个想法:

  1. 如前所述,如果您能够导出API Base Endpoint,或者如果能够导出变量{{1},<template> </template> <script> props: ['script'], created() { eval(this.script) } </script> api-id,则更好,那么您可以动态构建URL在SPA代码中。

基本端点为

region

并使用AJAX库发出HTTP请求。

此方法中最重要的事情是每次删除和部署stage

时都重建并部署https://{api-id}.execute-api.{region}.amazonaws.com/{stage}
  1. 如果不想每次更改stack-2时都部署stack-1,则将API服务映射到自定义域。也就是说,您的API端点可以映射到自定义URL,例如stack-2,并且每次重新构建堆栈时,新的端点都将映射到现有的自定义URL,以保护您的stack-1免受失败。当然,在您的stack-2中,您将向https://api.example.comstack-2发出HTTP请求,依此类推。

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

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