Требование - передача файлов между ведрами s3 через лямбда, динамическое получение ключей исходного файла s3. - PullRequest
0 голосов
/ 16 июня 2020
import boto3
import json
def lambda_handler(event, context):
    print(event)
    message = event['Records'][0]['s3']['object']['key']
    print(message)
    old_bucket_name = 'audio'
    old_prefix = '2020/06/10/17/'
    new_bucket_name = 'dev'
    new_prefix = 'source_metadata/'
    s3 = boto3.resource('s3')
    old_bucket = s3.Bucket(old_bucket_name)
    new_bucket = s3.Bucket(new_bucket_name)
for obj in old_bucket.objects.filter(Prefix=old_prefix):
    old_source = { 'Bucket': old_bucket_name,
               'Key': obj.key}
# replace the prefix
    new_key = new_prefix + obj.key[len(old_prefix):]
    new_obj = new_bucket.Object(new_key)
    new_obj.copy(old_source)

Я получаю путь и имя файла, которые я помещаю в s3 в переменную "message", как я могу определить как префикс моего целевого сегмента (dev)

1 Ответ

0 голосов
/ 16 июня 2020

Отдельная лямбда-функция будет запускаться для каждого создаваемого объекта.

Следовательно, лямбда-функция должна перемещать только объект, который запустил функцию.

Вот код, который будет переместить объект:

import boto3
import urllib

TARGET_BUCKET = 'dev'
TARGET_PATH = 'source_metadata/'

def lambda_handler(event, context):

    # Get incoming bucket and key
    source_bucket = event['Records'][0]['s3']['bucket']['name']
    source_key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'])

    # Extract filename without path
    filename = ('/' + source_key).rsplit('/', 1)[1]

    # Copy object to different bucket
    s3_resource = boto3.resource('s3')
    copy_source = {
        'Bucket': source_bucket,
        'Key': source_key
    }
    s3_resource.Bucket(TARGET_BUCKET).Object(TARGET_PATH + filename).copy(copy_source)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...