1

我想计算并降低我在 s3 上的文件存储成本。

我已将我的 django 应用程序部署到欧罗巴(法兰克福)eu-central-1 的弹性豆茎。目前我使用一个 t2.micro ec2 实例、一个 db.t2.micro PostgreSQL 数据库和一个附加的标准 s3 存储桶,旁边是来自弹性 beanstalk 的标准存储桶。

我认为 ec2 和数据库的成本很容易管理,因为在免费层之后我想使用保留实例。但是 s3 的成本让我担心。

用户可以将文件上传和下载到我的应用程序。我的 django 应用程序使用 django-storages 来管理文件,但我不知道后台发生了什么以及我必须支付的费用。

例如,我有一个存储类和一个带有文件字段的模型:

class PrivateMediaStorage(S3Boto3Storage):
    location = 'private'
    default_acl = 'private'
    custom_domain = False
    
class Document(models.Model):
    name = models.CharField(max_length=255)
    ...
    
class FileDocument(models.Model):
    document = models.ForeignKey('documents.Document', on_delete=models.CASCADE, related_name="files")
    file = models.FileField(storage=PrivateMediaStorage())
    ...

- - 上传

我存储用户上传的文件,如下所示:

document = Document.objects.get(...)

files = request.FILES.getlist('files[]')

if files:
    for file in files:
        try:
            file_obj = FileDocument.objects.get(name=file.name, document=document)
            file_obj.file.save(file.name, file)
            file_obj.save()
        except FileDocument.DoesNotExist:
            file_obj = FileDocument()
            file_obj.name = file.name
            file_obj.document = document
            file_obj.file.save(file.name, file)
            file_obj.save()
...

我认为这可能是一个 PUT 请求,因为我必须在我的区域内支付 0,0054 美元/1000 个请求。正确的?

- - 下载

如果用户想下载文件,我会返回一个 url:

...
file = get_object_or_404(FileDocument, pk=pk)
return Response({'url': file.file.url, })

这是哪个请求?GET 请求?一个 GET 请求的费用为 0,00043 美元/1000 个请求。但是如果用户打开返回的 url 也是一个 GET 请求吗?

- - 获取所有文件

在前端,用户获取属于特定文档的所有文件的列表。目前我返回一个文件的文件列表,如下所示:

document = get_object_or_404(Document, pk=pk)
serializer = FileDocumentSerializer(document.files.all(), many=True)
return Response(serializer.data)

我为此使用了 django rest 框架序列化程序:

class FileDocumentSerializer(serializers.ModelSerializer):
    class Meta:
        model = FileDocument
        exclude = ['document',]

这是什么样的要求?还有一个 GET 请求中的每个文件document.files.all()?在前端,只有名称很重要。如果我将文件的名称FileDocument另外存储在模型中并排除file序列化程序中的字段而不是发送 GET 请求?这能降低成本吗?

如果我不了解 django 存储何时以及发送什么样的请求,我认为计算成本非常棘手。

我知道我没有谈论数据库和文件存储空间的成本。我认为我可以忽略存储成本,因为此时我无法在不限制用户体验的情况下降低成本。此外,一开始我计划有 100 或 150 个用户,我认为每个用户上传的数据少于 1 GB。

感谢帮助!

4

1 回答 1

-1

您可以使用 aws https://calculator.aws/提供的成本计算器。创建一个估计并将资源用作 s3。

你可以输入你的文件传输大小,不。s3 上存在的请求和数据,您可以得到一个估计值以及导致该估计值的计算。

对 s3 获取任何数据的任何请求都是获取请求

于 2020-08-10T15:08:06.720 回答