使用 S3、Route 53、ACM、CloudFront 自托管安全静态网站
一直以来,我都梦想着搭建一个个人网站,并拥有自己的域名和托管服务。而这一切,仅仅用了两个周末就实现了。
以下是搭建https://bhuvana.pro网站的步骤,该网站是在静态网站开发完成后创建的。
整个博客分为三个阶段,您可以随时停止,但最终仍然会拥有一个可以正常运行的、拥有自定义域名的网站。
- 第一阶段 - 静态网站托管在 Route 53 路由上
- 第二阶段 - 静态网站托管在 S3 上,使用 Route 53 和 CloudFront 进行路由,并启用 ACM 进行 SSL 加密。
- 第三阶段 - 第二阶段 + CI/CD 用于部署静态网站
目录
使用的 AWS 服务
- S3
- 53号公路
- 亚马逊证书管理器
- CloudFront
- AWS CodeCommit
- AWS CodeDeploy
- AWS CodePipeline
最佳实践
- 请务必为所有创建的资源添加标签。
- S3 根域和日志存储桶
- CloudFront 分发
- 53号公路 - 托管区
- ACM - 公共证书
- 我创建了两个标签(名称:Bhuvana.pro 和用途:网站),这将有助于资源分组和成本分析。
- 为了规范 example.com 和本文通篇使用www.example.com作为根域名和子域名。
涉及的高级步骤
详细实施说明
第一阶段
我们将使用 Route 53 将静态网站部署在 S3 上,并路由到自定义域名 (example.com)。该自定义域名已在 GoDaddy.com 注册。具体步骤将按照第 1 步到第 9 步进行。
第一步:
Amazon Route 53 是一款高可用且可扩展的域名系统 (DNS) Web 服务。您可以使用 Route 53 执行三个主要功能,并且可以任意组合:域名注册、DNS 路由和健康检查。在本教程中,我们将使用 Route 53 进行 DNS 路由,并使用外部站点进行域名注册。点击此处了解更多关于 Route 53 的信息。
根据域名可用性注册您喜欢的域名。我选择在 GoDaddy 注册,只是为了将外部域名与 Route 53 集成;否则,直接在 Route 53 注册域名会自动为您创建一个托管区域。
第二步:
Amazon Simple Storage Service (Amazon S3) 是一种互联网存储服务,其静态网站托管功能可帮助您在 S3 存储桶上托管静态网站,而无需配置和管理服务器来满足扩展需求。点击此处了解更多关于如何使用 S3 的信息。
为根域名(例如 example.com)创建一个 S3 存储桶,并将静态网站的内容上传到该存储桶。
步骤 3:
为子域创建一个 S3 存储桶,并将其配置为重定向到域存储桶。
第四步:
在 Route 53 中为已注册的域名创建一个托管区域,并将 NS 记录服务器详细信息复制到 GoDaddy.com 进行更新。
如果您已在 Route 53 注册了域名,则 AWS 会自动处理此操作。
第五步:
在 GoDaddy.com 添加域名服务器。
复制服务器名称时,请记住去掉末尾的点号。
步骤 6:
现在您已经创建了两个用于托管和重定向的 S3 存储桶,让我们通过将 S3 存储桶的端点复制到浏览器来检查它是否正常工作。是的,网站已通过 S3 访问!
步骤 7:
现在需要将域名/子域名路由到托管在 S3 上的网站。您需要在托管区域下创建两个记录集,分别指向 S3 存储桶 example.com 和www.example.com。
第 8 步:
要监控网站流量,您可以启用根域名 S3 存储桶的日志记录,并将日志存储在 logs.example.com 目录下的logs/前缀下。
步骤 9:
第二阶段:
我们的网站已经上线运行,但是安全性如何呢?集成 SSL 证书当然很好。但是 S3 不支持 SSL 集成,因此我们决定使用 Amazon CloudFront 从 S3 分发静态网站,并使用从 Amazon Certificate Manager (ACM) 创建的公钥证书进行保护。
第十步:
Amazon Certificate Manager 可帮助您轻松配置、管理和部署公有及私有 SSL 证书。点击此处了解更多详情。
重要提示:您应该仅在弗吉尼亚州北部地区创建 SSL 证书,以便与 ACM 一起使用。
第 11 步:
Amazon CloudFront 是一项 Web 服务,可加速向用户分发静态和动态 Web 内容,例如 .html、.css、.js 和图像文件。CloudFront 通过遍布全球的数据中心网络(称为边缘节点)来交付您的内容。当用户请求您使用 CloudFront 提供的内容时,系统会将用户路由到延迟最低的边缘节点,从而确保内容以最佳性能交付。点击此处了解更多关于 CloudFront 的信息。
让我们在 Amazon CloudFront 中创建一个 Web 分发,作为我们静态网站托管的 CDN。
第 12 步:
在步骤 7 中,我们将域名/子域名路由到托管在 S3 上的网站。删除这些记录集,并创建两个新的记录集指向 CloudFront 域名。
如果 CloudFront Web 分发启用了 IPv6,则再创建两个记录集。
第 13 步:
第 14 步:
现在,您的网站可以通过 S3 端点(无需 SSL)浏览,也可以通过根域名和子域名(需要 SSL)浏览。
这还不够。此外,既然我们已经为您的域名集成了 SSL,用户为什么还要直接访问 S3 内容呢?
让我们使用源访问身份来限制对从 Amazon S3 存储桶提供的内容的访问,以下是步骤:
在 CloudFront 控制台中创建一个名为源访问身份 (OAI) 的特殊 CloudFront 用户,并将其与您的分发关联。
配置您的 S3 存储桶权限,以便 CloudFront 可以使用 OAI 访问存储桶中的文件并将其提供给用户。确保用户无法使用直接 URL 访问 S3 存储桶中的文件。
完成这些步骤后,用户只能通过 CloudFront 访问您的文件,而不能直接从 S3 存储桶访问。
点击此处了解更多关于 OAI 的信息,并按照以下说明进行设置。
第15步:
尝试通过 S3 端点访问内容。希望您收到403 Forbidden错误?
第一次收到“访问被拒绝”错误,这可是件好事!太棒了!!
现在,您的网站应该只能通过 CloudFront 分发的根域名和子域名访问。
衷心祝贺您和我一起成功搭建了安全的静态网站。
第三阶段:
作为一名 DevOps 人员,如果没有一个源代码控制库来对网站更改进行版本控制,并通过 DevOps 管道将更改无缝集成到 S3 存储桶中,那么实施就是不完整的,以下是架构。
定价
如果您想了解每月支出情况,请前往“我的账单”控制面板,激活我们为所有资源创建的名称和使用情况成本分配标签。激活成本分配标签后,AWS 会将这些标签关联的成本数据提供给整个账单数据管道。激活后,成本分配标签可以用作 AWS Cost Explorer 中的筛选和分组维度、AWS Budgets 中的筛选维度,以及 AWS Cost & Usage Report 中的专用列。
参考链接
使用自定义域名进行静态网站托管,
配置 SSL 证书到 CloudFront 分发
,路由到 CloudFront 分发,
通过源访问身份限制对 S3 内容的访问。




