无服务器Web应用程序架构

时间:2018-01-17 15:07:49

标签: serverless-framework serverless serverless-architecture

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

我目前的预期筹码是;

  • API网关
  • LAMBDA
  • DynamoDB
  • 静态单页应用

我已经按照一些教程使用Serverless Framework构建无服务器API,Lambda和DynamoDB,我已经构建了我的单页应用程序,但是现在它们是两个独立的实体。

我现在要做的是将静态站点(nodejs)带入与我的API,Lambda和DynamoDB相同的项目中,并使用无服务器框架来控制部署,但是我很难找到指导;

  1. 您如何表示无服务器中的静态网站部分 框架
  2. 如何最好地托管该静态网站(例如s3静态网站托管 或其他选择?)
  3. 如何最好地引用正在生成的API网关URL 部署发生的同时(例如通过无服务器 框架)
  4. 任何人都可以提供任何关于这应该如何工作的见解,或者可能指出我对一些好的博客/资源的指导?

    亲切的问候, 约翰

3 个答案:

答案 0 :(得分:3)

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

  • API
  • 应用
  • WWW

在每个服务文件夹的内部,我有一个serverless.yml,用于定义单独AWS Lambda的部署。 每个服务仅映射到1个函数index,它接受​​所有HTTP端点。我确实使用了2种环境stagingproduction。 我的AWS Lambdas的名称如下:

  • 例 - 的 API -staging索引
  • 例 - 的 API - 生产 -index
  • 例 - 的应用 -staging索引
  • 例 - 的应用 - 生产 -index
  • 例 - 的 WWW -staging索引
  • 例 - 的 WWW - 生产 -index

我使用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

应用服务

  • /捆绑生产
  • /捆绑-分期
  • src(此处为React / Angular单页应用程序)
  • handler.js
  • 的package.json
  • serverless.yml

app服务包含一个带有单页应用程序代码的文件夹/ src。 SPA在我的计算机上本地构建为./bundles-production或./bundles-staging,基于环境。构建生成.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服务 使用微服务架构可以轻松进行实验。我目前正在使用graphql

apollo-server-lambda中重写REST JSON API

答案 1 :(得分:2)

我做了几乎相同的架构并在s3上托管了单页应用。您可以做的是为api网关设置cloudfront,而不是将api.yourDomain.com指向该cloudfront。比你还需要在你的api上启用cors。

此插件可以为您处理域和云端的设置:

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

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

答案 2 :(得分:0)

关于无服务器体系结构和Azure无服务器服务,这里有一些有意义且值得阅读的内容

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