Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
如何使用 Lambda 函式將檔案從一個 Amazon S3 儲存貯體複製到另一個儲存貯體?
我想使用 AWS Lambda 函式將檔案從一個 Amazon Simple Storage Service (Amazon S3) 儲存貯體複製到另一個儲存貯體。
解決方法
請依照下列步驟建立 Lambda 函式,以將檔案從來源 Amazon S3 儲存貯體複製到目的地 S3 儲存貯體。
建立來源和目的地 S3 儲存貯體
**注意:**如果您已建立來源和目的地 S3 儲存貯體,請略過此步驟。
請完成下列步驟:
- 開啟 Amazon S3 主控台。
- 選擇 Create bucket (建立儲存貯體)。
- 在 Bucket name (儲存貯體名稱) 中,輸入來源儲存貯體的名稱。
- 選擇 Create bucket (建立儲存貯體)。
- 針對目的地儲存貯體重複步驟 1-4。
如需詳細資訊,請參閱建立儲存貯體。
建立 Lambda 函數
請完成下列步驟:
-
在 Lambda 主控台中開啟 Functions page (函式頁面)。
-
選擇 Create function (建立函式),然後選擇 Author from scratch (從頭開始撰寫)。
-
在 Function name (函式名稱) 中,輸入函式的名稱。
-
從 Runtime (執行時期) 下拉式清單中,選擇 Python 3.13。
-
展開 Change default execution role (變更預設執行角色),然後選擇 Create a new role with basic permissions )建立具有基本權限的新角色)。
-
選擇建立函數。
-
選擇程式碼標籤,然後貼上下列 Python 程式碼:
import boto3 import botocore import json import os import logging logger = logging.getLogger() logger.setLevel(logging.INFO) s3 = boto3.resource('s3') def lambda_handler(event, context): logger.info("New files uploaded to the source bucket.") key = event['Records'][0]['s3']['object']['key'] source_bucket = event['Records'][0]['s3']['bucket']['name'] destination_bucket = os.environ['destination_bucket'] source = {'Bucket': source_bucket, 'Key': key} try: response = s3.meta.client.copy(source, destination_bucket, key) logger.info("File copied to the destination bucket successfully!") except botocore.exceptions.ClientError as error: logger.error("There was an error copying the file to the destination bucket") print('Error Message: {}'.format(error)) except botocore.exceptions.ParamValidationError as error: logger.error("Missing required parameters while calling the API.") print('Error Message: {}'.format(error))**注意:**從 Lambda 函數接收的事件物件中尋找 source_bucket 名稱。您可以將 destination_bucket 名稱儲存為環境變數。
-
選擇 Deploy (部署)。
Lambda 會建立一個執行角色,向函式授予將日誌上傳到 Amazon CloudWatch 的權限。如需詳細資訊,請參閱使用主控台建立 Lambda 函數。
為 Lambda 函數建立 Amazon S3 觸發條件
請完成下列步驟:
- 在 Lambda 主控台中開啟 Functions page (函式頁面)。
- 在函數中,選擇 Lambda 函數。
- 在函數概觀中,選擇新增觸發條件。
- 從觸發條件組態下拉式清單中,選擇 S3。
- 在儲存貯體中,輸入來源儲存貯體的名稱。
- 從事件類型下拉式清單中,選擇所有物件建立事件。
**注意:**將此步驟設定為使用 POST、PUT 或分段上傳事件類型以上傳物件。 - 選取我確認不建議同時對輸入和輸出使用相同的 S3 儲存貯體協議,然後選擇新增。
如需詳細資訊,請參閱教學課程: 使用 Amazon S3 觸發條件調用 Lambda 函數。
為 Lambda 函數的執行角色提供 IAM 權限
若要將檔案複製到目的地 S3 儲存貯體,請為 Lambda 函式的執行角色新增 AWS Identity and Access Management (IAM) 權限。使用類似以下內容的資源型政策:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "putObject", "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": [ "arn:aws:s3:::destination-s3-bucket/*" ] }, { "Sid": "getObject", "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::source-s3-bucket/*" ] } ] }
注意:
- 將 destination-s3-bucket 替換為您的 S3 目的地儲存貯體,並將 source-s3-bucket 替換為您的 S3 來源儲存貯體。
- 將資源 ARN 末尾的 /* 替換為您環境所需的首碼值以限制權限。
- 最佳做法是授予執行任務的最低權限。
- 若要複製具有物件標籤的物件,執行角色必須具有 s3:GetObjectTagging 和 s3:PutObjectTagging 權限。您必須對來源儲存貯體中的來源物件具有 s3:GetObjectTagging 權限,而對目的地儲存貯體中的物件具有 s3:PutObjectTagging 權限。
如需詳細資訊,請參閱授予 AWS 服務的 Lambda 函式存取權。
相關資訊
相關內容
- 已提問 1 年前
- 已提問 1 年前
- 已提問 6 個月前
AWS 官方已更新 2 個月前
