AWSのS3から署名付きURLを使って画像を取得する際に、以下のエラーが発生することがあります。
<Error> <Code>InvalidKey</Code> <Message>Unknown Key</Message> </Error>
本記事では、どのような原因が考えられるのか、どのように解決すればよいのかについて、具体的に解説します。
署名付きURLとは?
AWSのS3では、特定のファイルに対して一時的にアクセスできる「署名付きURL」を発行できます。
これにより、公開設定をしていないオブジェクトにも特定の利用者が一定時間アクセス可能になります。
以前、署名付きURLを生成する方法を紹介しましので参考にしてみてください。

署名付きURLを使用する際には、いくつかの注意点があります。
「InvalidKey」エラーの原因と解決方法
ファイルの存在確認
最も基本的な原因として、指定したオブジェクト(ファイル)がS3上に存在しない可能性があります。
次のコマンドを実行し、ファイルがS3上に正しく配置されているか確認してください。
aws s3 ls s3://バケット名/フォルダ名/ファイル名
ファイルが存在しない場合は、パスの指定ミスやファイルの削除が考えられます。
適切なパスを確認し、正しく指定してください。
署名付きURLの有効期限切れ
署名付きURLには有効期限があります。
有効期限を過ぎたURLを使用するとアクセスできなくなります。
署名付きURLを作成する際に、有効期限を十分長く設定しているか確認してください。
const { S3 } = require('aws-sdk'); const s3 = new S3(); const params = { Bucket: 'バケット名', Key: 'フォルダ名/ファイル名', Expires: 3600 // 1時間(秒単位) }; const signedUrl = s3.getSignedUrl('getObject', params); console.log(signedUrl);
また、有効期限が短すぎると、URLの発行後すぐに使用できなくなる可能性があるため、適切な値に調整してください。
CloudFrontのキャッシュ設定
CloudFrontを経由して署名付きURLを利用している場合、キャッシュが影響を及ぼしている可能性があります。
特に、S3のオブジェクトを更新した後にCloudFrontのキャッシュが残っていると、古い情報が返されることがあります。
キャッシュをクリアするには、次のコマンドを実行してください。
aws cloudfront create-invalidation --distribution-id ディストリビューションID --paths "/*"
また、CloudFrontの設定でキャッシュの有効期限を短くすることも検討してください。
CORSの設定
S3のバケットが適切にCORS(クロスオリジンリソース共有)を設定していないと、ブラウザ経由でリクエストした際にエラーが発生することがあります。
S3のCORS設定を確認し、適切に設定してください。
以下は、適切なCORS設定の例です。
[ { "AllowedHeaders": ["*"], "AllowedMethods": ["GET", "HEAD"], "AllowedOrigins": ["*"], "ExposeHeaders": [], "MaxAgeSeconds": 3000 } ]
バケットのCORS設定を変更した場合は、変更が反映されるまで数分かかることがあります。
まとめ
S3の署名付きURLを利用する際にエラーが発生する原因として、以下が考えられます。
- ファイルの存在確認
- 有効期限切れ
- CloudFrontのキャッシュ
- CORSの設定
これらを順番に確認し、適切な設定を行うことで、問題を解決できます。
S3の署名付きURLを活用して、安全にデータを提供するために、適切な設定を行いましょう。
- Original:https://minory.org/aws-s3-signed-url-invalid-key.html
- Source:minory
- Author:管理者
Amazonベストセラー
Now loading...