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

问题描述:

我有以下python脚本从S3兼容服务下载两个文件。然后合并它们并将输出上传到另一个存储桶。如何操作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-restrict-access-to-directory-and-subdirs

对于Apache,你可以用这个例子 -

https://serverfault.com/questions/174708/apache2-how-do-i-restrict-access-to-a-directory-but-allow-access-to-one-file-w

+0

谢谢。这是否意味着我的由用户界面控制的应用程序将能够写入该文件夹,但其他人将无法访问它? – user3080315

+0

是的,通过修改您的Web服务器配置,您的运行代码可以访问它,但不会提供给最终用户。 – BryceH