ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
このエラーが出る状況
AWS の API 呼び出しで以下のレスポンスが返ってくるケース:
MissingParameter
The request must contain the parameter Signature.
代表的なシチュエーション:
- Amazon Product Advertising API (PA-API) を自前 URL 署名で叩いている
- 古い AWS SigV2 (Query String 認証) API を叩いている
- SDK ではなく
file_get_contentsやcurlで手書きしている - 古いライブラリ(PA-API 4.0 系)を使っている
原因の本質
AWS は API リクエストが正しい呼び出し元から来たことを署名 (Signature) で検証します。SigV2(旧)と SigV4(現行)の 2 系統があり、どちらにせよ署名情報をリクエストに含める必要があります。このエラーは:
- SigV2: クエリ文字列に
Signature=...パラメータが付いていない - SigV4:
Authorizationヘッダ(またはX-Amz-Signatureクエリ)が欠落
のどちらかを意味します。
対処1: 公式 SDK を使う
最も確実なのが公式 SDK の利用です。自分で署名計算をしないで済みます。
PA-API 5.0 (Amazon アソシエイト)
composer require amzn/paapi5-php-sdkuse Amazon\ProductAdvertisingAPI\v1\com\amazon\paapi5\v1\api\DefaultApi;
use Amazon\ProductAdvertisingAPI\v1\com\amazon\paapi5\v1\SearchItemsRequest;
use Amazon\ProductAdvertisingAPI\v1\com\amazon\paapi5\v1\PartnerType;
use Amazon\ProductAdvertisingAPI\v1\Configuration;
$config = new Configuration();
$config->setAccessKey(getenv('PAAPI_ACCESS_KEY'));
$config->setSecretKey(getenv('PAAPI_SECRET_KEY'));
$config->setHost('webservices.amazon.co.jp');
$config->setRegion('us-west-2');
$api = new DefaultApi(new GuzzleHttp\Client(), $config);
$req = new SearchItemsRequest();
$req->setPartnerTag(getenv('PAAPI_PARTNER_TAG'));
$req->setPartnerType(PartnerType::ASSOCIATES);
$req->setKeywords('プログラミング');
$req->setSearchIndex('Books');
$res = $api->searchItems($req);
一般 AWS API (S3 / DynamoDB 等)
$s3 = new Aws\S3\S3Client([
'version' => 'latest',
'region' => 'ap-northeast-1',
'credentials' => [
'key' => getenv('AWS_ACCESS_KEY_ID'),
'secret' => getenv('AWS_SECRET_ACCESS_KEY'),
],
]);
$s3->putObject([
'Bucket' => 'my-bucket',
'Key' => 'hello.txt',
'Body' => 'Hello world',
]);
SigV4 署名の仕組み(自前で計算する場合)
SDK が使えない事情がある場合は SigV4 を自前で計算します。手順:
- CanonicalRequest を作る
- StringToSign を作る
- SigningKey を派生
- HMAC-SHA256 で署名
- Authorization ヘッダを組み立て
function sigv4(
string $method, string $host, string $path, array $query,
string $payload, string $region, string $service,
string $accessKey, string $secretKey
): array {
$amzDate = gmdate('Ymd\THis\Z');
$dateStamp = gmdate('Ymd');
// 1. CanonicalRequest
ksort($query);
$canonicalQuery = http_build_query($query, '', '&', PHP_QUERY_RFC3986);
$payloadHash = hash('sha256', $payload);
$headers = [
'host' => $host,
'x-amz-date' => $amzDate,
'x-amz-content-sha256' => $payloadHash,
];
ksort($headers);
$canonicalHeaders = '';
$signedHeaders = '';
foreach ($headers as $k => $v) {
$canonicalHeaders .= "$k:$v\n";
$signedHeaders .= ($signedHeaders ? ';' : '') . $k;
}
$canonicalRequest =
"$method\n$path\n$canonicalQuery\n$canonicalHeaders\n$signedHeaders\n$payloadHash";
// 2. StringToSign
$credentialScope = "$dateStamp/$region/$service/aws4_request";
$stringToSign = "AWS4-HMAC-SHA256\n$amzDate\n$credentialScope\n" .
hash('sha256', $canonicalRequest);
// 3. SigningKey
$kDate = hash_hmac('sha256', $dateStamp, 'AWS4' . $secretKey, true);
$kRegion = hash_hmac('sha256', $region, $kDate, true);
$kService = hash_hmac('sha256', $service, $kRegion, true);
$kSigning = hash_hmac('sha256', 'aws4_request', $kService, true);
// 4. Signature
$signature = hash_hmac('sha256', $stringToSign, $kSigning);
// 5. Authorization ヘッダ
$authHeader =
"AWS4-HMAC-SHA256 Credential=$accessKey/$credentialScope, " .
"SignedHeaders=$signedHeaders, Signature=$signature";
return array_merge($headers, ['Authorization' => $authHeader]);
}
よくあるミス
| ミス | 症状 | 対処 |
|---|---|---|
| クエリパラメータの URL エンコードが不正確 | SignatureDoesNotMatch | RFC3986 エンコード(+ ではなく %20) |
| システム時計がずれている | RequestTimeTooSkewed | NTP 同期、5 分以内に |
| 古い API 版を叩いている | MissingParameter Signature | SigV4 / PA-API 5.0 へ移行 |
| Content-Type と payload hash の不一致 | SignatureDoesNotMatch | payload を生のまま hash |
| パーソナルタグ未設定 (PA-API) | InvalidPartnerTag | アソシエイトコンソールでタグ取得 |
デバッグ手順
# 1. AWS CLI で同じリクエストを実行して成功するか確認
aws s3 ls --debug
# --debug 出力に「CanonicalRequest」「StringToSign」が出るので
# 自前実装と比較する
# 2. 時刻ずれを確認
date -u
# サーバー時刻と 5 分以上ずれていないか
# 3. SDK ロギング有効化(PHP)
$client = new Aws\S3\S3Client([
...,
'debug' => true,
]);
FAQ
Q: PA-API 4.0 のコードがある
A: 2020 年 3 月に廃止済。PA-API 5.0 (SigV4) への完全書き換えが必要。エンドポイントも webservices.amazon.co.jp のパス /paapi5/searchitems に変わっています。
Q: SigV2 で良いケースは?
A: ほぼ無い。SQS の一部や旧 SES など。新規開発は必ず SigV4。
Q: Signature の有効期限
A: AWS は通常 15 分以内のリクエストしか受け付けません。Presigned URL は最大 7 日 (S3) など API ごとに異なります。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページ
子ページはありません
同階層のページ
- Error 400 : Bad Request Parameter Operation is missing
- MissingParameter. The request must contain the parameter Signature.
- RequestThrottled. AWS Access Key ID: ... . You are submitting requests too quickly
- SignatureDoesNotMatch. The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.
- failed to open stream: HTTP request failed! HTTP/1.1 503 Service Unavailable
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Laravel キャッシュクリア完全ガイド(cache:clear / config:clear / 2026-05-18 07:42:07
- プロジェクトの作成と削除 2026-05-18 07:42:07
- インストール直後にNetbeansが反応しない 2026-05-18 07:42:07
- 動画やチャンネルの検索 2026-05-18 07:42:07
- APIキー取得方法 2026-05-18 07:42:07
- チャンネル情報の取得 2026-05-18 07:42:07
- API 入門 — Web API(REST / GraphQL / gRPC / 2026-05-18 07:42:07
- インストール(eclipseプラグイン) 2026-05-18 07:42:07
- Laravel「Dotenv values containing spaces must be surrounded 2026-05-18 07:42:07
- エラー一覧 2026-05-18 07:42:07
- curl: (51) SSL: certificate subject name '~' does not match 2026-05-18 07:42:07
- インストール方法(Windows版) 2026-05-18 07:42:07
- JSONから配列に変換 2026-05-18 07:42:07
- 処理を一定時間待つ 2026-05-18 07:42:07
- A non well formed numeric value encountered 2026-05-18 07:42:07
コメントを削除してもよろしいでしょうか?