【问题标题】:How to manipulate files stored in S3 without saving them to the server?如何操作存储在 S3 中的文件而不将它们保存到服务器?
【发布时间】:2018-02-06 19:33:37
【问题描述】:

我有以下 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 并下载文件。有什么好的解决方案?

【问题讨论】:

    标签: python web-services amazon-s3 web-applications boto3


    【解决方案1】:

    实际上,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 ) 
    

    【讨论】:

      【解决方案2】:

      最简单的方法是修改您的网络服务器的配置,使其不提供您正在写入的目录或写入未提供的目录。例如,一种常见的做法是使用 /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

      【讨论】:

      • 谢谢。这是否意味着由用户界面控制的我的应用程序将能够写入该文件夹,但其他人将无法访问它?
      • 是的,通过修改您的网络服务器配置,您的运行代码可以访问它,但它不会提供给最终用户。
      猜你喜欢
      • 1970-01-01
      • 2010-11-21
      • 1970-01-01
      • 1970-01-01
      • 2015-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-26
      相关资源
      最近更新 更多