У меня есть лямбда-функция, написанная на Python, в которой есть код для запуска команд копирования Redshift для 3 таблиц из 3 файлов, расположенных в AWS S3.
Пример:
У меня есть таблица A, B и C.
The python code contains:
'copy to redshift A from "s3://bucket/abc/A.csv"'
'copy to redshift B from "s3://bucket/abc/B.csv"'
'copy to redshift C from "s3://bucket/abc/C.csv"'
Этот код запускается всякий раз, когда новый файл из трех поступает в "s3: // bucket / abc /" в S3.Таким образом, он загружает все три таблицы, даже если поступил только один CSV-файл.
Наилучшее решение: разбейте код на три разные функции Lambda и напрямую сопоставьте их с каждым обновлением / загрузкой исходных файлов.
Но мое требование состоит в том, чтобы продолжить работу с одним лямбда-кодом, который будет выборочно запускать его часть (используя if) только для тех CSV-файлов, которые были обновлены.
Пример:
if (new csv file for A has arrived):
'copy to redshift A from "s3://bucket/abc/A.csv"'
if (new csv file for B has arrived):
'copy to redshift B from "s3://bucket/abc/B.csv"'
if (new csv file for C has arrived):
'copy to redshift C from "s3://bucket/abc/C.csv"'
В настоящее время для достижения этого я храню метаданные этих файлов (LastModified) в файле python, ключом которого являются имена файлов.Печать dict будет выглядеть примерно так:
{'bucket/abc/A.csv': '2019-04-17 11:14:11+00:00', 'bucket/abc/B.csv': '2019-04-18 12:55:47+00:00', 'bucket/abc/C.csv': '2019-04-17 11:09:55+00:00'}
И затем, когда новый файл появляется среди любого из трех, Lambda запускается, и я читаю dict и сравниваю время каждого файла.с соответствующими значениями в dict, если новый LastModified увеличен, я запускаю команду копирования этой таблицы.
Все это, потому что нет никакой работы, которую я мог бы найти с событием S3 / CloudWatch для этого видаварианта использования.
Пожалуйста, задавайте дополнительные вопросы, если проблема не может быть четко сформулирована.