[AWS] 前后端分离项目如何上独立域名和HTTPS

这篇文章会介绍:使用AWS,如何给前后端分离项目换上独立域名还有使用安全的HTTPS协议。

注意:这里的HTTPS证书是使用免费的公有AWS SSL DV证书,或者Cloudflare的Universal SSL(TLS SNI)。

假设

  1. 你有一枚一级域名:example.com。
  2. 域名解析服务是由Cloudflare提供的。其实Godaddy,或者你的域名购买商都没问题,只要你会配置就可以。-
    • 注意:有些域名解析服务可能不是很可靠,或者提供的功能不是很强。
    • 小知识:域名解析是可以做做Load Balancing的,比如AWS Route 53就有这个服务,其中的Weighted Round Robin(WRR)和Latency Based Routing(LBR)就能根据权重和延时给用户不同的路由终点。
  3. 你的前端和后端是使用不同的二级域名:
    • 前端:web.example.com
    • 后端:api.example.com

本文会尽量使用AWS的服务解决托管的问题,这样使用起来更容易管理,特别是在CI/CD过程中。


前端

我现在公司使用的是AWS S3托管静态资源,然后启用S3 Bucket的Static website hosting功能。

图为Static website hosting功能,直接用endpoint就能访问你的index.html

是不是很直接很爽。如果是你不介意分配的Endpoint这么长,你其实可以直接用。

那么,如何才能用到自己的域名(web.example.com)呢?

接下来只要添加一个名为web的CNAME域名解析记录,指向上图的Endpoint,你就能用web.example.com访问这些静态资源了。

是不是很简单。🤡🤡

不好意思,其实这是不行的,你会得到一个404 NoSuchBucket的错误页面。

为什么?因为DNS服务器只会简单把web.example.com解析为上图Endpoint域名所在的AWS IP地址,比如52.219.36.14。S3 Static website hosting其实是需要从你的domain name中获取要指向的S3 bucket位置,有点Apache VirtualHost的感觉。(如果还不懂,可以留言找我。)

怎么办?😥

请使用CloudFront

创建一个CloudFront Distribution有几点需要注意。

1. 指向你的前端项目S3 Bucket

Origin ID是你选择S3 Bucket之后自动生成的。

2. 选择你的AWS ACM证书

注意,你的证书可以使免费的公共DV证书,也可以是独有的private证书。创建公共DV证书你点击“Request or Import a certification with ACM”,然后选择 “Request a Certification”按照流程走就可以。

创建AWS ACM免费公用证书的过程中,需要验证你对域名web.example.com的控制权。按照指引选择DNS验证就好,验证过程需要等几分钟。

⚠️注意:AWS ACM证书管理默认是在US East (N. Virginia)us-east-1区。如果你发现你所在的区找不到之前创建的证书,切换到该区查看。

3. 基本其他都可以保持默认配置,特别一点是,你可以开启:Redirect HTTP to HTTPS。这样更安全。

4. CloudFront贵吗?

这是亚太区的收费标准,基本产品早起阶段,收费可以忽略不计。比如我公司用了几个月,每个月不超过0.1USD

CloudFront Distribution的创建过程需要一点时间,印象中大概要等十几分钟到半个小时。创建成功后,你会得到一个分配的Domain Name。比如:dfdfdv432h212jk.cloudfront.net

拿好分配给你的Domain Name,在你的域名解析服务商添加名为web的CNAME域名解析记录,指向上面的CloudFront Domain Name。注意,这个免费证书是由Amazon颁发的。

如果你是使用Cloudflare,请选择DNS only。

要等多久就要看你的域名解析服务商。我使用Cloudflare基本等几秒就可以完成域名解析服务。

没什么意外,你应该就可以正常访问:https://web.exmaple.com


后端

如果你按照我之前的文章[AWS] 如何给EC2使用HTTPS?中的方法二,完成了API Gateway到EC2 API服务的映射。

你应该会得到一个API Gateway分配给你的URL,这个URL已经是使用HTTPS协议了。

但是,如何才能用上自己的域名api.example.com呢?

使用API Gateway

1. 在API Gateway创建Custom domain names。

我假设你已经按照我上个段落提供的方法创建了RESTful API还有Stage。

记得提前在AWS ACM验证好Domain,这里才能选择。验证的流程可以参考前端的方法。

2. 设置API mappings

Path是可选的,如果你自己的API Endpoints有层级,你可以在这里做再次的映射。比如,那些/v1, /v2的。

3 . 分配API Gateway Domain name

没什么意外的话,你有有一条自动分配的domain.

这条API Gateway Domain name并不能直接使用,你需要添加一条名为为api的CNAME域名解析记录,以实现api.exmaple.com指向这个API Gateway Domain name。这个过程是和前端配置CNAME指向CloudFront是类似的。

4 . 开启Cloudflare Proxied功能

你可能会得到这样的错误页面。

NET::ERR_CERT_REVOKED错误。

请记得在Cloudfalre开启Proxied功能。

开启 Cloudflare Proxied功能。

这个过程可能需要等十几分钟。

⚠️注意:如果你不开启这个功能,你需要是在AWS ACM导入Cloudflare Origin CA certificates。如果你的域名解析服务商没有这种Proxied功能,也就是只有DNS解析功能你可以使用AWS Route 53托管你部分的域名,比如只托管api.example.com 。篇幅问题,我不在这里展开,你可以看AWS文档了解一下。

5 . 完结.

这是我给公司弄的health-check Endpoint,方便检查api是否正常运作。

开启Proxied之后,使用的是Cloudfalre Universal SSL证书。这种可以让这么多域名共享证书的技术叫做TLS SNI

sni.cloudflaressl.com证书。

好的,完成上述步骤,你应该就可以正常访问: https://api.exmaple.com

完。

本文写作耗时约3.5小时。

Leave a Reply

Your email address will not be published. Required fields are marked *