CDN 和 DNS設置, The cloud resume challenge by Forest Brazeal - part2
為了讓自己更熟悉雲端服務,搜尋各種個人專案和挑戰的時候發現 The Cloud Resume Challenge by Forest Brazeal 。在前四個步驟時,使用了 AWS CLI 來理解設置的過程和各種選項,詳細請參考 Part 1 - 用 AWS CLI 在 S3 上架設靜態履歷 。
這篇會使用 AWS CloudFormation 用以下三個步驟來設置 CDN 和 DNS, 完成#theCloudResumeChallenge 的第5、6個步驟。:
- 使用 CloudFront 建立 供快速存取的 CDN Cache,避免使用者直接連結 S3
- 透過 ACM 獲得免費公開的 SSL 認證
- 透過 Route 53 的 DNS 服務,設置子網域 Subdomain 、將 CloudFront 位址導向到 客製化網域
在前四個步驟中將靜態頁面上傳到 S3 之後,我們可以得知Endpoint網站端點的網址、這個網址接下來會在 CloudFront 設定時使用。
http://subdomain.yourdomain.com.s3-website-ap-northeast-1.amazonaws.com
AWS 資源設置需求 #
若要將 S3 靜態網站設置為 HTTPS 、擁有客製化網址和快速可靠的將網站傳遞給使用者,我們需要「用ACM取得SSL認證」、「在Route53建立子網域」、「用CloudFront設置CDN」。
在進行 CDN 設置時會需要 SSL Certificate 、子網域和 S3 靜態網站的 Endpoint,因此會最後進行。我的設置順序如下
- ACM (Amazon Certificate Manager) 取得SSL認證
- 在Route53建立子網域
- 用CloudFront設置CDN
- 設置來源:S3 Endpoint
- 設置 HTTP 導向至 HTTPS
- 啟用子網域的 HTTPS:子網域,SSL認證
在 Route53 建立子網域 Subdomain #
Amazon Route 53 是 AWS上提供 DNS、能註冊網域名稱和確認運作狀態的服務。很適合搭配 AWS 其他服務如網路基礎設施,EC2 運算單位、Elastic Load Balancing 或 Amazon S3 等使用。除此之外也能回應請求,把特定網域轉換為對應的 IP 地址等。
因為我的網域是使用Route 53服務進行管理,接下來的操作都會用 Route 53。步驟如下 1) 確認既存網域的 Hosed Zones; 2) 設置新的子網域 CNAME Record。
確認現有 Hosted Zone ID:list-hosted-zones
#
$ aws route53 list-hosted-zones
輸入指令後會出現 hosted zone id、名稱等其他資訊,我們需要的id為 /hostedzone/Zxxxxxxxx
/ 後面這串英數混合字串。
建立新的 Record Sets:change-resource-record-sets
#
從 AWS CLI 設定 Record 需要建立一個 JSON 檔案,將我們所需要輸入的選項都寫入檔案中。
{
"Comment": "CREATE a record ",
"Changes": [{
"Action": "CREATE",
"ResourceRecordSet": {
"Name": "subdomain.yourdomain.com",
"Type": "CNAME",
"TTL": 300,
"ResourceRecords": [{ "Value": "http://subdomain.yourdomain.com.s3-website-ap-northeast-1.amazonaws.com"}]
}}]
}
- Action 建立、編輯或刪除 Record:
CREATE"|"DELETE"|"UPSERT
- Name 輸入符合規定的網域名稱:
subdomain.yourdomain.com
- Type 選擇合適的DNS Record種類:
A|CNAME
以S3靜態網站設定來說,可以使用Type:CNAME - ResourceRecords的值設定為 S3 bucket 網站端點的網址:
http://subdomain.yourdomain.com.s3-website-ap-northeast-1.amazonaws.com
完成上述JSON檔案後記得先put-object
上傳到S3 bucket,然後使用 change-resource-record-sets
來進行批次batch設定。
$ aws route53 change-resource-record-sets --hosted-zone-id ZXXXXXXXXXXX --change-batch file://record.json
- 指定 Hosted Zone:–hosted-zone-id ZXXXXXXXXXXX
- 指定 Record 設定檔案:–change-batch file://record.json
💪🏼 參考 #
- list-hosted-zones - AWS Documents
- change-resource-record-sets - AWS Documents
ACM (Amazon Certificate Manager) 取得SSL認證 #
AWS Certificate Manager 可以搭配公有與私有 Secure Sockets Layer/Transport Layer Security (SSL/TLS) 認證,讓我們在AWS內建置和管理內部連線資源。公有認證與私有認證都可以幫我們識別網路上的資源是否安全,公有認證可識別公有網際網路上的資源,而私有認證可識別私有網路上的資源。向ACM申請公有SSL認證時可以透過DNS進行驗證,用Route53幫我們快速完成驗證。
因此我們會需要 1) 向ACM申請公有認證; 2) 到Route 53新增CNAME Record 來驗證公有認證。
向 ACM 申請 SSL 認證: request-certificate
#
$ aws acm request-certificate --domain-name subdomain.yourdomain.com --validation-method DNS
- 指定子網域:–domain-name subdomain.yourdomain.com
- 指定認證方式:–validation-method DNS
完成上述指令會獲得 CertificationArn: arn:aws:acm:xxxxxx
,可以讓我們取得 CNAME name & value 到Route53進行 DNS認證。
取得 SSL 認證的CNAME name & value: describe-certificate
#
使用 describe-certificate 指令能獲得認證的詳細資訊,如認證的子網域名稱、認證狀態、認證單位等等。驗證 SSL認證時會需要 ResourceRecord 下的 Name名稱 和 Value值 。
$ aws acm describe-certificate --certificate-arn arn:aws:acm:xxxxxx
替SSL 在 Route53 上認證建立 Record:change-resource-record-sets
#
驗證SSL的方式和之前認證子網域時一樣,將需求紀錄在 JSON 上來一次進行大量的設定。在RecourceRecords下新增 Name 和 Value之後向Route 53新增Record。
$ aws route53 change-resource-record-sets --hosted-zone-id ZXXXXXXXXXXX --change-batch file://record.json
{
"Comment": "CREATE a record ",
"Changes": [{
"Action": "CREATE",
"ResourceRecordSet": {
"Name": "subdomain.yourdomain.com",
"Type": "CNAME",
"TTL": 300,
"ResourceRecords": [{
"Name": "_xxxxx.subdomain.yourdomain.com.",
"Type": "CNAME",
"Value": "_xxxxxx.wrncprvrjv.acm-validations.aws."
}]
}}]
}
完成後我們能在 Route 53 > Hosted Zones > Records 中看到子網域和 SSL認證的 CNAME Record 紀錄。
💪🏼 參考 #
- AWS Certificate Manager 常見問答集
- request-certificate - AWS Documents
- list-certificates - AWS Documents
- change-resource-record-sets - AWS Documents
用 CloudFront 來儲存、保護和傳送 S3 的靜態頁面 #
CloudFront 是Content Delivery Network (CDN) 內容傳出網路服務的一種,用安全可擴充的方式傳輸網頁、影片和API內容。相較於直接從 S3 傳送內容相比,CloudFront 的設計相對經濟、更能設置存取限制如:地理位置、簽名、Cookie等。
CloudFront 的服務有每個月的免費使用額度:資料使用量1TB以下、10M HTTP 或 HTTPS 請求以下、2M CloudFront 函數調動以內都不會計費。依照 Cloud Resume Challenge 的用途來說,每個月的費用應該會接近免費。
新建 Distribution和其他設定: create-distribution
#
在 CloudFront 快速建置 Distrubution 可以使用下列的指令來指定來源網址: S3 Endpoint 和預設的起始物件:index.html。
$ aws cloudfront create-distribution /
--origin-domain-name subdomain.yourdomain.com.s3-website-ap-northeast-1.amazonaws.com /
--default-root-object index.html
但因為我們希望對 Distribution 做更多的設定,這裡會使用上傳 JSON 設定檔的方式進行。詳細設定請參考文件:create-distribution。主要需要設定的為以下幾點,其他可以根據需求自行增減:
$ aws cloudfront create-distribution --distribution-config file://dist-config.json
- 指定原始網域(S3 bucket的網站端點)Origin Domain name
- 指定起始物件:Default Root Object
- 登陸ACM獲得的SSL認證:ACM Certificate Arn
- 是否允許HTTP或是重新導向到HTTPS:Viewer Protocol Policy
完成設定後CloudFront會在全球的端點展開佈置,到完成大約需要15分鐘左右。經過上述的設定,應該就能在subdomain.yourdomain.com
看到我們所上傳的 index.html檔案出現在瀏覽器中。下一步就是寫一個 Lambda Serverless function 來透過API 存取 DynamoDB上的資料了!😨