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
質問済み 4年前299ビュー
2回答
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
回答済み 4年前
0

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

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

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

mitani
回答済み 4年前

ログインしていません。 ログイン 回答を投稿する。

優れた回答とは、質問に明確に答え、建設的なフィードバックを提供し、質問者の専門分野におけるスキルの向上を促すものです。

質問に答えるためのガイドライン