iT邦幫忙

2023 iThome 鐵人賽

DAY 19
0

寫在正文之前

事發突然,很抱歉我電腦喝了很大一杯水。我這幾天只能先打打標題文字,圖片或進階測試,請容我搞定電腦後再回來補。


正文開始

近年來也許大家也聽過一個詞, Edge Computing,幾個大家可能比較有機會聽過的 CDN 服務提供業者也都有提供相關的資訊,比方說:

同時,也推出了對應的產品。

  • AWS: 邊緣函數 (Edge Functions: Lambad@Edge + CloudFront Functions)
  • CloudFlare: Cloudflare Workers
  • Akamai: EdgeWorkers

概念上都很類似,讓一部份的運算任務儘可能在靠近客戶的部分出現。

快問快答,這是為什麼?

這是因為機器效能能靠硬體改進,但光速不變、距離越遠,傳送需要消耗的時間也越久。(不然愛因斯坦要從墳墓裡爬起來了)

所以各家都採用了類似的作法。今天我們以 CloudFront 的作法作舉例。

CloudFront 的 Edge Functions

如同前面提到,EdgeFunctions 包含了兩部分: Lambda@edge & CloudFront Functions,我是這樣認知這兩種服務

  • Lambda@edge: 在 REC(RegionalEdgeCache) 執行的程式。能力強大,支持 Node.js & Python,有網路能力。
  • CloudFront Functions: 在 PoP 執行的程式,能力稍微沒有那麼強大,只支持 JavaScript(和ECMAScripts 很像,但有時會遇到小小的不一樣)
    如果你比較想直接看原廠文件,點這裡

當然,可以在哪個地方 trigger(觸發、或者你習慣稱之為「調用」,對岸用語) 這些程式,也是值得我們瞭解的點。
如果我們把 Client <--> CloudFront <--> Origin 畫出來,就比較能明白有哪些點(搭配官方講法)

  • viewer request: Client 將請求送進 CloudFront 網路
  • origin request: CloudFront 去 Origin 抓資料
  • origin response: CloudFront 收到 Origin 的回應。
  • viewer response: CloudFront 將資料返回

參考下圖: 資料來源

但實際上,還可以再更細一點。 因為 CloudFront Functions 和 Lambda@Edge 分別在 PoP & REC 執行,
所以可以參考另一張。

也因為如此,所以 CloudFront Functions 的執行記錄(Ex: CloudWatch Metrics, CloudWatch Logs),就呈現在不同的地方。

  • Lambda@edge: 在 Regions (以台灣為例,我目前的經驗都是看到在 ap-northeast-1 region)
  • CloudFront Functions: 集中在 us-east-1(不然全球超過 400 個 PoP 也不好查?)

那麼,還有什麼值得注意的地方呢?
我們透過實作功能來比較,或許更容易說明白些。

實作練習。

練習目標,分別以 Lamda@edge 以及 CloudFront Functions,在收到 Client 送來對跟目錄的請求後,轉址(302)到 2023鐵人賽首頁()。

Lambda@edge 參考代碼 (runtime 為 Node.js 16.x)

'use strict';

exports.handler = (event, context, callback) => {
    //新的目標URL
    const newLocation="https://ithelp.ithome.com.tw/2023ironman/event";
    //直接取 request 
    const request = event.Records[0].cf.request;

    //檢查到 URL相符,就理所當然的下手
    if(request.uri=='/'){
        const response = {
        status: '302',
        statusDescription: 'Found',
        headers: {
            location: [{
                key: 'Location',
                value: newLocation,
            }],
        },
    };
    callback(null, response);
    };     
}

CloudFront Functions 參考代碼

function handler(event) {
  var request =  event.request;
  var newLocation="https://ithelp.ithome.com.tw/2023ironman/event"
  var uri = request.uri;

  var querystring = request.querystring;
   //checking url if it is the target.
   if (uri =='/' ) {

       var response = {
           statusCode: 302,
           statusDescription: 'Found',
           headers:{ 
                "location": { "value": newLocation }
              }
           
       }
       return response;
  }
   
   // if the uri does not match, just let go. 

    return request;
}

Okay, 我們現在有兩隻程式了,能否順利執行呢,這又有什麼差別呢?
讓我們留在明天繼續討論:)


P.S.艦長提醒我這樣混會被判定斷賽,感謝艦長

電腦壞了就遇到了,比起電腦,我需要先好好安慰我家的小女孩。

所以先附上她的照片。很可愛吧。
當父親的怎麼能生她的氣?

https://ithelp.ithome.com.tw/upload/images/20230921/201625023qPQG0v6AS.jpg

這幾天很抱歉,我會努力修好電腦的


上一篇
Day 18 - 進一步比較 Policy 和 Legacy Settings
下一篇
Day 20 - Lambda@Edge & CloudFront Functions,我們繼續
系列文
2023 年了,一起來學 CDN - 你也可以瞭解的 CloudFront 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言