Я создаю веб-сайт, на котором есть функция, которая, если пользователь удалит изображение / видео, оно будет заархивировано, я использую AWS S3 для хранения, а при удалении хочу переместить его на Glacier, я не хочу использовать AWS SDK, поэтому я создаю запрос Raw с использованием PHP cURL, по этой ссылке я попытался поместить жизненный цикл сегмента в объект, http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTlifecycle.html и сделал некоторый код, но он дает мне ошибку несоответствия подписи,
SignatureDoesNotMatch-The request signature we calculated does not match the signature you provided. Check your key and signing method.
Это мой код, в этом я хочу применить жизненный цикл на x.php
который находится в ведре, применить жизненный цикл для истечения срока его действия, что я делаю не так? Помоги мне,
$AWSaccessKey = 'xxxxxxxxxxxxxxxx';
$AWSsecretKey = 'xxxxxxxxxxxxxxxxxxxxxxxxxx';
$AWSregion = 'xxxxxxxxx';
// bucket
$bucket = 'xxxxxxxx';
$postdata = $filedata = '<LifecycleConfiguration>
<Rule>
<Filter>
<Prefix>/</Prefix>
</Filter>
<Status>Enabled</Status>
<Expiration>
<Days>0</Days>
</Expiration>
</Rule>
</LifecycleConfiguration>';
$filetype = 'text/plain';
$path = '/x.php'; // file on which i want to put lifecycle to move it to GLACIER
// file md5
$file_md5 = base64_encode(md5($filedata, true));
// file size
$filesize = strlen($filedata);
// date
$date = gmdate('D, d M Y H:i:s').' +0000';
// -> for putting lifecycle config
$params = array(
'x-amz-date' => gmdate('D, d M Y H:i:s \\G\\M\\T'),
);
//'x-amz-security-token'=> $auth['Token']
// sort and stringify params (different to other requests, this is formatted like headers)
$params_str = '';
uksort($params, 'strcmp');
foreach($params as $k=>$v){
$params_str .= $k.': '.$v."\\n";
}
// -> for putting lifecycle config
$to_sign = "PUT\\n$file_md5\\n$filetype\\n\\n".$params_str.'/'.$bucket.$path;
// create signature
// Note: S3 uses SHA1 instead of 256!
$signature = base64_encode(hash_hmac('SHA1', $to_sign, $AWSsecretKey, true));
$headers = "Host: $bucket.s3.amazonaws.com\\n"; // change to your region
$headers .= $params_str; // note that the params get added to the header
$headers .= 'Content-MD5: '.$file_md5."\\n";
$headers .= 'Authorization: AWS '.$AWSaccessKey.':'.$signature."\\n";
$headers .= 'Content-Length: '.$filesize."\\n";
$ch = curl_init("http://$bucket.s3-$AWSregion.amazonaws.com");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, explode('\n', $headers));
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_STDERR, fopen(dirname(__FILE__).'/errorlog.txt', 'w'));
$result = curl_exec($ch);
var_dump($result);
Я думаю, вы не до конца понимаете, как работает политика жизненного цикла.
$path = '/x.php'; // file on which i want to put lifecycle to move it to GLACIER
Вы не перемещаете отдельные файлы. Вы настраиваете префикс.
это должно быть в вашем XML-документе.
У вас уже есть это
<Prefix>/</Prefix>
/?lifecycle
, И вы положили это как /x.php
SignatureDoesNotMatch
Вы также должны увидеть другие сообщения, <StringToSignBytes></StringToSignBytes>
а также <CanonicalRequest></CanonicalRequest>
, Их должно быть более чем достаточно, чтобы вы могли изолировать и решить эту проблему.<StorageClass>GLACIER</StorageClass>
в вашем XML.Надеюсь это поможет.
Других решений пока нет …