教學課程:建立基本 Lambda@Edge 函數 - Amazon CloudFront

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

教學課程:建立基本 Lambda@Edge 函數

本教學課程說明如何透過建立和設定在 中執行的範例 Node.js 函數,開始使用 Lambda@Edge CloudFront。當 CloudFront 擷取檔案時,此範例會將HTTP安全標頭新增至回應。(這可以改善網站的安全性和隱私權。)

本教學課程不需要您自己的網站。不過,當您選擇建立自己的 Lambda@Edge 解決方案時,請遵循類似的步驟並從相同的選項中選取 。

步驟 1:註冊 AWS 帳戶

如果您尚未這樣做,請註冊 AWS 帳戶。如需詳細資訊,請參閱註冊 AWS 帳戶

步驟 2:建立CloudFront 分佈

在建立 Lambda@Edge 函數範例之前,您必須有一個 CloudFront環境來使用,其中包含從中服務內容的原始伺服器。

在此範例中,您可以建立使用 Amazon S3 儲存貯體作為 CloudFront 分發來源的分發。如果您已有環境可使用,可以略過此步驟。

使用 CloudFrontAmazon S3 原始伺服器建立分佈
  1. 使用一兩個檔案來建立 Amazon S3 儲存貯體,例如範例內容適用的映像檔案。如需說明,請遵循將您的內容上傳到 Amazon S3 中的步驟。請確定您有設定對應的許可,以授予儲存貯體中物件的公有讀取權限。

  2. 按照建立 CloudFront Web CloudFront 分佈 中的步驟建立分佈,並將 S3 儲存貯體新增為原始伺服器。如果您已有分佈,可以改為新增儲存貯體當做該分佈的來源。

    提示

    請記下您的分佈 ID。在本教學稍後的課程中,當您為函數新增 CloudFront 觸發條件時,您必須在下拉式清單中選擇分發的 ID,例如 E653W22221KDDL

步驟 3:建立函數

在此步驟中,您可以從 Lambda 主控台中的藍圖範本建立 Lambda 函數。函數會新增程式碼來更新分佈中的 CloudFront安全標頭。

建立 Lambda 函式
  1. 登入 AWS Management Console 並在 開啟 AWS Lambda 主控台https://console.aws.amazon.com/lambda/

    重要

    請確定您位於美國US-East-1(維吉尼亞北部) AWS 區域 (us-east-1)。您必須位在此區域,才能建立 Lambda@Edge 函數。

  2. 選擇 Create function (建立函數)

  3. 建立函數頁面上,選擇使用藍圖 ,然後在cloudfront搜尋欄位中輸入 CloudFront 藍圖進行篩選。

    注意

    CloudFront 藍圖僅適用於 US-East-1 (維吉尼亞北部) 區域 (us-east-1)。

  4. 選擇修改HTTP回應標頭藍圖作為函數的範本。

  5. 輸入以下有關函數的資訊:

    • 函數名稱 – 輸入函數的名稱。

    • 執行角色 – 選擇如何設定函數的許可。若要使用建議的基本 Lambda@Edge 許可政策範本,請選擇從 AWS 政策範本 建立新角色

    • 角色名稱 – 輸入政策範本建立的角色名稱。

    • 政策範本 – Lambda 會自動新增政策範本 Basic Lambda@Edge 許可,因為您選擇 CloudFront藍圖作為函數的基礎。此政策範本會新增執行角色許可, CloudFront 允許 在全球 CloudFront 位置為您執行 Lambda 函數。如需詳細資訊,請參閱設定 Lambda@Edge 的IAM許可和角色

  6. 選擇頁面底部的建立函數

  7. 在顯示的部署至 Lambda@Edge 窗格中,選擇取消 。(在本教學課程中,您必須先修改函數程式碼,才能將函數部署至 Lambda@Edge。)

  8. 向下捲動至頁面的程式碼來源區段。

  9. 使用修改原始伺服器傳回之安全性標頭的函數,來取代範本程式碼。例如,您可能會使用與下列類似的程式碼:

    'use strict'; export const handler = (event, context, callback) => { //Get contents of response const response = event.Records[0].cf.response; const headers = response.headers; //Set new headers headers['strict-transport-security'] = [{key: 'Strict-Transport-Security', value: 'max-age= 63072000; includeSubdomains; preload'}]; headers['content-security-policy'] = [{key: 'Content-Security-Policy', value: "default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'"}]; headers['x-content-type-options'] = [{key: 'X-Content-Type-Options', value: 'nosniff'}]; headers['x-frame-options'] = [{key: 'X-Frame-Options', value: 'DENY'}]; headers['x-xss-protection'] = [{key: 'X-XSS-Protection', value: '1; mode=block'}]; headers['referrer-policy'] = [{key: 'Referrer-Policy', value: 'same-origin'}]; //Return modified response callback(null, response); };
  10. 選擇檔案 儲存 以儲存更新後的程式碼。

  11. 選擇部署

前往下一節以新增 CloudFront 觸發程序來執行函數。

步驟 4:新增CloudFront 觸發程序以執行函數

現在您已擁有 Lambda 函數來更新安全標頭,請設定CloudFront 觸發程序來執行函數,以新增從分發原始伺服器接收的任何回應 CloudFront中的標頭。

設定函數的 CloudFront 觸發程序
  1. 在 Lambda 主控台的函數概觀頁面上,選擇新增觸發程序

  2. 針對觸發組態 ,選擇 CloudFront

  3. 選擇部署至 Lambda@Edge

  4. 部署至 Lambda@Edge 窗格中,在設定 CloudFront 觸發程序 下,輸入下列資訊:

    • 分佈 – CloudFront要與您的函數建立關聯的分佈 ID。在下拉式清單中,選擇分佈 ID。

    • 快取行為 – 要與觸發程序搭配使用的快取行為。在此範例中,請將值的設定保留為 *,這代表分佈的預設快取行為。如需詳細資訊,請參閱 分佈設定參考 主題中的 快取行為設定

    • CloudFront event – 指定函數執行時間的觸發條件。我們希望每當 CloudFront 傳回原始伺服器的回應時,安全標頭函數都會執行。在下拉式清單中,選擇 Origin 回應 。如需詳細資訊,請參閱新增 Lambda@Edge 函數的觸發條件

  5. 選取確認部署至 Lambda@Edge 核取方塊。

  6. 選擇部署以新增觸發程序,並將函數複寫至全球 AWS 位置。

  7. 請等候函數完成複寫。這通常需要幾分鐘的時間。

    您可以前往 CloudFront主控台並檢視分佈,查看複寫是否已完成。等待分佈狀態從部署變更為日期和時間,這表示您的函數已複寫。若要驗證函數是否可正常運作,請依照下一節的步驟進行。

步驟 5:驗證函數正常執行

現在,您已經建立 Lambda 函數並設定觸發程序來執行該函數以進行 CloudFront 分佈,請檢查該函數是否達到預期。在此範例中,我們會檢查傳回的HTTP CloudFront標頭,以確保已新增安全標頭。

驗證您的 Lambda@Edge 函數有新增安全標頭
  1. 在瀏覽器中,輸入 S3 儲存貯體中檔案URL的 。例如,您可以使用URL類似 的 https://d111111abcdef8.cloudfront.net/image.jpg

    如需要在 檔案中使用的 CloudFront 網域名稱的詳細資訊URL,請參閱 自訂 中檔案的URL格式 CloudFront

  2. 開啟瀏覽器的網頁開發人員工具列。例如,在 Chrome 瀏覽器視窗中,開啟內容 (按一下滑鼠右鍵) 選單,然後選擇 Inspect (檢查)

  3. 選擇 Network (網路) 索引標籤。

  4. 重新載入頁面以檢視您的映像,然後在左側窗格中選擇一個HTTP請求。您會在個別窗格中看到顯示的HTTP標頭。

  5. 查看HTTP標頭清單,以確認預期的安全標頭包含在清單中。例如,您可能會看到類似於以下螢幕擷取畫面所示的標頭。

    HTTP 標頭清單會反白顯示預期的安全標頭。

如果安全標頭包含在您的標頭清單中,那就太棒了!這表示您已成功建立第一個 Lambda@Edge 函數。如果 CloudFront 傳回錯誤或有其他問題,請繼續下一個步驟來疑難排解問題。

步驟 6:排除問題

如果 CloudFront 傳回錯誤或 未如預期新增安全標頭,您可以查看 CloudWatch Logs 來調查函數的執行。請務必使用存放在最 AWS 接近執行函數位置的日誌。

例如,如果您從倫敦檢視 檔案,請嘗試將CloudWatch 主控台中的區域變更為歐洲 (倫敦)。

檢查 Lambda@Edge 函數的CloudWatch 日誌
  1. 登入 AWS Management Console 並在 開啟 CloudWatch 主控台https://console.aws.amazon.com/cloudwatch/

  2. Region (區域) 變更為您在瀏覽器中檢視檔案時所顯示的位置。這是函數執行所在的位置。

  3. 在左窗格中,選擇 Logs (日誌) 來檢視分佈的日誌。

如需詳細資訊,請參閱使用 Amazon CloudFront 監控指標 CloudWatch

步驟 7:清除範例資源

如果您僅為本教學課程建立 Amazon S3 儲存貯體和 CloudFront 分佈,請刪除您配置 AWS 的資源,以便不再產生費用。刪除 AWS 資源後,您新增的任何內容將不再可用。

工作

刪除 S3 儲存貯體

刪除 Amazon S3 儲存貯體之前,請務必停用儲存貯體的記錄。否則,刪除日誌時, AWS 請繼續將日誌寫入儲存貯體。

停用儲存貯體的記錄
  1. 在 開啟 Amazon S3 主控台https://console.aws.amazon.com/s3/

  2. 選取您的儲存貯體,然後選擇 Properties (屬性)

  3. Properties (屬性) 選擇 Logging (記錄日誌)

  4. 清除 Enabled (已啟用) 核取方塊。

  5. 選擇 Save (儲存)。

現在即可刪除儲存貯體。如需詳細資訊,請參閱 Amazon Simple Storage Service 主控台使用者指南中的我該如何刪除 S3 儲存貯體?

刪除 Lambda 函數

如需刪除 Lambda 函數關聯和可選函數本身的指示,請參閱 刪除 Lambda@Edge 函數和複本

刪除 CloudFront 分佈

刪除 CloudFront 分發之前,您必須先停用分發。已停用的分佈如此即不再有用,也不會產生費用。您隨時都可以啟用之前停用的分佈。刪除停用的分佈之後,它即不再可供使用。

若要停用和刪除 CloudFront 分佈
  1. 在 開啟 CloudFront 主控台https://console.aws.amazon.com/cloudfront/v4/home

  2. 選取您要停用的分佈,然後選擇 Disable (停用)

  3. 出現確認提示時,請選擇 Yes, Disable (是,停用)

  4. 選取已停用的分佈,然後選擇 Delete (刪除)

  5. 出現確認提示時,選擇 Yes, Delete (是,刪除)

相關資訊

現在您對於 Lambda@Edge 函數的運作方式已有了基本了解,請閱讀以下內容來進一步了解: