S3上のファイルをMojoliciousでproxyして返す

6 日目 by @takkyuuplayer

S3 上においてあるファイルを、 アプリ側で認証した人にだけアクセス許可したい事がある。 今回はMojolicious で S3 上のファイルを proxy して返した話。

f:id:takkyuuplayer:20141206113923p:plain

早速コード

S3への直接のアクセスは禁止だが、

アプリ経由ならok

use common::sense;
use Carp ();
use FindBin qw($Bin);
use lib $Bin . '/../local-git/lib';
                                   
use Constants qw(AWS_S3);
use Mojolicious::Lite;
use Amazon::S3;

get '/s3' => sub {
    my $self = shift;
                                                                     
    my $s3 = Amazon::S3->new({
        aws_access_key_id => AWS_S3()->{access_key},
        aws_secret_access_key => AWS_S3()->{secret_key},
    });
    my $backet = $s3->bucket('tp-sandbox');
    my $response = $backet->get_key('logo.gif');
    $self->res->headers->content_type($response->{content_type});
    $self->res->headers->content_length($response->{content_length});
    $self->render(data => $response->{value});
};

これで転送できる。

ただ, 転送するだけのために 一度$response変数に格納するのは メモリの無駄遣いなので、直接転送する方法があれば知りたい

次回予告

明日の担当も @takkyuuplayer です。