使用 a CloudFormation 範本自動化 S3 Object Lambda 設定 - Amazon Simple Storage Service

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

使用 a CloudFormation 範本自動化 S3 Object Lambda 設定

您可以使用 AWS CloudFormation 範本快速建立 Amazon S3 Object Lambda 存取點。 CloudFormation 範本會自動建立相關資源、設定 AWS Identity and Access Management (IAM) 角色,以及設定自動透過 Object Lambda 存取點處理請求的 AWS Lambda 函數。使用 CloudFormation 範本,您可以實作最佳實務、改善安全性狀態,並減少手動程序引起的錯誤。

GitHub 儲存庫包含 CloudFormation 範本和 Lambda 函數原始程式碼。如需如何使用範本的指示,請參閱建立 Object Lambda 存取點

範本中提供的 Lambda 函數不會執行任何轉換。相反,它會依原狀從您的 S3 儲存貯體傳回您的物件。您可以複製函數,並新增自己的轉換程式碼,在資料傳回應用程式時對其進行修改和處理。如需修改函數的詳細資訊,請參閱 修改 Lambda 函數撰寫 S3 Object Lambda 存取點的 Lambda 函數

修改範本

建立新的支援存取點

S3 Object Lambda 使用兩個存取點,一個 Object Lambda 存取點和一個標準 S3 存取點,這些稱為支援存取點。當您對 Object Lambda 存取點提出請求時,S3 會代表您叫用 Lambda,或將請求委派給支援的存取點 (視 S3 Object Lambda 組態而定)。您可以傳遞下列參數作為部署範本時 aws cloudformation deploy 命令的一部分,建立新的支援存取點。

CreateNewSupportingAccessPoint=true
設定函數承載

您可以透過部署範本時傳遞下列參數作為 aws cloudformation deploy 命令之一部分的方式,設定承載,以提供補充資料給 Lambda 函數。

LambdaFunctionPayload="format=json"
啟用 Amazon CloudWatch 監控

您可以在部署範本時傳遞下列參數,作為aws cloudformation deploy命令的一部分來啟用 CloudWatch 監控。

EnableCloudWatchMonitoring=true

此參數會啟用 Amazon S3 請求指標的 Object Lambda Access Point,並建立兩個 CloudWatch 警示來監控用戶端和伺服器端錯誤。

注意

Amazon CloudWatch 用量會產生額外費用。如需 Amazon S3 請求指標的詳細資訊,請參閱 監控與記錄存取點

如需定價詳細資訊,請參閱 CloudWatch 定價

設定佈建並行

若要減少延遲,您可以編輯範本,為 Lambda 函數支援的 Object Lambda 存取點設定佈建並行,以便包含 Resources 下的下列行。

LambdaFunctionVersion: Type: AWS::Lambda::Version Properties: FunctionName: !Ref LambdaFunction ProvisionedConcurrencyConfig: ProvisionedConcurrentExecutions: Integer
注意

您將需要針對佈建並行支付額外費用。如需佈建並行的詳細資訊,請參閱《AWS Lambda 開發人員指南》中的管理 Lambda 佈建並行

如需定價詳細資訊,請參閱 AWS Lambda 定價

修改 Lambda 函數

變更 GetObject 請求的標頭值

根據預設,Lambda 函數會將所有標頭,除了 Content-Length和 之外ETag,從預先簽章的 URL 請求轉送至GetObject用戶端。根據 Lambda 函數中的轉換程式碼,您可以選擇將新標頭值傳送至 GetObject 用戶端。

您可以更新 Lambda 函數,在 API WriteGetObjectResponse 操作中傳遞新的標頭值。

例如,如果 Lambda 函數將 Amazon S3 物件中的文字翻譯為不同的語言,則您可以在 Content-Language 標頭傳遞新值。您可以修改 writeResponse 函數來執行此操作,如下所示:

async function writeResponse (s3Client: S3, requestContext: GetObjectContext, transformedObject: Buffer, headers: Headers): Promise<PromiseResult<{}, AWSError>> { const { algorithm, digest } = getChecksum(transformedObject); return s3Client.writeGetObjectResponse({ RequestRoute: requestContext.outputRoute, RequestToken: requestContext.outputToken, Body: transformedObject, Metadata: { 'body-checksum-algorithm': algorithm, 'body-checksum-digest': digest }, ...headers, ContentLanguage: 'my-new-language' }).promise(); }

如需支援標頭的完整清單,請參閱 Amazon Simple Storage Service API 參考WriteGetObjectResponse中的 。

傳回中繼資料標頭

您可以更新 Lambda 函數,在 API WriteGetObjectResponse 操作請求中傳遞新的標頭值。

async function writeResponse (s3Client: S3, requestContext: GetObjectContext, transformedObject: Buffer, headers: Headers): Promise<PromiseResult<{}, AWSError>> { const { algorithm, digest } = getChecksum(transformedObject); return s3Client.writeGetObjectResponse({ RequestRoute: requestContext.outputRoute, RequestToken: requestContext.outputToken, Body: transformedObject, Metadata: { 'body-checksum-algorithm': algorithm, 'body-checksum-digest': digest, 'my-new-header': 'my-new-value' }, ...headers }).promise(); }
傳回新的狀態碼

您可以在 API WriteGetObjectResponse 操作請求中將自訂狀態碼傳遞給GetObject用戶端。

async function writeResponse (s3Client: S3, requestContext: GetObjectContext, transformedObject: Buffer, headers: Headers): Promise<PromiseResult<{}, AWSError>> { const { algorithm, digest } = getChecksum(transformedObject); return s3Client.writeGetObjectResponse({ RequestRoute: requestContext.outputRoute, RequestToken: requestContext.outputToken, Body: transformedObject, Metadata: { 'body-checksum-algorithm': algorithm, 'body-checksum-digest': digest }, ...headers, StatusCode: Integer }).promise(); }

如需支援狀態碼的完整清單,請參閱 Amazon Simple Storage Service API 參考WriteGetObjectResponse中的 。

RangepartNumber 參數套用至來源物件

根據預設, CloudFormation 範本建立的 Object Lambda 存取點可以處理 RangepartNumber 參數。Lambda 函數會將請求的範圍或組件編號套用至轉換物件。若要這樣做,函數必須下載整個物件並執行轉換。在某些情況下,您的轉換物件範圍可能會完全映射至您的來源物件範圍。這表示請求來源物件上的位元組範圍 A-B 並執行轉換,可能會產生與請求整個物件、執行轉換,以及傳回轉換物件上的位元組範圍 A-B 相同的結果。

在這種情況下,您可以變更 Lambda 函數實作,將範圍或組件編號直接套用至來源物件。此方法會減少整體函數延遲和所需的記憶體。如需詳細資訊,請參閱使用 Range 以及 partNumber 標頭

停用 RangepartNumber 處理

根據預設, CloudFormation 範本建立的 Object Lambda 存取點可以處理 RangepartNumber 參數。如果不需要此行為,則您可以從範本中移除下列行來停用此行為:

AllowedFeatures: - GetObject-Range - GetObject-PartNumber - HeadObject-Range - HeadObject-PartNumber
轉換大型物件

預設情況下,Lambda 函數會先處理記憶體中的整個物件,然後才能開始將回應串流至 S3 Object Lambda。您可以在執行轉換時修改函數以串流回應。這樣做有助於降低轉換延遲並縮小 Lambda 函數記憶體大小。如需範例實作,請參閱串流壓縮內容範例