

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

# 使用 CloudFormation 範本自動設定 S3 Object Lambda
<a name="olap-using-cfn-template"></a>

**注意**  
自 2025 年 11 月 7 日起，S3 Object Lambda 僅適用於目前正在使用該服務的現有客戶，以及選取 AWS 合作夥伴網路 (APN) 合作夥伴。對於類似於 S3 Object Lambda 的功能，請在此處進一步了解 - [Amazon S3 Object Lambda 可用性變更](https://docs.aws.amazon.com/AmazonS3/latest/userguide/amazons3-ol-change.html)。

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

此 [GitHub 儲存庫](https://github.com/aws-samples/amazon-s3-object-lambda-default-configuration)包含 CloudFormation 範本和 Lambda 函數原始程式碼。如需如何使用範本的指示，請參閱[建立 Object Lambda 存取點](olap-create.md)。

範本中提供的 Lambda 函數不會執行任何轉換。反之，它會依原樣從底層資料來源傳回物件。您可以複製函數，並新增自己的轉換程式碼，在資料傳回應用程式時對其進行修改和處理。如需修改函數的詳細資訊，請參閱 [修改 Lambda 函數](#modifying-lambda-function) 和 [撰寫 S3 Object Lambda 存取點的 Lambda 函數](olap-writing-lambda.md)。

## 修改範本
<a name="modifying-cfn-template"></a>

**建立新的支援存取點**  
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 存取點，並建立兩個 CloudWatch 警示來監控用戶端和伺服器端錯誤。

**注意**  
Amazon CloudWatch 用量會產生額外成本。如需 Amazon S3 請求指標的詳細資訊，請參閱 [監控與記錄存取點](access-points-monitoring-logging.md)。  
如需定價詳細資訊，請參閱 [CloudWatch 定價](https://aws.amazon.com/cloudwatch/pricing/)。

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

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

**注意**  
您將需要針對佈建並行支付額外費用。如需佈建並行的詳細資訊，請參閱《AWS Lambda 開發人員指南》**中的[管理 Lambda 佈建並行](https://docs.aws.amazon.com/lambda/latest/dg/provisioned-concurrency.html)。  
如需定價詳細資訊，請參閱 [AWS Lambda 定價](https://aws.amazon.com/lambda/pricing/)。

## 修改 Lambda 函數
<a name="modifying-lambda-function"></a>

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

您可以更新 Lambda 函數，透過在 `WriteGetObjectResponse` API 操作中傳遞新標頭值來傳送這些值。

例如，如果 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 參考*中的 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_WriteGetObjectResponse.html#API_WriteGetObjectResponse_RequestSyntax](https://docs.aws.amazon.com/AmazonS3/latest/API/API_WriteGetObjectResponse.html#API_WriteGetObjectResponse_RequestSyntax)。

**傳回中繼資料標頭**  
您可以更新 Lambda 函數，透過在 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_WriteGetObjectResponse.html#API_WriteGetObjectResponse_RequestSyntax](https://docs.aws.amazon.com/AmazonS3/latest/API/API_WriteGetObjectResponse.html#API_WriteGetObjectResponse_RequestSyntax) API 操作請求中傳遞新標頭值來傳送這些值。

```
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();
}
```

**傳回新的狀態碼**  
您可以將自訂狀態碼傳回至 `GetObject` 用戶端，方法為在 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_WriteGetObjectResponse.html#API_WriteGetObjectResponse_RequestSyntax](https://docs.aws.amazon.com/AmazonS3/latest/API/API_WriteGetObjectResponse.html#API_WriteGetObjectResponse_RequestSyntax) API 操作請求中傳遞該自訂狀態碼。

```
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 參考*中的 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_WriteGetObjectResponse.html#API_WriteGetObjectResponse_RequestSyntax](https://docs.aws.amazon.com/AmazonS3/latest/API/API_WriteGetObjectResponse.html#API_WriteGetObjectResponse_RequestSyntax)。

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

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

**停用 `Range` 和 `partNumber` 處理**  
根據預設，由 CloudFormation 範本建立的 Object Lambda 存取點可以處理 `Range` 和 `partNumber` 參數。如果不需要此行為，則您可以從範本中移除下列行來停用此行為：

```
AllowedFeatures:
  - GetObject-Range
  - GetObject-PartNumber
  - HeadObject-Range 
  - HeadObject-PartNumber
```

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