教學課程:建立基本 Lambda@Edge 函數 (主控台) - Amazon CloudFront

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

教學課程:建立基本 Lambda@Edge 函數 (主控台)

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

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

步驟 1:註冊 AWS 帳戶

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

步驟 2:建立 CloudFront 分佈

在建立 Lambda@Edge 範例函數之前,您必須有一個可使用、包含提供內容之來源的 CloudFront 環境。

在此範例中,您會建立 CloudFront 分佈,此分佈是使用 Amazon S3 儲存貯體做為分佈的原始伺服器。如果您已有環境可使用,可以略過此步驟。

使用 Amazon S3 原始伺服器建立 CloudFront 分佈
  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 藍圖僅適用於美國東部 1 (維吉尼亞北部) 區域 (us-east-1)。

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

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

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

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

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

    • 政策範本 – Lambda 會自動新增政策範本基本 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 事件 – 指定函數執行時間的觸發。我們希望每當 CloudFront 從原始伺服器傳回回應時,都會執行安全標頭函數。在下拉式清單中,選擇原始伺服器回應。如需詳細資訊,請參閱新增 Lambda@Edge 函數的觸發

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

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

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

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

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

既然您已建立 Lambda 函數並設定觸發條件來為 CloudFront 分佈執行該函數,接下來請進行檢查,以確定函數會如預期執行。在此範例中,我們會檢查 CloudFront 傳回的 HTTP 標頭,以確認安全標頭已新增。

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

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

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

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

  4. 重新載入頁面來查看您的影像,然後選擇左窗格中的 HTTP 請求。您會看到 HTTP 標頭顯示在個別的窗格中。

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

    HTTP 標頭清單,所要的安全標頭已採用突出顯示。

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

步驟 6:排除問題

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

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

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

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

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

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

步驟 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. https://console.aws.amazon.com/cloudfront/v4/home 開啟 CloudFront 主控台。

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

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

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

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

相關資訊

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