【问题标题】:AWS Lambda in Python to copy new files to another s3 bucketPython 中的 AWS Lambda 将新文件复制到另一个 s3 存储桶
【发布时间】:2019-10-02 10:59:40
【问题描述】:

我创建了一个 Lambda,每次我将文件添加到 s3://test-bucket-01/ 时都会触发它,它将 s3://test-bucket-01/ 中的所有文件复制到 s3:// test-bucket-02/

我希望它只添加刚刚添加的新文件?

当前代码:

import boto3
s3 = boto3.resource('s3')


def lambda_handler(event, context):
    bucket = s3.Bucket('test-bucket-01')
    dest_bucket = s3.Bucket('tb-bucket-02')
    print(bucket)
    print(dest_bucket)

    for obj in bucket.objects.all():
        dest_key = obj.key
        print(dest_key)
        s3.Object(dest_bucket.name, dest_key).copy_from(CopySource = {'Bucket': obj.bucket_name, 'Key': obj.key})

结果:

Function Logs:
START RequestId: XXXXXXX-XXXXXXX-XXXXXXX Version: $LATEST
s3.Bucket(name='test-bucket-01')
s3.Bucket(name='test-bucket-02')
test-data-01.json
test-data-02.json
test-data-03.json

【问题讨论】:

    标签: python amazon-web-services amazon-s3 aws-lambda boto


    【解决方案1】:

    您不需要列出存储桶来复制所有文件,因为事件变量是一个 json,其中包含您已复制到 test-bucket-01 中的文件。

    例子:

    {
      "Records": [
        {
          "eventVersion": "2.0",
          "eventSource": "aws:s3",
          "awsRegion": "us-east-1",
          "eventTime": "1970-01-01T00:00:00.000Z",
          "eventName": "ObjectCreated:Put",
          "userIdentity": {
            "principalId": "EXAMPLE"
          },
          "requestParameters": {
            "sourceIPAddress": "127.0.0.1"
          },
          "responseElements": {
            "x-amz-request-id": "C3D13FE58DE4C810",
            "x-amz-id-2": "FMyUVURIY8/IgAtTv8xRjskZQpcIZ9KG4V5Wp6S7S/JRWeUWerMUE5JgHvANOjpD"
          },
          "s3": {
            "s3SchemaVersion": "1.0",
            "configurationId": "testConfigRule",
            "bucket": {
              "name": "sourcebucket",
              "ownerIdentity": {
                "principalId": "EXAMPLE"
              },
              "arn": "arn:aws:s3:::mybucket"
            },
            "object": {
              "key": "key/to/HappyFace.jpg",
              "size": 1024,
              "eTag": "d41d8cd98f00b204e9800998ecf8427e"
            }
          }
        }
      ]
    }
    

    在这种情况下,此事件通知 ObjectCreated:Put 事件。一个新文件已复制到“sourcebucket”存储桶,其键为“key/to/HappyFace.jpg”。

    【讨论】:

      【解决方案2】:

      您为什么不想使用native functional of AWS S3 将新文件从一个存储桶复制到另一个存储桶?

      它更简单、更可靠。并且您可以通过前缀复制文件、更改存储计划以及使用此本机功能进行的许多其他操作。

      【讨论】:

      • 我遇到了类似的问题,我希望使用 lambda 而不是 s3 本机复制。这是因为 s3 复制无法复制到不同的路径。例如我无法从 source-bucket/prefix1/ 复制到 dest-bucket/prefix2/
      • 因为我需要即时复制
      【解决方案3】:

      那么答案是什么?如何仅在添加新文件时触发 lambda?

      【讨论】:

        猜你喜欢
        • 2018-11-16
        • 2017-04-14
        • 2020-09-15
        • 2018-11-22
        • 1970-01-01
        • 2023-02-01
        • 1970-01-01
        • 2020-01-03
        • 1970-01-01
        相关资源
        最近更新 更多