如何操纵存储在S3中的文件而不将其保存到服务器中



我有以下python脚本,该脚本从S3兼容服务下载两个文件。然后将它们合并并将输出上传到另一个存储桶中。

import time
import boto3
import pandas as pd
timestamp = int(time.time())
conn = boto3.client('s3')
conn.download_file('segment', 'segment.csv', 'segment.csv')
conn.download_file('payment', 'payments.csv', 'payments.csv')
paymentsfile = 'payments.csv'
segmentsfile = 'segment.csv'
outputfile = 'payments_merged_' + str(timestamp) + '.csv'
csv_payments = pd.read_csv(paymentsfile, dtype={'ID': float})
csv_segments = pd.read_csv(segmentsfile, dtype={'ID': float})
csv_payments = csv_payments.merge(csv_segments, on='ID')
open(outputfile, 'a').close()
csv_payments.to_csv(outputfile)
conn.upload_file(outputfile, backup, outputfile)

但是,如果我执行脚本,则它将文件存储在脚本的文件夹中。出于安全原因,我想防止这种情况发生。执行脚本后,我可以删除文件,但假设我的脚本位于文件夹/app/script/中。这意味着在执行脚本时,在短时间内,有人可以打开URL example.com/app/script/payments.csv并下载文件。什么是一个很好的解决方案?

实际上,pandas.read_csv让您读取一个缓冲区或字节对象。您可以在内存中完成所有操作。要么将此脚本放在一个实例中,如果文件很小,则可以将其运行为AWS lambda进程。

import time
import boto3
import pandas as pd
paymentsfile = 'payments.csv'
segmentsfile = 'segment.csv'
outputfile = 'payments_merged_' + str(timestamp) + '.csv'
s3 = boto3.client('s3')
payment_obj = s3.get_object(Bucket='payment', Key=paymentsfile )
segment_obj = s3.get_object(Bucket='segment', Key=segmentsfile )
csv_payments = pd.read_csv(payment_obj['Body'], dtype={'ID': float})
csv_segments = pd.read_csv(segments_obj['Body'], dtype={'ID': float})
csv_merge = csv_payments.merge(csv_segments, on='ID')
csv_merge.to_csv(buffer)
buffer.seek(0)
s3.upload_fileobj(buffer, 'bucket_name', outputfile ) 

最简单的方法是修改Web服务器的配置,以不提供您写入或写入未服务目录的目录。例如,一种常见的做法是将/SCR用于此类事物。您需要修改用户的Web服务器运行的用户权限,以确保它可以访问/SCR。

限制Web服务器访问您编写的目录,您可以在Nginx中使用以下内容 -

https://serverfault.com/questions/137907/how-to-to-restrict-access-cess-to-directory-and-subdirs

对于Apache,您可以使用此示例 -

https://serverfault.com/questions/174708/apache2-how-do-i-i-restrict-access-access-to-a-a-directory-ballow-allow-allow-ablow-abaly-access-to-no--file-file-w/p>

最新更新