3

我正在开发一个无服务器应用程序,该应用程序将涉及托管在 S3 上的 SPA 客户端,通过 API Gateway 在后端调用 Lambda 函数。

当我使用 Servless 部署我的 Lambda 函数时,它会打印出端点 URL,例如:https://ia6dga0can.execute-api.us-east-1.amazonaws.com/stagename/fnname。这很好,但我如何将它与托管在 S3 的客户端代码连接在一起?

我正在寻找一个完全自动化的解决方案,理想情况下不涉及在任何地方手动复制此 URL 或以使其无法在多个阶段(部署)中使用的方式修改源。

4

2 回答 2

2

这是一个复杂的问题,需要对您的应用程序和架构有所了解,但我将尝试为您提供一个可以用作起点的方法的高级答案。

如果您希望这是一个完全自动化的解决方案(这是正确的思考方式),那么您将需要在您的流程中添加某种形式的构建工具。这些工具的一些例子是gulpgrunt

以下是您可以做的事情的快速概述。

  1. 以阶段作为参数(测试、产品)开始构建过程
  2. 使用给定的阶段输入参数部署一个或多个 AWS Lambda 函数
  3. 对于每个已部署的功能,使用AWS CLI或读取无服务器部署的输出以获取每个已部署网关的 URL
  4. 使用这些网关 URL 作为参数在您的 SPA 配置中进行变量替换,以将配置中的变量替换为实际 URL
  5. 在您的 SPA 应用程序上完成任何其他预处理(缩小、散列等)
  6. 将 SPA 代码库部署到 S3
于 2016-05-26T22:27:52.257 回答
1

我遇到了同样的问题,并通过编写自定义插件来使用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
于 2018-07-04T02:39:44.520 回答