使用 S3 和 CloudFront 部署到 AWS

Amazon S3 是一种静态存储产品,可用作静态文件的主机,例如由 Vue CLI 的构建脚本生成的文件。

CloudFront 是 AWS 的内容交付网络 (CDN) 产品。 CDN 可以通过从边缘位置提供静态内容来提高 Web 应用程序的性能。这些服务器位于世界各地,并且比源服务器(实际提供内容的服务器)在地理位置上更有可能靠近最终用户。如果 CDN 中的边缘服务器没有缓存资源,则它们会从源请求资源,但会为后续请求提供服务。

以下步骤的先决条件是 AWS 账户:

  1. 我们将从创建和配置 S3 存储桶开始。

    我们首先前往 S3 产品页面。它看起来类似于以下屏幕截图:

    image 2023 10 17 20 05 50 841
    Figure 1. Figure 14.33: Select S3 from the AWS service list
  2. 在 S3 控制台主页上,我们可以单击创建存储桶按钮,这将带我们进入存储桶创建页面,如下所示:

    image 2023 10 17 20 07 09 816
    Figure 2. Figure 14.34: The Create bucket button on the AWS S3 console
  3. 首先,我们首先命名我们的存储桶。出于本示例的目的,我们将其称为 vue-workshop,如下所示:

    image 2023 10 17 20 08 05 157
    Figure 3. Figure 14.35: Entering the bucket name on the bucket creation page
  4. 我们还需要将 S3 存储桶设置为公开。这是通过取消选中 “阻止所有公共访问” 复选框来完成的。完成此操作后,我们必须选中确认复选框,如下所示:

    image 2023 10 17 20 09 18 640
    Figure 4. Figure 14.36: Set the S3 bucket to be public and acknowledge the warning
  5. 完成此操作后,我们将重定向到存储桶列表页面。我们想要点击进入我们的新存储桶。 然后,我们需要访问属性(Properties)标签才能找到静态网站托管选项:

    image 2023 10 17 20 11 20 096
    Figure 5. Figure 14.37: The Static website hosting option in the S3 bucket’s Properties tab
  6. 我们可以填写静态网站托管 S3 属性,选择使用此存储桶托管网站并将索引文档和错误文档设置为 index.html。最好记下端点 URL,我们需要它来配置 CloudFront,如下所示:

    image 2023 10 17 21 49 07 288
    Figure 6. Figure 14.38: Filling out the Static website hosting S3 property
  7. 现在,我们可以返回到 S3 存储桶页面的 “概述” 选项卡,单击 “上传”,然后从 dist 文件夹之一拖放文件,如以下屏幕截图所示:

    image 2023 10 17 21 50 11 101
    Figure 7. Figure 14.39: Adding files to the vue-workshop S3 bucket through drag and drop
  8. 将文件拖放到概述页面后,我们单击 “下一步”,并需要通过在页面的 “管理公共权限” 部分中选择 “授予对此对象的公共读取访问权限” 来确保将文件权限设置为公共。 完成后,我们在查看正在上传的文件后,可以通过单击 “下一步” 和 “上传” 来完成上传,无需对默认值进行任何更改,如下所示:

    image 2023 10 17 21 51 26 384
    Figure 8. Figure 14.40: Setting file permissions to public on files being uploaded to the S3 bucket
  9. 我们的 S3 存储桶现在应该配置为托管静态内容,通过访问网站端点(可在属性 | 静态网站托管中找到),我们会看到以下 Vue.js 应用程序(这是我们上传的内容):

    image 2023 10 17 21 52 31 022
    Figure 9. Figure 14.41: The Vue.js application being served from our AWS S3 bucket

    请注意,S3 只能通过 HTTP 为站点提供服务,并且无法直接从 S3 存储桶配置域名。 除了性能和稳健性之外,能够设置自定义域名和 HTTPS 支持也是将 AWS CloudFront 设置为我们网站的 CDN 的其它原因。

  10. 我们将首先导航到 CloudFront 控制台并单击 “创建分配” 按钮,如下所示:

    image 2023 10 17 21 53 43 203
    Figure 10. Figure 14.42: Select CloudFront from the AWS service list
  11. 当提示我们要创建哪种类型的发行版时,我们将通过单击相关的“开始”按钮来选择“Web”,如以下屏幕截图所示:

    image 2023 10 17 21 54 29 312
    Figure 11. Figure 14.43: Choosing to create a Web CloudFront distribution
  12. 原始域名应该是 S3 存储桶网站端点域 - 换句话说,我们之前用来访问它的 URL 的域。 对于 us-east-1 区域中的示例存储桶,它看起来类似于 example.s3-website.us-west-1.amazonaws.com。 以下屏幕截图显示了这一点:

    image 2023 10 17 21 55 12 541
    Figure 12. Figure 14.44: Enter the website endpoint domain in the CloudFront distribution’s "Origin Domain Name" field
  13. 当我们设置分发时,最好为 “默认缓存行为” 部分的 “查看器协议策略” 字段选择 “将 HTTP 重定向到 HTTPS” 选项,如下所示:

    image 2023 10 17 21 56 05 652
    Figure 13. Figure 14.45: Select Redirect HTTP to HTTPS for the Viewer Protocol Policy field

现在,我们准备好单击 “创建分发” 按钮并等待更改传播。

CloudFront 分发更改需要一段时间才能传播,因为它们被部署到世界各地的服务器。

一旦控制台显示 CloudFront 分发的状态为已部署,我们就可以为其打开域名。

我们已经了解了如何设置 S3 和 CloudFront 来为静态网站提供服务。现在我们将了解如何使用 AWS CLI 将本地目录同步到 S3 存储桶。

下一部分的前提条件是 shell 实例已使用 AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY 和 AWS_DEFAULT_REGION 环境变量注入了 AWS 凭据。访问密钥和秘钥需要从 Account | My Security Credentials | Access Keys 下拉菜单中生成。它还需要 AWS CLI 第 2 版。

如果我们在 Vue CLI 项目中,可以使用 AWS S3 CLI 命令将 dist 文件夹(可使用 npm run build 构建)部署到我们的 vue-workshop bucket 中。我们要更新一个 S3 资源,这样我们的命令就会以 aws s3 开头。我们要发布的命令是同步文件,因此将使用 aws s3 sync 命令。我们将使用 AWS URI 语法把 ./dist 同步到 vue-workshop S3 存储桶,即 s3://vue-workshop。我们还要确保上传的文件与 S3 存储桶配置一样,允许公开读取。命令全文如下:

aws s3 sync ./dist s3://vue-workshop --acl=public-read

练习 14.03:从 GitLab CI/CD 部署到 S3

S3 是一种非常经济高效且高性能的解决方案,用于大规模存储静态文件。在本练习中,我们将了解如何集成 GitLab CI/CD 和 AWS S3 来部署 Vue.js 应用程序。这会自动部署 Vue.js 应用程序。每次推送到 GitLab 时都会运行部署,无需任何手动干预。

要访问本练习的代码文件,请参阅 https://packt.live/3kJ1HPD

为了从 GitLab CI/CD 部署到 S3 存储桶,我们需要首先设置凭证管理:

  1. 导航到 GitLab 的 CI/CD 设置部分,如下所示:

    image 2023 10 17 22 04 30 621
    Figure 14. Figure 14.46: CI/CD in the Settings menu
  2. 我们需要添加变量,所以让我们扩展该部分。您将看到一条消息,如以下屏幕截图所示:

    image 2023 10 17 22 05 57 674
    Figure 15. Figure 14.47: The Variables section of the GitLab CI/CD settings expanded
  3. 接下来,我们将使用 UI 添加 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY(这些值未显示,因为它们是敏感的 API 密钥),如下所示:

    image 2023 10 17 22 07 14 067
    Figure 16. Figure 14.48: Entering the AWS_ACCESS_KEY_ID environment variable
  4. 然后,我们可以使用 UI 添加默认的 AWS_REGION 变量。这不是那么敏感,所以它的值如下面的截图所示:

    image 2023 10 17 22 08 28 207
    Figure 17. Figure 14.49: Entering the AWS_DEFAULT_REGION environment variable
  5. 现在我们已经在 GitLab CI/CD 上设置了环境变量,我们可以开始更新 .gitlab-ci.yml 文件。 首先,我们希望在构建步骤之后开始缓存 dist 目录。 为此,我们需要向构建作业添加一个缓存属性:

    build:
        # other properties
        cache:
            key: $CI_COMMIT_REF_SLUG
            paths:
              - dist
        # other properties
    # other jobs
  6. 我们现在可以添加部署(deploy)作业,这将是部署(deploy)阶段的一部分。 要访问 AWS CLI,我们将使用 Python 映像 (python:latest) 并在 before_script 步骤中使用 pip(Python 包管理器)安装 AWS CLI。安装 AWS CLI 后,我们将使用我们用于从本地计算机部署的 aws s3 sync 命令在脚本步骤中运行部署:

    # other jobs
    deploy:
        image: python:latest
        stage: deploy
        cache:
            key: $CI_COMMIT_REF_SLUG
            paths:
              - dist
        before_script:
          - pip install awscli
        script:
          - aws s3 sync ./dist s3://vue-workshop --acl=public-read

我们不需要使缓存失效,因为 Vue CLI 构建命令通过对文件名中的文件内容进行指纹识别来内置缓存清除功能。指纹识别意味着如果文件内容发生变化,其名称/URL 也会相应变化。当请求这个新文件时,它将从未缓存的 URL 加载,因此将获取该文件的最新版本。

一旦配置更新被推送到 GitLab 存储库,我们可以看到管道运行三个阶段,全部通过,如下所示:

image 2023 10 17 22 13 29 129
Figure 18. Figure 14.50: Passing build, test, and deploy jobs

我们现在已经了解了如何使用 AWS CLI 和 GitLab CI/CD 配置 Vue.js 应用程序并将其部署到 S3 和 CloudFront。

活动 14.01:使用 GitLab 将 CI/CD 添加到图书搜索应用程序并部署到 Amazon S3 和 CloudFront

现在,我们来构建一个完全构建的图书搜索 Vue.js 应用程序,该应用程序从 Google Books API 加载数据,并使用 GitLab CI/CD 将其部署到 S3/CloudFront。 我们将首先在本地运行生产构建并检查输出。 然后,我们将切换到在 GitLab CI 上运行构建和代码质量步骤(linting)。 最后,我们将设置一个 S3 存储桶和 CloudFront 发行版,并将它们与 GitLab CI/CD 集成,以便在每次推送到存储库时进行部署。

该活动的开始代码可以在 Chapter14/Activity14.01_initial 中找到;我们从使用 Vue CLI 构建图书搜索应用程序开始。 解决方案可以在 Chapter14/Activity14.01_solution 找到:

  1. 首先,我们需要在本地运行生产构建。我们可以使用常规命令来构建所有用于生产的 Vue CLI 项目。 我们还需要检查相关资源(JavaScript、CSS 和 HTML)是否正确生成。

    我们期望 dist 文件夹包含类似的结构,如下所示:

    image 2023 10 17 22 15 20 868
    Figure 19. Figure 14.51: Sample contents of the dist folder (generated using the tree command) after a Vue CLI production build run
  2. 为了运行 GitLab CI/CD,我们需要一个 .gitlab-ci.yml 文件。我们将向 .gitlab-ci.yml 添加一个作业,在构建阶段运行软件包的安装,然后在 Node.js LTS Docker 容器中进行生产构建。我们还将确保缓存生产版本的输出。

    一旦我们使用 git add .gitlab-ci.yml 并提交并推送更改,我们应该看到以下 GitLab CI/CD 管道运行,其中包括处于运行状态的 build 作业:

    image 2023 10 17 22 17 21 231
    Figure 20. Figure 14.52: The GitLab CI/CD pipeline with the build job running

    另一方面,以下屏幕截图表示构建作业已完成并处于通过状态时的 GitLab CI/CD 管道:

    image 2023 10 17 22 18 12 837
    Figure 21. Figure 14.53: GitLab CI/CD pipeline with the build job passed
  3. 接下来,我们希望将代码质量作业添加到 GitLab CI/CD 的测试阶段(通过更新 .gitlab-ci.yml)。我们将该作业称为 lint,它将运行依赖项的安装以及通过 Vue CLI 进行 linting。

    一旦我们使用 git add .gitlab-ci.yml 并提交并推送更改,我们应该看到以下 GitLab CI/CD 管道运行,其中包括处于运行状态的 lint 作业:

    image 2023 10 17 22 19 26 759
    Figure 22. Figure 14.54: The GitLab CI/CD pipeline with the lint job running

    以下屏幕截图显示了 GitLab CI/CD 管道,其中 lint 作业已成功完成:

    image 2023 10 17 22 20 07 235
    Figure 23. Figure 14.55: GitLab CI/CD pipeline with the lint job passed
  4. 为了部署我们的应用程序,我们需要创建一个 vue-workshopbook-search S3 存储桶,并使用 S3 控制台启用公共访问。

    S3 存储桶创建页面应如下所示:

    image 2023 10 17 22 21 03 155
    Figure 24. Figure 14.56: The S3 bucket creation page with vue-workshop-book-search entered as the bucket name

    以下屏幕截图显示了 S3 存储桶创建页面上的公共访问和免责声明信息:

    image 2023 10 17 22 21 46 339
    Figure 25. Figure 14.57: The S3 bucket creation page with public access enabled and the relevant disclaimer accepted
  5. 要通过网络访问 S3 存储桶内容,我们还需要将其配置为网络托管。我们可以通过 S3 控制台配置 Web 托管属性。

    它应该配置如下,索引和错误页面设置为 index.html:

    image 2023 10 17 22 24 04 303
    Figure 26. Figure 14.58: The S3 bucket properties page with web hosting enabled and configured with the index and error page set to index.html
  6. 为了使 GitLab CI/CD 能够在 S3 上创建和更新文件,我们需要将相关的 AWS 密钥添加到我们的 GitLab 存储库 CI/CD 设置中。这些秘密可在 AWS 管理控制台的 Username 下拉列表中找到 | My Security Credentials | Access keys(access key ID 和 加密访问密钥)| 创建新的访问密钥(或选择要重复使用的密钥)。以下屏幕截图显示了这些详细信息:

    image 2023 10 17 22 27 30 091
    Figure 27. Figure 14.59: The GitLab CI/CD settings page with required the AWS environment variables added (with values masked)
  7. 接下来,我们希望将部署作业添加到 GitLab CI/CD 上的部署阶段(通过更新 .gitlab-ci.yml)。我们将作业称为 deploy;它需要下载 awscli pip 包(Python 包管理器),这意味着最有意义的 Docker 镜像是 python:latest。部署作业将从缓存加载构建的生产版本,使用 pip 安装 awscli,并运行 aws s3sync <build_directory> s3://<s3-bucket-name> --acl=public-read。

    一旦我们使用 git add .gitlab-ci.yml 并提交并推送更改,我们应该看到以下 GitLab CI/CD 管道运行,其中包括处于运行状态的部署(deploy)作业:

    image 2023 10 17 22 30 12 586
    Figure 28. Figure 14.60: The GitLab CI/CD pipeline with the deploy job running

    以下屏幕截图显示了部署作业成功完成的 GitLab CI/CD 管道:

    image 2023 10 17 22 30 46 348
    Figure 29. Figure 14.61: The GitLab CI/CD pipeline with the deploy job passed

    管道完成后,我们的应用程序应该可以通过 Web S3 端点使用,如以下屏幕截图所示:

    image 2023 10 17 22 31 20 926
    Figure 30. Figure 14.62: Book search accessed through the S3 web endpoint URL
  8. 最后,我们将创建一个 CloudFront 发行版,充当 Web S3 端点的 CDN。 我们需要将 origin 设置为 S3 存储桶 Web 端点的原点,并确保我们已启用“将 HTTP 重定向到 HTTPS”,如以下屏幕截图所示:

image 2023 10 17 22 32 11 512
Figure 31. Figure 14.63: The CloudFront distribution creation page, displaying the origin and behavior settings

部署 CloudFront 发行版后,我们的应用程序应该可以通过 CloudFront 发行版的域访问,如以下屏幕截图所示:

image 2023 10 17 22 32 48 905
Figure 32. Figure 14.64: Book search accessed through the CloudFront domain displaying results for a "harry potter" query

总结

在本章中,我们研究了如何将 CI 和 CD 实践引入 Vue.js 项目,以便安全高效地部署到生产环境。 我们已经看到 CI 和 CD 在敏捷交付流程中如何发挥作用。 我们使用 GitLab 的 CI/CD 功能来运行测试、linting 并在每次提交上进行构建。 我们了解了如何通过将 Netlify 连接到我们的托管提供商来利用 Netlify 托管静态网站。最后,我们了解了如何设置和部署到 AWS S3 和 CloudFront。

通过本书,您学习了如何构建、测试和部署 Vue.js 应用程序,该应用程序可以为您的团队和最终用户扩展和执行。