PHPのCURL関数を用いた任意のバケットの内容取得の方法について

0

はじめまして。
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);
mitani
gefragt vor 4 Jahren308 Aufrufe
2 Antworten
0

リクエストの署名は何を参考にされましたか?

Authenticating Requests (AWS Signature Version 4)
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/API/sig-v4-authenticating-requests.html

SDK のコードを参考にしてしまった方が良いかもしれません。
https://github.com/aws/aws-sdk-php/tree/67441823800d206d069e2e5fdf5097693c4a11e0/src/Signature

semnil
beantwortet vor 4 Jahren
0

早速のご回答ありがとうございます!

署名については下記サイトを参考にいたしました。
http://www.applelife100.com/2012/06/23/using-rest-api-of-amazon-s3-in-php-1/
こちらで試してみて、バケット一覧が取得できたので、それをそのまま流用しておりました。

>SDK のコードを参考にしてしまった方が良いかもしれません。
こちらで一度試してみたいとおもいます。

mitani
beantwortet vor 4 Jahren

Du bist nicht angemeldet. Anmelden um eine Antwort zu veröffentlichen.

Eine gute Antwort beantwortet die Frage klar, gibt konstruktives Feedback und fördert die berufliche Weiterentwicklung des Fragenstellers.

Richtlinien für die Beantwortung von Fragen