

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

# 使用 S3 Object Lambda 轉換物件
<a name="transforming-objects"></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)。

藉助 Amazon S3 Object Lambda，您可將自己的程式碼新增至 Amazon S3 `GET`、`LIST` 和 `HEAD` 請求，以便在資料傳回應用程式時對其做出修改和處理。您可以使用自訂程式碼修改 S3 `GET` 請求傳回的資料，以執行資料列篩選、動態調整浮水印影像大小、修訂機密資料以及更多動作。您也可以使用 S3 Object Lambda 修改 S3 `LIST` 請求的輸出，以建立儲存貯體中所有物件的自訂檢視，以及建立 S3 `HEAD` 請求來修改物件中繼資料 (例如物件名稱和大小)。您可以使用 S3 Object Lambda 做為 Amazon CloudFront 分發的來源，為最終使用者量身打造資料，例如自動調整影像大小、轉碼舊格式 (例如從 JPEG 轉為 WebP)，或剝離中繼資料。如需詳細資訊，請參閱 AWS 部落格文章[搭配使用 Amazon S3 Object Lambda 和 Amazon CloudFront](https://aws.amazon.com/blogs/aws/new-use-amazon-s3-object-lambda-with-amazon-cloudfront-to-tailor-content-for-end-users/)。由 AWS Lambda 函數提供支援，您的程式碼會在完全受管的基礎設施上執行 AWS。使用 S3 Object Lambda 可減少建立和存放資料衍生副本或執行代理的需求，並且全程無需變更您的應用程式。

**S3 Object Lambda 的運作方式**  
S3 Object Lambda 使用 AWS Lambda 函數自動處理標準 S3`LIST`、 `GET`或 `HEAD`請求的輸出。 AWS Lambda 是一種無伺服器運算服務，可執行客戶定義的程式碼，而無需管理基礎運算資源。您可以編寫和執行自己的自訂 Lambda 函數，從而根據您的特定使用案例，量身定製資料轉換。

在設定 Lambda 函數之後，您可將其連接至 S3 Object Lambda 服務端點，稱為 *Object Lambda 存取點*。Object Lambda 存取點使用標準 S3 存取點 (稱為*支援存取點*) 來存取資料。

當您將請求傳送到 Object Lambda 存取點時，Amazon S3 會自動呼叫您的 Lambda 函數。使用 S3 `GET`、`LIST` 或 `HEAD` 請求透過 Object Lambda 存取點擷取的任何資料都會將一個轉換的結果傳回給應用程式。所有其他請求都會正常處理，如下圖所示。



![\[圖表顯示 S3 Object Lambda 的運作方式。\]](http://docs.aws.amazon.com/zh_tw/AmazonS3/latest/userguide/images/ObjectLamdaDiagram.png)


本節中的主題描述了如何使用 S3 Object Lambda。

**Topics**
+ [建立 Object Lambda 存取點](olap-create.md)
+ [使用 Amazon S3 Object Lambda 存取點](olap-use.md)
+ [S3 Object Lambda 存取點的安全考量](olap-security.md)
+ [撰寫 S3 Object Lambda 存取點的 Lambda 函數](olap-writing-lambda.md)
+ [使用 AWS 建置的 Lambda 函數](olap-examples.md)
+ [S3 Object Lambda 的最佳實務和指導方針](olap-best-practices.md)
+ [S3 Object Lambda 教學課程](olap-tutorials.md)
+ [對 S3 Object Lambda 進行偵錯和故障診斷](olap-debugging-lambda.md)

# 建立 Object Lambda 存取點
<a name="olap-create"></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)。

Object Lambda 存取點只會與您在建立期間指定的一個標準存取點建立關聯。若要建立 Object Lambda 存取點，您需要下列資源：
+ **標準 S3 存取點** 當您使用 Object Lambda 存取點時，此標準存取點稱為*支援存取點*，並連接到 S3 儲存貯體，或 Amazon FSx for OpenZFS 磁碟區。如需建立標準存取點的相關資訊，請參閱 [建立存取點](creating-access-points.md)。
+ ** AWS Lambda 函數。**您可以建立自己的 Lambda 函數，也可以使用預先建置的函數。如需建立 Lambda 函數的詳細資訊，請參閱 [撰寫 S3 Object Lambda 存取點的 Lambda 函數](olap-writing-lambda.md)。如需預先建置函數的詳細資訊，請參閱[使用 AWS 建置的 Lambda 函數](olap-examples.md)。
+ **（選用） An AWS Identity and Access Management (IAM) 政策。**Amazon S3 存取點支援 IAM 資源政策，可讓您依資源、使用者或其他條件控制對存取點的使用。如需建立這些政策的詳細資訊，請參閱 [設定 Object Lambda 存取點的 IAM 政策](olap-policies.md)。

下列各節描述如何建立 Object Lambda 存取點，方法為使用：
+ 的 AWS 管理主控台
+ The AWS Command Line Interface (AWS CLI)
+  AWS CloudFormation 範本
+ 的 AWS Cloud Development Kit (AWS CDK)

如需如何使用 REST API 建立 Object Lambda 存取點的資訊，請參閱《Amazon Simple Storage Service API 參考》**中的 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateAccessPointForObjectLambda.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateAccessPointForObjectLambda.html)。

## 建立 Object Lambda 存取點
<a name="create-olap"></a>

使用下列其中一個程序建立 Object Lambda 存取點。

### 使用 S3 主控台
<a name="olap-create-console"></a>

**使用主控台建立 Object Lambda 存取點**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) 開啟 Amazon S3 主控台。

1. 在導覽列中，選擇目前顯示的 名稱 AWS 區域。接下來，選擇您想要切換到的區域。

1. 在左側的導覽窗格中，選擇 **Object Lambda Access Points** (Object Lambda 存取點)。

1. 在 **Object Lambda Access Points** (Object Lambda 存取點) 頁面上，選擇 **Create Object Lambda access point** (建立 Object Lambda 存取點)。

1. 對於 **Object Lambda Access Point name** (Object Lambda 存取點名稱)，請輸入您要用於存取點的名稱。

   與標準存取點一樣，也有命名 Object Lambda 存取點的規則。如需詳細資訊，請參閱[存取點的命名規則](access-points-restrictions-limitations-naming-rules.md#access-points-names)。

1. 對於 **Supporting Access Point** (支援存取點)，請輸入或瀏覽至您要使用的標準存取點。存取點必須與您要轉換 AWS 區域 的物件位於相同的 中。如需建立標準存取點的相關資訊，請參閱 [建立存取點](creating-access-points.md)。

1. 在**轉換組態**下，您可以新增一個函數，針對 Object Lambda 存取點轉換資料。執行以下任意一項：
   + 如果您的帳戶中已有 AWS Lambda 函數，您可以在**叫用 Lambda 函數下選擇該函數**。您可以在其中輸入 Lambda 函數的 Amazon Resource Name (ARN)， AWS 帳戶 或從下拉式功能表中選擇 Lambda 函數。
   + 如果您想要使用 AWS 內建函數，請選擇**AWS 內建**函數下的函數名稱，然後選取**建立 Lambda 函數**。這將帶您前往 Lambda 主控台，您可以在其中將內建函數部署到 AWS 帳戶。如需內建函數的詳細資訊，請參閱 [使用 AWS 建置的 Lambda 函數](olap-examples.md)。

   在 **S3 APIs** (S3 API) 下，選擇一或多個要叫用的 API 操作。對於每個選取的 API，您都必須指定一個要叫用的 Lambda 函數。

1. (選用) 在 **Payload** (承載) 下，新增您想要提供給 Lambda 函數作為輸入的 JSON 文字。您可以針對叫用相同 Lambda 函數的不同 Object Lambda 存取點以不同參數設定承載，藉此擴充 Lambda 函數的彈性。
**重要**  
使用 Object Lambda 存取點時，請確定承載不包含任何機密資訊。

1. (選用) 對於 **Range and part number** (範圍和組件編號)，如果想要處理具有範圍和組件編號標頭的 `GET` 和 `HEAD` 請求，您必須啟用此選項。啟用此選項會確認您的 Lambda 函數可以辨識並處理這些請求。如需範圍標頭和組件編號的詳細資訊，請參閱 [使用 Range 和 partNumber 標頭](range-get-olap.md)。

1. (選用) 對於**請求指標**，請選擇**啟用**或**停用**，將 Amazon S3 監控新增至您的 Object Lambda 存取點。請求指標會以標準 Amazon CloudWatch 費率計費。

1. (選用) 在 **Object Lambda Access Point policy** (Object Lambda 存取點政策) 下，設定資源政策。資源政策會授予所指定 Object Lambda 存取點的許可，並且可依資源、使用者或其他條件控制存取點的使用。如需有關 Object Lambda 存取點資源政策的詳細資訊，請參閱 [設定 Object Lambda 存取點的 IAM 政策](olap-policies.md)。

1. 在 **Block Public Access settings for this Object Lambda Access Point** (此 Object Lambda 存取點的封鎖公開存取設定)下，選取要套用的封鎖公開存取設定。根據預設，新 Object Lambda 存取點的所有封鎖公開存取設定都會啟用，建議將預設設定保持啟用狀態。Amazon S3 目前不支援在您建立了 Object Lambda 存取點之後，變更 Object Lambda 存取點的封鎖公開存取設定。

   如需使用 Amazon S3 封鎖公開存取的詳細資訊，請參閱 [管理一般用途儲存貯體存取點的公開存取](access-points-bpa-settings.md)。

1. 選擇 **Create Object Lambda Access Point** (建立 Object Lambda 存取點)。

### 使用 AWS CLI
<a name="olap-create-cli"></a>

**使用 AWS CloudFormation 範本建立 Object Lambda 存取點**
**注意**  
若要使用下列命令，請以您自己的資訊取代 `user input placeholders`。

1. 在 [S3 Object Lambda 預設組態](https://github.com/aws-samples/amazon-s3-object-lambda-default-configuration)`s3objectlambda_deployment_package.zip`中下載 AWS Lambda 函數部署套件。

1. 執行下列 `put-object` 命令，將套件上傳至 Amazon S3 儲存貯體。

   ```
   aws s3api put-object --bucket Amazon S3 bucket name --key s3objectlambda_deployment_package.zip --body release/s3objectlambda_deployment_package.zip
   ```

1. 在 [S3 Object Lambda 預設組態](https://github.com/aws-samples/amazon-s3-object-lambda-default-configuration)`s3objectlambda_defaultconfig.yaml`下載 AWS CloudFormation 範本。

1. 執行下列 `deploy` 命令，將範本部署到您的 AWS 帳戶。

   ```
   aws cloudformation deploy --template-file s3objectlambda_defaultconfig.yaml \
    --stack-name CloudFormation stack name \ 
    --parameter-overrides ObjectLambdaAccessPointName=Object Lambda Access Point name \
     SupportingAccessPointName=Amazon S3 access point S3BucketName=Amazon S3 bucket \
     LambdaFunctionS3BucketName=Amazon S3 bucket containing your Lambda package \ 
     LambdaFunctionS3Key=Lambda object key LambdaFunctionS3ObjectVersion=Lambda object version \ 
     LambdaFunctionRuntime=Lambda function runtime --capabilities capability_IAM
   ```

您可以設定此 AWS CloudFormation 範本來叫用 `GET`、 `HEAD`和 `LIST` API 操作的 Lambda。如需修改範本預設組態的詳細資訊，請參閱 [使用 CloudFormation 範本自動設定 S3 Object Lambda](olap-using-cfn-template.md)。<a name="olap-create-cli-specific"></a>

**使用 建立 Object Lambda 存取點 AWS CLI**
**注意**  
若要使用下列命令，請以您自己的資訊取代 `user input placeholders`。

下列範例會為帳戶 *`111122223333`* 中的儲存貯體 *`amzn-s3-demo-bucket1`* 建立名為 *`my-object-lambda-ap`* 的 Object Lambda 存取點。此範例假設已建立名為 *`example-ap`* 的標準存取點。若要取得有關建立標準存取點的資訊，請參閱 [建立存取點](creating-access-points.md)。

此範例使用 AWS 預先建置的 函數 `decompress`。如需預先建置函數的詳細資訊，請參閱[使用 AWS 建置的 Lambda 函數](olap-examples.md)。

1. 建立儲存貯體。在此範例中，我們將使用 *`amzn-s3-demo-bucket1`*。如需建立儲存貯體的資訊，請參閱 [建立一般用途儲存貯體](create-bucket-overview.md)。

1. 建立標準的存取點並將其連接到您的儲存貯體。在此範例中，我們將使用 *`example-ap`*。如需建立標準存取點的相關資訊，請參閱 [建立存取點](creating-access-points.md)。

1. 執行以下任意一項：
   + 在您的帳戶中建立您要用來轉換 Amazon S3 物件的 Lambda 函數。如需建立 Lambda 函數的詳細資訊，請參閱 [撰寫 S3 Object Lambda 存取點的 Lambda 函數](olap-writing-lambda.md)。若要搭配 使用自訂函數 AWS CLI，請參閱《 *AWS Lambda 開發人員指南*》中的[搭配 使用 Lambda AWS CLI](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-awscli.html)。
   + 使用 AWS 預先建置的 Lambda 函數。如需預先建置函數的詳細資訊，請參閱[使用 AWS 建置的 Lambda 函數](olap-examples.md)。

1. 建立名為 `my-olap-configuration.json` 的 JSON 組態檔案。在此組態中，請為您在先前步驟中建立的 Lambda 函數提供支援存取點和 Amazon Resource Name (ARN)，或為您正在使用的預建函數提供 ARN。  
**Example**  

   

   ```
   {
       "SupportingAccessPoint" : "arn:aws:s3:us-east-1:111122223333:accesspoint/example-ap",
       "TransformationConfigurations": [{
           "Actions" : ["GetObject", "HeadObject", "ListObjects", "ListObjectsV2"],
           "ContentTransformation" : {
               "AwsLambda": {
                   "FunctionPayload" : "{\"compressionType\":\"gzip\"}",
                   "FunctionArn" : "arn:aws:lambda:us-east-1:111122223333:function/compress"
               }
           }
       }]
   }
   ```

1. 執行 `create-access-point-for-object-lambda` 命令以建立 Object Lambda 存取點。

   ```
   aws s3control create-access-point-for-object-lambda --account-id 111122223333 --name my-object-lambda-ap --configuration file://my-olap-configuration.json
   ```

1. (選用) 建立名為 `my-olap-policy.json` 的 JSON 政策檔案。

   新增 Object Lambda 存取點資源政策可依資源、使用者或其他條件控制存取點的使用。此資源政策會將帳戶 *`444455556666`* 的 `GetObject` 許可授予指定的 Object Lambda 存取點。  
**Example**  

   

   ```
   {
       "Version": "2008-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "Grant account 444455556666 GetObject access",
               "Effect": "Allow",
               "Action": "s3-object-lambda:GetObject",
               "Principal": {
                   "AWS": "arn:aws:iam::444455556666:root"
               },
               "Resource": "your-object-lambda-access-point-arn"
           }
       ]
   }
   ```

1. (選用) 執行 `put-access-point-policy-for-object-lambda` 命令以設定您的資源政策。

   ```
   aws s3control put-access-point-policy-for-object-lambda --account-id 111122223333 --name my-object-lambda-ap --policy file://my-olap-policy.json
   ```

1. (選用) 指定承載。

   承載是選用的 JSON，您可以提供給 AWS Lambda 函數做為輸入。您可以針對叫用相同 Lambda 函數的不同 Object Lambda 存取點以不同參數設定承載，藉此擴充 Lambda 函數的彈性。

   下列 Object Lambda 存取點組態顯示具有兩個參數的承載。

   ```
   {
   	"SupportingAccessPoint": "AccessPointArn",
   	"CloudWatchMetricsEnabled": false,
   	"TransformationConfigurations": [{
   		"Actions": ["GetObject", "HeadObject", "ListObjects", "ListObjectsV2"],
   		"ContentTransformation": {
   			"AwsLambda": {
   				"FunctionArn": "FunctionArn",
   				"FunctionPayload": "{\"res-x\": \"100\",\"res-y\": \"100\"}"
   			}
   		}
   	}]
   }
   ```

   下列 Object Lambda 存取點組態顯示具有一個參數、且已啟用 `GetObject-Range`、`GetObject-PartNumber`、`HeadObject-Range` 和 `HeadObject-PartNumber` 的承載。

   ```
   {
       "SupportingAccessPoint":"AccessPointArn",
       "CloudWatchMetricsEnabled": false,
       "AllowedFeatures": ["GetObject-Range", "GetObject-PartNumber", "HeadObject-Range", "HeadObject-PartNumber"],        
       "TransformationConfigurations": [{
           "Action": ["GetObject", "HeadObject", "ListObjects", "ListObjectsV2"],
           "ContentTransformation": {
               "AwsLambda": {
                   "FunctionArn":"FunctionArn",
                   "FunctionPayload": "{\"compression-amount\": \"5\"}"
               }
           }
       }]
   }
   ```
**重要**  
使用 Object Lambda 存取點時，請確定承載不包含任何機密資訊。

### 使用 AWS CloudFormation 主控台和範本
<a name="olap-create-cfn-console"></a>

您可以使用 Amazon S3 提供的預設組態建立 Object Lambda 存取點。您可以從 [GitHub 儲存庫](https://github.com/aws-samples/amazon-s3-object-lambda-default-configuration)下載 AWS CloudFormation 範本和 Lambda 函數原始程式碼，並部署這些資源來設定功能正常的 Object Lambda 存取點。

如需修改 AWS CloudFormation 範本預設組態的相關資訊，請參閱 [使用 CloudFormation 範本自動設定 S3 Object Lambda](olap-using-cfn-template.md)。

如需 CloudFormation 不使用 範本設定 Object Lambda 存取點的相關資訊，請參閱*AWS CloudFormation 《 使用者指南*[https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3objectlambda-accesspoint.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3objectlambda-accesspoint.html)》中的 。

**上傳 Lambda 函數部署套件**

1. 下載 [S3 Object Lambda 預設組態](https://github.com/aws-samples/amazon-s3-object-lambda-default-configuration)`s3objectlambda_deployment_package.zip`的 AWS Lambda 函數部署套件。

1. 將套件上傳至 Amazon S3 儲存貯體。

**使用 AWS CloudFormation 主控台建立 Object Lambda 存取點**

1. 在 [S3 Object Lambda 預設組態](https://github.com/aws-samples/amazon-s3-object-lambda-default-configuration)`s3objectlambda_defaultconfig.yaml`下載 AWS CloudFormation 範本。

1. 登入 AWS 管理主控台，並在 https：//[https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) 開啟 AWS CloudFormation 主控台。

1. 執行以下任意一項：
   + 如果您 AWS CloudFormation 之前從未使用過 ，請在 AWS CloudFormation 首頁上，選擇**建立堆疊**。
   + 如果您 AWS CloudFormation 之前已使用過 ，請在左側導覽窗格中選擇 **Stacks**。選擇 **Create stack (建立堆疊)**，然後選擇 **With new resources (standard)** (使用新資源 (標準))。

1. 對於 **Prepare template** (準備範本)，請選擇 **Template is ready** (範本已準備就緒)。

1. 對於 **Specify template** (指定範本)，選擇 **Upload a template file** (上傳範本檔案) 並上傳 `s3objectlambda_defaultconfig.yaml`。

1. 選擇**下一步**。

1. 在 **Specify stack details** (指定堆疊詳細資訊) 頁面上，輸入堆疊的名稱。

1. 在 **Parameters** (參數) 區段中，指定堆疊範本中定義的以下參數。

   1. 對於 **CreateNewSupportingAccessPoint**，請執行下列其中一項動作：
      + 如果您已有範本上傳所在之 S3 儲存貯體的支援存取點，請選擇 **false**。
      + 如果您要針對此儲存貯體建立新的存取點，請選擇 **true**。

   1. 對於 **EnableCloudWatchMonitoring**，請選擇 **true** 或 **false**，取決於您是否想要啟用 Amazon CloudWatch 請求指標和警示。

   1. (選用) 對於 **LambdaFunctionPayload**，新增您想要提供給 Lambda 函數作為輸入的 JSON 文字。您可以針對叫用相同 Lambda 函數的不同 Object Lambda 存取點以不同參數設定承載，藉此擴充 Lambda 函數的彈性。
**重要**  
使用 Object Lambda 存取點時，請確定承載不包含任何機密資訊。

   1. 對於 **LambdaFunctionRuntime**，輸入偏好的 Lambda 函數執行時間。可用選項為 `nodejs14.x`、`python3.9`、`java11`。

   1. 對於 **LambdaFunctionS3BucketName**，輸入您已在其中上傳部署套件的 Amazon S3 儲存貯體名稱。

   1. 對於 **LambdaFunctionS3Key**，輸入您已在其中上傳部署套件的 Amazon S3 物件金鑰。

   1. 對於 **LambdaFunctionS3ObjectVersion**，輸入您已在其中上傳部署套件的 Amazon S3 物件版本。

   1. 對於 **ObjectLambdaAccessPointName**，輸入 Object Lambda 存取點的名稱。

   1. 對於 **S3BucketName**，輸入將與 Object Lambda 存取點相關聯的 Amazon S3 儲存貯體名稱。

   1. 對於 **SupportingAccessPointName**，輸入支援存取點的名稱。
**注意**  
這是與您在上一步驟中所選擇 Amazon S3 儲存貯體相關聯的存取點。如果沒有任何與 Amazon S3 儲存貯體相關聯的存取點，則您可以為 **CreateNewSupportingAccessPoint** 選擇 **true**，設定範本來建立一個存取點。

1. 選擇**下一步**。

1. 在 **Configure stack options** (設定堆疊選項) 頁面，選擇 **Next** (下一步)。

   如需此頁面上選用設定的詳細資訊，請參閱《AWS CloudFormation 使用者指南》**中的[設定 AWS CloudFormation 堆疊選項](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-add-tags.html)。

1. 在 **Review** (檢閱) 頁面上，選擇 **Create stack** (建立堆疊)。

### 使用 AWS Cloud Development Kit (AWS CDK)
<a name="olap-create-cdk"></a>

如需使用 設定 Object Lambda 存取點的詳細資訊 AWS CDK，請參閱 *AWS Cloud Development Kit (AWS CDK) API 參考*中的[`AWS::S3ObjectLambda`建構程式庫](https://docs.aws.amazon.com/cdk/api/latest/docs/aws-s3objectlambda-readme.html)。

# 使用 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)。

# 使用 Amazon S3 Object Lambda 存取點
<a name="olap-use"></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)。

透過 Amazon S3 Object Lambda 存取點發出請求，與透過其他存取點發出請求的運作方式相同。如需如何透過存取點發出請求的詳細資訊，請參閱 [將 Amazon S3 Access Points 用於一般用途儲存貯體](using-access-points.md)。您可以使用 Amazon S3 主控台、 AWS Command Line Interface (AWS CLI)、 AWS SDKs 或 Amazon S3 REST API，透過 Object Lambda 存取點提出請求。

**重要**  
Object Lambda 存取點的 Amazon Resource Name (ARN) 使用 `s3-object-lambda` 的服務名稱。因此，Object Lambda 存取點 ARN 以 `arn:aws::s3-object-lambda` 為開頭 (而不是 `arn:aws::s3`)，其會與其他存取點一起使用。

## 如何為 Object Lambda 存取點尋找 ARN
<a name="olap-find-arn"></a>

若要搭配 AWS CLI AWS SDKs 使用 Object Lambda 存取點，您需要知道 Object Lambda 存取點的 Amazon Resource Name (ARN)。下列範例示範如何使用 Amazon S3 主控台或 AWS CLI，來尋找 Object Lambda 存取點的 ARN。

### 使用 S3 主控台
<a name="olap-use-arn-console"></a>

**使用主控台為 Object Lambda 存取點尋找 ARN**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) 開啟 Amazon S3 主控台。

1. 在左側的導覽窗格中，選擇 **Object Lambda Access Points** (Object Lambda 存取點)。

1. 選擇要複製 ARN 的 Object Lambda 存取點旁的選項按鈕。

1. 選擇 **Copy ARN** (複製 ARN)。

### 使用 AWS CLI
<a name="olap-use-arn-cli"></a>

**使用 尋找 Object Lambda 存取點的 ARN AWS CLI**

1. 若要擷取與 AWS 帳戶相關聯的 Object Lambda 存取點的清單，請執行以下命令。執行 命令之前，請將帳戶 ID 取代*`111122223333`*為您的 AWS 帳戶 ID。

   ```
   aws s3control list-access-points-for-object-lambda --account-id 111122223333
   ```

1. 檢閱命令輸出，尋找要使用的 Object Lambda 存取點 ARN。先前命令的輸出看起來應與下列範例類似。

   ```
   {
       "ObjectLambdaAccessPointList": [
           {
               "Name": "my-object-lambda-ap",
               "ObjectLambdaAccessPointArn": "arn:aws:s3-object-lambda:us-east-1:111122223333:accesspoint/my-object-lambda-ap"
           },
           ...
       ]
   }
   ```

## 如何針對您的 S3 儲存貯體 Object Lambda 存取點使用儲存貯體樣式別名
<a name="ol-access-points-alias"></a>

在您建立 Object Lambda 存取點時，Amazon S3 會自動為您的 Object Lambda 存取點產生唯一的別名。您可以針對存取點資料平面操作在請求中使用此別名，而不是使用 Amazon S3 儲存貯體名稱或 Object Lambda 存取點 Amazon Resource Name (ARN)。如需這些操作的清單，請參閱 [存取點相容性](access-points-service-api-support.md)。

Object Lambda 存取點別名是在與 Amazon S3 儲存貯體相同的命名空間內建立的。此別名會自動產生且無法變更。針對現有的 Object Lambda 存取點，系統會自動指派別名以供使用。Object Lambda 存取點別名符合有效 Amazon S3 儲存貯體名稱的所有要求，並由下列部分組成：

`Object Lambda Access Point name prefix-metadata--ol-s3`

**注意**  
Object Lambda 存取點別名會保留該 `--ol-s3` 尾碼，且該尾碼不能用於儲存貯體或 Object Lambda 存取點名稱。如需 Amazon S3 儲存貯體命名規則的詳細資訊，請參閱[一般用途儲存貯體命名規則](bucketnamingrules.md)。

下列範例顯示了名稱為 `my-object-lambda-access-point` 之 Object Lambda 存取點的 ARN 和 Object Lambda 存取點別名。
+ **ARN** – `arn:aws:s3-object-lambda:region:account-id:accesspoint/my-object-lambda-access-point`
+ **Object Lambda 存取點別名** – `my-object-lambda-acc-1a4n8yjrb3kda96f67zwrwiiuse1a--ol-s3`

使用 Object Lambda 存取點時，您可以使用 Object Lambda 存取點別名，而不需要大量變更程式碼。

刪除 Object Lambda 存取點時，Object Lambda 存取點別名會變成非作用中且未佈建狀態。

### 如何為 Object Lambda 存取點尋找別名
<a name="olap-find-alias"></a>

#### 使用 S3 主控台
<a name="olap-use-alias-console"></a>

**使用主控台為 Object Lambda 存取點尋找別名**

1. 登入 AWS 管理主控台 ，並在 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)：// 開啟 Amazon S3 主控台。

1. 在左側的導覽窗格中，選擇 **Object Lambda Access Points** (Object Lambda 存取點)。

1. 針對您要使用的 Object Lambda 存取點，請複製 **Object Lambda 存取點別名**值。

#### 使用 AWS CLI
<a name="olap-use-alias-cli"></a>

建立 Object Lambda 存取點時，Amazon S3 會自動產生 Object Lambda 存取點別名，如下列範例命令所示。若要執行此命令，請以您自己的資訊取代 `user input placeholders`。如需有關如何使用 建立 Object Lambda 存取點的資訊 AWS CLI，請參閱 [使用 建立 Object Lambda 存取點 AWS CLI](olap-create.md#olap-create-cli-specific)。

```
aws s3control create-access-point-for-object-lambda --account-id 111122223333 --name my-object-lambda-access-point --configuration file://my-olap-configuration.json
{
    "ObjectLambdaAccessPointArn": "arn:aws:s3:region:111122223333:accesspoint/my-access-point",
    "Alias": {
        "Value": "my-object-lambda-acc-1a4n8yjrb3kda96f67zwrwiiuse1a--ol-s3",
        "Status": "READY"
    }
}
```

產生的 Object Lambda 存取點別名會有兩個欄位：
+ `Value` 欄位是 Object Lambda 存取點的別名。
+ `Status` 欄位是 Object Lambda 存取點別名的狀態。若狀態為 `PROVISIONING`，表示 Amazon S3 正在佈建 Object Lambda 存取點別名，且別名尚不可供使用。若狀態為 `READY`，則表示 Object Lambda 存取點別名已成功佈建並可供使用。

如需詳細了解 REST API 中的 `ObjectLambdaAccessPointAlias` 資料類型，請參閱《Amazon Simple Storage Service API 參考》**中的 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_ObjectLambdaAccessPointAlias.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_ObjectLambdaAccessPointAlias.html) 和 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateAccessPointForObjectLambda.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateAccessPointForObjectLambda.html)。

### 如何使用 Object Lambda 存取點別名
<a name="use-olap-alias"></a>

您可以針對 [存取點相容性](access-points-service-api-support.md) 所列操作，使用 Object Lambda 存取點別名，而非 Amazon S3 儲存貯體名稱。

下列 `get-bucket-location`命令 AWS CLI 範例會使用儲存貯體的存取點別名，傳回 AWS 區域 儲存貯體所在的 。若要執行此命令，請以您自己的資訊取代 `user input placeholders`。

```
aws s3api get-bucket-location --bucket my-object-lambda-acc-w7i37nq6xuzgax3jw3oqtifiusw2a--ol-s3
            
{
    "LocationConstraint": "us-west-2"
}
```

若請求中的 Object Lambda 存取點別名無效，則會傳回 `InvalidAccessPointAliasError` 錯誤碼。如需有關 `InvalidAccessPointAliasError` 的詳細資訊，請參閱《Amazon Simple Storage Service API 參考》**中的[錯誤代碼清單](https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList)。

Object Lambda 存取點別名的限制與存取點別名的限制相同。如需存取點別名限制的詳細資訊，請參閱 [存取點別名限制](access-points-naming.md#use-ap-alias-limitations)。

# S3 Object Lambda 存取點的安全考量
<a name="olap-security"></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)。

透過 Amazon S3 Object Lambda，您可以使用 AWS Lambda 作為運算平台的擴展和彈性，在資料離開 Amazon S3 時執行自訂轉換。S3 和 Lambda 依預設保持安全狀態，但若要維護安全，需要 Lambda 函數授權方的特別考量。S3 Object Lambda 要求所有存取都由經過驗證的主體 (無匿名訪問) 和透過 HTTPS 進行。

若要緩解安全風險，建議您採取下列操作：
+ 將 Lambda 執行角色的範圍儘可能設定為最小的許可集。
+ 儘可能確保您的 Lambda 函數透過提供的預先簽章 URL 存取 Amazon S3。

## 設定 IAM 政策
<a name="olap-iam-policies"></a>

S3 存取點支援 AWS Identity and Access Management (IAM) 資源政策，可讓您依資源、使用者或其他條件控制存取點的使用。如需詳細資訊，請參閱[設定 Object Lambda 存取點的 IAM 政策](olap-policies.md)。

## 加密行為
<a name="olap-encryption"></a>

由於 Object Lambda 存取點同時使用 Amazon S3 和 AWS Lambda，因此加密行為會有所不同。如需預設 S3 加密行為的詳細資訊，請參閱[對 Amazon S3 儲存貯體設定預設伺服器端加密行為](bucket-encryption.md)。
+ 當您搭配 Object Lambda 存取點使用 S3 伺服器端加密時，物件會在傳送至 Lambda 之前進行解密。將物件傳送至 Lambda 之後，會以未加密方式處理物件 (若為 `GET` 或 `HEAD` 請求)。
+ 為了防止金鑰遭到記錄，S3 會針對搭配客戶提供的金鑰 (SSE-C) 使用伺服器加密來加密的物件拒絕 `GET` 和 `HEAD` 請求。不過，如果 Lambda 函數可以存取用戶端提供的金鑰，則它仍然可能擷取這些物件。
+ 搭配 Object Lambda 存取點使用 S3 用戶端加密時，請確定 Lambda 可以存取金鑰，以便其可以解密和重新加密物件。

## 存取點安全
<a name="olap-access-points-security"></a>

S3 Object Lambda 使用兩個存取點，一個 Object Lambda 存取點和一個標準 S3 存取點，這些稱為*支援存取點*。當您對 Object Lambda 存取點提出請求時，S3 會代表您叫用 Lambda，或將請求委派給支援的存取點 (視 S3 Object Lambda 組態而定)。當針對請求叫用 Lambda 時，S3 會透過支援存取點代表您對物件產生預先簽章的 URL。叫用 Lambda 函數時，此函數會接收此 URL 作為輸入。

您可以將 Lambda 函數設定為使用此預先簽章 URL 來擷取原始物件，而不是直接叫用 S3。藉由使用此模型，您可以將更好的安全界限套用至您的物件。您可以透過 S3 儲存貯體或 S3 存取點，將直接物件存取限制為一組有限的 IAM 角色或使用者。此方法也可以保護 Lambda 函數免受[混淆代理人問題](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)的影響，其中具有與啟動程式不同許可的錯誤設定函數可能會允許或拒絕物件的存取。

## Object Lambda 存取點公有存取點
<a name="olap-public-access"></a>

S3 Object Lambda 不允許匿名或公有存取，因為 Amazon S3 必須授權您的身分，才能完成任何 S3 Object Lambda 請求。當透過 Object Lambda 存取點叫用請求時，您必須具有所設定 Lambda 函數的 `lambda:InvokeFunction` 許可。同樣，當透過 Object Lambda 存取點叫用其他 API 操作時，您必須具有必要的 `s3:*` 許可。

若沒有這些許可，叫用 Lambda 或委派給 S3 的請求將會失敗，並顯示 HTTP 403 (禁止) 錯誤。所有存取必須由經過身分驗證的委託人進行。如果需要公有存取，您可以使用 Lambda@Edge 作為可能的替代方案。如需詳細資訊，請參閱《Amazon CloudFront 開發人員指南》**中的[使用 Lambda@Edge 在邊緣進行自訂](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-at-the-edge.html)。

## Object Lambda 存取點 IP 位址
<a name="olap-ips"></a>

這些`describe-managed-prefix-lists` 子網路支援閘道虛擬私有雲端 (VPC) 端點，並且與 VPC 端點的路由表相關。由於 Object Lambda 存取點不支援閘道 VPC，因此缺少其 IP 範圍。缺少的範圍屬於 Amazon S3，但閘道 VPC 端點不支援。如需 `describe-managed-prefix-lists` 的詳細資訊，請參閱《Amazon EC2 API 參考》**中的 [DescribeManagedPrefixLists](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeManagedPrefixLists.html) 和《AWS 一般參考》**中的 [AWS IP 位址範圍](https://docs.aws.amazon.com/general/latest/gr/aws-ip-ranges.html)。

# 設定 Object Lambda 存取點的 IAM 政策
<a name="olap-policies"></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)。

Amazon S3 存取點支援 AWS Identity and Access Management (IAM) 資源政策，可用於依資源、使用者或其他條件控制存取點的使用。您可以透過 Object Lambda 存取點上的選用資源政策或支援存取點的資源政策來控制存取。如需逐步範例說明，請參閱 [教學課程：使用 S3 Object Lambda 轉換應用程式的資料](tutorial-s3-object-lambda-uppercase.md) 和 [教學課程：使用 S3 Object Lambda 和 Amazon Comprehend 來偵測和編輯 PII 資料](tutorial-s3-object-lambda-redact-pii.md)。

下列四個資源必須具有使用 Object Lambda 存取點的許可：
+ IAM 身分，例如使用者或角色。如需 IAM 身分與最佳實務的詳細資訊，請參閱《IAM 使用者指南》**中的 [IAM 身分 (使用者、群組和角色)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id.html)。
+ 連接至底層資料來源的標準存取點，例如 S3 儲存貯體或 Amazon FSx for OpenZFS 磁碟區。當您使用 Object Lambda 存取點時，此標準存取點稱為*支援存取點*。
+ Object Lambda 存取點。
+  AWS Lambda 函數。

**重要**  
儲存政策之前，請務必解決安全警告、錯誤、一般警告和建議 AWS Identity and Access Management Access Analyzer。IAM Access Analyzer 會比對 IAM [政策文法](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_grammar.html)和[最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)來執行政策檢查，以驗證您的政策。這些檢查會產生問題清單並提供可行的建議，協助您撰寫具有功能性且符合安全最佳實務的政策。  
若要進一步了解如何使用 IAM Access Analyzer 驗證政策，請參閱《IAM 使用者指南》**中的 [IAM Access Analyzer 政策驗證](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-policy-validation.html)。若要檢視 IAM Access Analyzer 傳回的警告、錯誤和建議清單，請參閱 [IAM Access Analyzer 政策檢查參考](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-reference-policy-checks.html)。

下列政策範例假設您有下列資源：
+ 含有下列 Amazon Resource Name (ARN) 的 Amazon S3 儲存貯體：

  `arn:aws:s3:::amzn-s3-demo-bucket1`
+ 具有下列 ARN 的此儲存貯體上的 Amazon S3 Standard 存取點：

  `arn:aws:s3:us-east-1:111122223333:accesspoint/my-access-point`
+ 具有下列 ARN 的 Object Lambda 存取點：

  `arn:aws:s3-object-lambda:us-east-1:111122223333:accesspoint/my-object-lambda-ap`
+ 具有下列 ARN 的 AWS Lambda 函數：

  `arn:aws:lambda:us-east-1:111122223333:function:MyObjectLambdaFunction`

**注意**  
如果從您的帳戶使用 Lambda 函數，您必須在政策陳述式中包含特定函數版本。在下列範例 ARN 中，版本是以 *1* 表示：  
`arn:aws:lambda:us-east-1:111122223333:function:MyObjectLambdaFunction:1`  
Lambda 不支援將 IAM 政策新增至版本 `$LATEST`。如需 Lambda 函數版本的詳細資訊，請參閱《AWS Lambda 開發人員指南》**中的 [Lambda 函數版本](https://docs.aws.amazon.com/lambda/latest/dg/configuration-versions.html)。

**Example - 將存取控制委派給標準存取點的儲存貯體政策**  
下列 S3 儲存貯體政策範例會將儲存貯體的存取控制委派給儲存貯體的標準存取點。此政策允許完整存取儲存貯體擁有者帳戶所擁有的所有存取點。因此，對此儲存貯體的所有存取皆由連接至其存取點的政策所控制。使用者只能透過存取點從儲存貯體讀取，這表示只能透過存取點叫用操作。如需詳細資訊，請參閱[將存取控制委派給存取點](access-points-policies.md#access-points-delegating-control)。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement" : [
    {
        "Effect": "Allow",
        "Principal" : { "AWS":"account-ARN"},
        "Action" : "*",
        "Resource" : [
            "arn:aws:s3:::amzn-s3-demo-bucket", 
            "arn:aws:s3:::amzn-s3-demo-bucket/*"
        ],
        "Condition": {
            "StringEquals" : { "s3:DataAccessPointAccount" : "Bucket owner's account ID" }
        }
    }]
}
```

**Example – 授予使用者必要許可，使其可以使用 Object Lambda 存取點的 IAM 政策**  
下列 IAM 政策許可使用者使用 Lambda 函數、標準存取點和 Object Lambda 存取點。    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowLambdaInvocation",
      "Action": [
        "lambda:InvokeFunction"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:lambda:us-east-1:111122223333:function:MyObjectLambdaFunction:1",
      "Condition": {
        "ForAnyValue:StringEquals": {
          "aws:CalledVia": [
            "s3-object-lambda.amazonaws.com"
          ]
        }
      }
    },
    {
      "Sid": "AllowStandardAccessPointAccess",
      "Action": [
        "s3:Get*",
        "s3:List*"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:us-east-1:111122223333:accesspoint/my-access-point/*",
      "Condition": {
        "ForAnyValue:StringEquals": {
          "aws:CalledVia": [
            "s3-object-lambda.amazonaws.com"
          ]
        }
      }
    },
    {
      "Sid": "AllowObjectLambdaAccess",
      "Action": [
        "s3-object-lambda:Get*",
        "s3-object-lambda:List*"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3-object-lambda:us-east-1:111122223333:accesspoint/my-object-lambda-ap"
    }
  ]
}
```

## 啟用 Lambda 執行角色的許可
<a name="olap-execution-role"></a>

對 Object Lambda 存取點提出 `GET` 請求時，您的 Lambda 函數需要許可，才能將資料傳送至 S3 Object Lambda 存取點。此許可是透過對您的 Lambda 函數的執行角色啟用 `s3-object-lambda:WriteGetObjectResponse` 許可來提供的。您可建立新的執行角色，或使用現有的角色進行更新。

**注意**  
只有當您提出 `GET` 請求時，您的函數才需要 `s3-object-lambda:WriteGetObjectResponse` 許可。

**若要在 IAM 主控台中建立執行角色**

1. 前往 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

1. 在左側導覽窗格中，選擇 **Roles** (角色)。

1. 選擇**建立角色**。

1. 在 **Common use cases** (一般使用案例) 下，選擇 **Lambda**。

1. 選擇**下一步**。

1. 在**新增許可**頁面上，搜尋 AWS 受管政策 [https://console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/service-role/AmazonS3ObjectLambdaExecutionRolePolicy$serviceLevelSummary](https://console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/service-role/AmazonS3ObjectLambdaExecutionRolePolicy$serviceLevelSummary)，然後選取政策名稱旁的核取方塊。

   此政策應包含 `s3-object-lambda:WriteGetObjectResponse` 動作。

1. 選擇**下一步**。

1. 在 **Name, review, and create** (命名、檢閱和建立) 頁面上，針對 **Role name** (角色名稱) 輸入 **s3-object-lambda-role**。

1. (選用) 新增此角色的描述和標籤。

1. 選擇建**立角色**。

1. 套用新建立的 **s3-object-lambda-role** 作為 Lambda 函數的執行角色。此動作可以在 Lambda 主控台中建立 Lambda 函數期間或之後完成。

如需執行角色的詳細資訊，請參閱《AWS Lambda 開發人員指南》**中的 [Lambda 執行角色](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html)。

## 搭配 Object Lambda 存取點使用內容索引鍵
<a name="olap-keys"></a>

S3 Object Lambda 將評估內容索引鍵，例如，與連線相或請求簽署相關的 `s3-object-lambda:TlsVersion` 或 `s3-object-lambda:AuthType`。所有其他內容索引鍵，例如 `s3:prefix`，都會由 Amazon S3 評估。

## Object Lambda 存取點 CORS 支援
<a name="olap-cors"></a>

當 S3 Object Lambda 從瀏覽器接收到請求，或請求包含 `Origin` 標頭時，S3 Object Lambda 一律會新增 `"AllowedOrigins":"*"` 標頭欄位。

如需詳細資訊，請參閱[使用跨來源資源分享 (CORS)](cors.md)。

# 撰寫 S3 Object Lambda 存取點的 Lambda 函數
<a name="olap-writing-lambda"></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 Lambda 函數以搭配 Amazon S3 Object Lambda 存取點使用。

若要了解部分 S3 Object Lambda 任務的完整端對端程序，請參閱下列內容：
+ [教學課程：使用 S3 Object Lambda 轉換應用程式的資料](tutorial-s3-object-lambda-uppercase.md)
+ [教學課程：使用 S3 Object Lambda 和 Amazon Comprehend 來偵測和編輯 PII 資料](tutorial-s3-object-lambda-redact-pii.md)
+ [教學課程：使用 S3 Object Lambda 在擷取影像時動態加上浮水印](https://aws.amazon.com/getting-started/hands-on/amazon-s3-object-lambda-to-dynamically-watermark-images/?ref=docs_gateway/amazons3/olap-writing-lambda.html)

**Topics**
+ [使用 Lambda 中的 `GetObject` 請求](#olap-getobject-response)
+ [使用 Lambda 中的 `HeadObject` 請求](#olap-headobject)
+ [使用 Lambda 中的 `ListObjects` 請求](#olap-listobjects)
+ [使用 Lambda 中的 `ListObjectsV2` 請求](#olap-listobjectsv2)
+ [事件內容格式和用量](olap-event-context.md)
+ [使用 Range 和 partNumber 標頭](range-get-olap.md)

## 使用 Lambda 中的 `GetObject` 請求
<a name="olap-getobject-response"></a>

本節假設您的 Object Lambda 存取點已設定為呼叫 `GetObject` 的 Lambda 函數。S3 Object Lambda 包含 Amazon S3 API 操作 (`WriteGetObjectResponse`)，其可讓 Lambda 函數為 `GetObject` 呼叫者提供自訂的資料和回應標頭。

`WriteGetObjectResponse` 可讓您根據處理需求，全面控制狀態碼、回應標頭和回應本文。您可以使用 `WriteGetObjectResponse`，以整個轉換的物件、轉換物件的部分，或是基於應用程式內容的其他回應進行回應。下一節展示了使用 `WriteGetObjectResponse` API 操作的唯一範例。
+ **範例 1：**使用 HTTP 狀態代碼 403 (禁止) 回應 
+ **範例 2：**以轉換後的映像回應
+ **範例 3：**串流壓縮內容

**範例 1：使用 HTTP 狀態代碼 403 (禁止) 回應**

您可以根據物件內容使用 `WriteGetObjectResponse` 回應 HTTP 狀態代碼 403 (禁止)。

------
#### [ Java ]



```
package com.amazon.s3.objectlambda;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.events.S3ObjectLambdaEvent;
import software.amazon.awssdk.core.sync.RequestBody;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.WriteGetObjectResponseRequest;

import java.io.ByteArrayInputStream;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Example1 {

    public void handleRequest(S3ObjectLambdaEvent event, Context context) throws Exception {
        S3Client s3Client = S3Client.builder().build();

        // Check to see if the request contains all of the necessary information.
        // If it does not, send a 4XX response and a custom error code and message.
        // Otherwise, retrieve the object from S3 and stream it
        // to the client unchanged.
        var tokenIsNotPresent = !event.getUserRequest().getHeaders().containsKey("requiredToken");
        if (tokenIsNotPresent) {
            s3Client.writeGetObjectResponse(WriteGetObjectResponseRequest.builder()
                    .requestRoute(event.outputRoute())
                    .requestToken(event.outputToken())
                    .statusCode(403)
                    .contentLength(0L)
                    .errorCode("MissingRequiredToken")
                    .errorMessage("The required token was not present in the request.")
                    .build(),
                    RequestBody.fromInputStream(new ByteArrayInputStream(new byte[0]), 0L));
            return;
        }

        // Prepare the presigned URL for use and make the request to S3.
        HttpClient httpClient = HttpClient.newBuilder().build();
        var presignedResponse = httpClient.send(
                HttpRequest.newBuilder(new URI(event.inputS3Url())).GET().build(),
                HttpResponse.BodyHandlers.ofInputStream());

        // Stream the original bytes back to the caller.
        s3Client.writeGetObjectResponse(WriteGetObjectResponseRequest.builder()
                .requestRoute(event.outputRoute())
                .requestToken(event.outputToken())
                .build(),
                RequestBody.fromInputStream(presignedResponse.body(),
                    presignedResponse.headers().firstValueAsLong("content-length").orElse(-1L)));
    }
}
```

------
#### [ Python ]



```
import boto3
import requests 

def handler(event, context):
    s3 = boto3.client('s3')

    """
    Retrieve the operation context object from the event. This object indicates where the WriteGetObjectResponse request
    should be delivered and contains a presigned URL in 'inputS3Url' where we can download the requested object from.
    The 'userRequest' object has information related to the user who made this 'GetObject' request to 
    S3 Object Lambda.
    """
    get_context = event["getObjectContext"]
    user_request_headers = event["userRequest"]["headers"]

    route = get_context["outputRoute"]
    token = get_context["outputToken"]
    s3_url = get_context["inputS3Url"]

    # Check for the presence of a 'CustomHeader' header and deny or allow based on that header.
    is_token_present = "SuperSecretToken" in user_request_headers

    if is_token_present:
        # If the user presented our custom 'SuperSecretToken' header, we send the requested object back to the user.
        response = requests.get(s3_url)
        s3.write_get_object_response(RequestRoute=route, RequestToken=token, Body=response.content)
    else:
        # If the token is not present, we send an error back to the user. 
        s3.write_get_object_response(RequestRoute=route, RequestToken=token, StatusCode=403,
        ErrorCode="NoSuperSecretTokenFound", ErrorMessage="The request was not secret enough.")

    # Gracefully exit the Lambda function.
    return { 'status_code': 200 }
```

------
#### [ Node.js ]



```
const { S3 } = require('aws-sdk');
const axios = require('axios').default;

exports.handler = async (event) => {
    const s3 = new S3();

    // Retrieve the operation context object from the event. This object indicates where the WriteGetObjectResponse request
    // should be delivered and contains a presigned URL in 'inputS3Url' where we can download the requested object from.
    // The 'userRequest' object has information related to the user who made this 'GetObject' request to S3 Object Lambda.
    const { userRequest, getObjectContext } = event;
    const { outputRoute, outputToken, inputS3Url } = getObjectContext;

    // Check for the presence of a 'CustomHeader' header and deny or allow based on that header.
    const isTokenPresent = Object
        .keys(userRequest.headers)
        .includes("SuperSecretToken");

    if (!isTokenPresent) {
        // If the token is not present, we send an error back to the user. The 'await' in front of the request
        // indicates that we want to wait for this request to finish sending before moving on. 
        await s3.writeGetObjectResponse({
            RequestRoute: outputRoute,
            RequestToken: outputToken,
            StatusCode: 403,
            ErrorCode: "NoSuperSecretTokenFound",
            ErrorMessage: "The request was not secret enough.",
        }).promise();
    } else {
        // If the user presented our custom 'SuperSecretToken' header, we send the requested object back to the user.
        // Again, note the presence of 'await'.
        const presignedResponse = await axios.get(inputS3Url);
        await s3.writeGetObjectResponse({
            RequestRoute: outputRoute,
            RequestToken: outputToken,
            Body: presignedResponse.data,
        }).promise();
    }

    // Gracefully exit the Lambda function.
    return { statusCode: 200 };
}
```

------

**範例 2：**以轉換後的映像回應

執行映像轉換時，您可能會發現您需要來源物件的所有位元組，才能開始對其進行處理。在本例中，`WriteGetObjectResponse` 請求會在一次呼叫中，將整個物件傳回給請求的應用程式。

------
#### [ Java ]



```
package com.amazon.s3.objectlambda;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.events.S3ObjectLambdaEvent;
import software.amazon.awssdk.core.sync.RequestBody;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.WriteGetObjectResponseRequest;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.awt.Image;
import java.io.ByteArrayOutputStream;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Example2V2 {

    private static final int HEIGHT = 250;
    private static final int WIDTH = 250;

    public void handleRequest(S3ObjectLambdaEvent event, Context context) throws Exception {
        S3Client s3Client = S3Client.builder().build();
        HttpClient httpClient = HttpClient.newBuilder().build();

        // Prepare the presigned URL for use and make the request to S3.
        var presignedResponse = httpClient.send(
                HttpRequest.newBuilder(new URI(event.inputS3Url())).GET().build(),
                HttpResponse.BodyHandlers.ofInputStream());

        // The entire image is loaded into memory here so that we can resize it.
        // Once the resizing is completed, we write the bytes into the body
        // of the WriteGetObjectResponse request.
        var originalImage = ImageIO.read(presignedResponse.body());
        var resizingImage = originalImage.getScaledInstance(WIDTH, HEIGHT, Image.SCALE_DEFAULT);
        var resizedImage = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
        resizedImage.createGraphics().drawImage(resizingImage, 0, 0, WIDTH, HEIGHT, null);

        var baos = new ByteArrayOutputStream();
        ImageIO.write(resizedImage, "png", baos);

        // Stream the bytes back to the caller.
        s3Client.writeGetObjectResponse(WriteGetObjectResponseRequest.builder()
                .requestRoute(event.outputRoute())
                .requestToken(event.outputToken())
                .build(), RequestBody.fromBytes(baos.toByteArray()));
    }
}
```

------
#### [ Python ]



```
import boto3
import requests 
import io
from PIL import Image

def handler(event, context):
    """
    Retrieve the operation context object from the event. This object indicates where the WriteGetObjectResponse request
    should be delivered and has a presigned URL in 'inputS3Url' where we can download the requested object from.
    The 'userRequest' object has information related to the user who made this 'GetObject' request to 
    S3 Object Lambda.
    """
    get_context = event["getObjectContext"]
    route = get_context["outputRoute"]
    token = get_context["outputToken"]
    s3_url = get_context["inputS3Url"]

    """
    In this case, we're resizing .png images that are stored in S3 and are accessible through the presigned URL
    'inputS3Url'.
    """
    image_request = requests.get(s3_url)
    image = Image.open(io.BytesIO(image_request.content))
    image.thumbnail((256,256), Image.ANTIALIAS)

    transformed = io.BytesIO()
    image.save(transformed, "png")

    # Send the resized image back to the client.
    s3 = boto3.client('s3')
    s3.write_get_object_response(Body=transformed.getvalue(), RequestRoute=route, RequestToken=token)

    # Gracefully exit the Lambda function.
    return { 'status_code': 200 }
```

------
#### [ Node.js ]



```
const { S3 } = require('aws-sdk');
const axios = require('axios').default;
const sharp = require('sharp');

exports.handler = async (event) => {
    const s3 = new S3();

    // Retrieve the operation context object from the event. This object indicates where the WriteGetObjectResponse request
    // should be delivered and has a presigned URL in 'inputS3Url' where we can download the requested object from.
    const { getObjectContext } = event;
    const { outputRoute, outputToken, inputS3Url } = getObjectContext;

    // In this case, we're resizing .png images that are stored in S3 and are accessible through the presigned URL
    // 'inputS3Url'.
    const { data } = await axios.get(inputS3Url, { responseType: 'arraybuffer' });

    // Resize the image.
    const resized = await sharp(data)
        .resize({ width: 256, height: 256 })
        .toBuffer();

    // Send the resized image back to the client.
    await s3.writeGetObjectResponse({
        RequestRoute: outputRoute,
        RequestToken: outputToken,
        Body: resized,
    }).promise();

    // Gracefully exit the Lambda function.
    return { statusCode: 200 };
}
```

------

**範例 3：**串流壓縮內容

壓縮物件時，壓縮的資料會以增量方式產生。因此，您可以使用 `WriteGetObjectResponse` 請求，在壓縮資料就緒時將其傳回。如本範例所示，您不需要知道完成轉換的長度。

------
#### [ Java ]



```
package com.amazon.s3.objectlambda;

import com.amazonaws.services.lambda.runtime.events.S3ObjectLambdaEvent;
import com.amazonaws.services.lambda.runtime.Context;
import software.amazon.awssdk.core.sync.RequestBody;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.WriteGetObjectResponseRequest;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Example3 {

    public void handleRequest(S3ObjectLambdaEvent event, Context context) throws Exception {
        S3Client s3Client = S3Client.builder().build();
        HttpClient httpClient = HttpClient.newBuilder().build();

        // Request the original object from S3.
        var presignedResponse = httpClient.send(
                HttpRequest.newBuilder(new URI(event.inputS3Url())).GET().build(),
                HttpResponse.BodyHandlers.ofInputStream());

        // Consume the incoming response body from the presigned request,
        // apply our transformation on that data, and emit the transformed bytes
        // into the body of the WriteGetObjectResponse request as soon as they're ready.
        // This example compresses the data from S3, but any processing pertinent
        // to your application can be performed here.
        var bodyStream = new GZIPCompressingInputStream(presignedResponse.body());

        // Stream the bytes back to the caller.
        s3Client.writeGetObjectResponse(WriteGetObjectResponseRequest.builder()
                .requestRoute(event.outputRoute())
                .requestToken(event.outputToken())
                .build(),
                RequestBody.fromInputStream(bodyStream,
                    presignedResponse.headers().firstValueAsLong("content-length").orElse(-1L)));
    }
}
```

------
#### [ Python ]



```
import boto3
import requests
import zlib
from botocore.config import Config


"""
A helper class to work with content iterators. Takes an interator and compresses the bytes that come from it. It
implements 'read' and '__iter__' so that the SDK can stream the response. 
"""
class Compress:
    def __init__(self, content_iter):
        self.content = content_iter
        self.compressed_obj = zlib.compressobj()

    def read(self, _size):
        for data in self.__iter__()
            return data

    def __iter__(self):
        while True:
            data = next(self.content)
            chunk = self.compressed_obj.compress(data)
            if not chunk:
                break

            yield chunk

        yield self.compressed_obj.flush()


def handler(event, context):
    """
    Setting the 'payload_signing_enabled' property to False allows us to send a streamed response back to the client.
    in this scenario, a streamed response means that the bytes are not buffered into memory as we're compressing them,
    but instead are sent straight to the user.
    """
    my_config = Config(
        region_name='eu-west-1',
        signature_version='s3v4',
        s3={
            "payload_signing_enabled": False
        }
    )
    s3 = boto3.client('s3', config=my_config)

    """
    Retrieve the operation context object from the event. This object indicates where the WriteGetObjectResponse request
    should be delivered and has a presigned URL in 'inputS3Url' where we can download the requested object from.
    The 'userRequest' object has information related to the user who made this 'GetObject' request to S3 Object Lambda.
    """
    get_context = event["getObjectContext"]
    route = get_context["outputRoute"]
    token = get_context["outputToken"]
    s3_url = get_context["inputS3Url"]

    # Compress the 'get' request stream.
    with requests.get(s3_url, stream=True) as r:
        compressed = Compress(r.iter_content())

        # Send the stream back to the client.
        s3.write_get_object_response(Body=compressed, RequestRoute=route, RequestToken=token, ContentType="text/plain",
                                     ContentEncoding="gzip")

    # Gracefully exit the Lambda function.
    return {'status_code': 200}
```

------
#### [ Node.js ]



```
const { S3 } = require('aws-sdk');
const axios = require('axios').default;
const zlib = require('zlib');

exports.handler = async (event) => {
    const s3 = new S3();

    // Retrieve the operation context object from the event. This object indicates where the WriteGetObjectResponse request
    // should be delivered and has a presigned URL in 'inputS3Url' where we can download the requested object from.
    const { getObjectContext } = event;
    const { outputRoute, outputToken, inputS3Url } = getObjectContext;

    // Download the object from S3 and process it as a stream, because it might be a huge object and we don't want to
    // buffer it in memory. Note the use of 'await' because we want to wait for 'writeGetObjectResponse' to finish 
    // before we can exit the Lambda function. 
    await axios({
        method: 'GET',
        url: inputS3Url,
        responseType: 'stream',
    }).then(
        // Gzip the stream.
        response => response.data.pipe(zlib.createGzip())
    ).then(
        // Finally send the gzip-ed stream back to the client.
        stream => s3.writeGetObjectResponse({
            RequestRoute: outputRoute,
            RequestToken: outputToken,
            Body: stream,
            ContentType: "text/plain",
            ContentEncoding: "gzip",
        }).promise()
    );

    // Gracefully exit the Lambda function.
    return { statusCode: 200 };
}
```

------

**注意**  
雖然 S3 Object Lambda 允許最多 60 秒，透過 `WriteGetObjectResponse` 請求將完整的回應傳送給呼叫者，但實際可用時間可能會更少。例如，Lambda 函數逾時可能小於 60 秒。在其他情況下，呼叫者可能會有更嚴格的逾時要求。

對於接收非 HTTP 狀態碼 500 (內部伺服器錯誤) 的原始呼叫者，必須完成 `WriteGetObjectResponse` 呼叫。異常或其他情形下，如果 Lambda 函數在呼叫 `WriteGetObjectResponse` API 操作之前傳回，則原始呼叫者將會收到 500 (內部伺服器錯誤) 回應。在完成回應所需的時間內擲出的異常會導致對呼叫者的回應截斷。如果 Lambda 函數從 `WriteGetObjectResponse` API 呼叫收到 HTTP 狀態碼 200 (OK) 回應，則原始呼叫者已傳送完整的請求。無論是否擲出異常，S3 Object Lambda 都會忽略 Lambda 函數的回應。

呼叫 `WriteGetObjectResponse` API 操作時，Amazon S3 需要來自事件內容的路由和請求字符。如需詳細資訊，請參閱[事件內容格式和用量](olap-event-context.md)。

路由和請求字符參數是必要項目，用來將 `WriteGetObjectResult` 回應與原始呼叫者連線。即使重試 500 (內部伺服器錯誤) 回應始終適用，仍請注意，請求字符是單次使用字符，後續嘗試使用該字符可能會導致 HTTP 狀態碼 400 (錯誤請求) 回應。雖然使用路由和請求字符的 `WriteGetObjectResponse` 呼叫不需要從叫用的 Lambda 函數建立，但必須由同一帳戶中的身分進行呼叫。在 Lambda 函數完成執行之前，還必須完成呼叫。

## 使用 Lambda 中的 `HeadObject` 請求
<a name="olap-headobject"></a>

本節假設您的 Object Lambda 存取點已設定為呼叫 `HeadObject` 的 Lambda 函數。Lambda 將收到一個 JSON 承載，其中包含一個稱為 `headObjectContext` 的金鑰。在內容中，有一個稱為 `inputS3Url` 的單一屬性，這是 `HeadObject` 支援存取點的預先簽章 URL。

如果已指定預先簽章 URL，則此 URL 將包含下列屬性：
+ `versionId` (在查詢參數中)
+ `requestPayer` (在 `x-amz-request-payer` 標頭中)
+ `expectedBucketOwner` (在 `x-amz-expected-bucket-owner` 標頭中)

其他屬性不會預先簽章，因此不會包含在內。呼叫 `userRequest` 標頭中找到的預先簽章 URL 時，可以將以標頭形式傳送的未簽章選項手動新增至請求。`HeadObject` 不支援伺服器端加密選項。

如需請求語法 URI 參數，請參閱《Amazon Simple Storage Service API 參考》**中的 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html)。

下列範例顯示 `HeadObject` 的 Lambda JSON 輸入承載。

```
{
  "xAmzRequestId": "requestId",
  "**headObjectContext**": {
    "**inputS3Url**": "https://my-s3-ap-111122223333.s3-accesspoint.us-east-1.amazonaws.com/example?X-Amz-Security-Token=<snip>"
  },
  "configuration": {
       "accessPointArn": "arn:aws:s3-object-lambda:us-east-1:111122223333:accesspoint/example-object-lambda-ap",
       "supportingAccessPointArn": "arn:aws:s3:us-east-1:111122223333:accesspoint/example-ap",
       "payload": "{}"
  },
  "userRequest": {
       "url": "https://object-lambda-111122223333.s3-object-lambda.us-east-1.amazonaws.com/example",
       "headers": {
           "Host": "object-lambda-111122223333.s3-object-lambda.us-east-1.amazonaws.com",
           "Accept-Encoding": "identity",
           "X-Amz-Content-SHA256": "e3b0c44298fc1example"
       }
   },
   "userIdentity": {
       "type": "AssumedRole",
       "principalId": "principalId",
       "arn": "arn:aws:sts::111122223333:assumed-role/Admin/example",       
       "accountId": "111122223333",
       "accessKeyId": "accessKeyId",
       "sessionContext": {
            "attributes": {
            "mfaAuthenticated": "false",
            "creationDate": "Wed Mar 10 23:41:52 UTC 2021"
       },
       "sessionIssuer": {
            "type": "Role",
            "principalId": "principalId",
            "arn": "arn:aws:iam::111122223333:role/Admin",
            "accountId": "111122223333",
            "userName": "Admin"
            }
       }
    },
  "protocolVersion": "1.00"
}
```

您的 Lambda 函數應該傳回一個 JSON 物件，其中包含將為 `HeadObject` 呼叫傳回的標頭和值。

下列範例顯示 `HeadObject` 的 Lambda 回應 JSON 結構。

```
{
    "statusCode": <number>; // Required
    "errorCode": <string>;
    "errorMessage": <string>;
    "headers": {
        "Accept-Ranges": <string>,
        "x-amz-archive-status": <string>,
        "x-amz-server-side-encryption-bucket-key-enabled": <boolean>,
        "Cache-Control": <string>,
        "Content-Disposition": <string>,
        "Content-Encoding": <string>,
        "Content-Language": <string>,
        "Content-Length": <number>, // Required
        "Content-Type": <string>,
        "x-amz-delete-marker": <boolean>,
        "ETag": <string>,
        "Expires": <string>,
        "x-amz-expiration": <string>,
        "Last-Modified": <string>,
        "x-amz-missing-meta": <number>,
        "x-amz-object-lock-mode": <string>,
        "x-amz-object-lock-legal-hold": <string>,
        "x-amz-object-lock-retain-until-date": <string>,
        "x-amz-mp-parts-count": <number>,
        "x-amz-replication-status": <string>,
        "x-amz-request-charged": <string>,
        "x-amz-restore": <string>,
        "x-amz-server-side-encryption": <string>,
        "x-amz-server-side-encryption-customer-algorithm": <string>,
        "x-amz-server-side-encryption-aws-kms-key-id": <string>,
        "x-amz-server-side-encryption-customer-key-MD5": <string>,
        "x-amz-storage-class": <string>,
        "x-amz-tagging-count": <number>,
        "x-amz-version-id": <string>,
        <x-amz-meta-headers>: <string>, // user-defined metadata 
        "x-amz-meta-meta1": <string>, // example of the user-defined metadata header, it will need the x-amz-meta prefix
        "x-amz-meta-meta2": <string>
        ...
    };
}
```

下列範例會示範如何使用預先簽章的 URL 填入回應，方法是在傳回 JSON 之前視需要修改標頭值。

------
#### [ Python ]



```
import requests

def lambda_handler(event, context):
    print(event)
    
    # Extract the presigned URL from the input.
    s3_url = event["headObjectContext"]["inputS3Url"]

    # Get the head of the object from S3.     
    response = requests.head(s3_url)
    
    # Return the error to S3 Object Lambda (if applicable).           
    if (response.status_code >= 400):
        return {
            "statusCode": response.status_code,
            "errorCode": "RequestFailure",                         
            "errorMessage": "Request to S3 failed"    
    }
    
    # Store the headers in a dictionary.
    response_headers = dict(response.headers)

    # This obscures Content-Type in a transformation, it is optional to add
    response_headers["Content-Type"] = "" 

    # Return the headers to S3 Object Lambda.     
    return {
        "statusCode": response.status_code,
        "headers": response_headers     
        }
```

------

## 使用 Lambda 中的 `ListObjects` 請求
<a name="olap-listobjects"></a>

本節假設您的 Object Lambda 存取點已設定為呼叫 `ListObjects` 的 Lambda 函數。Lambda 將接收 JSON 承載，其中包含名為 `listObjectsContext` 的新物件。`listObjectsContext` 包含單一屬性 `inputS3Url`，這是 `ListObjects` 支援存取點的預先簽章 URL。

與 `GetObject` 和 `HeadObject` 不同，如果已指定預先簽章 URL，則此 URL 將包含下列屬性：
+ 所有查詢參數
+ `requestPayer` (在 `x-amz-request-payer` 標頭中) 
+ `expectedBucketOwner` (在 `x-amz-expected-bucket-owner` 標頭中)

如需請求語法 URI 參數，請參閱《Amazon Simple Storage Service API 參考》**中的 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjects.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjects.html)。

**重要**  
建議您在開發應用程式時，使用更新的版本 ([LitObjectLitSv2](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html))。為了回溯相容性，Amazon S3 繼續支援 `ListObjects`。

下列範例顯示 `ListObjects` 的 Lambda JSON 輸入承載。

```
{
    "xAmzRequestId": "requestId",
     "**listObjectsContext**": {
     "**inputS3Url**": "https://my-s3-ap-111122223333.s3-accesspoint.us-east-1.amazonaws.com/?X-Amz-Security-Token=<snip>",
     },
    "configuration": {
        "accessPointArn": "arn:aws:s3-object-lambda:us-east-1:111122223333:accesspoint/example-object-lambda-ap",
        "supportingAccessPointArn": "arn:aws:s3:us-east-1:111122223333:accesspoint/example-ap",
        "payload": "{}"
    },
    "userRequest": {
        "url": "https://object-lambda-111122223333.s3-object-lambda.us-east-1.amazonaws.com/example",
        "headers": {
            "Host": "object-lambda-111122223333.s3-object-lambda.us-east-1.amazonaws.com",
            "Accept-Encoding": "identity",
            "X-Amz-Content-SHA256": "e3b0c44298fc1example"
        }
    },
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "principalId",
        "arn": "arn:aws:sts::111122223333:assumed-role/Admin/example",
        "accountId": "111122223333",
        "accessKeyId": "accessKeyId",
        "sessionContext": {
            "attributes": {
                "mfaAuthenticated": "false",
                "creationDate": "Wed Mar 10 23:41:52 UTC 2021"
            },
            "sessionIssuer": {
                "type": "Role",
                "principalId": "principalId",
                "arn": "arn:aws:iam::111122223333:role/Admin",
                "accountId": "111122223333",
                "userName": "Admin"
            }
        }
    },
  "protocolVersion": "1.00"
}
```

您的 Lambda 函式應該傳回 JSON 物件，其中包含狀態碼、清單 XML 結果或將從 S3 Object Lambda 傳回的錯誤資訊。

S3 Object Lambda 不會處理或驗證 `listResultXml`，而是將其轉送給 `ListObjects` 呼叫者。對於 `listBucketResult`，S3 Object Lambda 預期某些屬性為特定類型，而且如果無法剖析它們，則會擲回例外狀況。不能同時提供 `listResultXml` 和 `listBucketResult`。

下列範例示範如何使用預先簽章 URL 呼叫 Amazon S3，並使用結果填入回應，包括錯誤檢查。

------
#### [ Python ]

```
import requests 
import xmltodict

def lambda_handler(event, context):
    # Extract the presigned URL from the input.
    s3_url = event["listObjectsContext"]["inputS3Url"]


    # Get the head of the object from Amazon S3.
    response = requests.get(s3_url)

    # Return the error to S3 Object Lambda (if applicable).
    if (response.status_code >= 400):
        error = xmltodict.parse(response.content)
        return {
            "statusCode": response.status_code,
            "errorCode": error["Error"]["Code"],
            "errorMessage": error["Error"]["Message"]
        }

    # Store the XML result in a dict.
    response_dict = xmltodict.parse(response.content)

    # This obscures StorageClass in a transformation, it is optional to add
    for item in response_dict['ListBucketResult']['Contents']:
        item['StorageClass'] = ""

    # Convert back to XML.
    listResultXml = xmltodict.unparse(response_dict)
    
    # Create response with listResultXml.
    response_with_list_result_xml = {
        'statusCode': 200,
        'listResultXml': listResultXml
    }

    # Create response with listBucketResult.
    response_dict['ListBucketResult'] = sanitize_response_dict(response_dict['ListBucketResult'])
    response_with_list_bucket_result = {
        'statusCode': 200,
        'listBucketResult': response_dict['ListBucketResult']
    }

    # Return the list to S3 Object Lambda.
    # Can return response_with_list_result_xml or response_with_list_bucket_result
    return response_with_list_result_xml

# Converting the response_dict's key to correct casing
def sanitize_response_dict(response_dict: dict):
    new_response_dict = dict()
    for key, value in response_dict.items():
        new_key = key[0].lower() + key[1:] if key != "ID" else 'id'
        if type(value) == list:
            newlist = []
            for element in value:
                if type(element) == type(dict()):
                    element = sanitize_response_dict(element)
                newlist.append(element)
            value = newlist
        elif type(value) == dict:
            value = sanitize_response_dict(value)
        new_response_dict[new_key] = value
    return new_response_dict
```

------

下列範例顯示 `ListObjects` 的 Lambda 回應 JSON 結構。

```
{ 
  "statusCode": <number>; // Required
  "errorCode": <string>;
  "errorMessage": <string>;
  "listResultXml": <string>; // This can also be Error XML string in case S3 returned error response when calling the pre-signed URL

  "listBucketResult": {  // listBucketResult can be provided instead of listResultXml, however they can not both be provided in the JSON response  
        "name": <string>,  // Required for 'listBucketResult'
        "prefix": <string>,  
        "marker": <string>, 
        "nextMarker": <string>, 
        "maxKeys": <int>,   // Required for 'listBucketResult'
        "delimiter": <string>, 
        "encodingType": <string>  
        "isTruncated": <boolean>,  // Required for 'listBucketResult'
        "contents": [  { 
            "key": <string>,  // Required for 'content'
            "lastModified": <string>,  
            "eTag": <string>,  
            "checksumAlgorithm": <string>,   // CRC32,  CRC32C,  SHA1,  SHA256
            "size": <int>,   // Required for 'content'
            "owner": {  
                "displayName": <string>,  // Required for 'owner'
                "id": <string>,  // Required for 'owner'
            },  
            "storageClass": <string>  
            },  
        ...  
        ],  
        "commonPrefixes": [  {  
            "prefix": <string>   // Required for 'commonPrefix'
        },  
        ...  
        ],  
    }
}
```

## 使用 Lambda 中的 `ListObjectsV2` 請求
<a name="olap-listobjectsv2"></a>

本節假設您的 Object Lambda 存取點已設定為呼叫 `ListObjectsV2` 的 Lambda 函數。Lambda 將接收 JSON 承載，其中包含名為 `listObjectsV2Context` 的新物件。`listObjectsV2Context` 包含單一屬性 `inputS3Url`，這是 `ListObjectsV2` 支援存取點的預先簽章 URL。

與 `GetObject` 和 `HeadObject` 不同，如果已指定預先簽章 URL，則此 URL 將包含下列屬性：
+ 所有查詢參數
+ `requestPayer` (在 `x-amz-request-payer` 標頭中) 
+ `expectedBucketOwner` (在 `x-amz-expected-bucket-owner` 標頭中)

如需請求語法 URI 參數，請參閱《Amazon Simple Storage Service API 參考》**中的 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html)。

下列範例顯示 `ListObjectsV2` 的 Lambda JSON 輸入承載。

```
{
    "xAmzRequestId": "requestId",
     "**listObjectsV2Context**": {
     "**inputS3Url**": "https://my-s3-ap-111122223333.s3-accesspoint.us-east-1.amazonaws.com/?list-type=2&X-Amz-Security-Token=<snip>",
     },
    "configuration": {
        "accessPointArn": "arn:aws:s3-object-lambda:us-east-1:111122223333:accesspoint/example-object-lambda-ap",
        "supportingAccessPointArn": "arn:aws:s3:us-east-1:111122223333:accesspoint/example-ap",
        "payload": "{}"
    },
    "userRequest": {
        "url": "https://object-lambda-111122223333.s3-object-lambda.us-east-1.amazonaws.com/example",
        "headers": {
            "Host": "object-lambda-111122223333.s3-object-lambda.us-east-1.amazonaws.com",
            "Accept-Encoding": "identity",
            "X-Amz-Content-SHA256": "e3b0c44298fc1example"
        }
    },
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "principalId",
        "arn": "arn:aws:sts::111122223333:assumed-role/Admin/example",
        "accountId": "111122223333",
        "accessKeyId": "accessKeyId",
        "sessionContext": {
            "attributes": {
                "mfaAuthenticated": "false",
                "creationDate": "Wed Mar 10 23:41:52 UTC 2021"
            },
            "sessionIssuer": {
                "type": "Role",
                "principalId": "principalId",
                "arn": "arn:aws:iam::111122223333:role/Admin",
                "accountId": "111122223333",
                "userName": "Admin"
            }
        }
    },
  "protocolVersion": "1.00" 
}
```

您的 Lambda 函式應該傳回 JSON 物件，其中包含狀態碼、清單 XML 結果或將從 S3 Object Lambda 傳回的錯誤資訊。

S3 Object Lambda 不會處理或驗證 `listResultXml`，而是將其轉送給 `ListObjectsV2` 呼叫者。對於 `listBucketResult`，S3 Object Lambda 預期某些屬性為特定類型，而且如果無法剖析它們，則會擲回例外狀況。不能同時提供 `listResultXml` 和 `listBucketResult`。

下列範例示範如何使用預先簽章 URL 呼叫 Amazon S3，並使用結果填入回應，包括錯誤檢查。

------
#### [ Python ]

```
import requests 
import xmltodict

def lambda_handler(event, context):
    # Extract the presigned URL from the input.
    s3_url = event["listObjectsV2Context"]["inputS3Url"]


    # Get the head of the object from Amazon S3.
    response = requests.get(s3_url)

    # Return the error to S3 Object Lambda (if applicable).
    if (response.status_code >= 400):
        error = xmltodict.parse(response.content)
        return {
            "statusCode": response.status_code,
            "errorCode": error["Error"]["Code"],
            "errorMessage": error["Error"]["Message"]
        }

    # Store the XML result in a dict.
    response_dict = xmltodict.parse(response.content)

    # This obscures StorageClass in a transformation, it is optional to add
    for item in response_dict['ListBucketResult']['Contents']:
        item['StorageClass'] = ""

    # Convert back to XML.
    listResultXml = xmltodict.unparse(response_dict)
    
    # Create response with listResultXml.
    response_with_list_result_xml = {
        'statusCode': 200,
        'listResultXml': listResultXml
    }

    # Create response with listBucketResult.
    response_dict['ListBucketResult'] = sanitize_response_dict(response_dict['ListBucketResult'])
    response_with_list_bucket_result = {
        'statusCode': 200,
        'listBucketResult': response_dict['ListBucketResult']
    }

    # Return the list to S3 Object Lambda.
    # Can return response_with_list_result_xml or response_with_list_bucket_result
    return response_with_list_result_xml

# Converting the response_dict's key to correct casing
def sanitize_response_dict(response_dict: dict):
    new_response_dict = dict()
    for key, value in response_dict.items():
        new_key = key[0].lower() + key[1:] if key != "ID" else 'id'
        if type(value) == list:
            newlist = []
            for element in value:
                if type(element) == type(dict()):
                    element = sanitize_response_dict(element)
                newlist.append(element)
            value = newlist
        elif type(value) == dict:
            value = sanitize_response_dict(value)
        new_response_dict[new_key] = value
    return new_response_dict
```

------

下列範例顯示 `ListObjectsV2` 的 Lambda 回應 JSON 結構。

```
{  
    "statusCode": <number>; // Required  
    "errorCode": <string>;  
    "errorMessage": <string>;  
    "listResultXml": <string>; // This can also be Error XML string in case S3 returned error response when calling the pre-signed URL  
  
    "listBucketResult": {  // listBucketResult can be provided instead of listResultXml, however they can not both be provided in the JSON response 
        "name": <string>, // Required for 'listBucketResult'  
        "prefix": <string>,  
        "startAfter": <string>,  
        "continuationToken": <string>,  
        "nextContinuationToken": <string>,
        "keyCount": <int>, // Required for 'listBucketResult'  
        "maxKeys": <int>, // Required for 'listBucketResult'  
        "delimiter": <string>,  
        "encodingType": <string>  
        "isTruncated": <boolean>, // Required for 'listBucketResult'  
        "contents": [ {  
            "key": <string>, // Required for 'content'  
            "lastModified": <string>,  
            "eTag": <string>,  
            "checksumAlgorithm": <string>, // CRC32, CRC32C, SHA1, SHA256  
            "size": <int>, // Required for 'content'  
            "owner": {  
                "displayName": <string>, // Required for 'owner'  
                "id": <string>, // Required for 'owner'  
            },  
            "storageClass": <string>  
            },  
            ...  
        ],  
        "commonPrefixes": [ {  
            "prefix": <string> // Required for 'commonPrefix'  
            },  
        ...  
        ],  
    }  
}
```

# 事件內容格式和用量
<a name="olap-event-context"></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)。

Amazon S3 Object Lambda 提供在傳遞給您的 AWS Lambda 函式時所提出請求的內容。請求範例如下所示。範例後面包括欄位的描述。

```
{
    "xAmzRequestId": "requestId",
    "getObjectContext": {
        "inputS3Url": "https://my-s3-ap-111122223333.s3-accesspoint.us-east-1.amazonaws.com/example?X-Amz-Security-Token=<snip>",
        "outputRoute": "io-use1-001",
        "outputToken": "OutputToken"
    },
    "configuration": {
        "accessPointArn": "arn:aws:s3-object-lambda:us-east-1:111122223333:accesspoint/example-object-lambda-ap",
        "supportingAccessPointArn": "arn:aws:s3:us-east-1:111122223333:accesspoint/example-ap",
        "payload": "{}"
    },
    "userRequest": {
        "url": "https://object-lambda-111122223333.s3-object-lambda.us-east-1.amazonaws.com/example",
        "headers": {
            "Host": "object-lambda-111122223333.s3-object-lambda.us-east-1.amazonaws.com",
            "Accept-Encoding": "identity",
            "X-Amz-Content-SHA256": "e3b0c44298fc1example"
        }
    },
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "principalId",
        "arn": "arn:aws:sts::111122223333:assumed-role/Admin/example",
        "accountId": "111122223333",
        "accessKeyId": "accessKeyId",
        "sessionContext": {
            "attributes": {
                "mfaAuthenticated": "false",
                "creationDate": "Wed Mar 10 23:41:52 UTC 2021"
            },
            "sessionIssuer": {
                "type": "Role",
                "principalId": "principalId",
                "arn": "arn:aws:iam::111122223333:role/Admin",
                "accountId": "111122223333",
                "userName": "Admin"
            }
        }
    },
    "protocolVersion": "1.00"
}
```

請求中包括下列欄位：
+ `xAmzRequestId`：此請求的 Amazon S3 請求 ID。我們建議您記錄此值以協助進行偵錯。
+ `getObjectContext`：連線至 Amazon S3 和 S3 Object Lambda 的輸入和輸出詳細資訊。
  + `inputS3Url`：預先簽章 URL，可用於從 Amazon S3 擷取原始物件。URL 是使用原始呼叫者的身分進行簽署，而且該使用者的許可將在使用 URL 時套用。如果 URL 中有簽署的標頭，Lambda 函數必須在對 Amazon S3 的呼叫中包含這些標頭，除了 `Host` 標頭之外。
  + `outputRoute` – 當 Lambda 函數呼叫 `WriteGetObjectResponse` 時，會新增至 S3 Object Lambda URL 的路由字符。
  + `outputToken` - S3 Object Lambda 用來將 `WriteGetObjectResponse` 呼叫與原始呼叫者進行比對的不透明字符。
+ `configuration`：有關 Object Lambda 存取點的組態資訊。
  + `accessPointArn`：接收此請求之 Object Lambda 存取點的 Amazon Resource Name (ARN)。
  + `supportingAccessPointArn`：Object Lambda 存取點組態中指定的支援存取點的 ARN。
  + `payload`：套用至 Object Lambda 存取點組態的自訂資料。S3 Object Lambda 將此資料視為不透明字串，因此可能需要在使用之前進行解碼。
+ `userRequest`：原始呼叫 S3 Object Lambda 的相關資訊。
  + `url`：S3 Object Lambda 接收之請求的解碼 URL，不包括任何授權相關的查詢參數。
  + `headers`：從原始呼叫中包含 HTTP 標頭及其值之字串到字串的映射，不包括任何授權相關的標頭。如果相同的標頭出現多次，來自相同標頭的每個執行個體的值會合併成逗號分隔的清單。原始標頭的情形保留在此映射中。
+ `userIdentity`：有關呼叫 S3 Object Lambda 身分的詳細資訊。如需詳細資訊，請參閱《AWS CloudTrail 使用者指南》**中的[記錄資料事件](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/logging-data-events-with-cloudtrail.html)。
  + `type`：身分的類型。
  + `accountId` – AWS 帳戶 身分所屬的 。
  + `userName`：發出呼叫之身分的易記名稱。
  + `principalId`：發出呼叫之身分的唯一識別符。
  + `arn`：發出呼叫之主體的 ARN。ARN 的最後一個部分包含發出呼叫的使用者或角色。
  + `sessionContext`：如果使用臨時安全憑證提出請求，此元素會提供為這些憑證所建立之工作階段的相關資訊。
  + `invokedBy` – AWS 服務 發出請求的 名稱，例如 Amazon EC2 Auto Scaling 或 AWS Elastic Beanstalk。
  + `sessionIssuer`：如果使用臨時安全憑證提出請求，此元素會提供憑證取得方式的相關資訊。
+ `protocolVersion`：提供之內容的版本 ID。此欄位的格式為 `{Major Version}.{Minor Version}`。次要版本號碼永遠是兩位數。對欄位的語意進行任何移除或變更都需要提升主要版本，並且需要主動選擇加入。Amazon S3 可以隨時新增欄位，此時您可能會遇到次要版本凸起。由於軟體發行的性質，您可能會同時看到多個次要版本正在使用中。

# 使用 Range 和 partNumber 標頭
<a name="range-get-olap"></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)。

在 Amazon S3 Object Lambda 中使用大型物件時，您可以使用 `Range` HTTP 標頭，從物件下載指定的位元組範圍。若要從同一物件內擷取不同的位元組範圍，您可以對 Amazon S3 使用並行連線。您還可以指定 `partNumber` 參數 (1 到 10,000 之間的整數)，其會針對物件的指定部分執行範圍請求。

因為您可能需要多種方法來處理包含 `Range` 或者 `partNumber` 參數的請求，而 S3 Object Lambda 不會將這些參數套用至轉換的物件。相反地，您的 AWS Lambda 函數必須根據您的應用程式所需實作此功能。

若要搭配 S3 Object Lambda 使用 `Range` 和 `partNumber` 參數，請執行下列動作：
+ 在 Object Lambda 存取點組態中啟用這些參數。
+ 撰寫一個 Lambda 函數，其可以處理包含這些參數的請求。

下列步驟說明如何完成這項操作。

## 步驟 1：設定 Object Lambda 存取點
<a name="range-get-olap-step-1"></a>

根據預設，Object Lambda 存取點會以 HTTP 狀態碼 501 (未實作) 錯誤回應任何 `GetObject` 或 `HeadObject` 請求，該請求包含在標頭或查詢參數中的 `Range` 或 `partNumber` 參數。

若要啟用 Object Lambda 存取點以接受此類請求，您必須在 Object Lambda 存取點組態的 `AllowedFeatures` 區段中包括 `GetObject-Range`、`GetObject-PartNumber`、`HeadObject-Range` 或 `HeadObject-PartNumber`。如需更新 Object Lambda 存取點組態的詳細資訊，請參閱 [建立 Object Lambda 存取點](olap-create.md)。

## 步驟 2：在 Lambda 函數中實作 `Range` 或 `partNumber` 處理
<a name="range-get-olap-step-2"></a>

當 Object Lambda 存取點使用範圍 `GetObject` 或 `HeadObject` 請求叫用 Lambda 函數時，`Range` 或 `partNumber` 參數會包含在事件內容中。如下表所述，參數在事件內容中的位置，取決於使用的參數以及將其包含在對 Object Lambda 存取點的原始請求中的方式。


| 參數 | 事件內容位置 | 
| --- | --- | 
|  `Range` (標頭)  |  `userRequest.headers.Range`  | 
|  `Range` (查詢參數)  |  `userRequest.url` (查詢參數 `Range`)  | 
|  `partNumber`  |  `userRequest.url` (查詢參數 `partNumber`)  | 

**重要**  
針對您的 Object Lambda 存取點所提供的預先簽章 URL 不包含來自原始請求的 `Range` 或 `partNumber` 參數。請參閱下列選項，了解如何在 AWS Lambda 函數中處理這些參數。

在擷取 `Range` 或 `partNumber` 值後，您可以根據應用程式的需求採取下列其中一種方法：

1. **將請求的 `Range` 或 `partNumber` 映射到轉換的物件 (建議)。**

   處理 `Range` 或 `partNumber` 請求的最可靠方式是執行以下動作：
   + 從 Amazon S3 擷取完整物件。
   + 轉換物件。
   + 將請求的 `Range` 或 `partNumber` 參數套用至轉換的物件。

   為此，請使用提供的預先簽章 URL 從 Amazon S3 擷取整個物件，然後根據需要處理物件。如需以這種方式處理`Range`參數的範例 Lambda 函數，請參閱 AWS 範例 GitHub 儲存庫中的[此範例](https://github.com/aws-samples/amazon-s3-object-lambda-default-configuration/blob/main/function/nodejs_20_x/src/response/range_mapper.ts)。

1. **將請求的 `Range` 映射到預先簽署的 URL。**

   在某些情況下，Lambda 函數可以將請求的 `Range` 直接映射到預先簽署的 URL，以便從 Amazon S3 中僅擷取部分物件。只有當轉換符合以下兩個條件時，此方法才適用：

   1. 轉換函數可套用於部分物件範圍。

   1. 在轉換函數之前或之後套用 `Range` 參數，將會產生相同的轉換物件。

   例如，將 ASCII 編碼物件中的所有字元轉換為大寫的轉換函數滿足上述兩個條件。轉換可套用至物件的一部分，而且在轉換前與轉換後套用 `Range` 參數的結果相同。

   相比之下，將 ASCII 編碼物件中的字元反轉的函數不符合這些條件。這類函數滿足標準 1，因為其可以套用於部分物件範圍。但不符合標準 2，因為在轉換前套用 `Range` 參數與轉換後套用參數的結果不同。

   請考慮以下請求：將函數套用至包含內容 `abcdefg` 之物件的前三個字元。在轉換前套用 `Range` 參數會僅擷取 `abc`，接著反轉資料，傳回 `cba`。但是，如果在轉換之後套用參數，函數將擷取整個物件，將其反轉，然後套用 `Range` 參數，最終傳回 `gfe`。因為這些結果都不同，所以此函數不應在從 Amazon S3 擷取物件時套用 `Range` 參數。其反而應該擷取整個物件、執行轉換，然後才套用 `Range` 參數。
**警告**  
在許多情況下，將 `Range` 參數套用至預先簽署的 URL，將導致 Lambda 函數或請求用戶端的發生意外行為。如前文方法 A 中所述，除非確定應用程式在從 Amazon S3 中僅擷取部分物件時能夠正常工作，否則建議您擷取和轉換完整物件。

   如果您的應用程式符合先前在方法 B 中所述的條件，您可以僅擷取請求的物件範圍，然後在該範圍上執行轉換，以簡化 AWS Lambda 函數。

   下列 Java 程式碼範例會示範如何執行下列動作：
   + 從 `GetObject` 請求中擷取 `Range` 標頭。
   + 將 `Range` 標頭新增至 Lambda 可以用來從 Amazon S3 擷取請求範圍的預先簽章 URL。

   ```
   private HttpRequest.Builder applyRangeHeader(ObjectLambdaEvent event, HttpRequest.Builder presignedRequest) {
       var header = event.getUserRequest().getHeaders().entrySet().stream()
               .filter(e -> e.getKey().toLowerCase(Locale.ROOT).equals("range"))
               .findFirst();
   
       // Add check in the query string itself.
       header.ifPresent(entry -> presignedRequest.header(entry.getKey(), entry.getValue()));
       return presignedRequest;
   }
   ```

# 使用 AWS 建置的 Lambda 函數
<a name="olap-examples"></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 提供一些預先建置的 AWS Lambda 函數，您可以搭配 Amazon S3 Object Lambda 使用，以偵測和修訂個人身分識別資訊 (PII) 和解壓縮 S3 物件。這些 Lambda 函數可在 AWS Serverless Application Repository中使用。建立 Object Lambda 存取點時，您可以透過 AWS 管理主控台 選取這些函數。

如需如何從 部署無伺服器應用程式的詳細資訊 AWS Serverless Application Repository，請參閱[《 開發人員指南》中的部署應用程式](https://docs.aws.amazon.com/serverlessrepo/latest/devguide/serverlessrepo-consuming-applications.html)。 *AWS Serverless Application Repository *

**注意**  
下列範例只能與 `GetObject` 請求搭配使用。

## 範例 1：PII 存取控制
<a name="olap-examples-1"></a>

此 Lambda 函數使用了 Amazon Comprehend，這是一種自然語言處理 (NLP) 服務，使用機器學習在文字中尋找洞見和關係。此函數會在 Amazon S3 儲存貯體的文件中自動偵測個人身分識別資訊 (PII)，例如姓名、地址、日期、信用卡號碼和社會安全號碼。如果儲存貯體中有包含 PII 的文件，您可以設定 PII 存取控制函數來偵測這些 PII 實體類型，並限制未經授權的使用者存取。

若要開始使用，請在您的帳戶中部署下列 Lambda 函數，然後將此函數的 Amazon Resource Name (ARN) 新增至 Object Lambda 存取點組態。

以下是此函數的範例 ARN：

```
arn:aws:serverlessrepo:us-east-1:111122223333:applications/ComprehendPiiAccessControlS3ObjectLambda
```

您可以使用以下連結 AWS 管理主控台 在 上新增或檢視此函數 AWS Serverless Application Repository ：[ComprehendPiiAccessControlS3ObjectLambda](https://console.aws.amazon.com/lambda/home#/create/app?applicationId=arn:aws:serverlessrepo:us-east-1:839782855223:applications/ComprehendPiiAccessControlS3ObjectLambda)。

若要在 GitHub 上檢視此函數，請參閱 [Amazon Comprehend S3 Object Lambda](https://github.com/aws-samples/amazon-comprehend-s3-object-lambdas)。

## 範例 2：PII 修改
<a name="olap-examples-2"></a>

此 Lambda 函數使用了 Amazon Comprehend，這是一種自然語言處理 (NLP) 服務，使用機器學習在文字中尋找洞見和關係。此函數會從 Amazon S3 儲存貯體中的文件自動修改個人身分識別資訊 (PII)，例如姓名、地址、日期、信用卡號碼和社會安全號碼。

如果儲存貯體中有包含信用卡號碼或銀行帳戶資訊等資訊的文件，則您可以設定 PII Redaction S3 Object Lambda 函數來偵測 PII，然後傳回此類已修改 PII 實體類型的文件複本。

若要開始使用，請在您的帳戶中部署下列 Lambda 函數，然後將此函數的 ARN 新增至 Object Lambda 存取點組態。

以下是此函數的範例 ARN：

```
arn:aws:serverlessrepo:us-east-1:111122223333::applications/ComprehendPiiRedactionS3ObjectLambda
```

您可以使用以下連結 AWS 管理主控台 在 上新增或檢視此函數 AWS Serverless Application Repository ：[ComprehendPiiRedactionS3ObjectLambda](https://console.aws.amazon.com/lambda/home#/create/app?applicationId=arn:aws:serverlessrepo:us-east-1:839782855223:applications/ComprehendPiiRedactionS3ObjectLambda)。

若要在 GitHub 上檢視此函數，請參閱 [Amazon Comprehend S3 Object Lambda](https://github.com/aws-samples/amazon-comprehend-s3-object-lambdas)。

若要了解 PII 修訂中部分 S3 Object Lambda 任務的完整端對端程序，請參閱 [教學課程：使用 S3 Object Lambda 和 Amazon Comprehend 來偵測和編輯 PII 資料](tutorial-s3-object-lambda-redact-pii.md)。

## 範例 3：解壓縮
<a name="olap-examples-3"></a>

Lambda 函數 `S3ObjectLambdaDecompression` 可以將以六種壓縮檔案格式之一存放在 Amazon S3 中的物件解壓縮：`bzip2`、`gzip`、`snappy`、`zlib`、`zstandard` 和 `ZIP`。

若要開始使用，請在您的帳戶中部署下列 Lambda 函數，然後將此函數的 ARN 新增至 Object Lambda 存取點組態。

以下是此函數的範例 ARN：

```
arn:aws:serverlessrepo:us-east-1:111122223333::applications/S3ObjectLambdaDecompression
```

您可以使用以下連結 AWS 管理主控台 在 上新增或檢視此函數 AWS Serverless Application Repository ：[S3ObjectLambdaDecompression](https://eu-west-1.console.aws.amazon.com/lambda/home?region=eu-west-1#/create/app?applicationId=arn:aws:serverlessrepo:eu-west-1:123065155563:applications/S3ObjectLambdaDecompression)。

若要在 GitHub 上檢視此函數，請參閱 [S3 Object Lambda 解壓縮](https://github.com/aws-samples/amazon-s3-object-lambda-decompression)。

# S3 Object Lambda 的最佳實務和指導方針
<a name="olap-best-practices"></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)。

使用 S3 Object Lambda 時，請遵循下列最佳實務和指導方針，以優化作業和效能。

**Topics**
+ [使用 S3 Object Lambda](#olap-working-with)
+ [AWS 服務 用於與 S3 Object Lambda 連線](#olap-services)
+ [`Range` 和 `partNumber` 標頭](#olap-managing-range-part)
+ [轉換 `expiry-date`](#olap-console-download)
+ [使用 AWS CLI 和 SDK AWS SDKs](#olap-cli-sdk)

## 使用 S3 Object Lambda
<a name="olap-working-with"></a>

S3 Object Lambda 僅支援處理 `GET`、`LIST` 和 `HEAD` 請求。任何其他請求都不會叫用 AWS Lambda ，而是傳回標準、未轉換的 API 回應。 AWS 帳戶 每個區域最多可以建立 1，000 個 Object Lambda 存取點。您使用的 AWS Lambda 函數必須與 Object Lambda 存取點位於相同的 AWS 帳戶 和 區域。

S3 Object Lambda 允許最多 60 秒，將完整回應串流至其發起人。您的函數也受到 AWS Lambda 預設配額的限制。如需詳細資訊，請參閱《AWS Lambda 開發人員指南》**中的 [Lambda 配額](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html)。

當 S3 Object Lambda 叫用您指定的 Lambda 函數時，您必須負責確保您指定的 Lambda 函數或應用程式從 Amazon S3 覆寫或刪除的任何資料是預期且正確的。

您只能使用 S3 Object Lambda 對物件執行操作。您無法使用 S3 Object Lambda 來執行其他 Amazon S3 操作，例如修改或刪除儲存貯體。如需支援存取點的 S3 操作完整清單，請參閱[存取點與 S3 操作的相容性](access-points-service-api-support.md#access-points-operations-support)。

除了此清單之外，Object Lambda 存取點不支援 [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html)、[https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html) (做為來源) 和 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_SelectObjectContent.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_SelectObjectContent.html) API 操作。

## AWS 服務 用於與 S3 Object Lambda 連線
<a name="olap-services"></a>

S3 Object Lambda 會連接 Amazon S3， AWS Lambda並選擇性地連接您選擇的其他 AWS 服務 ，以交付與請求應用程式相關的物件。與 S3 Object Lambda AWS 服務 搭配使用的所有 都受其各自的服務水準協議 (SLAs) 管理。例如，如果有任何 AWS 服務 不符合其服務承諾，則您有資格收到服務點數，如服務 SLA 中所述。

## `Range` 和 `partNumber` 標頭
<a name="olap-managing-range-part"></a>

使用大型物件時，您可以使用 `Range` HTTP 標頭，從物件下載指定的位元組範圍。當您使用標 `Range` 頭時，您的請求只會擷取物件的指定部分。您也可以使用 `partNumber` 標頭，針對物件中的指定部分執行範圍請求。

如需詳細資訊，請參閱[使用 Range 和 partNumber 標頭](range-get-olap.md)。

## 轉換 `expiry-date`
<a name="olap-console-download"></a>

您可以從 上的 Object Lambda 存取點開啟或下載轉換的物件 AWS 管理主控台。這些物件必須未過期。如果您的 Lambda 函數會轉換物件的 `expiry-date`，您可能會看到無法開啟或下載的過期物件。此行為僅適用於 S3 Glacier Flexible Retrive 和 S3 Glacier Deep Archive 還原物件。

## 使用 AWS CLI 和 SDK AWS SDKs
<a name="olap-cli-sdk"></a>

AWS Command Line Interface (AWS CLI) S3 子命令 (`cp`、 `mv`和 `sync`) 和 類別的使用 適用於 Java 的 AWS SDK `TransferManager`不支援搭配 S3 Object Lambda 使用。

# S3 Object Lambda 教學課程
<a name="olap-tutorials"></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)。

下列教學課程會針對 S3 Object Lambda 工作，提供完整的端對端程序。

利用 S3 Object Lambda，您可以新增自己的程式碼，以處理從 S3 擷取的資料，然後再將其傳回應用程式。下列每個教學課程都會修改從 Amazon S3 擷取的資料，而不會變更現有物件或維護資料的多個複本。第一個教學將逐步解說如何將 AWS Lambda 函數新增至 S3 GET 請求，以修改從 S3 擷取的物件。第二個教學課程示範如何使用由 Amazon Comprehend 支援的預先建置 Lambda 函數來保護從 S3 擷取的個人身分識別資訊 (PII)，再將其傳回應用程式。第三個教學課程使用 S3 Object Lambda 將浮水印新增至從 Amazon S3 擷取的影像。
+ [教學課程：使用 S3 Object Lambda 轉換應用程式的資料](tutorial-s3-object-lambda-uppercase.md)
+ [教學課程：使用 S3 Object Lambda 和 Amazon Comprehend 來偵測和編輯 PII 資料](tutorial-s3-object-lambda-redact-pii.md)
+ [教學課程：使用 S3 Object Lambda 在擷取影像時動態加上浮水印](https://aws.amazon.com/getting-started/hands-on/amazon-s3-object-lambda-to-dynamically-watermark-images/?ref=docs_gateway/amazons3/olap-tutorials.html)

# 教學課程：使用 S3 Object Lambda 轉換應用程式的資料
<a name="tutorial-s3-object-lambda-uppercase"></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)。

將資料存放至 Amazon S3 時，您可以輕鬆地進行共用，以供多個應用程式使用。不過，每個應用程式可能有唯一的資料格式需求，而且可能需要針對特定使用案例修改或處理您的資料。例如，電子商務應用程式建立的資料集可能會包含個人身分識別資訊 (PII)。當處理相同的資料以進行分析時，不需要此 PII，而且應該加以修訂。不過，如果同一個資料集用於行銷活動，您可能需要使用其他詳細資訊 (例如來自客戶忠誠度資料庫的資訊) 來豐富資料。

利用 [S3 Object Lambda](https://aws.amazon.com/s3/features/object-lambda)，您可以新增自己的程式碼，以處理從 S3 擷取的資料，然後再將其傳回應用程式。具體而言，您可以設定 AWS Lambda 函數並將其連接至 S3 Object Lambda 存取點。當應用程式透過 S3 Object Lambda 存取點傳送[標準 S3 GET 請求](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html)時，則會調用指定的 Lambda 函式，以處理透過支援 S3 存取點從底層資料來源擷取的任何資料。然後，S3 Object Lambda 存取點會將轉換的結果傳回至應用程式。您可以編寫和執行自己的自訂 Lambda 函數，從而根據您的特定使用案例，量身定製 S3 Object Lambda 資料轉換，並且全程無需對應用程式進行任何變更。

![\[這是 S3 Object Lambda 工作流程圖。\]](http://docs.aws.amazon.com/zh_tw/AmazonS3/latest/userguide/images/ol-example-image-global.png)


**目標**  
在本教學課程中，您將學習如何將自訂程式碼新增至標準 S3 GET 請求，以修改從 S3 擷取的請求物件，如此一來，物件方能符合請求用戶端或應用程式的需求。具體而言，您將學習如何透過 S3 Object Lambda 將儲存在 S3 儲存貯體中的原始物件中的所有文字轉換為大寫。

**注意**  
本教學課程使用 Python 程式碼轉換資料，如需使用其他 AWS SDKs的範例，請參閱 AWS SDK 程式碼範例程式庫中的[使用 S3 Object Lambda 轉換應用程式的資料](https://docs.aws.amazon.com/code-library/latest/ug/lambda_example_cross_ServerlessS3DataTransformation_section.html)。

**Topics**
+ [先決條件](#ol-upper-prerequisites)
+ [步驟 1：建立 S3 儲存貯體](#ol-upper-step1)
+ [步驟 2：將檔案上傳至 S3 儲存貯體](#ol-upper-step2)
+ [步驟 3：建立 S3 存取點](#ol-upper-step3)
+ [步驟 4：建立 Lambda 函數](#ol-upper-step4)
+ [步驟 5：為 Lambda 函數的執行角色設定 IAM 政策](#ol-upper-step5)
+ [步驟 6：建立 S3 Object Lambda 存取點](#ol-upper-step6)
+ [步驟 7：檢視轉換後的資料](#ol-upper-step7)
+ [步驟 8：清理](#ol-upper-step8)
+ [後續步驟](#ol-upper-next-steps)

## 先決條件
<a name="ol-upper-prerequisites"></a>

開始本教學課程之前，您必須擁有 AWS 帳戶 ，以具有正確許可的 AWS Identity and Access Management (IAM) 使用者身分登入 。您還必須安裝 Python 3.8 版或更新版本。

**Topics**
+ [在您的 AWS 帳戶 （主控台） 中建立具有許可的 IAM 使用者](#ol-upper-prerequisites-account)
+ [在您的本機機器上安裝 Python 3.8 或更新版本](#ol-upper-prerequisites-python)

### 在您的 AWS 帳戶 （主控台） 中建立具有許可的 IAM 使用者
<a name="ol-upper-prerequisites-account"></a>

您可以為該教學課程建立 IAM 使用者。若要完成本教學課程，您的 IAM 使用者必須連接下列 IAM 政策，才能存取相關 AWS 資源並執行特定動作。如需如何建立 IAM 使用者的詳細資訊，請參閱《*IAM 使用者指南》*中的[建立 IAM 政策 (主控台)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html#id_users_create_console)。

您的 IAM 使用者需要下列政策：
+ [AmazonS3FullAccess](https://console.aws.amazon.com/iam/home?#/policies/arn:aws:iam::aws:policy/AmazonS3FullAccess$jsonEditor) – 授予所有 Amazon S3 動作的許可，包括建立和使用 Object Lambda 存取點的許可。
+ [AWSLambda\$1FullAccess](https://console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/AWSLambda_FullAccess$jsonEditor) – 授予所有 Lambda 動作的許可。
+ [IAMFullAccess](https://console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/IAMFullAccess$jsonEditor) – 授予所有 IAM 動作的許可。
+ [IAMAccessAnalyzerReadOnlyAccess](https://console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/IAMAccessAnalyzerReadOnlyAccess$jsonEditor) – 授予讀取由 IAM Access Analyzer 提供的所有存取資訊的許可。
+ [CloudWatchLogsFullAccess](https://console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/CloudWatchLogsFullAccess$jsonEditor) – 授予對 CloudWatch Logs 的完整存取。

**注意**  
為了簡單起見，本教學課程會建立和使用 IAM 使用者。完成本教學課程後，請記得 [刪除 IAM 使用者](#ol-upper-step8-delete-user)。針對生產使用，我們建議您遵循《IAM 使用者指南》**中的 [IAM 中的安全最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。其中一項最佳實務是，要求人類使用者搭配身分提供者使用聯合功能，以便使用暫時性憑證存取 AWS 。另一項最佳實務要求工作負載使用臨時性憑證和 IAM 角色來存取 AWS。若要了解如何使用 AWS IAM Identity Center 建立具有臨時登入資料的使用者，請參閱*AWS IAM Identity Center 《 使用者指南*》中的[入門](https://docs.aws.amazon.com/singlesignon/latest/userguide/getting-started.html)。  
本教學課程也使用完整存取的 AWS 受管政策。為供生產使用，我們建議您改為僅授予使用案例所需的最低許可，以符合[安全最佳實務](security-best-practices.md#security-best-practices-prevent)。

### 在您的本機機器上安裝 Python 3.8 或更新版本
<a name="ol-upper-prerequisites-python"></a>

使用以下程序在您的本機機器上安裝 Python 3.8 或更新版本。如需安裝說明的詳細資訊，請參閱*《Python 入門指南》*中的[下載 Python](https://wiki.python.org/moin/BeginnersGuide/Download)。

1. 開啟您的本機終端機或 shell 並執行以下命令，以確定是否已經安裝 Python，如果是，那安裝的是哪個版本。

   ```
   python --version
   ```

1. 如果您沒有 Python 3.8 或更新版本，請下載使用您的本機機器的 Python 3.8 的[官方安裝程式](https://www.python.org/downloads/)。

1. 按兩下下載的檔案來執行安裝程式，然後依照步驟完成安裝。

   若為 **Windows 使用者**，利用安裝精靈選擇 **Add Python 3.X to PATH** (新增 Python 3.X 至 PATH)，然後選擇 **Install Now** (立即安裝)。

1. 透過關閉並重新開啟終端機來重新啟動。

1. 執行以下命令，以驗證已正確安裝 Python 3.8 或更新版本。

   若為 **macOS 使用者**，請執行此命令：

   ```
   python3 --version
   ```

   若為 **Windows 使用者**，請執行此命令：

   ```
   python --version
   ```

1. 執行下列命令，以來驗證已安裝 pip3 套件管理工具。如果您在命令回應中看到 pip 版本編號和 python 3.8 或更新版本，則意味著已成功安裝 pip3 套件管理工具。

   ```
   pip --version
   ```

## 步驟 1：建立 S3 儲存貯體
<a name="ol-upper-step1"></a>

建立儲存貯體來存放您計劃要轉換的原始資料。

**注意**  
存取點可以連接到另一個資料來源，例如 Amazon FSx for OpenZFS 磁碟區，但本教學課程使用的是連接到 S3 儲存貯體的支援存取點。

**建立儲存貯體**

1. 登入 AWS 管理主控台 ，並在 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)：// 開啟 Amazon S3 主控台。

1. 在左側導覽窗格中，選擇 **Buckets** (儲存貯體)。

1. 選擇 **Create bucket** (建立儲存貯體)。

   **Create bucket (建立儲存貯體)** 頁面隨即開啟。

1. 針對 **Bucket name** (儲存貯體名稱)，輸入儲存貯體的名稱 (例如 **tutorial-bucket**)。

   如需有關在 Amazon S3 中的命名儲存貯體的詳細資訊，請參閱 [一般用途儲存貯體命名規則](bucketnamingrules.md)。

1. 針對**區域**，選擇您希望儲存貯體所在的 AWS 區域 。

   如需有關儲存貯體區域的詳細資訊，請參閱 [一般用途儲存貯體概觀](UsingBucket.md) 。

1. 針對 **Block Public Access settings for this bucket** (此儲存貯體的封鎖公開存取設定)，將保留預設設定 (已啟用**封鎖*所有*公開存取**)。

   除非您需要針對使用案例關閉一或多個設定，否則建議您將所有封鎖公開存取設定保持啟用狀態。如需封鎖公開存取的詳細資訊，請參閱 [封鎖對 Amazon S3 儲存體的公開存取權](access-control-block-public-access.md)。

1. 對於其他設定，請保留預設值。

   (選用) 如果您想要為您的特定使用案例設定其他儲存貯體設定，請參閱 [建立一般用途儲存貯體](create-bucket-overview.md)。

1. 選擇**建立儲存貯體**。

## 步驟 2：將檔案上傳至 S3 儲存貯體
<a name="ol-upper-step2"></a>

上傳文字檔案至 S3 儲存貯體。此文字檔案包含您將在本教學課程稍後部分轉換為大寫的原始資料。

例如，您可以上傳 `tutorial.txt` 檔案，其中包含以下文字：

```
Amazon S3 Object Lambda Tutorial:
You can add your own code to process data retrieved from S3 before 
returning it to an application.
```

**上傳檔案至儲存貯體**

1. 登入 AWS 管理主控台 ，並在 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)：// 開啟 Amazon S3 主控台。

1. 在左側導覽窗格中，選擇 **Buckets** (儲存貯體)。

1. 在 **Buckets** (儲存貯體) 清單中，選擇您在[步驟 1](#ol-upper-step1) 中建立的且要將檔案上傳至的儲存貯體的名稱 (例如，**tutorial-bucket**)。

1. 在儲存貯體的**物件**索引標籤上，選擇**上傳**。

1. 在 **Upload** (上傳) 頁面上的 **Files and folders** (檔案和資料夾) 下，選擇 **Add files** (新增檔案)。

1. 選擇要上傳的檔案，然後選擇 **Open (開啟)**。舉例而言，您可以上傳之前提及的 `tutorial.txt` 檔案範例。

1. 選擇**上傳**。

## 步驟 3：建立 S3 存取點
<a name="ol-upper-step3"></a>

若要使用 S3 Object Lambda 存取點來存取和轉換原始資料，您必須建立 S3 存取點，並將其與您在[步驟 1](#ol-upper-step1) 中建立的 S3 儲存貯體建立關聯。存取點必須與您要轉換 AWS 區域 的物件位於相同的 中。

在本教學課程稍後的部分，您將使用此存取點做為您 Object Lambda 存取點的支援存取點。

**建立存取點**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) 開啟 Amazon S3 主控台。

1. 在左側導覽窗格中，選擇 **Access Points** (存取點)。

1. 在 **Access Points** (存取點) 頁面上，選擇 **Create access point** (建立存取點)。

1. 在 **Access point name** (存取點名稱) 欄位中，輸入存取點的名稱 (例如，**tutorial-access-point**)。

   如需存取點命名的詳細資訊，請參閱「[存取點的命名規則](access-points-restrictions-limitations-naming-rules.md#access-points-names)」。

1. 在**資料來源**欄位中，輸入您在[步驟 1](#ol-upper-step1) 中建立的儲存貯體的名稱 (例如，**tutorial-bucket**)。S3 將存取點連接至此儲存貯體。

   (選用) 您可以選擇 **Browse S3** (瀏覽 S3) 來瀏覽並搜尋您帳戶中的儲存貯體。如果您選擇 **Browse S3** (瀏覽 S3)，請先選擇所需的儲存貯體，然後選擇 **Choose path** (選擇路徑)，系統即會在 **Bucket name** (儲存貯體名稱) 欄位中填入該儲存貯體的名稱。

1. 針對 **Network origin** (網路來源)，選擇 **Internet** (網際網路)。

   如需存取點網路來源的詳細資訊，請參閱「[建立受限於 Virtual Private Cloud 的存取點](access-points-vpc.md)」。

1. 依預設，存取點的所有封鎖公開存取設定都會開啟。我們建議您將**封鎖*所有*公開存取**保持啟用的狀態。

   如需詳細資訊，請參閱[管理一般用途儲存貯體存取點的公開存取](access-points-bpa-settings.md)。

1. 對於所有其他存取點設定，保留預設設定。

   (選用) 您可以修改存取點設定，以支援您的使用案例。在本教學課程中，我們建議您保留預設設定。

   (選用) 如果您需要管理存取點的存取，您可以指定存取點政策。如需詳細資訊，請參閱[存取點的政策範例](access-points-policies.md#access-points-policy-examples)。

1. 選擇 **Create access point (建立新的存取點)**。

## 步驟 4：建立 Lambda 函數
<a name="ol-upper-step4"></a>

若要轉換原始資料，請建立一個 Lambda 函數，以與您的 S3 Object Lambda 存取點搭配使用。

**Topics**
+ [使用虛擬環境撰寫 Lambda 函數程式碼並建立部署套件](#ol-upper-step4-write-lambda)
+ [使用執行角色建立 Lambda 函數 (主控台)](#ol-upper-step4-create-function)
+ [使用 .zip 檔案封存部署 Lambda 函數程式碼，並設定 Lambda 函數 (主控台)](#ol-upper-step4-deploy-function)

### 使用虛擬環境撰寫 Lambda 函數程式碼並建立部署套件
<a name="ol-upper-step4-write-lambda"></a>

1. 在本機機器上，為虛擬環境建立資料夾名稱為 `object-lambda` 的資料夾，以便用於本教學課程的稍後部分。

1. 在 `object-lambda` 資料夾中，建立具有 Lambda 函數的檔案，而該函數會將原始物件中的所有文字變更為大寫。例如，您可以使用以 Python 撰寫的下列函數。將此函數儲存在名為 `transform.py` 的檔案中。

   ```
   import boto3
   import requests
   from botocore.config import Config
   
   # This function capitalizes all text in the original object
   def lambda_handler(event, context):
       object_context = event["getObjectContext"]
       # Get the presigned URL to fetch the requested original object 
       # from S3
       s3_url = object_context["inputS3Url"]
       # Extract the route and request token from the input context
       request_route = object_context["outputRoute"]
       request_token = object_context["outputToken"]
       
       # Get the original S3 object using the presigned URL
       response = requests.get(s3_url)
       original_object = response.content.decode("utf-8")
   
       # Transform all text in the original object to uppercase
       # You can replace it with your custom code based on your use case
       transformed_object = original_object.upper()
   
       # Write object back to S3 Object Lambda
       s3 = boto3.client('s3', config=Config(signature_version='s3v4'))
       # The WriteGetObjectResponse API sends the transformed data
       # back to S3 Object Lambda and then to the user
       s3.write_get_object_response(
           Body=transformed_object,
           RequestRoute=request_route,
           RequestToken=request_token)
   
       # Exit the Lambda function: return the status code  
       return {'status_code': 200}
   ```
**注意**  
上述範例 Lambda 函數將整個請求的文件載入到記憶體中，然後予以轉換並將其傳回給用戶端。或者，您可以從 S3 串流對象，以避免將整個文件載入到記憶體中。處理大型物件時，此方法非常有用。如需使用 Object Lambda 存取點串流回應的詳細資訊，請參閱 [使用 Lambda 中的 `GetObject` 請求](olap-writing-lambda.md#olap-getobject-response) 中的串流範例。

   當您撰寫與 S3 Object Lambda 存取點搭配使用的 Lambda 函數時，函數會以 S3 Object Lambda 提供給 Lambda 函數的輸入事件內容為基礎。事件內容提供了從 S3 Object Lambda 傳遞給 Lambda 事件中提出之請求的相關資訊。它會包含您用來建立 Lambda 函數的參數。

   用來建立前述 Lambda 函數的欄位如下所示：

   `getObjectContext` 的欄位意指連線至 Amazon S3 和 S3 Object Lambda 的輸入和輸出詳細資訊。其欄位如下：
   + `inputS3Url` – Lambda 函數可用來從支援存取點下載原始物件的預先簽章 URL。透過使用預先簽章 URL，Lambda 函數不需要擁有 Amazon S3 讀取許可即可擷取原始物件，而且只能存取每次叫用處理的物件。
   + `outputRoute` – 當 Lambda 函數呼叫 `WriteGetObjectResponse` 以傳回轉換的物件時，會新增至 S3 Object Lambda URL 的路由字符。
   + `outputToken` – 當傳回轉換的物件時，S3 Object Lambda 用來將 `WriteGetObjectResponse` 呼叫與原始呼叫者比對的字符。

   如需事件內容中的所有欄位的詳細資訊，請參閱 [事件內容格式和用量](olap-event-context.md) 和 [撰寫 S3 Object Lambda 存取點的 Lambda 函數](olap-writing-lambda.md)。

1. 在本機終端機中，輸入下列命令來安裝 `virtualenv` 套件：

   ```
   python -m pip install virtualenv
   ```

1. 在您的本機終端機中，開啟您之前建立的 `object-lambda` 資料夾，然後輸入下列命令以建立並初始化稱為 `venv` 的虛擬環境。

   ```
   python -m virtualenv venv
   ```

1. 如要啟用虛擬環境，請輸入下列命令來從環境的檔案局中執行 `activate` 檔案：

   若為 **macOS 使用者**，請執行此命令：

   ```
   source venv/bin/activate
   ```

   若為 **Windows 使用者**，請執行此命令：

   ```
   .\venv\Scripts\activate
   ```

   現在，您的命令提示字元會變更，以顯示 **(venv)**，表示虛擬環境作用中。

1. 若要安裝所需的程式庫，請在 `venv` 虛擬環境中逐行執行下列命令。

   這些命令會安裝 `lambda_handler` Lambda 函數相依性的更新版本。這些相依性是 AWS SDK for Python (Boto3) 和請求模組。

   ```
   pip3 install boto3
   ```

   ```
   pip3 install requests
   ```

1. 若要停用虛擬環境，請執行下列命令：

   ```
   deactivate
   ```

1. 若要在 `object-lambda` 目錄根中將含有已安裝程式庫的部署套件建立為名為 `lambda.zip` 的 `.zip` 檔案，請在本機終端機中逐行執行以下命令。
**提示**  
下列命令可能需要調整，才能在您的特定環境中運作。例如，程式庫可能會出現在 `site-packages` 或 `dist-packages` 中，並且第一個資料夾可能是 `lib` 或 `lib64`。此外，`python` 資料夾可能會使用不同的 Python 版本命名。若要尋找特定套件，使用 `pip show` 命令。

   若為 **macOS 使用者**，請執行這些命令：

   ```
   cd venv/lib/python3.8/site-packages 
   ```

   ```
   zip -r ../../../../lambda.zip .
   ```

   若為 **Windows 使用者**，請執行這些命令：

   ```
   cd .\venv\Lib\site-packages\ 
   ```

   ```
   powershell Compress-Archive * ../../../lambda.zip
   ```

   最後一個命令會將部署套件儲存至 `object-lambda` 目錄的根目錄。

1. 將函數程式碼檔案 `transform.py` 新增至部署套件的根目錄。

   若為 **macOS 使用者**，請執行這些命令：

   ```
   cd ../../../../ 
   ```

   ```
   zip -g lambda.zip transform.py
   ```

   若為 **Windows 使用者**，請執行這些命令：

   ```
   cd ..\..\..\
   ```

   ```
   powershell Compress-Archive -update transform.py lambda.zip
   ```

   完成此步驟後，您應具有下列目錄結構：

   ```
   lambda.zip$
     │ transform.py
     │ __pycache__
     | boto3/
     │ certifi/
     │ pip/
     │ requests/
     ...
   ```

### 使用執行角色建立 Lambda 函數 (主控台)
<a name="ol-upper-step4-create-function"></a>

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) 開啟 AWS Lambda 主控台。

   

1. 在左側導覽窗格中，選擇 **Functions** (函數)。

1. 選擇 **Create function (建立函數)**。

1. 選擇 **Author from scratch** (從頭開始撰寫)。

1. 在**基本資訊**下，請執行下列動作：

   1. 針對**函數名稱**，請輸入 **tutorial-object-lambda-function**。

   1. 針對 **Runtime** (執行時間)，選擇 **Python 3.8** 或更新版本。

1. 展開 **Change default execution role** (變更預設執行角色) 區段。在 **Execution role (執行角色)** 下，選擇 **Create a new role with basic Lambda permissions** (建立具備基本 Lambda 許可的新角色)。

   在本教學課程後面的[步驟 5](#ol-upper-step5) 中，您可以將 **AmazonS3ObjectLambdaExecutionRolePolicy** 連接至此 Lambda 函數的執行角色。

1. 將其餘設定保持為預設值。

1. 選擇**建立函數**。

### 使用 .zip 檔案封存部署 Lambda 函數程式碼，並設定 Lambda 函數 (主控台)
<a name="ol-upper-step4-deploy-function"></a>

1. 在位於 https：//[https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) 的 AWS Lambda 主控台中，選擇左側導覽窗格中的函數。 ****

1. 選擇您之前建立的 Lambda 函數 (例如，**tutorial-object-lambda-function**)。

1. 在 Lambda 函數的詳細資訊頁面上，選擇 **Code** (程式碼) 標籤。在 **Code Source** (程式碼來源) 區段中，選擇 **Upload from** (上傳來源)，然後選擇 **.zip file** (.zip 檔案)。

1. 選擇 **Upload** (上傳) 以選取您的本機 `.zip` 檔案。

1. 選擇您之前建立的 `lambda.zip` 檔案，然後選擇 **Open** (開啟)。

1. 選擇**儲存**。

1. 在 **Runtime settings** (執行時間設定) 區段中，選擇 **Edit** (編輯)。

1. 在 **Edit runtime settings** (編輯執行時間設定) 頁面上，確認 **Runtime** (執行時間) 已設定為 **Python 3.8** 或更新版本。

1. 若要告知 Lambda 執行時間要叫用 Lambda 函數程式碼中的處理常式方法，請針對 **Handler** (處理常式) 輸入 **transform.lambda\$1handler**。

   當您在 Python 中設定函數時，處理常式設定的值是檔案名稱和處理常式模組的名稱，並以點分隔。例如，`transform.lambda_handler` 會呼叫 `transform.py` 檔案中定義的 `lambda_handler` 方法。

1. 選擇**儲存**。

1. (選用) 在 Lambda 函數的詳細資訊頁面上，選擇 **Configuration** (組態) 標籤。在左側導覽窗格中，選擇 **General configuration** (一般組態)，然後選擇 **Edit** (編輯)。在 **Timeout (逾時)** 欄位中，輸入 **1** 分 **0** 秒。將其餘設定設定為預設值，然後選擇 **Save** (儲存)。

   **Timeout** (逾時) 是 Lambda 在停用函數前允許函數執行叫用的時間。預設為 3 秒。S3 Object Lambda 使用的 Lambda 函數的持續時間上限為 60 秒。定價是根據設定的記憶體數量和程式碼執行的時間量而定。

## 步驟 5：為 Lambda 函數的執行角色設定 IAM 政策
<a name="ol-upper-step5"></a>

若要啟用 Lambda 函數，將自訂資料和回應標頭提供給 `GetObject` 呼叫者，您 Lambda 函數的執行角色必須具有 IAM 許可，才能呼叫 `WriteGetObjectResponse` API。

**若要將 IAM 政策連接到您的 Lambda 函數角色**



1. 在位於 https：//[https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) 的 AWS Lambda 主控台中，選擇左側導覽窗格中的函數。 ****

1. 選擇您在[步驟 4](#ol-upper-step4) 中建立的函數 (例如，**tutorial-object-lambda-function**)。

1. 在 Lambda 函數的詳細資訊頁面上，選擇 **Configuration** (組態) 標籤，然後在左側導覽窗格選擇**Permissions** (許可)。

1. 在 **Execution role** (執行角色)，選擇 **Role name** (角色名稱)。開啟 IAM 主控台。

1. 在 IAM 主控台的 **Summary** (摘要) 頁面上，針對您 Lambda 函數的執行角色，選擇 **Permissions** (許可) 索引標籤。然後，從 **Add Permissions** (新增許可) 功能表中選擇 **Attach policies** (附加政策)。

1. 在 **Attach permissions** (連接許可) 頁面的搜尋方塊中，輸入 **AmazonS3ObjectLambdaExecutionRolePolicy**，以篩選政策清單。選取 **AmazonS3ObjectLambdaExecutionRolePolicy** 政策的名稱旁的核取方塊。

1. 選擇**連接政策**。

## 步驟 6：建立 S3 Object Lambda 存取點
<a name="ol-upper-step6"></a>

S3 Object Lambda 存取點提供了直接從 S3 GET 請求叫用 Lambda 函數的靈活性，以便函數可以處理從 S3 存取點擷取的資料。建立及設定 S3 Object Lambda 存取點時，您必須指定要叫用的 Lambda 函數，並以 JSON 格式提供事件內容做為自訂參數以供 Lambda 使用。

**建立 S3 Object Lambda 存取點**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) 開啟 Amazon S3 主控台。

1. 在左側的導覽窗格中，選擇 **Object Lambda Access Points** (Object Lambda 存取點)。

1. 在 **Object Lambda Access Points** (Object Lambda 存取點) 頁面上，選擇 **Create Object Lambda access point** (建立 Object Lambda 存取點)。

1. 對於 **Object Lambda 存取點名稱**，請輸入您要用於 Object Lambda 存取點的名稱 (例如，**tutorial-object-lambda-accesspoint**)。

1. 針對 **Supporting Access Point** (支援存取點)，輸入或瀏覽您在[步驟 3](#ol-upper-step3) 中建立的標準存取點 (例如，**tutorial-access-point**)，然後選擇 **Choose supporting Access Point** (選擇支援存取點)。

1. 對於 **S3 API**，若要從 S3 儲存貯體中擷取物件以供 Lambda 函數處理，請選取 **GetObject**。

1. 針對 **Invoke Lambda function** (叫用 Lambda 函式)，您可以為本教學課程選擇以下兩個選項中的任意一個。
   + 從 **Lambda 函式**下拉式清單，選擇**從您帳戶中的函數選擇**，並選擇您在[步驟 4](#ol-upper-step4) 中建立的 Lambda 函式 (例如，**tutorial-object-lambda-function**)。
   + 選擇 **Enter ARN** (輸入 ARN)，然後輸入您在[步驟 4](#ol-upper-step4) 中建立的 Lambda 函數的 Amazon 資源名稱 (ARN)。

1. 針對 **Lambda function version** (Lambda 函數版本)，選擇 **\$1LATEST** (您在[步驟 4](#ol-upper-step4) 中建立的 Lambda 函數的最新版本)。

1. (選用) 如果您需要 Lambda 函數來識別和處理具有範圍和組件編號標頭的 GET 請求，請選取 **Lambda function supports requests using range** (Lambda 函數支援使用範圍的請求) 和 **Lambda function supports requests using part numbers** (Lambda 函數支援使用組件編號的請求)。否則，請清除這兩個核取方塊。

   如需如何藉助 S3 Object Lambda 使用範圍或組件編號的詳細資訊，請參閱「[使用 Range 和 partNumber 標頭](range-get-olap.md)」。

1. (選用) 在 **Payload - *optional*** (酬載 - 選用) 下，新增 JSON 文字，以提供 Lambda 函數的其他資訊。

   承載是可選的 JSON 文本，您可以將其做為來自特定 S3 Object Lambda 存取點的所有叫用的輸入來提供給您的 Lambda 函數。若要針對叫用相同 Lambda 函數的不同 Object Lambda 存取點自訂行為，您可以使用不同參數設定承載，藉此擴充 Lambda 函數的靈活性。

   如需承載的詳細資訊，請參閱「[事件內容格式和用量](olap-event-context.md)」。

1. (選用) 對於 **請求指標 - *選用***，選擇**停用**或**啟用**，將 Amazon S3 監控功能新增至您的 Object Lambda 存取點。請求指標會以標準 Amazon CloudWatch 費率計費。如需詳細資訊，請參閱 [CloudWatch 定價](https://aws.amazon.com/cloudwatch/pricing/)。

1. 在 **Object Lambda Access Point policy - *optional*** (Object Lambda 存取點政策 - 選用) 下，請保留預設設定。

   (選用) 您可以設定資源政策。此資源政策會授予 `GetObject` API 許可 ，以使用指定的 Object Lambda 存取點。

1. 將其餘設定保持為預設值，並選擇 **Create Object Lambda Access Point** (建立 Object Lambda 存取點)。

## 步驟 7：檢視轉換後的資料
<a name="ol-upper-step7"></a>

現在，S3 Object Lambda 已經準備好為您的使用案例轉換資料。在本教學課程中，S3 Object Lambda 會將物件中的所有文字轉換為大寫。

**Topics**
+ [在 S3 Object Lambda 存取點中檢視轉換後的資料](#ol-upper-step7-check-data)
+ [執行 Python 指令碼，以列印原始資料和轉換的資料](#ol-upper-step7-python-print)

### 在 S3 Object Lambda 存取點中檢視轉換後的資料
<a name="ol-upper-step7-check-data"></a>

當您請求透過 S3 Object Lambda 存取點擷取檔案時，您要對 S3 Object Lambda 進行 `GetObject` API 呼叫。S3 Object Lambda 會叫用 Lambda 函數來轉換您的資料，然後傳回轉換後的資料，作為對標準 S3 `GetObject` API 呼叫的回應。

1. 登入 AWS 管理主控台 ，並在 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)：// 開啟 Amazon S3 主控台。

1. 在左側的導覽窗格中，選擇 **Object Lambda Access Points** (Object Lambda 存取點)。

1. 在 **Object Lambda 存取點**頁面上，選擇您在[步驟 6](#ol-upper-step6) 中建立的 S3 Object Lambda 存取點 (例如，**tutorial-object-lambda-accesspoint**)。

1. 在您的 S3 Object Lambda 存取點的**物件**標籤上，選取與您在 [步驟 2](#ol-upper-step2). 中上傳至 S3 儲存貯體的檔案同名的檔案 (例如，`tutorial.txt`)。

   此檔案應包含所有轉換的資料。

1. 若要檢視轉換的資料，選擇 **Open** (開啟) 或 **Download** (下載)。

### 執行 Python 指令碼，以列印原始資料和轉換的資料
<a name="ol-upper-step7-python-print"></a>

您可以將 S3 Object Lambda 與您現有的應用程式搭配使用。若要執行這項操作，請更新您的應用程式組態，以使用您在[步驟 6](#ol-upper-step6) 中建立的新的 S3 Object Lambda 存取點 ARN，進而從 S3 擷取資料。

下列範例 Python 指令碼會同時列印來自 S3 儲存貯體的原始資料，以及來自 S3 Object Lambda 存取點的轉換資料。

1. 登入 AWS 管理主控台 ，並在 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)：// 開啟 Amazon S3 主控台。

1. 在左側的導覽窗格中，選擇 **Object Lambda Access Points** (Object Lambda 存取點)。

1. 在 **Object Lambda 存取點**頁面上，選擇您在[步驟 6](#ol-upper-step6) 中建立的 S3 Object Lambda 存取點左側的選項按鈕 (例如，**tutorial-object-lambda-accesspoint**)。

1. 選擇 **Copy ARN** (複製 ARN)。

1. 儲存 ARN 以供稍後使用。

1. 在本機機器上編寫 Python 指令碼，以列印來自 S3 儲存貯體的原始資料 (例如，`tutorial.txt`) 和來自 S3 Object Lambda 存取點的轉換後的資料 (例如，`tutorial.txt`)。您可使用下列範例指令碼。

   ```
   import boto3
   from botocore.config import Config
   
   s3 = boto3.client('s3', config=Config(signature_version='s3v4'))
   
   def getObject(bucket, key):
       objectBody = s3.get_object(Bucket = bucket, Key = key)
       print(objectBody["Body"].read().decode("utf-8"))
       print("\n")
   
   print('Original object from the S3 bucket:')
   # Replace the two input parameters of getObject() below with 
   # the S3 bucket name that you created in Step 1 and 
   # the name of the file that you uploaded to the S3 bucket in Step 2
   getObject("tutorial-bucket", 
             "tutorial.txt")
   
   print('Object transformed by S3 Object Lambda:')
   # Replace the two input parameters of getObject() below with 
   # the ARN of your S3 Object Lambda Access Point that you saved earlier and
   # the name of the file with the transformed data (which in this case is
   # the same as the name of the file that you uploaded to the S3 bucket 
   # in Step 2)
   getObject("arn:aws:s3-object-lambda:us-west-2:111122223333:accesspoint/tutorial-object-lambda-accesspoint",
             "tutorial.txt")
   ```

1. 在您本機機器上使用自訂名稱將您的 Python 指令碼 (例如，`tutorial_print.py`) 儲存至您在[步驟 4](#ol-upper-step4) 中建立的資料夾中 (例如，`object-lambda`)。

1. 在本機終端機中，從您在[步驟 4](#ol-upper-step4) 中建立的目錄的根中執行下列命令 (例如，`object-lambda`)。

   ```
   python3 tutorial_print.py
   ```

   您應該透過終端機查看原始資料和轉換的資料 (所有文字均為大寫)。例如，您應該會看到類似下列文字的內容。

   ```
   Original object from the S3 bucket:
   Amazon S3 Object Lambda Tutorial:
   You can add your own code to process data retrieved from S3 before 
   returning it to an application.
   
   Object transformed by S3 Object Lambda:
   AMAZON S3 OBJECT LAMBDA TUTORIAL:
   YOU CAN ADD YOUR OWN CODE TO PROCESS DATA RETRIEVED FROM S3 BEFORE 
   RETURNING IT TO AN APPLICATION.
   ```

## 步驟 8：清理
<a name="ol-upper-step8"></a>

如果透過 S3 Object Lambda 轉換的資料僅供學習練習之用，請先刪除已配置的 AWS 資源，如此即不會再產生費用。

**Topics**
+ [刪除 Object Lambda 存取點](#ol-upper-step8-delete-olap)
+ [刪除 S3 存取點](#ol-upper-step8-delete-ap)
+ [為您的 Lambda 函數刪除執行角色](#ol-upper-step8-delete-lambda-role)
+ [刪除 Lambda 函式](#ol-upper-step8-delete-lambda-function)
+ [刪除 CloudWatch 日誌群組](#ol-upper-step8-delete-cloudwatch)
+ [刪除 S3 來源儲存貯體中的原始檔案](#ol-upper-step8-delete-file)
+ [刪除 S3 來源儲存貯體](#ol-upper-step8-delete-bucket)
+ [刪除 IAM 使用者](#ol-upper-step8-delete-user)

### 刪除 Object Lambda 存取點
<a name="ol-upper-step8-delete-olap"></a>

1. 登入 AWS 管理主控台 ，並在 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)：// 開啟 Amazon S3 主控台。

1. 在左側的導覽窗格中，選擇 **Object Lambda Access Points** (Object Lambda 存取點)。

1. 在 **Object Lambda 存取點**頁面上，選擇您在[步驟 6](#ol-upper-step6) 中建立的 S3 Object Lambda 存取點左側的選項按鈕 (例如，**tutorial-object-lambda-accesspoint**)。

1. 選擇 **刪除**。

1. 在出現的文字欄位中，輸入存取點名稱，以確認您要刪除 Object Lambda 存取點，然後選擇**刪除**。

### 刪除 S3 存取點
<a name="ol-upper-step8-delete-ap"></a>

1. 登入 AWS 管理主控台 ，並在 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)：// 開啟 Amazon S3 主控台。

1. 在左側導覽窗格中，選擇 **Access Points** (存取點)。

1. 導覽至您在[步驟 3](#ol-upper-step3) 中建立的存取點 (例如，**tutorial-access-point**)，然後選擇存取點名稱旁的選項按鈕。

1. 選擇 **刪除**。

1. 在出現的文字欄位中，輸入存取點名稱，以確認您要刪除此存取點，然後選擇 **Delete** (刪除)。

### 為您的 Lambda 函數刪除執行角色
<a name="ol-upper-step8-delete-lambda-role"></a>

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) 開啟 AWS Lambda 主控台。

1. 在左側導覽窗格中，選擇 **Functions** (函數)。

1. 選擇您在[步驟 4](#ol-upper-step4) 中建立的函數 (例如，**tutorial-object-lambda-function**)。

1. 在 Lambda 函數的詳細資訊頁面上，選擇 **Configuration** (組態) 標籤，然後在左側導覽窗格選擇**Permissions** (許可)。

1. 在 **Execution role** (執行角色)，選擇 **Role name** (角色名稱)。開啟 IAM 主控台。

1. 在 IAM 主控台的 Lambda 函數的執行角色的 **Summary** (摘要) 頁面，選擇 **Delete role** (刪除角色)。

1. 在 **Delete role** (刪除角色) 對話方塊中，選擇 **Yes, delete** (是，刪除)。

### 刪除 Lambda 函式
<a name="ol-upper-step8-delete-lambda-function"></a>

1. 在位於 https：//[https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) 的 AWS Lambda 主控台中，選擇左側導覽窗格中的函數。 ****

1. 選取您在[步驟 4](#ol-upper-step4) 中建立的函數名稱的左側的核取方塊 (例如，**tutorial-object-lambda-function**)。

1. 選擇**動作**，然後選擇**刪除**。

1. 在 **Delete function** (刪除函數) 對話方塊中，選擇 **Delete** (刪除)。

### 刪除 CloudWatch 日誌群組
<a name="ol-upper-step8-delete-cloudwatch"></a>

1. 透過 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 開啟 CloudWatch 主控台。

1. 在左側導覽窗格中，選擇 **Log groups** (日誌群組)。

1. 尋找您在[步驟 4](#ol-upper-step4) 中建立的且名稱以 Lambda 函數結尾的日誌群組 (例如，**tutorial-object-lambda-function**)。

1. 選取日誌群組名稱左側的核取方塊。

1. 選擇 **Actions** (動作)，然後選擇 **Delete log group(s)** (刪除日誌群組)。

1. 在 **刪除日誌群組** 對話方塊中，選擇 **刪除** 。

### 刪除 S3 來源儲存貯體中的原始檔案
<a name="ol-upper-step8-delete-file"></a>

1. 登入 AWS 管理主控台 ，並在 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)：// 開啟 Amazon S3 主控台。

1. 在左側導覽窗格中，選擇 **Buckets** (儲存貯體)。

1. 在 **Bucket name** (儲存貯體名稱) 清單中，選擇您在[步驟 2](#ol-upper-step2) 中將原始檔案上傳到的儲存貯體的名稱 (例如，**tutorial-bucket**)。

1. 選取要刪除之物件名稱左側的核取方塊 (例如，`tutorial.txt`)。

1. 選擇 **刪除**。

1. 在 **Delete objects** (刪除物件) 頁面上的 **Permanently delete objects?** (永久刪除物件？) 區段中，在文字方塊中輸入 **permanently delete**，以確認您要刪除此物件。

1. 選擇 **Delete objects** (刪除物件)。

### 刪除 S3 來源儲存貯體
<a name="ol-upper-step8-delete-bucket"></a>

1. 登入 AWS 管理主控台 ，並在 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)：// 開啟 Amazon S3 主控台。

1. 在左側導覽窗格中，選擇 **Buckets** (儲存貯體)。

1. 在 **Buckets** (儲存貯體) 清單中，選擇您在[步驟 1](#ol-upper-step1) 中建立的儲存貯體名稱旁的選項按鈕 (例如，**tutorial-bucket**)。

1. 選擇 **刪除**。

1. 在 **Delete bucket** (刪除儲存貯體) 頁面上，在文字欄位中輸入儲存貯體名稱以確認您要刪除該儲存貯體，然後選擇 **Delete bucket** (刪除儲存貯體)。

### 刪除 IAM 使用者
<a name="ol-upper-step8-delete-user"></a>

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台。

1. 在左側導覽窗格中，選擇 **Users** (使用者)，然後選取您要刪除之使用者名稱旁的核取方塊。

1. 在頁面頂端，選擇 **Delete** (刪除)。

1. 在 **Delete *user name*?** (刪除使用者名稱？) 對話方塊中，在文字輸入欄位中輸入使用者名稱以確認刪除使用者。選擇 **刪除**。

## 後續步驟
<a name="ol-upper-next-steps"></a>

完成本教學課程後，您可以針對您的使用案例自訂 Lambda 函數，進而修改標準 S3 GET 請求傳回的資料。

以下是 S3 Object Lambda 的常用使用案例清單：
+ 遮罩敏感資料以確保安全與合規。

  如需詳細資訊，請參閱[教學課程：使用 S3 Object Lambda 和 Amazon Comprehend 來偵測和編輯 PII 資料](tutorial-s3-object-lambda-redact-pii.md)。
+ 篩選某些資料列，以傳遞特定資訊。
+ 使用來自其他服務或資料庫的資訊增強資料。
+ 跨資料格式轉換，例如將 XML 轉換為 JSON 以獲得應用程式的相容性。
+ 在下載檔案時壓縮或解壓縮檔案。
+ 調整圖像大小和為其浮水印。

  如需詳細資訊，請參閱[教學課程：使用 S3 Object Lambda 在擷取影像時動態加上浮水印](https://aws.amazon.com/getting-started/hands-on/amazon-s3-object-lambda-to-dynamically-watermark-images/?ref=docs_gateway/amazons3/tutorial-s3-object-lambda-uppercase.html)。
+ 實作自訂授權規則以存取資料。

如需 S3 Object Lambda 的詳細資訊，請參閱 [使用 S3 Object Lambda 轉換物件](transforming-objects.md)。

# 教學課程：使用 S3 Object Lambda 和 Amazon Comprehend 來偵測和編輯 PII 資料
<a name="tutorial-s3-object-lambda-redact-pii"></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)。

當您將 Amazon S3 用於多個應用程式和使用者存取的共用資料集時，請務必將特許資訊 (例如個人身分識別資訊 (PII)) 限制為授權的實體。例如，當行銷應用程式使用某些包含 PII 的資料時，可能需要先遮罩 PII 資料，才能符合資料隱私權需求。此外，當分析應用程式使用生產訂單清查資料集時，可能需要先修訂客戶信用卡資訊，以防止意外的資料外洩。

搭配使用 [S3 Object Lambda](https://aws.amazon.com/s3/features/object-lambda) 和由 Amazon Comprehend 提供的預先建置的 AWS Lambda 函數，您可以保護從 S3 擷取的 PII 資料，然後再將其傳回應用程式。具體而言，您可以使用預先建置的 [Lambda 函數](https://aws.amazon.com/lambda/)做為修訂函數，並將其連接到 S3 Object Lambda 存取點。當應用程式 (例如，分析應用程式) 傳送[標準 S3 GET 請求](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html)時，這些透過 S3 Object Lambda 存取點提出的請求會調用預先建置的修訂 Lambda 函式，進而偵測並修訂透過支援 S3 存取點從底層資料來源擷取的 PII 資料。然後，S3 Object Lambda 存取點會將修訂的結果傳回至應用程式。

![\[這是 S3 Object Lambda 工作流程圖。\]](http://docs.aws.amazon.com/zh_tw/AmazonS3/latest/userguide/images/ol-comprehend-image-global.png)


在該過程中，預先建置的 Lambda 函數使用自然語言處理 (NLP) 服務的 [Amazon Comprehend](https://aws.amazon.com/comprehend/)，擷取 PII 表示方式的變化，而不論 PII 在文字中的存在方式 (例如數字或文字與數字的組合)。Amazon Comprehend 甚至使用文字中的內容來了解一個 4 位數的數字是一個 PIN、社會安全號碼 (SSN) 的最後四個數字還是年份。Amazon Comprehend 處理 UTF-8 格式的任何文字檔案，並可以大規模保護 PII，而不會影響準確性。如需詳細資訊，請參閱*《Amazon Comprehend 開發人員指南》*中的[什麼是 Amazon Comprehend？](https://docs.aws.amazon.com/comprehend/latest/dg/what-is.html)。

**目標**  
在本教學課程中，您將學習如何搭配使用 S3 Object Lambda 和預先建置的 Lambda 函數 `ComprehendPiiRedactionS3ObjectLambda`。此函數使用 Amazon Comprehend 來檢測 PII 實體。然後，它會以星號取代這些實體，進而予以修訂。透過修訂 PII，您可以隱藏敏感資料，而這有助於維持安全與合規。

您也會了解如何在 中使用和設定預先建置的 AWS Lambda 函數[AWS Serverless Application Repository](https://aws.amazon.com/serverless/serverlessrepo/)，以便與 S3 Object Lambda 搭配使用，以便輕鬆部署。

**Topics**
+ [先決條件：建立具有許可的 IAM 使用者](#ol-pii-prerequisites)
+ [步驟 1：建立 S3 儲存貯體](#ol-pii-step1)
+ [步驟 2：將檔案上傳至 S3 儲存貯體](#ol-pii-step2)
+ [步驟 3：建立 S3 存取點](#ol-pii-step3)
+ [步驟 4：設定及部署預先建置的 Lambda 函數](#ol-pii-step4)
+ [步驟 5：建立 S3 Object Lambda 存取點](#ol-pii-step5)
+ [步驟 6：使用 S3 Object Lambda 存取點擷取已修訂的檔案](#ol-pii-step6)
+ [步驟 7：清除](#ol-pii-step7)
+ [後續步驟](#ol-pii-next-steps)

## 先決條件：建立具有許可的 IAM 使用者
<a name="ol-pii-prerequisites"></a>

開始本教學課程之前，您必須擁有一個 AWS 帳戶，以具有正確許可 AWS Identity and Access Management 的使用者 (IAM 使用者） 身分登入 。

您可以為該教學課程建立 IAM 使用者。若要完成本教學課程，您的 IAM 使用者必須連接下列 IAM 政策，才能存取相關 AWS 資源並執行特定動作。

**注意**  
為了簡單起見，本教學課程會建立和使用 IAM 使用者。完成本教學課程後，請記得 [刪除 IAM 使用者](#ol-pii-step8-delete-user)。針對生產使用，我們建議您遵循《IAM 使用者指南》**中的 [IAM 中的安全最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。其中一項最佳實務是，要求人類使用者搭配身分提供者使用聯合功能，以便使用暫時性憑證存取 AWS 。另一項最佳實務要求工作負載使用臨時性憑證和 IAM 角色來存取 AWS。若要了解如何使用 AWS IAM Identity Center 建立具有臨時登入資料的使用者，請參閱*AWS IAM Identity Center 《 使用者指南*》中的[入門](https://docs.aws.amazon.com/singlesignon/latest/userguide/getting-started.html)。  
本教學課程也使用完整存取的政策。為供生產使用，我們建議您改為僅授予使用案例所需的最低許可，以符合[安全最佳實務](security-best-practices.md#security-best-practices-prevent)。

您的 IAM 使用者需要下列 AWS 受管政策：
+ [AmazonS3FullAccess](https://console.aws.amazon.com/iam/home?#/policies/arn:aws:iam::aws:policy/AmazonS3FullAccess$jsonEditor) – 授予所有 Amazon S3 動作的許可，包括建立和使用 Object Lambda 存取點的許可。
+ [AWSLambda\$1FullAccess](https://console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/AWSLambda_FullAccess$jsonEditor) – 授予所有 Lambda 動作的許可。
+ [AWSCloudFormationFullAccess](https://console.aws.amazon.com/iam/home?#/policies/arn:aws:iam::aws:policy/AWSCloudFormationFullAccess$serviceLevelSummary) – 授予所有 AWS CloudFormation 動作的許可。
+ [IAMFullAccess](https://console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/IAMFullAccess$jsonEditor) – 授予所有 IAM 動作的許可。
+ [IAMAccessAnalyzerReadOnlyAccess](https://console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/IAMAccessAnalyzerReadOnlyAccess$jsonEditor) – 授予讀取由 IAM Access Analyzer 提供的所有存取資訊的許可。

您可以在建立 IAM 使用者時直接連接這些現有政策。如需如何建立 IAM 使用者的詳細資訊，請參閱*《IAM 使用者指南》*中的[建立 IAM 政策 (主控台)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html#id_users_create_console)。

此外，您的 IAM 使用者需要客戶受管政策。若要授予 IAM 使用者所有 AWS Serverless Application Repository 資源和動作的許可，您必須建立 IAM 政策並將政策連接到 IAM 使用者。

**建立 IAM 政策並將其連接至您的 IAM 使用者**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

1. 在左側導覽窗格中選擇 **Policies** (政策)。

1. 選擇**建立政策**。

1. 在 **Visual editor** (視覺化編輯器) 索引標籤上，針對 **Service** (服務)，選擇 **Choose a service** (選擇服務)。然後，選擇 **Serverless Application Repository**。

1. 針對 **Actions** (動作)，在 **Manual actions** (手動動作) 下，為本教學課程選取 **All Serverless Application Repository actions (serverlessrepo:\$1)** (所有 Serverless Application Repository 動作 (serverlessrepo:\$1)。

   作為安全最佳實務，您應該根據您的使用案例，僅允許使用者需要的那些動作和資源的許可。如需詳細資訊，請參閱*《IAM 使用者指南》*中的 [IAM 中的安全最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

1. 針對 **Resources** (資源)，為本教學課程選擇 **All resources** (所有資源)。

   作為最佳實務，您應該僅為特定帳戶中的特定資源定義許可。或者，您也可以使用條件金鑰授予最低權限。如需詳細資訊，請參閱*《IAM 使用者指南》*中的[授予最低權限](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)。

1. 選擇下**一步：標籤**。

1. 選擇下**一步：檢閱**。

1. 在**檢閱政策**頁面上，為您正在建立的政策輸入**名稱** (例如，**tutorial-serverless-application-repository**) 與**描述** (選用)。檢閱政策摘要以確認您已授予所需的許可，然後選擇 **Create policy** (建立政策) 來儲存您的新政策。

1. 在左側導覽窗格中，選擇 **Users (使用者)**。然後，選擇本教學課程的 IAM 使用者。

1. 在所選使用者的 **Summary** (摘要) 頁面上，選擇 **Permissions** (許可) 標籤，然後選擇 **Add permissions** (新增許可)。

1. 在 **Grant permissions (授予許可)** 下，選擇 **Attach existing policies directly (直接連接現有政策)**。

1. 選取您剛建立之政策旁的核取方塊 (例如，**tutorial-serverless-application-repository**)，然後選擇 **Next: Review** (下一步：檢閱)。

1. 在 **Permissions summary** (許可摘要) 下，檢閱摘要以確認您已連接想要的政策。然後，選擇 **Add permissions** (新增許可)。

## 步驟 1：建立 S3 儲存貯體
<a name="ol-pii-step1"></a>

建立儲存貯體來存放您計劃要轉換的原始資料。

**注意**  
存取點可以連接到另一個資料來源，例如 Amazon FSx for OpenZFS 磁碟區，但本教學課程使用的是連接到 S3 儲存貯體的支援存取點。

**建立儲存貯體**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) 開啟 Amazon S3 主控台。

1. 在左側導覽窗格中，選擇 **Buckets** (儲存貯體)。

1. 選擇 **Create bucket** (建立儲存貯體)。

   **Create bucket (建立儲存貯體)** 頁面隨即開啟。

1. 針對 **Bucket name** (儲存貯體名稱)，輸入儲存貯體的名稱 (例如 **tutorial-bucket**)。

   如需有關在 Amazon S3 中的命名儲存貯體的詳細資訊，請參閱 [一般用途儲存貯體命名規則](bucketnamingrules.md)。

1. 針對 **Region** (區域)，選擇希望存放儲存貯體的 AWS 區域 。

   如需有關儲存貯體區域的詳細資訊，請參閱 [一般用途儲存貯體概觀](UsingBucket.md) 。

1. 針對 **Block Public Access settings for this bucket** (此儲存貯體的封鎖公開存取設定)，將保留預設設定 (已啟用**封鎖*所有*公開存取**)。

   除非您需要針對使用案例關閉一或多個設定，否則建議您將所有封鎖公開存取設定保持啟用狀態。如需封鎖公開存取的詳細資訊，請參閱 [封鎖對 Amazon S3 儲存體的公開存取權](access-control-block-public-access.md)。

1. 對於其他設定，請保留預設值。

   (選用) 如果您想要為您的特定使用案例設定其他儲存貯體設定，請參閱 [建立一般用途儲存貯體](create-bucket-overview.md)。

1. 選擇**建立儲存貯體**。

## 步驟 2：將檔案上傳至 S3 儲存貯體
<a name="ol-pii-step2"></a>

將包含各種類型的已知 PII 資料 (例如姓名、銀行資訊、電話號碼和 SSN) 的文字檔案作為原始資料上傳至 S3 儲存貯體，而您將在本教學課程的之後部分修訂 PII。

例如，您可以上傳下列 `tutorial.txt` 檔案。這是 Amazon Comprehend 的輸入檔案範例。

```
Hello Zhang Wei, I am John. Your AnyCompany Financial Services, 
LLC credit card account 1111-0000-1111-0008 has a minimum payment 
of $24.53 that is due by July 31st. Based on your autopay settings, 
we will withdraw your payment on the due date from your 
bank account number XXXXXX1111 with the routing number XXXXX0000. 

Your latest statement was mailed to 100 Main Street, Any City, 
WA 98121. 
After your payment is received, you will receive a confirmation 
text message at 206-555-0100. 
If you have questions about your bill, AnyCompany Customer Service 
is available by phone at 206-555-0199 or 
email at support@anycompany.com.
```

**上傳檔案至儲存貯體**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) 開啟 Amazon S3 主控台。

1. 在左側導覽窗格中，選擇 **Buckets** (儲存貯體)。

1. 在 **Buckets** (儲存貯體) 清單中，選擇您在[步驟 1](#ol-pii-step1) 中建立的且要將檔案上傳至的儲存貯體的名稱 (例如，**tutorial-bucket**)。

1. 在儲存貯體的**物件**索引標籤上，選擇**上傳**。

1. 在 **Upload** (上傳) 頁面上的 **Files and folders** (檔案和資料夾) 下，選擇 **Add files** (新增檔案)。

1. 選擇要上傳的檔案，然後選擇 **Open (開啟)**。舉例而言，您可以上傳之前提及的 `tutorial.txt` 檔案範例。

1. 選擇**上傳**。

## 步驟 3：建立 S3 存取點
<a name="ol-pii-step3"></a>

若要使用 S3 Object Lambda 存取點來存取和轉換原始資料，您必須建立 S3 存取點，並將其與您在[步驟 1](#ol-pii-step1) 中建立的 S3 儲存貯體建立關聯。存取點必須與您要轉換 AWS 區域 的物件位於相同的 中。

在本教學課程稍後的部分，您將使用此存取點做為您 Object Lambda 存取點的支援存取點。

**建立存取點**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) 開啟 Amazon S3 主控台。

1. 在左側導覽窗格中，選擇 **Access Points** (存取點)。

1. 在 **Access Points** (存取點) 頁面上，選擇 **Create access point** (建立存取點)。

1. 在 **Access point name** (存取點名稱) 欄位中，輸入存取點的名稱 (例如，**tutorial-pii-access-point**)。

   如需存取點命名的詳細資訊，請參閱「[存取點的命名規則](access-points-restrictions-limitations-naming-rules.md#access-points-names)」。

1. 在**資料來源**欄位中，輸入您在[步驟 1](#ol-pii-step1) 中建立的儲存貯體的名稱 (例如，**tutorial-bucket**)。S3 將存取點連接至此儲存貯體。

   (選用) 您可以選擇 **Browse S3** (瀏覽 S3) 來瀏覽並搜尋您帳戶中的儲存貯體。如果您選擇 **Browse S3** (瀏覽 S3)，請先選擇所需的儲存貯體，然後選擇 **Choose path** (選擇路徑)，系統即會在 **Bucket name** (儲存貯體名稱) 欄位中填入該儲存貯體的名稱。

1. 針對 **Network origin** (網路來源)，選擇 **Internet** (網際網路)。

   如需存取點網路來源的詳細資訊，請參閱「[建立受限於 Virtual Private Cloud 的存取點](access-points-vpc.md)」。

1. 依預設，存取點的所有封鎖公開存取設定都會開啟。我們建議您將**封鎖*所有*公開存取**保持啟用的狀態。如需詳細資訊，請參閱[管理一般用途儲存貯體存取點的公開存取](access-points-bpa-settings.md)。

1. 對於所有其他存取點設定，保留預設設定。

   (選用) 您可以修改存取點設定，以支援您的使用案例。在本教學課程中，我們建議您保留預設設定。

   (選用) 如果您需要管理存取點的存取，您可以指定存取點政策。如需詳細資訊，請參閱[存取點的政策範例](access-points-policies.md#access-points-policy-examples)。

1. 選擇 **Create access point (建立新的存取點)**。

## 步驟 4：設定及部署預先建置的 Lambda 函數
<a name="ol-pii-step4"></a>

若要修訂 PII 資料，請設定並部署預先建置的 AWS Lambda 函數 `ComprehendPiiRedactionS3ObjectLambda`，以與您的 S3 Object Lambda 存取點搭配使用。

**設定和部署 Lambda 函數**

1. 登入 AWS 管理主控台 並在 中檢視 [https://console.aws.amazon.com/lambda/home#/create/app?applicationId=arn:aws:serverlessrepo:us-east-1:839782855223:applications/ComprehendPiiRedactionS3ObjectLambda](https://console.aws.amazon.com/lambda/home#/create/app?applicationId=arn:aws:serverlessrepo:us-east-1:839782855223:applications/ComprehendPiiRedactionS3ObjectLambda)函數 AWS Serverless Application Repository。

1. 針對 **Application settings** (應用程式設定)，在 **Application name** (應用程式名稱) 下，為本教學課程保留預設值 (`ComprehendPiiRedactionS3ObjectLambda`)。

   (選用) 您可以輸入您要給予此應用程式的名稱。如果您計劃針對相同共用資料集的不同存取需求，設定多個 Lambda 函數，您可能會想要這麼做。

1. 針對 **MaskCharacter**，請保留預設值 (`*`)。遮罩字元會取代已修訂 PII 實體中的每個字元。

1. 針對 **MaskMode**，請保留預設值 (**MASK**)。**MaskMode** 數值會指定 PII 實體是使用 `MASK` 字元還是 `PII_ENTITY_TYPE` 數值進行修訂。

1. 若要修訂指定類型的資料，針對 **PiiEntityTypes**，請保留預設值**ALL** (所有)。**PiiEntityTypes** 數值會指定要考慮進行修訂的 PII 實體類型。

   如需支援的 PII 實體類型清單的詳細資訊，請參閱*《Amazon Comprehend 開發人員指南》*中的[偵測個人身分識別資訊 (PII)](https://docs.aws.amazon.com/comprehend/latest/dg/how-pii.html)。

1. 將其餘設定保持為預設值。

   (選用) 如果您想要為您的特定使用案例設定其他設定，請參閱位於頁面左側的 **Readme 檔案**。

1. 選取 **I acknowledge that this app creates custom IAM roles (我認可此應用程式建立自訂的 IAM 角色)** 旁的核取方塊。

1. 選擇**部署**。

1. 在新應用程式的頁面，在 **Resources** (資源) 下，選擇您部署的 Lambda 函數的 **Logical ID** (邏輯 ID)，以檢閱 Lambda function (Lambda 函數) 頁面上的函數。

## 步驟 5：建立 S3 Object Lambda 存取點
<a name="ol-pii-step5"></a>

S3 Object Lambda 存取點提供了直接從 S3 GET 請求叫用 Lambda 函數的靈活性，以便函數可以修訂從 S3 存取點擷取的 PII 資料。建立及設定 S3 Object Lambda 存取點時，您必須指定要叫用的修訂 Lambda 函數，並以 JSON 格式提供事件內容做為自訂參數以供 Lambda 使用。

事件內容提供了從 S3 Object Lambda 傳遞給 Lambda 事件中提出之請求的相關資訊。如需事件內容中所有欄位的詳細資訊，請參閱 [事件內容格式和用量](olap-event-context.md)。

**建立 S3 Object Lambda 存取點**

1. 登入 AWS 管理主控台 ，並在 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)：// 開啟 Amazon S3 主控台。

1. 在左側的導覽窗格中，選擇 **Object Lambda Access Points** (Object Lambda 存取點)。

1. 在 **Object Lambda Access Points** (Object Lambda 存取點) 頁面上，選擇 **Create Object Lambda access point** (建立 Object Lambda 存取點)。

1. 對於 **Object Lambda 存取點名稱**，請輸入您要用於 Object Lambda 存取點的名稱 (例如，**tutorial-pii-object-lambda-accesspoint**)。

1. 針對 **Supporting Access Point** (支援存取點)，輸入或瀏覽您在[步驟 3](#ol-pii-step3) 中建立的標準存取點 (例如，**tutorial-pii-access-point**)，然後選擇 **Choose supporting Access Point** (選擇支援存取點)。

1. 對於 **S3 API**，若要從 S3 儲存貯體中擷取物件以供 Lambda 函數處理，請選取 **GetObject**。

1. 針對 **Invoke Lambda function** (叫用 Lambda 函式)，您可以為本教學課程選擇以下兩個選項中的任意一個。
   + 從 **Lambda 函式**下拉式清單，選擇**從您帳戶中的函數選擇**，並選擇您在[步驟 4](#ol-pii-step4) 中部署的 Lambda 函式 (例如，**serverlessrepo-ComprehendPiiRedactionS3ObjectLambda**)。
   + 選擇 **Enter ARN** (輸入 ARN)，然後輸入您在[步驟 4](#ol-pii-step4) 中建立的 Lambda 函數的 Amazon 資源名稱 (ARN)。

1. 針對 **Lambda function version** (Lambda 函數版本)，選擇 **\$1LATEST** (您在[步驟 4](#ol-pii-step4) 中部署的 Lambda 函數的最新版本)。

1. (選用) 如果您需要 Lambda 函數來識別和處理具有範圍和組件編號標頭的 GET 請求，請選取 **Lambda function supports requests using range** (Lambda 函數支援使用範圍的請求) 和 **Lambda function supports requests using part numbers** (Lambda 函數支援使用組件編號的請求)。否則，請清除這兩個核取方塊。

   如需如何藉助 S3 Object Lambda 使用範圍或組件編號的詳細資訊，請參閱「[使用 Range 和 partNumber 標頭](range-get-olap.md)」。

1. (選用) 在 **Payload - *optional*** (酬載 - 選用) 下，新增 JSON 文字，以提供 Lambda 函數的其他資訊。

   承載是可選的 JSON 文本，您可以將其做為來自特定 S3 Object Lambda 存取點的所有叫用的輸入來提供給您的 Lambda 函數。若要針對叫用相同 Lambda 函數的不同 Object Lambda 存取點自訂行為，您可以使用不同參數設定承載，藉此擴充 Lambda 函數的靈活性。

   如需承載的詳細資訊，請參閱「[事件內容格式和用量](olap-event-context.md)」。

1. (選用) 對於 **請求指標 - *選用***，選擇**停用**或**啟用**，將 Amazon S3 監控功能新增至您的 Object Lambda 存取點。請求指標會以標準 Amazon CloudWatch 費率計費。如需詳細資訊，請參閱 [CloudWatch 定價](https://aws.amazon.com/cloudwatch/pricing/)。

1. 在 **Object Lambda Access Point policy - *optional*** (Object Lambda 存取點政策 - 選用) 下，請保留預設設定。

   (選用) 您可以設定資源政策。此資源政策會授予 `GetObject` API 許可，以使用指定的 Object Lambda 存取點。

1. 將其餘設定保持為預設值，並選擇 **Create Object Lambda Access Point** (建立 Object Lambda 存取點)。

## 步驟 6：使用 S3 Object Lambda 存取點擷取已修訂的檔案
<a name="ol-pii-step6"></a>

現在，S3 Object Lambda 已經準備好從您的原始檔案修訂 PII 資料。

**若要使用 S3 Object Lambda 存取點擷取修訂的檔案**

當您請求透過 S3 Object Lambda 存取點擷取檔案時，您要對 S3 Object Lambda 進行 `GetObject` API 呼叫。S3 Object Lambda 會叫用 Lambda 函數來修改您的 PII 資料，並傳回轉換後的資料，作為對標準 S3 `GetObject` API 呼叫的回應。

1. 登入 AWS 管理主控台 ，並在 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)：// 開啟 Amazon S3 主控台。

1. 在左側的導覽窗格中，選擇 **Object Lambda Access Points** (Object Lambda 存取點)。

1. 在 **Object Lambda 存取點**頁面上，選擇您在[步驟 5](#ol-pii-step5) 中建立的 S3 Object Lambda 存取點 (例如，**tutorial-pii-object-lambda-accesspoint**)。

1. 在您的 S3 Object Lambda 存取點的**物件**標籤上，選取與您在 [步驟 2](#ol-pii-step2). 中上傳至 S3 儲存貯體的檔案同名的檔案 (例如，`tutorial.txt`)。

   此檔案應包含所有轉換的資料。

1. 若要檢視轉換的資料，選擇 **Open** (開啟) 或 **Download** (下載)。

    您應能夠看到已修訂的檔案，如下方範例所示。

   ```
   Hello *********. Your AnyCompany Financial Services, 
   LLC credit card account ******************* has a minimum payment 
   of $24.53 that is due by *********. Based on your autopay settings, 
   we will withdraw your payment on the due date from your 
   bank account ********** with the routing number *********. 
   
   Your latest statement was mailed to **********************************. 
   After your payment is received, you will receive a confirmation 
   text message at ************. 
   If you have questions about your bill, AnyCompany Customer Service 
   is available by phone at ************ or 
   email at **********************.
   ```

## 步驟 7：清除
<a name="ol-pii-step7"></a>

如果您只透過 S3 Object Lambda 做為學習練習來修訂資料，請刪除您配置 AWS 的資源，以免再產生費用。

**Topics**
+ [刪除 Object Lambda 存取點](#ol-pii-step8-delete-olap)
+ [刪除 S3 存取點](#ol-pii-step8-delete-ap)
+ [刪除 Lambda 函式](#ol-pii-step8-delete-lambda-function)
+ [刪除 CloudWatch 日誌群組](#ol-pii-step8-delete-cloudwatch)
+ [刪除 S3 來源儲存貯體中的原始檔案](#ol-pii-step8-delete-file)
+ [刪除 S3 來源儲存貯體](#ol-pii-step8-delete-bucket)
+ [為您的 Lambda 函數刪除 IAM 角色](#ol-pii-step8-delete-lambda-role)
+ [刪除 IAM 使用者的客戶受管政策](#ol-pii-step8-delete-function-policy)
+ [刪除 IAM 使用者](#ol-pii-step8-delete-user)

### 刪除 Object Lambda 存取點
<a name="ol-pii-step8-delete-olap"></a>

1. 登入 AWS 管理主控台 ，並在 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)：// 開啟 Amazon S3 主控台。

1. 在左側的導覽窗格中，選擇 **Object Lambda Access Points** (Object Lambda 存取點)。

1. 在 **Object Lambda 存取點**頁面上，選擇您在[步驟 5](#ol-pii-step5) 中建立的 S3 Object Lambda 存取點左側的選項按鈕 (例如，**tutorial-pii-object-lambda-accesspoint**)。

1. 選擇 **刪除**。

1. 在出現的文字欄位中，輸入存取點名稱，以確認您要刪除 Object Lambda 存取點，然後選擇**刪除**。

### 刪除 S3 存取點
<a name="ol-pii-step8-delete-ap"></a>

1. 登入 AWS 管理主控台 ，並在 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)：// 開啟 Amazon S3 主控台。

1. 在左側導覽窗格中，選擇 **Access Points** (存取點)。

1. 導覽至您在[步驟 3](#ol-pii-step3) 中建立的存取點 (例如，**tutorial-pii-access-point**)，然後選擇存取點名稱旁的選項按鈕。

1. 選擇 **刪除**。

1. 在出現的文字欄位中，輸入存取點名稱，以確認您要刪除此存取點，然後選擇 **Delete** (刪除)。

### 刪除 Lambda 函式
<a name="ol-pii-step8-delete-lambda-function"></a>

1. 在位於 https：//[https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) 的 AWS Lambda 主控台中，選擇左側導覽窗格中的函數。 ****

1. 選擇您在[步驟 4](#ol-pii-step4) 中建立的函數 (例如，**serverlessrepo-ComprehendPiiRedactionS3ObjectLambda**)。

1. 選擇**動作**，然後選擇**刪除**。

1. 在 **Delete function** (刪除函數) 對話方塊中，選擇 **Delete** (刪除)。

### 刪除 CloudWatch 日誌群組
<a name="ol-pii-step8-delete-cloudwatch"></a>

1. 透過 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 開啟 CloudWatch 主控台。

1. 在左側導覽窗格中，選擇 **Log groups** (日誌群組)。

1. 尋找您在[步驟 4](#ol-pii-step4) 中建立的且名稱以 Lambda 函數結尾的日誌群組 (例如，**serverlessrepo-ComprehendPiiRedactionS3ObjectLambda**)。

1. 選擇 **Actions** (動作)，然後選擇 **Delete log group(s)** (刪除日誌群組)。

1. 在 **刪除日誌群組** 對話方塊中，選擇 **刪除** 。

### 刪除 S3 來源儲存貯體中的原始檔案
<a name="ol-pii-step8-delete-file"></a>

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) 開啟 Amazon S3 主控台。

1. 在左側導覽窗格中，選擇 **Buckets** (儲存貯體)。

1. 在 **Bucket name** (儲存貯體名稱) 清單中，選擇您在[步驟 2](#ol-pii-step2) 中將原始檔案上傳到的儲存貯體的名稱 (例如，**tutorial-bucket**)。

1. 選取要刪除之物件名稱左側的核取方塊 (例如，`tutorial.txt`)。

1. 選擇 **刪除**。

1. 在 **Delete objects** (刪除物件) 頁面上的 **Permanently delete objects?** (永久刪除物件？) 區段中，在文字方塊中輸入 **permanently delete**，以確認您要刪除此物件。

1. 選擇 **Delete objects** (刪除物件)。

### 刪除 S3 來源儲存貯體
<a name="ol-pii-step8-delete-bucket"></a>

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) 開啟 Amazon S3 主控台。

1. 在左側導覽窗格中，選擇 **Buckets** (儲存貯體)。

1. 在 **Buckets** (儲存貯體) 清單中，選擇您在[步驟 1](#ol-pii-step1) 中建立的儲存貯體名稱旁的選項按鈕 (例如，**tutorial-bucket**)。

1. 選擇 **刪除**。

1. 在 **Delete bucket** (刪除儲存貯體) 頁面上，在文字欄位中輸入儲存貯體名稱以確認您要刪除該儲存貯體，然後選擇 **Delete bucket** (刪除儲存貯體)。

### 為您的 Lambda 函數刪除 IAM 角色
<a name="ol-pii-step8-delete-lambda-role"></a>

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台。

1. 在左側導覽窗格中，選擇 **Roles** (角色)，然後選取您要刪除之角色名稱旁的核取方塊。角色名稱以您在[步驟 4](#ol-pii-step4) 中部署的 Lambda 函數的名稱為開頭 (例如，**serverlessrepo-ComprehendPiiRedactionS3ObjectLambda**)。

1. 選擇 **刪除**。

1. 在 **Delete** (刪除) 對話方塊中，在文字輸入欄位中輸入角色名稱以確認刪除。再選擇 **Delete** (刪除)。

### 刪除 IAM 使用者的客戶受管政策
<a name="ol-pii-step8-delete-function-policy"></a>

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台。

1. 在左側導覽窗格中選擇 **Policies** (政策)。

1. 在 **Policies** (政策) 頁面上，在搜尋方塊中輸入您在 [Prerequisites](#ol-pii-prerequisites) (先決條件) 中建立的客戶受管政策的名稱 (例如，**tutorial-serverless-application-repository**)，以篩選政策清單。選取您要刪除的政策名稱旁的選項按鈕。

1. 選擇**動作**，然後選擇**刪除**。

1. 在顯示的文字欄位中，輸入本政策的名稱，以確認您要刪除此政策，然後選擇 **Delete** (刪除)。

### 刪除 IAM 使用者
<a name="ol-pii-step8-delete-user"></a>

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台。

1. 在左側導覽窗格中，選擇 **Users** (使用者)，然後選取您要刪除之使用者名稱旁的核取方塊。

1. 在頁面頂端，選擇 **Delete** (刪除)。

1. 在 **Delete *user name*?** (刪除使用者名稱？) 對話方塊中，在文字輸入欄位中輸入使用者名稱以確認刪除使用者。選擇 **刪除**。

## 後續步驟
<a name="ol-pii-next-steps"></a>

完成本教學課程之後，您可以進一步探索下列相關的使用案例：
+ 您可以建立多個 S3 Object Lambda 存取點，並使用預先建置的 Lambda 函數啟用這些函數，其中這些函數的設定不同，以根據資料存取者的業務需求修訂特定類型的 PII。

  每種類型的使用者都具有 IAM 角色，且只能存取一個 S3 Object Lambda 存取點 (透過 IAM 政策管理)。然後，您連接每個 `ComprehendPiiRedactionS3ObjectLambda` 針對不同 S3 Object Lambda 存取點的不同修訂使用案例設定 Lambda 函數。對於每個 S3 Object Lambda 存取點，您可以擁有支援的 S3 存取點，以便從存放共用資料集的 S3 儲存貯體讀取資料。

  如需如何建立 S3 儲存貯體政策，以允許使用者僅透過 S3 存取點讀取儲存貯體的詳細資訊，請參閱「[配置使用存取點的 IAM 原則](access-points-policies.md)」。

  如需如何授予使用者存取 Lambda 函數、S3 存取點及 S3 Object Lambda 存取點之許可的相關資訊，請參閱 [設定 Object Lambda 存取點的 IAM 政策](olap-policies.md)。
+ 您可以建置自己的 Lambda 函數，並將 S3 Object Lambda 搭配您自訂的 Lambda 函數使用，以滿足您的特定資料需求。

  例如，若要探索各種資料值，您可以使用 S3 Object Lambda 和您自己的 Lambda 函數，其中該函數會使用其他 [Amazon Comprehend 功能](https://aws.amazon.com/comprehend/features/) (例如實體辨識、金鑰片語辨識、情感分析和文件分類) 來處理資料。您也可以將 S3 Object Lambda 與 [Amazon Comprehend Medical](https://aws.amazon.com/comprehend/medical/) 搭配使用，後者是符合 HIPAA 資格的 NLP 服務，以內容感知的方式分析和擷取資料。

  如需如何使用 S3 Object Lambda 和您自己的 Lambda 函數轉換資料的詳細資訊，請參閱「[教學課程：使用 S3 Object Lambda 轉換應用程式的資料](tutorial-s3-object-lambda-uppercase.md)」。

# 對 S3 Object Lambda 進行偵錯和故障診斷
<a name="olap-debugging-lambda"></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)。

當 Lambda 函數叫用或執行發生問題時，對 Amazon S3 Object Lambda 存取點的請求可能會導致新的錯誤回應。這些錯誤的格式與標準 Amazon S3 錯誤的格式相同。如需有關 S3 Object Lambda 錯誤的資訊，請參閱《Amazon Simple Storage Service API 參考》**中的 [S3 Object Lambda 錯誤代碼清單](https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#S3ObjectLambdaErrorCodeList)。

如需有關一般 Lambda 函數偵錯的詳細資訊，請參閱《AWS Lambda 開發人員指南》**中的 [Lambda 應用程式的監控和疑難排解](https://docs.aws.amazon.com/lambda/latest/dg/lambda-monitoring.html )。

有關標準 Amazon S3 錯誤的資訊，請參閱《Amazon Simple Storage Service API 參考》**中的[錯誤回應](https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html)。

您可以在 Amazon CloudWatch 中為 Object Lambda 存取點啟用請求指標。這些指標會協助您監控存取點的操作效能。您可以在 Object Lambda 存取點建立期間或之後啟用請求指標。如需詳細資訊，請參閱[CloudWatch 中的 S3 Object Lambda 請求指標](metrics-dimensions.md#olap-cloudwatch-metrics)。

您可以啟用 AWS CloudTrail 資料事件，以取得對 Object Lambda 存取點所提出請求的更精細日誌記錄。如需詳細資訊，請參閱《AWS CloudTrail 使用者指南》**中的[記錄資料事件](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/logging-data-events-with-cloudtrail.html)。

如需 S3 Object Lambda 的教學課程，請參閱下列各項：
+ [教學課程：使用 S3 Object Lambda 轉換應用程式的資料](tutorial-s3-object-lambda-uppercase.md)
+ [教學課程：使用 S3 Object Lambda 和 Amazon Comprehend 來偵測和編輯 PII 資料](tutorial-s3-object-lambda-redact-pii.md)
+ [教學課程：使用 S3 Object Lambda 在擷取影像時動態加上浮水印](https://aws.amazon.com/getting-started/hands-on/amazon-s3-object-lambda-to-dynamically-watermark-images/?ref=docs_gateway/amazons3/transforming-objects.html)

如需標準存取點的詳細資訊，請參閱 [使用存取點管理對共用資料集的存取](access-points.md)。

如需有關使用儲存貯體的詳細資訊，請參閱 [一般用途儲存貯體概觀](UsingBucket.md)。如需使用物件的資訊，請參閱「[Amazon S3 物件概觀](UsingObjects.md)」。