【发布时间】:2020-02-23 08:37:36
【问题描述】:
我一直在研究如何将压缩的 S3 数据移动到 Elasticsearch。在 Aws 网站上有信息,您可以在其中创建解压缩文件并重新上传然后将其移动到 ES 的 lambda。现在,由于我没有太大的数据集,我正在将数据下载到本地计算机并以正确的格式将其发送到 ElasticSearch。这两种方法似乎效率低下,我想知道是否有办法解压缩文件,然后将其移动到 Elasticsearch,无需下载或重新上传数据。
现在这是我的代码:
s3 = boto3.resource('s3')
s3.Bucket(bucket).download_file(key, 'download_path')
ip_pattern = re.compile('(\d+\.\d+\.\d+\.\d+)')
time_pattern = re.compile('\[(\d+\/\w\w\w\/\d\d\d\d:\d\d:\d\d:\d\d\s\+\d\d\d\d)\]')
message_pattern = re.compile('\"(.+)\"')
with gzip.open('download_path') as files:
data = ""
document = {}
for line in files:
line = line.decode("utf-8") # decode byte to str
ip = ip_pattern.search(line).group(0)
timestamp = time_pattern.search(line).group(0)
message = message_pattern.search(line).group(0)
document = { "ip": ip, "timestamp": timestamp, "message": message }
如果没有更好的方法我会使用上面的代码。
【问题讨论】:
-
elasticsearch 实例托管在哪里 - 也在 AWS 上?我假设 lambda 无需下载和重新上传就可以工作,不是吗,因为它将在同一个 AWS 区域内运行?为什么你认为这是低效的?或者,如果您不想使用 lambda,您可以创建一个临时 EC2 实例并在那里运行您的脚本。
-
是的,ES 托管在 AWS 上。 lambda 在有事件时工作,所以我找不到使用 lambda 移动以前存储的文件的方法,只有新来的数据。 1.我认为重新上传然后移动到es效率低 2.下载所有我要删除的文件似乎效率低下。
-
您可以从 AWS 控制台触发 lambda 以立即运行。我认为你必须给他们假数据,但你可以发布一个“hello world”JSON 样本。好的,但我是说如果您使用 lambda 或从 EC2 实例运行脚本,那么您将不会从 AWS 区域下载数据或重新上传数据。
标签: amazon-web-services amazon-s3 amazon-elasticsearch