如何操作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,你可以用这个例子 -
谢谢。这是否意味着我的由用户界面控制的应用程序将能够写入该文件夹,但其他人将无法访问它? – user3080315
是的,通过修改您的Web服务器配置,您的运行代码可以访问它,但不会提供给最终用户。 – BryceH