CloudFrontの署名付きURLで403エラーが発生する原因と対策

AWSCloudFrontS3を利用して、Node.jsAPIから署名付き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は、AWSIAMコンソールから取得できます。

署名付き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署名付きURL403エラーが発生する主な原因とその対策を解説しました。

原因解決策
Key-Pair-Idが未設定キーペアIDを正しく指定する
有効期限切れExpiresの値を確認する
CloudFrontのオリジン設定ミスCloudFrontのオリジンを適切に設定する
S3バケットポリシーの誤りCloudFrontからのアクセスを許可する設定を行う

これらの対策を実施すれば、AWSのCloudFrontとS3を活用した署名付きURLの仕組みを正しく機能させることができます。
エラーに直面した際は、本記事を参考にして原因を特定し、適切な対処を行ってください。


Amazonベストセラー

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA