CloudFront 署名付き URL で AccessDenied が発生するときの解決方法

2021.02.08

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

困っていた内容

CloudFront の署名付き URL へアクセスすると、正常にアクセスできることもあるのですが、エラーになることもあります。発生するエラーは以下の通りです。

<Error>
  <Code>AccessDenied</Code>
  <Message>Access denied</Message>
</Error>

どのようにすればこのエラーの発生を抑制できますか?

どう対応すればいいの?

エラーの発生を抑制するには、CloudFront 署名付き URL の作成時にソースコードやコマンドで指定するカスタムポリシーを確認してください。

カスタムポリシーは、以下の項目があります。

  • DateLessThan
  • DateGreaterThan(オプション)
  • IpAddress(オプション)

上述の Access Denied エラーは、以下の状況で発生します。

  • DateLessThan に指定した署名付き URL の有効期限が切れた
  • 署名付き URL へアクセスした日時が DateGreaterThan に指定した日時よりも前である
  • クライアントの IP アドレスが IpAddress に含まれない

一時的な問題切り分け方法としては、以下をお試しください。

  1. DateLessThan を大きな値にする
  2. DateGreaterThan の指定をポリシーステートメントから除外、関連する処理をコメントアウトする(指定があれば)
  3. IpAddress の指定をポリシーステートメントから除外、関連する処理をコメントアウトする(指定があれば)

問題の切り分けを行った後、該当する設定値を見直してください。

ワンポイント

CloudFront 署名付き URL のカスタムポリシーで制限できるクライアント IP アドレスは、1 つの IP アドレス、もしくは CIDR 指定しかできず、2 つ以上の指定はできません。

本来署名付き URL は URL を共有した相手にのみコンテンツの閲覧を許可する機能です。IpAddress を指定しない、つまり特定の IP アドレスからのアクセスを制限しなくても、有効期限内に URL が特定されなければ問題はありません。

誤って外部に署名付き URL を公開してしまうなどのミスを考慮すると、クライアントの IP アドレスを制限する運用が安全です。署名付き URL 共有相手の IP アドレスが 1 つの CIDR で表記できない場合は IpAddress を未指定にし、DateLessThan を短めに設定する運用が安全です。

この辺りの設定はプロジェクトの運用方針に合わせて決めてください。

参考資料