S3バケットの前にクラウドフロントディストリビューションがあります。 CloudfrontのURLは制限されており、キーはURL署名されている必要があります。 s3バケットも制限されており、クラウドフロントのみが読み取ることができます
S3に画像を正常にアップロードした後、その後画像を取得しようとすると、cloudfrontが403を返すことがあります。これは約1分間続き、その後、cloudfrontが画像を適切に提供し始めます。
これは、画像が正常にアップロードされた後でも発生します。s3コンソールに移動して手動で表示できます。
何かが原因で、ファイルがバケットに存在する前にCloudFrontからファイルが要求されています。 CloudFrontのデフォルト構成では、最大5分間、これがネガティブキャッシュされます。
デフォルトでは、OriginがHTTP 4xxまたは5xxステータスコードを返すと、CloudFrontはこれらのエラー応答を5分間キャッシュし、次にオブジェクトの次のリクエストをOriginに送信して、エラーの原因となった問題が解決され、リクエストされたかどうかを確認しますオブジェクトが利用可能になりました。
— http://docs.aws.Amazon.com/AmazonCloudFront/latest/DeveloperGuide/custom-error-pages.html
S3へのアップロードが完了する前に、ブラウザーまたはその他のものが、その特定のCloudFront Edge(または、リクエストがリージョナルEdgeを通過する場合は任意のEdge-CloudFrontには2つのEdgeレイヤーがあります)からファイルをダウンロードしようとした場合、S3はエラーを返し、CloudFront(そのエッジの場所にある)はそのエラーをキャッシュし、次の5分間、わざわざ再試行しないように記憶します。
このタイマーは設定可能です。
CloudFrontがキャッシュする4xxおよび5xxステータスコードごとに、エラーキャッシング期間(エラーキャッシング最小TTL)を指定できます。手順については、「 エラー応答動作の構成 」を参照してください。
— http://docs.aws.Amazon.com/AmazonCloudFront/latest/DeveloperGuide/custom-error-pages.html
エラーキャッシュを無効にする403などのエラーコードの値を0に設定します。
この回答の内容は、 Stack Overflow に関する私の元の投稿を基にしています。