【问题标题】:Serverless Web App Architecture无服务器 Web 应用架构
【发布时间】:2018-06-26 12:21:56
【问题描述】:

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

我当前的预期堆栈是;

  • API 网关
  • 拉姆达
  • DynamoDB
  • 静态单页应用

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

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

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

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

亲切的问候, 约翰

【问题讨论】:

    标签: serverless-framework serverless serverless-architecture


    【解决方案1】:

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

    • API
    • 应用程序
    • www

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

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

    我使用AWS Api Gateway's Custom Domain Names 将每个 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 since HTTPS certificates are free

    应用服务

    • /bundles-生产
    • /bundles-staging
    • src(此处为 React/Angular 单页应用程序)
    • handler.js
    • package.json
    • serverless.yml

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

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

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

    我使用 webpack 构建 SPA,因为它与带有 serverless-webpack 插件的无服务器集成得非常好。

    API 服务 我使用aws-serverless-express 定义所有 REST JSON API 端点。 aws-serverless-express 与普通快递一样,但您不能执行 express.static()fs.sendFile() 之类的操作。 我最初尝试为每个端点使用单独的 AWS Lambda 函数而不是 aws-serverless-express,但我很快就点击了 CloudFormation mappings limit

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

    奖金:

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

    【讨论】:

      【解决方案2】:

      我已经完成了几乎相同的架构,并在 s3 上托管了单页应用程序。您可以做的是为 api 网关设置云端,然后将 api.yourDomain.com 指向该云端。比你还需要在你的 api 上启用 cors。

      此插件会为您设置域和云端:

      https://github.com/amplify-education/serverless-domain-manager

      我不确定您的项目要求,但如果您想更快地提供静态文件,设置域->cloudfront->s3 可能是一个明智的选择。

      【讨论】:

      • 嗨 Vjeran,我已经更新了我的描述,希望能澄清我的确切问题。很高兴得到您的反馈。谢谢约翰
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-03-02
        • 1970-01-01
        • 2017-09-13
        • 2015-02-15
        • 2013-06-26
        • 1970-01-01
        • 2014-07-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多