Criar solicitações assinadas AWS S3 com PHP

Esta é uma maneira simples de gerar uma solicitação assinada para objetos no Amazon S3:

//request variables:
$awsKeyId
= AWS_KEY_ID;
$awsSecret
= AWS_SECRET;
$expires
= time() + (5*60);
$httpVerb
= "GET";
$contentMD5
= "";
$contentType
= "";
$amzHeaders
= "";
$amzResource
= "/BUCKETNAME/" . $filename;

//request to be signed:
$request
= sprintf("%sn%sn%sn%sn%s%s" , $httpVerb , $contentMD5 , $contentType , $expires , $amzHeaders , $amzResource );

//signing:
$base64signed
= base64_encode( hash_hmac( 'sha1' , $request, $awsSecret , true ) );

//the final url:
$url
= "http://s3.amazonaws.com%s?AWSAccessKeyId=%s&Expires=%s&Signature=%s";
$url
= sprintf( $url , $amzResource , $awsKeyId , $expires , $base64signed );

O link final ficará disponível por apenas 5 minutos, olhe em $expires.

O $httpVerbpode ser alternado para HEAD se você quiser apenas verificar se a chave existe.

Este código é baseado em um exemplo de python que encontrei outro dia.