AWSのCloudFrontとS3を利用して、Node.jsのAPIから署名付きURLを取得し、Reactで画像を表示するシステムを構築する際に、403エラーが発生することがあります。
本記事では、CloudFrontの署名付きURLに関する403エラーの原因と、その解決方法について詳しく解説します。
403エラーの概要
403エラーは、アクセス権限が不足している場合に発生します。
署名付きURLを利用しても、正しく設定されていなければアクセスできません。
エラーの内容(例)
ブラウザの開発者ツール(DevTools)で確認できるエラーメッセージの例です。
1 2 3 |
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を指定してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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からのアクセスを許可します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
{ "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の仕組みを正しく機能させることができます。
エラーに直面した際は、本記事を参考にして原因を特定し、適切な対処を行ってください。
コメント