我正在开发一个无服务器的应用程序,该应用程序涉及在S3上托管的SPA客户端,通过API网关在后端调用Lambda函数。
当我使用Servless部署我的Lambda函数时,它打印出端点URL,如:https://ia6dga0can.execute-api.us-east-1.amazonaws.com/stagename/fnname
。这很好,但是如何将它与我在S3上托管的客户端代码连接在一起?
我正在寻找一个完全自动化的解决方案,理想情况是不涉及在任何地方手动复制此URL或修改源,使其无法在多个阶段(部署)中使用。
答案 0 :(得分:2)
这是一个复杂的问题,需要您对应用程序和体系结构有所了解,但我会尝试为您提供一个可以作为起点的方法的高级答案。
如果您希望这是一个完全自动化的解决方案(这是考虑它的正确方法),那么您需要在流程中添加某种形式的构建工具。这些工具的一些示例可能是gulp或grunt。
以下是您可以做的快速概述。
答案 1 :(得分:0)
我也遇到了同样的问题,并通过编写一个自定义插件使用serverless.yml
环境变量构建前端来解决了这个问题。如果您想使用该插件,则将其称为serverless-build-client
。然后,我使用serverless-finch
将内部版本上传到S3。
serverless-build-client
很简单;它只是遍历环境变量,并将它们添加到process.env
中。这是重要的部分
const environment = this.serverless.service.provider.environment;
if (!environment) {
return;
}
Object.keys(environment).forEach(variable => {
process.env[variable] = environment[variable];
});
// Later
spawnSync("yarn", ["build"]);
我有2个独立的无服务器项目:一个用于前端,一个用于后端。部署后端时,堆栈会输出ServiceEndpoint
,这是您要引用的基本终结点。
在serverless.yml
文件中,我有类似的内容:
plugins:
- serverless-build-client
- serverless-finch
provider:
...
environment:
REACT_APP_ENDPOINT: ${cf:<backend service name>.ServiceEndpoint}
然后在前端,我引用环境变量进行请求
const response = await fetch(`${process.env.REACT_APP_ENDPOINT}/some/api`);
我的部署脚本按此顺序执行命令
// Backend
npx serverless deploy
// Frontend
npx serverless deploy
npx serverless build
npx serverless client deploy