使用 AWS re:Post 即表示您同意 AWS re:Post 使用條款

如何使用 Lambda 函數將檔案從一個 Amazon S3 儲存貯體複製到另一個儲存貯體?

2 分的閱讀內容
0

我想使用 AWS Lambda 函數將檔案從一個 Amazon Simple Storage Service (Amazon S3) 儲存貯體複製到另一個儲存貯體。

解決方法

請依照下列步驟建立 Lambda 函數,以將檔案從來源 Amazon S3 儲存貯體複製到目的地 S3 儲存貯體。

建立來源和目的地 Amazon S3 儲存貯體

**注意:**如果您已建立來源和目的地 S3 儲存貯體,請略過此步驟。

請完成下列步驟:

  1. 開啟 Amazon S3 主控台
  2. 選擇建立儲存貯體
  3. 對於儲存貯體名稱,輸入來源儲存貯體的名稱。
  4. AWS 區域下拉式清單中,選擇您的 AWS 區域。
  5. 選擇建立儲存貯體
  6. 針對目的地儲存貯體重複步驟 1-4。

如需詳細資訊,請參閱建立儲存貯體

建立 Lambda 函數

請完成下列步驟:

  1. 在 Lambda 主控台中開啟函數頁面

  2. 選擇建立函數,然後選擇從頭開始撰寫

  3. 針對函數名稱,輸入函數的名稱。

  4. 執行時期下拉式清單中,選擇 Python 3.11

  5. 展開變更預設執行角色,然後選擇建立具有基本許可的新角色

  6. 選擇建立函數

  7. 選擇程式碼標籤,然後貼上下列 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 名稱儲存為環境變數。

  8. 選擇部署

Lambda 會建立一個執行角色,向函數授予將日誌上傳到 Amazon CloudWatch 的權限。如需詳細資訊,請參閱使用主控台建立 Lambda 函數

為 Lambda 函數建立 Amazon S3 觸發條件

請完成下列步驟:

  1. 在 Lambda 主控台中開啟函數頁面
  2. 函數中,選擇 Lambda 函數。
  3. 函數概觀中,選擇新增觸發條件
  4. 觸發條件組態下拉式清單中,選擇 S3
  5. 儲存貯體中,輸入來源儲存貯體的名稱。
  6. 事件類型下拉式清單中,選擇所有物件建立事件
    **注意:**將此步驟設定為使用 POST、PUT 或分段上傳事件類型以上傳物件。
  7. 選取我確認不建議同時對輸入和輸出使用相同的 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:GetObjectTaggings3:PutObjectTagging 許可。您必須對來源儲存貯體中的來源物件具有 s3:GetObjectTagging 許可,而對目的地儲存貯體中的物件具有 s3:PutObjectTagging 許可。

如需詳細資訊,請參閱授予 AWS 服務的函數存取權

相關資訊

如何對來自 Amazon S3 的 403 存取遭拒錯誤進行疑難排解?

如何允許我的 Lambda 執行角色存取我的 Amazon S3 儲存貯體?

AWS 官方
AWS 官方已更新 1 年前