CloudFront で署名付き URL または署名付き cookie に関連する問題をトラブルシューティングするにはどうすればよいですか?

最終更新日: 2022 年 6 月 2 日

Amazon CloudFront と署名付き URL または署名付き cookie を使用してプライベートコンテンツを保護しています。「403 Access Denied」(403 アクセス拒否) エラーが表示されます。このエラーをトラブルシューティングするにはどうすればよいですか?

簡単な説明

署名付き URL または署名付き cookie に問題がある場合、Amazon CloudFront は「403 Access Denied」(403 アクセス拒否) エラーを返すことがあります。このエラーの原因とトラブルシューティングのステップについては、次の解決方法セクションを参照してください。

解決方法

動作で [Restrict Viewer Access] (閲覧者のアクセスを制限) をオンにする場合は、署名者を決定する必要があります。署名者は、CloudFront で作成する信頼されたキーグループ、または CloudFront キーペアを含む AWS アカウントのいずれかです。次の 403 エラーメッセージは、署名者情報がないか、正しくないことを示しています。

「Missing Key-Pair-Id query parameter or cookie value.」(Key-Pair-Id クエリパラメータまたは cookie 値がありません。) というメッセージを含む「403 Access Denied」(403 アクセス拒否) エラー

このメッセージは、署名付き URL にクエリ文字列パラメータ Key-Pair-ID がないか、空であることを示しています。

「Missing Key-Pair-Id query parameter or cookie value.」(Key-Pair-Id クエリパラメータまたは cookie 値がありません。) というメッセージを含む「403 Access Denied」(403 アクセス拒否) エラー

このメッセージは、署名付き cookie にクエリ文字列パラメータ CloudFront-Key-Pair-ID がないか、空であることを示しています。

「Unknown Key.」(不明なキー。) というメッセージを含む「403 Access Denied」(403 アクセス拒否) エラー

このメッセージは、CloudFront が Key-Pair-ID (署名付き URL の場合) または CloudFront-Key-Pair-ID (署名付き cookie の場合) を使用して署名者情報を検証できないことを示しています。この問題を解決するには、署名付き URL の場合は Key-Pair-ID、署名付き cookie の場合は CloudFront-Key-Pair-ID の正しい値が使用されていることを確認します。まず、次を実行します。

署名付き URL を使用している場合は、Key-Pair-ID の値を見つけて書き留めます。
- または -
署名付き cookie を使用している場合は、CloudFront-Key-Pair-ID の値を見つけて書き留めます。

その後、[Key ID] (キー ID) を見つけて、それが Key-Pair-ID または CloudFront-Key-Pair-ID と一致することを確認します。

  1. CloudFront コンソールを開きます。左側のナビゲーションメニューで、[Distributions] (ディストリビューション) を選択します。
  2. ディストリビューションを選択します。その後、[Behaviors] (動作) タブを選択します。
  3. 動作名を選択し、[Edit] (編集) を選択します。
  4. [Restrict viewer access] (閲覧者のアクセスを制限) 設定を見つけます。
    : [Yes] (はい) に設定されている場合、このキャッシュ動作のパスパターンに一致するファイルのリクエストでは、署名付き URL または署名付き cookie を使用する必要があります。
  5. [Restrict view access] (表示アクセスを制限) フィールドが [Yes] (はい) に設定されていることを確認したら、[Trusted authorization type] (信頼できる認証タイプ) フィールドを確認します。
  6. [Trusted authorization type] (信頼できる認証の種類) 設定の値が [Trusted key groups] (信頼されたキーグループ) の場合は、信頼キーグループの名前を書き留めます。
    その後、信頼キーグループのパブリックキー ID を見つけます。CloudFront コンソールに戻ります。[Key Groups] (キーグループ) を選択します。キーグループのリストで、書き留めた、信頼されたキーグループの名前を選択します。
    ステップ 1 で書き留めた Key-Pair-Id または CloudFront-Key-Pair-Id の値が、信頼されたキーグループのパブリックキー ID のいずれかと一致することを確認します。
  7. [Trusted authorization] (信頼された認証タイプ) の値が [Trusted Signer] (信頼された署名者) の場合、AWS によって生成された CloudFront 認証情報が使用されます。この場合、ステップ 1 で書き留めた Key-Pair-Id または CloudFront-Key-Pair-Id の値は、CloudFront 認証情報の [Access Key ID] (アクセスキー ID) と一致する必要があります。
    CloudFront 認証情報の [Access Key ID] (アクセスキー ID) を見つけるには、「署名者のキーペアの作成」を参照してください。

署名付き URL または署名付き cookie を作成する場合、JSON 形式のポリシーステートメントは、署名付き URL の制限を指定します。このステートメントは、URL の有効期間を決定します。次の場合、CloudFront は「403 Access Denied」(403 アクセス拒否) エラーを返します。

  • 署名付き URL が、既定ポリシーを使用して、署名付き URL の Expires の値よりも大きい時間に送信された。
  • 署名付き cookie が、既定ポリシーを使用して、署名付き cookie の CloudFront-Expires の値よりも大きい時間に送信された。
  • 署名付き URL または署名付き cookie が、カスタムポリシーの DateLessThan の値より大きいか、DateGreaterThan の値より小さい時間に送信された。

: ExpiresCloudFront-ExpiresDateLessThanDateGreaterThan の値は、Unix 時間形式 (秒) および協定世界時 (UTC) です。例えば、2013 年 1 月 1 日午前 10 時 UTC は Unix 時間形式で 1357034400 に変換されます。エポック時間を使用する場合は、2147483647 (2038 年 1 月 19 日 3 時 14 分 7 秒 UTC) までの日付に 32 ビット整数を使用します。

署名付き URL の Policy パラメータまたは署名付き cookie の CloudFront-Policy 属性は、カスタムポリシーが使用されていることを示します。ポリシーステートメントは JSON 形式で、base64 でエンコードされています。DateLessThan または DateGreaterThan の値を確認するには、64base デコードコマンドを使用します。

base64 エンコードのカスタムポリシーの例は次のようになります。

eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__

次の Linux コマンドを使用して、base64 エンコード形式のカスタムポリシーを JSON 形式にデコードします。この例では、前の例の値を使用しています。独自のカスタムポリシーに置き換えます。

$ echo -n eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__ | base64 -di

コマンドの出力は次のようになります。

{ "Statement": [{ "Resource": "http://d111111abcdef8.cloudfront.net/game_download.zip", "Condition": { "IpAddress": { "AWS:SourceIp": "192.0.2.0/24" }, "DateLessThan": { "AWS:EpochTime": 1426500000 } } }] }

既定ポリシーまたはカスタムポリシーに複数のステートメントが含まれている場合、CloudFront は「403 Access denied」(403 アクセス拒否) エラーを返します。

トラブルシューティングするには、前のセクションの Linux コマンドを使用して、カスタムポリシーのステートメントを確認します。コードの詳細を確認し、既定ポリシーまたはカスタムポリシーに 1 つのステートメントのみが含まれていることを確認します。

次の場合、CloudFront は「403 Access denied」(403 アクセス拒否) エラーを返します。

  • ポリシーステートメントのキー Resource (リソース) のベース URL に、省略された URL (www.example.com) がある。完全な URL (http://www.example.com) を使用します。
  • ベース URL に UTF-8 文字エンコーディングがない。
  • ベース URL にすべての句読点とパラメータ名が含まれていない。
  • ベース URL の HTTP または HTTPS プロトコルが、署名付き URL または署名付き cookie を送信するリクエストで使用されているプロトコルと一致しない。
  • ベース URL のドメイン名が、署名付き URL または署名付き cookie を送信するユーザーエージェントが使用するホストヘッダーの値と一致しない。
  • ベース URL クエリ文字列に無効な文字が含まれている。

次の場合、CloudFront は「403 Access Denied」(403 アクセス拒否) エラーを返します。

  • ポリシーステートメントに空白 (タブと改行文字を含む) が含まれている。
  • 既定ポリシーまたはカスタムポリシーが、ハッシュされる前は文字列としてフォーマットされていない。これは、AWS SDK を使用せずに署名付き URL または署名付き cookie を作成した場合に発生する可能性があります。
  • ポリシーが署名を生成する前にハッシュされていない。これは、AWS SDK を使用せずに署名付き URL または署名付き cookie を作成する場合に発生する可能性があります。

署名付き URL または署名付き cookie を使用する際の署名のベストプラクティスについては、「署名付き URL の署名を作成するためのコード例」を参照してください。

次の場合、CloudFront は「403 Access denied」(403 アクセス拒否) エラーを返します。

  • 署名付き URL または署名付き cookie が IPv6 IP アドレスから送信された。
  • 署名付き URL または署名付き cookie が、カスタムポリシーで指定された IPv4 アドレスまたは IPv4 IP 範囲から送信されなかった。

キー IpAddress は、署名付き URL または署名付き cookie のカスタムポリシーでのみ使用できます。IPv6 形式の IP アドレスはサポートされていません。IpAddress を含むカスタムポリシーを使用している場合は、ディストリビューション用に IPv6 を有効にしないでください。

CloudFront から cookie が返されたが、同じドメインに対する次のリクエストに含まれていなかった場合、CloudFront は「403 Access Denied」(403 アクセス拒否) エラーを返します。この場合、Set-Cookie レスポンスヘッダーの cookie 属性である DomainPath を確認します。

Domain 値は、リクエストされたファイルのドメイン名です。Domain 属性を指定しない場合、デフォルト値は URL のドメイン名です。これは、指定されたドメイン名にのみ適用され、サブドメインには適用されません。Domain 属性を指定すると、サブドメインにも適用されます。

Domain 属性を指定する場合、URL のドメイン名と Domain 属性の値が一致する必要があります。CloudFront がディストリビューションに割り当てるドメイン名 (例: d111111abcdef8.cloudfront.net) を指定できますが、ドメイン名に *.cloudfront.net を指定することはできません。URL で代替ドメイン名 (example.com など) を使用するには、ディストリビューションに代替ドメイン名を追加します。

Path 値は、リクエストされたファイルのパスです。Path 属性を指定しない場合、デフォルト値は URL 内のパスです。


この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?