AWS Lambda (python): передать список путей к файлам и выполнить каждый файл как отдельную лямбду

1

У меня есть одна функция лямбды python, которая будет перечислять каждый файл в ведре S3 (код ниже). То, что я не понимаю, как это сделать, - передать each file object другой лямбда-функции в качестве ввода и иметь отдельные исполнения. Цель состоит в том, чтобы x количество файлов в списке, чтобы создать число x второго lambdas для выполнения одновременно (т.е. Если в списке 20 файлов, затем выполните вторую лямбда с 20 исполнением с каждым файлом, переданным лямбда-функции соответственно). Файл будет использоваться во второй лямбда-функции для соединения в Pandas.

Радуйся за любую помощь!

Список файлов (лямбда 1)

import boto3

#Start session with Profile
session = 
boto3.session.Session(profile_name='<security_token_service_profile>')

client = session.client('s3') #low-level functional API
resource = session.resource('s3') #high-level object-oriented API

#State S3 bucket
my_bucket = resource.Bucket('<bucket>') #subsitute this for your s3 bucket name. 

#List all files
files = list(my_bucket.objects.filter(Prefix='<path_to_file>'))

print(files)
  • 2
    Похоже, у вас уже есть список объектов, поэтому просто выполните итерацию по этому списку и вызовите lambda.invoke async (FunctionName, InvokeArgs) для каждого объекта, предоставив соответствующую информацию об объекте S3 для вызываемой функции Lambda через InvokeArgs. Обратите внимание, что в этом случае lambda = session.client ('lambda').
  • 0
    Спасибо, @jarmod! Ответ, который работал для меня ниже
Показать ещё 1 комментарий
Теги:
amazon-web-services
aws-lambda
concurrency

1 ответ

0
Лучший ответ

Спасибо @jarmod! Это сработало. Для тех, кому это может понадобиться в будущем, мой лямбда-скрипт выше был изменен следующим образом:

import boto3
import json

print('[INFO]  Loading Function')

def lambda_handler(event, context):

    print("[INFO]  Received event: " + json.dumps(event, indent=2))

    #Start session with region details for authentication
    session = boto3.session.Session(region_name='<region>')
    client = session.client('s3') #low-level functional API
    resource = session.resource('s3') #high-level object-oriented API

    #Identify S3 bucket
    my_bucket = resource.Bucket('<bucket>') #subsitute this for your s3 bucket name. 

    #List all files
    files = list(my_bucket.objects.filter(Prefix='<file_path>'))

    for file in files:
        payload = json.dumps({"key": file.key})
        print(payload)
        client_lambda = session.client('lambda')
        client_lambda.invoke(
            FunctionName='<lambda_function_name_to_call>',
            InvocationType='Event',
            LogType='None',
            Payload=payload
        )


if __name__ == '__main__':
    lambda_handler()'

Ещё вопросы

Сообщество Overcoder
Наверх
Меню