

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

# 教學課程：使用 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)。