限制對 AWS Lambda 函數 URL 來源的訪問 - Amazon CloudFront

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

限制對 AWS Lambda 函數 URL 來源的訪問

CloudFront 提供來源存取控制 (OAC),以限制對 Lambda 函數 URL 來源的存取。

建立新的 OAC

完成下列主題中描述的步驟,以在中 CloudFront設定新的 OAC。

注意

如果您將PUTPOST方法與 Lambda 函數 URL 搭配使用,則使用者在將請求傳送至時必須在x-amz-content-sha256標頭中包含承載雜湊值 CloudFront。Lambda 不支持未簽名的有效載荷。

必要條件

在建立和設定 OAC 之前,您必須擁有一個以 Lambda 函數 URL 作為來源的 CloudFront 發佈。如需詳細資訊,請參閱 使用 Lambda 函數 URL

授與 OAC 存取 Lambda 函數 URL 的權限

在您建立 OAC 或在 CloudFront 發佈中進行設定之前,請確定 OAC 具有存取 Lambda 函數 URL 的權限。在建立分發之後,但在您將 OAC 新增至 CloudFront發佈組態中的 Lambda 函數 URL 之前,請執行此動作。

注意

若要更新 Lambda 函數 URL 的 IAM 政策,您必須使用 AWS Command Line Interface (AWS CLI)。目前不支援在 Lambda 主控台中編輯身分與存取權管理政策。

下列 AWS CLI 命令會授與 CloudFront 服務主體 (cloudfront.amazonaws.com) 存取您的 Lambda 函數 URL。只有當請求代表包含 Lambda 函數 URL 的 CloudFront 發佈時,政策中的Condition元素才允許 CloudFront 存取 Lambda。

範例 : 更新原則以允許 CloudFront OAC 唯讀存取的 AWS CLI 命令

以下 AWS CLI 命令允許 CloudFront 分發(E1PDK09ESKHJWT)訪問您的 Lambda FUNCTION_URL_NAME

aws lambda add-permission \ --statement-id "AllowCloudFrontServicePrincipal" \ --action "lambda:InvokeFunctionUrl" \ --principal "cloudfront.amazonaws.com" \ --source-arn "arn:aws:cloudfront::123456789012:distribution/E1PDK09ESKHJWT" \ --function-name FUNCTION_URL_NAME
注意

如果您建立發行版,但它沒有 Lambda 函數 URL 的權限,您可以從 CloudFront主控台選擇複製 CLI 命令,然後從命令列終端機輸入此命令。如需詳細資訊,請參閱AWS Lambda 開發人員指南 AWS 服務的授予函數存取權。

建立 OAC

若要建立 OAC,您可以使用 AWS Management Console AWS CloudFormation、 AWS CLI、或 CloudFront API。

Console
若要建立 OAC
  1. 登入 AWS Management Console 並開啟 CloudFront 主控台,位於https://console.aws.amazon.com/cloudfront/v4/home

  2. 於左側導覽窗格中,選擇 Origin access (原始存取)。

  3. 選擇 Create control setting (建立控制設定)。

  4. 在 [建立新的 OAC] 表單上,執行下列動作:

    1. 輸入 OAC 的「名稱」與 (選擇性)「說明」。

    2. 對於簽署行為,建議您保留預設設定 (簽署要求 (建議))。如需詳細資訊,請參閱 原始存取控制的進階設定

  5. 針對原點類型,選擇 Lambda

  6. 選擇建立

    提示

    建立 OAC 之後,請記下 [名稱]。您需要於下列程序中進行使用。

若要將來源存取控制新增至發佈中的 Lambda 函數 URL
  1. 在開啟 CloudFront 主控台https://console.aws.amazon.com/cloudfront/v4/home

  2. 選擇您想要將 OAC 新增至的 Lambda 函數 URL 的發佈,然後選擇「起源」索引標籤。

  3. 選取您要新增 OAC 的 Lambda 函數 URL,然後選擇 [編輯]。

  4. 在原始伺服器的Protocol (通訊協定) 選取 HTTPS only (僅限 HTTPS)。

  5. Origin 存取控制下拉式清單中,選擇您要使用的 OAC 名稱。

  6. 選擇儲存變更

發行版會開始部署到所有邊 CloudFront 緣位置。當節點接收到新組態時,它會簽署傳送至 Lambda 函數 URL 的所有請求。

CloudFormation

若要使用建立 OAC AWS CloudFormation,請使用資AWS::CloudFront::OriginAccessControl源類型。下列範例會顯示建立 OAC 的 AWS CloudFormation 範本語法 (YAML 格式)。

Type: AWS::CloudFront::OriginAccessControl Properties: OriginAccessControlConfig: Description: An optional description for the origin access control Name: ExampleOAC OriginAccessControlOriginType: lambda SigningBehavior: always SigningProtocol: sigv4

若要取得更多資訊,請參閱AWS CloudFormation 使用指南中的〈AWS::CloudFront::OriginAccess控制〉。

CLI

若要使用 AWS Command Line Interface (AWS CLI) 建立原始存取控制,請使用aws cloudfront create-origin-access-control指令。您可以使用輸入檔案來提供命令的輸入參數,而不必分別將每個個別參數指定為命令列輸入。

如要建立原始存取控制 (包含輸入檔案的 CLI)
  1. 使用下列命令建立名為 origin-access-control.yaml 的檔案。這個檔案中包含 create-origin-access-control 命令的所有輸入參數。

    aws cloudfront create-origin-access-control --generate-cli-skeleton yaml-input > origin-access-control.yaml
  2. 開啟您剛才建立的 origin-access-control.yaml 檔案。編輯檔案以新增 OAC 的名稱、說明 (選用),並將 SigningBehavior 變更為 always。接著儲存檔案。

    如需其他 OAC 設定的相關資訊,請參閱 原始存取控制的進階設定

  3. 使用下列命令,利用 origin-access-control.yaml 檔案中的輸入參數建立原始存取控制。

    aws cloudfront create-origin-access-control --cli-input-yaml file://origin-access-control.yaml

    記下命令輸出中的 Id 值,您需要將 OAC 新增至 CloudFront 分發中的 Lambda 函數 URL。

若要將 OAC 附加至現有發行版中的 Lambda 函數 URL (包含輸入檔案的 CLI)
  1. 使用下列命令來儲存您要新增 OAC 的 CloudFront發佈組態。該發行版必須有一個 Lambda 函數 URL 作為來源。

    aws cloudfront get-distribution-config --id <CloudFront distribution ID> --output yaml > dist-config.yaml
  2. 開啟您剛才建立且命名為 dist-config.yaml 的檔案。編輯檔案,進行下列變更:

    • Origins 物件中,將 OAC 的 ID 新增至名為 OriginAccessControlId 的欄位。

    • 從名為 OriginAccessIdentity 的欄位中移除值(如果存在)。

    • ETag 欄位重新命名為 IfMatch,但不要變更欄位的值。

    完成後儲存檔案。

  3. 使用下列命令來更新分佈,以使用原始存取控制。

    aws cloudfront update-distribution --id <CloudFront distribution ID> --cli-input-yaml file://dist-config.yaml

發行版會開始部署到所有邊 CloudFront 緣位置。當節點接收到新組態時,它會簽署傳送至 Lambda 函數 URL 的所有請求。

API

若要使用 CloudFront API 建立 OAC,請使用 CreateOriginAccessControl. 如需有關您在此 API 呼叫中指定之欄位的詳細資訊,請參閱 AWS SDK 或其他 API 用戶端的 API 參考文件。

建立 OAC 之後,您可以使用下列其中一個 API 呼叫,將其附加至分發中的 Lambda 函數 URL:

對於這兩個 API 呼叫,請在來源內的OriginAccessControlId欄位中提供 OAC ID。如需有關您在這些 API 呼叫中指定的其他欄位的詳細資訊,請參閱 AWS SDK 或其他 API 用戶端的 API 參考文件和說明文件。

原始存取控制的進階設定

CloudFront OAC 功能包含僅適用於特定使用案例的進階設定。除非您對進階設定有特定需求,否則請使用建議的設定。

OAC 包含名為簽署行為 (在主控台中) 或 SigningBehavior (在 API、CLI 和 AWS CloudFormation) 的設定。此設定提供下列選項:

永遠簽署原始請求 (建議設定)

我們建議使用此設定,於主控台中名為Sign requests (recommended) (簽署請求 (建議使用)),或於 API、CLI 和 AWS CloudFormation中的 always。使用此設定 CloudFront 時,永遠會簽署傳送至 Lambda 函數 URL 的所有要求。

絕不簽署原始伺服器請求

此設定於主控台中命名為 Do not sign requests (請勿簽署請求),或 API、CLI 和 AWS CloudFormation中的 never。使用此設定可關閉使用此 OAC 之所有發行版中所有來源的 OAC。與從使用它的所有來源和發行版中逐個移除 OAC 相比,這可以節省時間和精力。使用此設定時, CloudFront 不會簽署傳送至 Lambda 函數 URL 的任何要求。

警告

若要使用此設定,Lambda 函數 URL 必須可公開存取。如果您將此設定與無法公開存取的 Lambda 函數 URL 搭配使用,則 CloudFront 無法存取來源。Lambda 函數 URL 會傳回錯誤, CloudFront 並將這些錯誤傳 CloudFront 送給檢視者。如需詳細資訊,請參閱AWS Lambda 使用者指南的 Lambda 函數 URL 的安全性和驗證模型

請勿覆寫檢視器 (用戶端) Authorization 標題

此設定於主控台中命名為 Do not override authorization header (請勿覆寫授權標頭),或於 API、CLI 和 AWS CloudFormation中的 no-override。如果您只想在對應的檢視器 CloudFront 要求不包含Authorization標頭時簽署原始請求,請使用此設定。使用此設定時,會在檢視器要求存在時 CloudFront 傳遞來自檢視器要求的Authorization標頭,但是當檢視器要求未包含Authorization標頭時,會簽署原始要求 (新增其自己的Authorization標頭)。

警告
  • 如果使用此設定,則必須為 Lambda 函數 URL 指定簽名版本 4 簽署,而不是 CloudFront 分發的名稱或 CNAME。 CloudFront 將Authorization標頭從檢視器請求轉寄至 Lambda 函數 URL 時,Lambda 會根據 Lambda URL 網域的主機驗證簽章。如果簽名不是以 Lambda URL 網域為基礎,簽章中的主機就不會與 Lambda URL 來源所使用的主機相符。這意味著請求將失敗,導致簽名驗證錯誤。

  • 若要從檢視器要求傳遞Authorization標頭,您必須針對使用與此原始存取控制相關聯的 Lambda 函數 URL 的所有快取行為,將Authorization標頭新增至快取策。