将你的 Astro 网站部署到 AWS
AWS 是一个功能齐全的 Web 应用托管平台,可以用来部署 Astro 网站。
将你的项目部署到 AWS 需要使用 AWS 控制台(大部分操作也可以使用 AWS CLI 进行)。本指南将指导你按照最基本的方法将网站部署到 AWS 上,然后演示如何添加额外的服务以降本增效。
AWS Amplify
段落标题 AWS AmplifyAWS Amplify 是一套专为前端 Web 和移动开发人员设计的工具和功能,可以让你在 AWS 上快速轻松地构建全栈应用程序。
-
创建一个新的 Amplify Hosting 项目。
-
将你的仓库连接到 Amplify。
-
修改构建输出目录
baseDirectory
为/dist
。
如果使用 pnpm
,则需要稍微不同的配置来缓存 pnpm 存储目录而不是 node_modules
。以下是建议的构建配置:
之后 Amplify 将自动部署你的网站,并在你向仓库推送提交时进行更新。
S3 静态网站托管
段落标题 S3 静态网站托管S3 是任何应用程序的起点,因为它是一个可以存储你项目文件和其他资源的地方。S3 按照文件存储和请求数量收费。你可以在 AWS 文档 中找到有关 S3 的更多信息。
-
创建一个与你的项目名称相对应的 S3 存储桶。
存储桶名称应该是全局唯一的,我们建议使用你的项目名称以及你的站点域名来组合。
-
禁用 “Block all public access”。默认情况下,AWS 将所有存储桶设置为私有。要使其公开访问,你需要在存储桶的属性中取消选中“Block public access”复选框。
-
将你构建后的文件(位于
dist
目录)上传到 S3。你可以在控制台手动执行此操作,也可以使用 AWS CLI。如果使用 AWS CLI,请在 使用 AWS 凭证进行身份验证 后,使用以下命令: -
更新你的存储桶策略以允许公共访问。你可以在存储桶的权限 > 存储桶策略中找到此设置。
不要忘记将
<BUCKET_NAME>
替换为你的存储桶名称。 -
为你的存储桶启用网站托管。你可以在存储桶的 Settings > Static website hosting 中找到此设置。将你的索引文档设置为
index.html
,错误文档设置为404.html
。最后,在存储桶的 Settings > Static website hosting 中找到你的新网站 URL。如果你正在部署单页面应用程序 (SPA),请将错误文档设置为
index.html
。
S3 与 CloudFront
段落标题 S3 与 CloudFrontCloudFront 是一个提供内容分发网络 (CDN) 功能的 Web 服务。它用于缓存 Web 服务器的内容并将其分发给用户。CloudFront 按照传输的数据量收费。将 CloudFront 添加到你的 S3 存储桶中可以更为经济的同时也提供更快的分发速度。
我们将使用 CloudFront 来包装我们的 S3 存储桶,以使用亚马逊全球 CDN 网络为项目的文件提供服务。这样可以降低提供项目文件的成本,并提高站点的性能。
S3 设置
段落标题 S3 设置-
使用你的项目名称创建一个 S3 存储桶。
存储桶名称应为全局唯一。我们建议使用你的项目名称和站点的域名来组合。
-
将位于
dist
目录中的构建文件上传到 S3。你可以在控制台手动执行此操作,也可以使用 AWS CLI。如果使用 AWS CLI,可以在 使用 AWS 凭证进行身份验证 后使用以下命令: -
更新存储桶策略以允许 CloudFront 访问。你可以在存储桶的 Permissions > Bucket policy 中找到此设置。
请确保将
<CLOUDFRONT_OAI_ID>
替换为你的 CloudFront Origin Access Identity ID 的名称。你可以在设置 CloudFront 后,在 CloudFront > Origin access identities 中找到 CloudFront Origin Access Identity ID。
CloudFront 设置
段落标题 CloudFront 设置- 创建一个 CloudFront 分发,并按如下值配置:
- 源域名:你的 S3 存储桶
- S3 存储桶访问:“Yes use OAI (bucket can restrict access to only CloudFront)”
- 源访问标识:创建一个新的源访问标识
- 查看者 - 存储桶策略:“No, I will update the bucket policy”
- 查看者协议策略:“Redirect to HTTPS”
- 默认根对象:
index.html
这样的配置将阻止公共互联网访问你的 S3 存储桶,并通过全球 CDN 网络提供你的网站。你可以在存储桶的 Distributions > Domain name 中找到你的 CloudFront 分发 URL。
CloudFront 函数设置
段落标题 CloudFront 函数设置不幸的是,默认情况下,CloudFront 不支持多页的 sub-folder/index
路由。为了配置它,我们将使用 CloudFront 函数将请求定向到 S3 中所需的对象上。
-
使用以下代码片段创建一个新的 CloudFront 函数。你可以在 CloudFront > Functions 中找到 CloudFront 函数。
-
将函数附加到 CloudFront 分发中。你可以在 CloudFront 分发的 Settings > Behaviors > Edit > Function 关联中找到此选项。
- 查看者请求 - 函数类型: CloudFront 函数。
- 查看者请求 - 函数 ARN: 选择在前面创建的函数。
CloudFront 错误页面设置
段落标题 CloudFront 错误页面设置默认情况下,当未找到文件时 S3 会返回 404 错误,当文件是私有的时返回 403 错误。这会导致访问者在这两种情况下都看到一个不友好的 XML 错误页面。
为了解决这个问题,可以在你的 CloudFront 分发的 Settings > Error pages 中添加自定义错误响应。
-
使用以下值来为 404 错误创建一个自定义错误响应:
- HTTP 错误状态码:404: Not Found
- 自定义错误响应:Yes
- 响应页面路径:
/index.html
- HTTP 响应状态码:200: OK
-
使用以下值来为 403 错误创建一个自定义错误响应:
- HTTP 错误状态码:403: Forbidden
- 自定义错误响应:Yes
- 响应页面路径:
/index.html
- HTTP 响应状态码:200: OK
为了提供最佳的用户体验,你可以在你的项目中创建一个自定义的 404 页面,并将响应页面路径设置为 /404.html
。
使用 GitHub Actions 实现持续部署
段落标题 使用 GitHub Actions 实现持续部署有许多方法可以为 AWS 设置持续部署。对于托管在 GitHub 上的代码,一种可能的方法是使用 GitHub Actions 在每次提交时部署你的网站。
-
创建一个新的策略在你的 AWS 账户中使用 IAM 并拥有以下权限。这个策略将允许你在提交时上传构建好的文件到你的 S3 存储桶,并且在提交时使 CloudFront 分布的文件失效。
不要忘记替换
<DISTRIBUTION_ARN>
和<BUCKET_NAME>
。你可以在 CloudFront > Distributions > Details 中找到 ARN。 -
创建一个新的 IAM 用户并将该策略附加到用户上。这将需要你提供
AWS_SECRET_ACCESS_KEY
和AWS_ACCESS_KEY_ID
。 -
将以下示例工作流添加到你的代码库中的
.github/workflows/deploy.yml
文件中,并将其推送到 GitHub。你需要将AWS_ACCESS_KEY_ID
、AWS_SECRET_ACCESS_KEY
、BUCKET_ID
和DISTRIBUTION_ID
作为“secrets”添加到 GitHub 代码库中的 Settings > Secrets > Actions 中。使用 New repository secret 按钮来添加每个秘钥。BUCKET_ID
是你的 S3 存储桶的名称。DISTRIBUTION_ID
是你的 CloudFront 分发 ID。你可以在 CloudFront > Distributions > ID 中找到你的 CloudFront 分发 ID。