Amazon Simple Storage Service (Amazon S3) の署名済み URL を使用して Amazon S3 にリクエストを行ったところ、SignatureDoesNotMatch または 403 Forbidden というエラーメッセージが表示されます。
簡単な説明
署名済み URL を生成すると、クライアントは一意の署名を計算してリクエストを認証します。次に、Amazon S3 はクライアントが HTTP リクエストで送信したパラメータに基づいて署名を計算し、双方の署名を比較します。署名が一致しない場合、SignatureDoesNotMatch エラーが発生します。
解決策
この問題をトラブルシューティングするには、Amazon S3 署名済み URL のリクエストで次の設定を確認します。
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
HTTP メソッドを検証する
署名済み URL を生成する際に、その URL に HTTP アクションを割り当てます。クライアントが HTTP リクエストで送信するアクションは、URL 内の HTTP アクションと一致する必要があります。たとえば、GET アクションを URL に割り当てる場合、リクエスト内の HTTP アクションも GET である必要があります。
シークレットアクセスキーを確認する
署名済み URL の生成に使用したシークレットアクセスキーの状態が Incorrect、Not valid、Turned off のいずれかになっていないかどうかを確認します。シークレットアクセスキーに、一致していない文字や不適切なスペースを追加した場合、シークレットアクセスキーはこれらのうちいずれかの状態になります。正しいアクセスキーを使用して署名済み URL を再生成していることを確認してください。
URL のバケット名とキー名を検証する
バケット名とオブジェクト名が正しく、URL の署名生成に含まれるものと一致しているかどうかを確認します。名前の大文字と小文字も一致する必要があります。
HTTP リクエストで使用するヘッダーを検証する
署名の生成に使用する HTTP ヘッダーは、クライアントが HTTP リクエストで S3 に送信するヘッダーと一致する必要があります。
さらに、ヘッダーの値が署名の計算で生成した値と一致していることを確認してください。
AWS リージョンが正しいことを確認する
署名済み URL を S3 に送信する前に、URL を生成した AWS リージョンがバケットが現存のリージョンと一致することを確認します。
GetBucketLocation API リクエストを実行して S3 バケットのリージョンを確認します。AWS CLI コマンド get-bucket-location を実行しても確認できます。
$ aws s3api get-bucket-location --bucket example-bucket
出力例
{
"LocationConstraint": "us-west-2"
}
システム時間の有効期間を確認する
システム時刻がデジタル署名の有効期間よりも後の未来の日付に設定されている場合、署名は期限切れとして表示され、署名を行うことができません。システム時刻が署名の有効期間よりも前の過去の日付に設定されている場合、署名は無効になり、署名を行うことができません。
関連情報
エラーコードのリスト
Amazon S3 バケット用の署名済み URL が、指定した有効期限より前に期限切れになる理由を知りたいです
署名済み URL を使用してオブジェクトをダウンロード、アップロードする
S3 オブジェクトにアクセスしようとする際に発生する Request has expired というエラーのトラブルシューティング方法を教えてください