はじめまして。
aws初心者のため、基本的なことを聞いてしまってたら申し訳ございません。
現在、PHPのCURL関数を用いた任意のバケットの中のオブジェクトの内容を取得する方法を検討しております。
当方環境がSDKの導入ができないため、CURL関数を用いてRestAPIにリクエストを送ることを試しております。
IAMからアクセスキーとシークレットを発行して試したところ、
バケットの一覧は取得できたのですが、バケットの内容の取得を試みた場合、
The request signature we calculated does not match the signature you provided. Check your key and signing method.
とのエラーが出てしまい、内容取得ができませんでした。
バケット一覧が取得できたため、バケット単位の認証設定などが影響しているかと思い、パブリックアクセス可にして試してみたのですが、上記エラーはかわりありませんでした。
コードは以下の通りで試してみております。
不足点等あれば、ご指摘いただけますとありがたいです。
情報の取得のやり方など、ご教示いただけますと幸いにございます。
何卒よろしくお願いいたします。
$secretAccessKey = 'シークレットアクセスキー';
$accessKeyId = 'アクセスキーID';
// ----- Signature -----
// HTTP-Verb
$httpVerb = 'GET' . "\n";
// Content-MD5
$contentMd5 = "\n";
// Content-Type
$contentType = "\n";
// Date
$datetime = new DateTime('now', new DateTimeZone('UTC'));
$date = $datetime->format(DateTime::RFC1123) . "\n";
// CanonicalizedAmzHeaders
$canonicalizedAmzHeaders = '';
// CanonicalizedResource
$canonicalizedResource = '/バケット名';
// StringToSign
$stringToSign = $httpVerb . $contentMd5 . $contentType . $date . $canonicalizedAmzHeaders . $canonicalizedResource;
var_dump($stringToSign);
// Signature
$hash = hash_hmac('sha1', $stringToSign, $secretAccessKey, true);
$signature = base64_encode($hash);
var_dump($signature);
// ----- Authorization Header -----
// Authorization
$authorization = 'AWS' . ' ' . $accessKeyId . ':' . $signature;
// ----- HTTP Request -----
// Gets list of buckets.
$ch = curl_init('http://バケット名.s3.us-east-1.amazonaws.com');
$headers = array(
'Authorization: ' . $authorization,
'Date: ' . $date,
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$body = curl_exec($ch);
curl_close($ch);