我想计算并降低我在 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。
感谢帮助!