Re: nginx и Amazon S3

David Mzareulyan david at hiero.ru
Mon Nov 5 23:58:57 MSK 2007


Зависит от прочей архитектуры Вашего проекта. Во-первых, если контент не 
секретный, то, как уже было сказано, ему ключи и не нужны. Если же контент 
закрытый, то я, например, использую авторизацию по query-string. А именно: 
перехватываю обращение, при помощи PHP формирую адрес типа /s3-pass/bucket/file?AWSAccessKeyId=... 
(с нужными параметрами авторизации) и делаю X-Accel-Redirect на него. А /s3-pass 
обрабатывается как:

location /s3-pass/ {
    internal;
    proxy_set_header        Authorization "";
    proxy_pass      http://s3.amazonaws.com/;
    proxy_buffering off;
}

proxy_set_header        Authorization ""; -- потому что у меня самого на 
сайте используется хедер "Authorization".



> День добрый.
> 
> Хочется поставить nginx фронтендом к Amazon S3 , чтобы стримить им
> флешки.
> 
> Доступ к файлам на S3 можно получить через http get, но в
> http-запросе
> должен присутствовать header Authorization , который является
> "HMAC-SHA1 hash of your request using your AWS Secret Access Key.".
> Он уникальный для каждого запроса, его нужно сгенерировать, добавить и
> сделать proxy_pass и flv дальше.
> Пример создания запроса из Net::Amazon::S3 :
> 
> [...]
> my $canonical_string
> = $self->_canonical_string( $method, $path, $headers );
> my $encoded_canonical
> = $self->_encode( $aws_secret_access_key, $canonical_string );
> $headers->header(
> Authorization => "AWS $aws_access_key_id:$encoded_canonical"
> );
> [...]
> # finds the hmac-sha1 hash of the canonical string and the aws secret
> access key and then
> # base64 encodes the result (optionally urlencoding after that).
> sub _encode {
> my ( $self, $aws_secret_access_key, $str, $urlencode ) = @_;
> my $hmac = Digest::HMAC_SHA1->new($aws_secret_access_key);
> $hmac->add($str);
> my $b64 = encode_base64( $hmac->digest, '' );
> if ($urlencode) {
> return $self->_urlencode($b64);
> } else {
> return $b64;
> }
> }
> [...]
> 
> В какую сторону копать для решения этой задачи ?
> 
> Если http_perl_module, то как ему передать все headers ?
> 
> P.S.
> http://docs.amazonwebservices.com/AmazonS3/2006-03-01/gsg/reading-an-o
> bject.html
> 


-- 
С уважением
Давид Мзареулян
david at hiero.ru








More information about the nginx-ru mailing list