如何降低AWS S3数据传输成本



我有一个AWS S3存储桶,用于存储laravel应用程序的公共和私有文件的组合,如下所示:

AWS Bucket和文件夹:

myapp
|____private
|____public

在我的刀片文件中,图像显示如下:

<img src="http://myapp.com/files/10"/>

这是我的路线:

Route::get('files/{id}', 'FileController@show');

这是我的控制器显示和上传文件的方法:

public function show(Request $request, $id)
{
$file = AppFile::findOrFail($id);
$user = auth()->check() ? auth()->user() : new User;
$this->authorizeForUser($user, 'show', $file);
return Image::make(Storage::disk('s3')->get($file->path))->response();
} 

public function store(FileRequest $request)
{
$file = $request->file('file');
$fileType = strtolower($request->input('file_type'));
$filePath = $fileType . '/' . Str::random(40) . '.' .  $file->getClientOriginalExtension();

$user = auth()->user();
DB::beginTransaction();
try
{
$this->authorizeForUser($user, 'store', AppFile::class);
$newFile = AppFile::create([
"name"          => $file->getClientOriginalName(),
"path"          => $filePath,
"size"          => $file->getSize(),
"mime_type"     => $file->getMimeType(),
"type"          => $fileType, 
"user_id"       => $user->id
]);
$image = Image::make($file->getRealPath())->resize(360, 180);

Storage::disk('s3')->put($filePath, $image->stream());

$content = "<textarea data-type="application/json">{"ok": true, "message": "Success", "path": "" . $newFile->path . "",  "id": "" . $newFile->id . "",  "name": "" . $newFile->name . "" }</textarea>";
DB::commit();
} catch (Exception $e)
{
DB::rollback();
$error =  'There was a problem uploading your file';
$content = "<textarea data-type="application/json">{"ok": false, "message": "" . $error . "" }</textarea>";
}
return response($content);
}

这是一种文件策略,通过身份验证的用户可以访问公共和私人文件,而访客用户可以仅访问公共文件:

public function show(User $user, File $file)
{
if ($file->type == 'public' || (!is_null($user->getKey()) && $file->type == 'private'))
return true;
}
}

我想添加缓存支持,因为即使是少数应用程序用户也会在AWS S3上产生数百个,有时甚至数千个GET请求。如果存储桶是私有的,即只能通过IAM用户访问,我如何缓存文件以降低S3成本?

我读过一些建议使用cloudfront的帖子,但这不只是增加了另一个成本吗?我如何用上面的控制器方法实现cloudfront,以及bucket在根级别是私有的?

使用laravels文件缓存是一个合适的选择吗?

我很想知道我可以在S3和laravel中使用什么技术,最好是一些步骤和代码来指导,这将真正有所帮助。

PS。我已经看过下面的帖子了。Laravel AWS S3存储图像缓存

最简单的选择是使用CloudFront,如果您的问题是成本,当请求转到CloudFront时,AWS S3不收取数据传输费用。

使用S3设置CloudFront非常重要,并且您可以将Bucket保持为私有,您只需要创建OAI。

检查以下链接:

https://aws.amazon.com/pt/premiumsupport/knowledge-center/cloudfront-https-requests-s3/

https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html

由于CloudFront是一项公共服务,您需要将当前身份验证更改为另一种格式(请在边缘查看此链接CloudFront授权(,或者您可以使用签名URL或签名Cookie提供私人内容(请查看此另一个链接PrivateContent(;您可以使用您现有的IAM用户生成这些已签名的URL/已签名的Cookie。

相关内容

  • 没有找到相关文章

最新更新