5

我目前正在使用无服务器设计一个简单的无服务器 Web 应用程序。

我当前的预期堆栈是;

  • API 网关
  • 拉姆达
  • 动态数据库
  • 静态单页应用

我遵循了一些使用无服务器框架构建无服务器 API、Lambda 和 DynamoDB 的教程,并且我构建了我的单页应用程序,但是现在它们是 2 个独立的实体。

我现在要做的是将静态站点(nodejs)与我的 API、Lambda 和 DynamoDB 放到同一个项目中,并使用无服务器框架来控制部署,但是我正在努力寻找指导;

  1. 无服务器框架中如何表示静态网站部分
  2. 如何最好地托管该静态网站(例如 s3 静态网站托管或其他选项?)
  3. 如何最好地引用在部署发生的同时生成的 API 网关 URL(例如,通过无服务器框架)

任何人都可以提供任何关于这应该如何工作的见解,或者可以向我指出一些好的博客/资源的方向吗?

亲切的问候,约翰

4

3 回答 3

3

我有一个用 React 编写的 SPA(单页应用程序),与用 nodejs 编写的 REST JSON API 通信,并作为一个整体托管在 Heroku 上。我迁移到 AWS Lambda 并将单体应用程序拆分为 3 个以上的 AWS Lambdas微服务在一个monorepo内 如果您的 SPA 需要用户登录才能执行任何操作,则以下项目结构很好。我使用了一个 git 存储库,其中每个服务都有一个文件夹:

  • api
  • 应用程序
  • 万维网

在每个服务的文件夹中,我都有一个 serverless.yml 定义部署到单独的 AWS Lambda。每个服务仅映射到index一个接受所有 HTTP 端点的函数。我确实使用 2 个环境stagingproduction. 我的 AWS Lambda 是这样命名的:

  • 示例-api -staging-index
  • 示例-api-生产-索引
  • 示例-app - staging -index
  • 示例-应用程序-生产-索引
  • 示例-www - staging-index
  • 示例 - www -生产-索引

我使用AWS Api Gateway 的自定义域名将每个 lambda 映射到公共域:

  • api.example.com(REST JSON API)
  • app.example.com(需要登录的单页应用程序)
  • www.example.com(服务器端呈现的登录页面)

  • api-staging.example.com

  • app-staging.example.com
  • www-staging.example.com

您可以使用 serverless.yml 资源或插件定义域映射,但您只需执行一次,因此我从 AWS 网站控制台手动完成。我的 .com 域托管在 GoDaddy 上,但我将其迁移到AWS Route 53,因为 HTTPS 证书是免费的

应用服务

  • /捆绑生产
  • /捆绑分期
  • src(此处为 React/Angular 单页应用程序)
  • handler.js
  • 包.json
  • 无服务器.yml

应用服务包含一个文件夹 /src,其中包含单页应用程序代码。SPA 基于环境在我的计算机上本地构建在 ./bundles-production 或 ./bundles-staging 中。build 生成 .js 和 .css 包以及 index.html。当我运行serverless deploy -v -s production. 我只为 serverless.yml 中的所有端点定义了 1 个函数(我使用 JSON 而不是 YAML):

...
    "functions": {

        "index": {
            "handler": "handler.index",
            "events": [
                { "http": "GET /" },
                { "http": "GET /{proxy+}"}
            ]
        },

    },

handler.js 文件返回index.html/bundles-staging 或 /bundles-production 中定义的

我使用 webpack 来构建 SPA,因为它通过serverless-webpack插件很好地与无服务器集成。

api 服务 我使用aws-serverless-express定义所有 REST JSON API 端点。aws-serverless-express 就像普通快递一样,但你不能做一些事情,比如express.static()and fs.sendFile()。我最初尝试对每个端点使用单独的 AWS Lambda 函数而不是 aws-serverless-express,但我很快就达到了CloudFormation 映射限制

www 服务 如果您的单页应用程序的大部分功能都需要登录,最好将 SPA 放在单独的域中,并将 www 域用于针对 SEO 优化的服务器端渲染登录页面。

奖金:

graphql service 使用微服务架构可以很容易地进行实验。我目前正在使用apollo-server-lambda在graphql中重写 REST JSON API

于 2018-03-17T09:59:15.283 回答
2
于 2018-01-21T13:12:16.613 回答
0

这是关于无服务器架构和 Azure 无服务器服务的一些有意义且值得一读的内容

https://sps-cloud-architect.blogspot.com/2019/12/what-is-serverless-architecture.html

于 2019-12-11T05:37:04.207 回答