
AWSのCloudFrontとS3を利用して、Node.jsのAPIから署名付きURLを取得し、Reactで画像を表示するシステムを構築する際に、403エラーが発生することがあります。
本記事では、CloudFrontの署名付きURLに関する403エラーの原因と、その解決方法について詳しく解説します。
403エラーの概要
403エラーは、アクセス権限が不足している場合に発生します。
署名付きURLを利用しても、正しく設定されていなければアクセスできません。
エラーの内容(例)
ブラウザの開発者ツール(DevTools)で確認できるエラーメッセージの例です。
Status Code: 403 Forbidden x-cache: Error from cloudfront Key-Pair-Id=undefined
特に、Key-Pair-Id=undefined となっている場合は、署名付きURLの作成に問題がある可能性が高いです。
403エラーの主な原因と対策
Key-Pair-Idが設定されていない
CloudFrontの署名付きURLを利用するには、キーペアIDが必要です。
もし Key-Pair-Id=undefined となっている場合、適切なキーペアIDが指定されていない可能性があります。
署名付きURLを生成するコードで、正しいキーペアIDを指定してください。
const cloudfrontSigner = require('@aws-sdk/cloudfront-signer');
const fs = require('fs');
const url = "https://example.cloudfront.net/protected/image.jpg";
const privateKey = fs.readFileSync("/path/to/private-key.pem", "utf8");
const keyPairId = "AKIAEXAMPLEKEY";
const signedUrl = cloudfrontSigner.getSignedUrl({
url,
keyPairId,
privateKey,
expires: Math.floor(Date.now() / 1000) + 3600, // 1時間後に期限切れ
});
console.log(signedUrl);
キーペアIDは、AWSのIAMコンソールから取得できます。
署名付きURLの有効期限が切れている
署名付きURLには有効期限(Expires)が設定されています。期限を過ぎると403エラーが発生します。
expiresの値が適切か確認する。- 現在時刻よりも未来の時間になっているか確認する。
CloudFrontのオリジン設定が正しくない
CloudFrontのオリジン設定が適切でないと、署名付きURLが機能しません。
- CloudFrontのオリジンを確認する
- CloudFrontのオリジン設定で、S3バケットのエンドポイントが正しく設定されているか確認。
- オリジンアクセスアイデンティティ(OAI)を利用する
- OAIを利用することで、CloudFront経由のみでS3のコンテンツにアクセス可能になります。
S3のバケットポリシーが正しく設定されていない
S3のバケットがCloudFrontからのアクセスを許可していない場合も403エラーが発生します。
バケットポリシーを以下のように設定し、CloudFrontからのアクセスを許可します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "cloudfront.amazonaws.com"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::your-bucket-name/*",
"Condition": {
"StringEquals": {
"AWS:SourceArn": "arn:aws:cloudfront::123456789012:distribution/EXAMPLEDISTRIBUTION"
}
}
}
]
}
your-bucket-nameをS3のバケット名に置き換えます。123456789012をAWSアカウントIDに変更します。EXAMPLEDISTRIBUTIONをCloudFrontのディストリビューションIDに変更します。
この設定により、CloudFront経由のリクエストのみが許可されます。
まとめ
CloudFrontの署名付きURLで403エラーが発生する主な原因とその対策を解説しました。
| 原因 | 解決策 |
|---|---|
| Key-Pair-Idが未設定 | キーペアIDを正しく指定する |
| 有効期限切れ | Expiresの値を確認する |
| CloudFrontのオリジン設定ミス | CloudFrontのオリジンを適切に設定する |
| S3バケットポリシーの誤り | CloudFrontからのアクセスを許可する設定を行う |
これらの対策を実施すれば、AWSのCloudFrontとS3を活用した署名付きURLの仕組みを正しく機能させることができます。
エラーに直面した際は、本記事を参考にして原因を特定し、適切な対処を行ってください。
- Original:https://minory.org/aws-signed-url-403-error.html
- Source:minory
- Author:管理者
Amazonベストセラー
Now loading...