веб-сервисы Amazon — необработанный запрос PHP AWS API для жизненного цикла корзины PUT

Я создаю веб-сайт, на котором есть функция, которая, если пользователь удалит изображение / видео, оно будет заархивировано, я использую 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);

1

Решение

Я думаю, вы не до конца понимаете, как работает политика жизненного цикла.

$path = '/x.php'; // file on which i want to put lifecycle to move it to GLACIER

Вы не перемещаете отдельные файлы. Вы настраиваете префикс.
это должно быть в вашем XML-документе.
У вас уже есть это

<Prefix>/</Prefix>

  1. PUT жизненного цикла всегда должен быть /?lifecycle, И вы положили это как /x.php
  2. Вероятно, было бы лучше использовать AWS Signature V4, а не V2, поскольку некоторые новые регионы не поддерживают Signature V2, но все регионы поддерживают Signature V4. Больше информации здесь: http://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html
  3. С подписью V4, даже если вы видите сообщение об ошибке SignatureDoesNotMatch Вы также должны увидеть другие сообщения, <StringToSignBytes></StringToSignBytes> а также <CanonicalRequest></CanonicalRequest>, Их должно быть более чем достаточно, чтобы вы могли изолировать и решить эту проблему.
  4. Вы упоминаете, что хотите переместить его в GLACIER, но не упоминаете об этом в своем XML-контенте. Обратитесь к разделу «Пример 1: добавление конфигурации жизненного цикла — корзина без поддержки версий» на этой странице для http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTlifecycle.html Вам нужно <StorageClass>GLACIER</StorageClass> в вашем XML.

Надеюсь это поможет.

1

Другие решения

Других решений пока нет …