CDN 和 DNS設置, The cloud resume challenge by Forest Brazeal - part2

AWS, TheCloudResumeChallenge

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個步驟。:

  1. 使用 CloudFront 建立 供快速存取的 CDN Cache,避免使用者直接連結 S3
  2. 透過 ACM 獲得免費公開的 SSL 認證
  3. 透過 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,因此會最後進行。我的設置順序如下

  1. ACM (Amazon Certificate Manager) 取得SSL認證
  2. 在Route53建立子網域
  3. 用CloudFront設置CDN
    1. 設置來源:S3 Endpoint
    2. 設置 HTTP 導向至 HTTPS
    3. 啟用子網域的 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 / 後面這串英數混合字串。

The cloud resume challenge by Forest Brazeal - part2

建立新的 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"}]
}}]
}

完成上述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

The cloud resume challenge by Forest Brazeal - part2

💪🏼 參考 #

 


 

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

完成上述指令會獲得 CertificationArn: arn:aws:acm:xxxxxx ,可以讓我們取得 CNAME name & value 到Route53進行 DNS認證。

The cloud resume challenge by Forest Brazeal - part2

取得 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 #

The cloud resume challenge by Forest Brazeal - part2

驗證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 紀錄。

The cloud resume challenge by Forest Brazeal - part2

💪🏼 參考 #

 


 

用 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

完成設定後CloudFront會在全球的端點展開佈置,到完成大約需要15分鐘左右。經過上述的設定,應該就能在subdomain.yourdomain.com 看到我們所上傳的 index.html檔案出現在瀏覽器中。下一步就是寫一個 Lambda Serverless function 來透過API 存取 DynamoDB上的資料了!😨

The cloud resume challenge by Forest Brazeal - part2

💪🏼 參考 #