无服务器化地持续部署一个网站
时间:2023-04-18 16:02:01 | 来源:网站运营
时间:2023-04-18 16:02:01 来源:网站运营
无服务器化地持续部署一个网站:Serverless 不仅仅是 Function as a Service,广义上来讲,Serverless 是云计算的一种模式。当一个软件产品运行时不直接管理机器(无论是物理机还是虚拟机)进行计算、存储时,便可算是 Serverless 架构。本文以一个构建及部署一个静态网站为例,介绍下如何无服务器化的 AWS 服务进行低成本的持续部署(Continuous Deployment,CD)。这个方案可以扩展到动态网站及其他形式的 web applications & services。
本文使用的例子是 A Serverless Pro 站点,使用 Hexo 框架。构建静态站点有许多高质量的框架,部署 Hexo 静态站点也有许多简单高效的方案,本文仅仅是使用 Hexo 作为一个简单的例子,不讨论如 “为什么不使用 jekyll 做静态站?”、“为什么不直接用 Github Pages?” 等问题。
总览下图是最终构建出来的 CD Pipeline。当一个开发者 push 一个新 commit 时,新的改动会被自动构建、部署到 AWS S3,进而分发到 CloudFront CDN。
代码管理代码管理使用的 CodeCommit 是类似于 Github 的服务,相比 Github 的优势在于其对个人或小团队的 private repository 价格低了许多。本文的例子只将 Hexo 源码 提交至 CodeCommit 而不是 Hexo 生成的静态文件,这样的好处是版本控制控制的是开发者写的源码,而不是 Hexo 生成的静态文件。
构建及测试CodeBuild 是一个用来构建及测试代码的服务,在例子中取代了如 Jenkin 、Gitlab CI 等成熟开源方案。CodeBuild 相对于成熟方案的优势在于,开发者不需要自己搭建服务器用于软件构建。本例子在源码根目录下创建了一个 buildspec.yml 文件,CodeBuild会根据这个文件在其所管理的容器实例里进行构建。
version: 0.2phases: install: commands: - npm install build: commands: - node_modules/.bin/hexo generate post_build: commands: - aws s3 sync public/ s3://$WEBSITE_BUCKET/ --cache-control max-age=3600 --delete
本例子的部署过程比较简单,只是使用 Hexo 命令生成静态文件并在成功构建之后将生成的文件上传到相应的 S3 Bucket 里。
PipelineCodePipeline 是一个用来将源码、构建、测试、部署过程串起来实现 CD 的服务。下图是该例子所使用的 Pipeline:
当一个新的 commit 被 push 到 CodeCommit 的时候,会触发 pipeline 将源码打包送到 CodeBuild。因为这个例子的部署过程仅仅是讲文件上传到 S3,所以在这个 pipeline 中便没有 Deploy 这一 stage。如果是更复杂的软件、服务,则可能需要在这个 pipeline 中增加 Beta、Gamma 及 Prod 等 stages,并在各 stages 直接添加一些如集成测试之类的 steps。
DNS、证书 及 CDN目前这个方案手动通过相应的 AWS 服务生成及管理 SSL 证书、配置 CDN 分发及 DNS资源的创建。
优势与不足这个方案扩展到更复杂的动态网站、微服务也同样适用。其优势在于不需要开发者太操心实现 CD 所需要的构建及测试服务器。一旦整条 pipeline 配置好,开发者每次提交及部署新代码所需要做的,就是一个 git push。这对初创团队是非常好的事情,让团队可以专注于开发业务本身,而不需要太考虑支撑业务开发的 infrastructure 的问题。
本文用于介绍该方案的例子也有明显的不足:手动配置的步骤太多。好在 AWS 提供了 CloudFormation 这个服务让 Infrastructure as Code 变得非常简单。
另外,使用云服务会有另一个隐患,即 vendor lock-in,以后想迁移到其他平台或技术,都变得困难。