我想使用 AWS Lambda 函數將檔案從一個 Amazon Simple Storage Service (Amazon S3) 儲存貯體複製到另一個儲存貯體。
解決方法
請依照下列步驟建立 Lambda 函數,以將檔案從來源 Amazon S3 儲存貯體複製到目的地 S3 儲存貯體。
建立來源和目的地 Amazon S3 儲存貯體
**注意:**如果您已建立來源和目的地 S3 儲存貯體,請略過此步驟。
請完成下列步驟:
- 開啟 Amazon S3 主控台。
- 選擇建立儲存貯體。
- 對於儲存貯體名稱,輸入來源儲存貯體的名稱。
- 從 AWS 區域下拉式清單中,選擇您的 AWS 區域。
- 選擇建立儲存貯體。
- 針對目的地儲存貯體重複步驟 1-4。
如需詳細資訊,請參閱建立儲存貯體。
建立 Lambda 函數
請完成下列步驟:
-
在 Lambda 主控台中開啟函數頁面。
-
選擇建立函數,然後選擇從頭開始撰寫。
-
針對函數名稱,輸入函數的名稱。
-
從執行時期下拉式清單中,選擇 Python 3.11。
-
展開變更預設執行角色,然後選擇建立具有基本許可的新角色。
-
選擇建立函數。
-
選擇程式碼標籤,然後貼上下列 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 名稱儲存為環境變數。
-
選擇部署。
Lambda 會建立一個執行角色,向函數授予將日誌上傳到 Amazon CloudWatch 的權限。如需詳細資訊,請參閱使用主控台建立 Lambda 函數。
為 Lambda 函數建立 Amazon S3 觸發條件
請完成下列步驟:
- 在 Lambda 主控台中開啟函數頁面。
- 在函數中,選擇 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 服務的函數存取權。
相關資訊
如何對來自 Amazon S3 的 403 存取遭拒錯誤進行疑難排解?
如何允許我的 Lambda 執行角色存取我的 Amazon S3 儲存貯體?