@semir-deljićの回答を展開しています。
関数を呼び出すたびにgetSignedUrl
、新しい URL が生成されます。これにより、Cache Control
ヘッダーが存在する場合でも画像がキャッシュされなくなります。
したがって、タイムキーパー ライブラリを使用して時間を凍結します。これで、関数が呼び出されると、時間が経過していないと見なされ、同じ URL が返されます。
const moment = require('moment');
const tk = require("timekeeper");
function url4download(awsPath, awsKey) {
function getFrozenDate() {
return moment().startOf('week').toDate();
}
// Paramters for getSignedUrl function
const params = {
// Ref: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html
// Ref: https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html
Bucket: awsBucket,
Key: `${awsPath}/${awsKey}`,
// 604800 == 7 days
ResponseCacheControl: `public, max-age=604800, immutable`,
Expires: 604800, // 7 days is max
};
const url = tk.withFreeze(getFrozenDate(), () => {
return S3.getSignedUrl('getObject', params);
});
return url;
}
注:
を使用moment().toDate()
すると、タイムキーパーにはネイティブの日付オブジェクトが必要になるためです。
ライブラリを使用するための質問は難しいですがknox
、私の答えはawsの公式ライブラリを使用しています。
// This is how the AWS & S3 is initiliased.
const AWS = require('aws-sdk');
const S3 = new AWS.S3({
accessKeyId: awsAccessId,
secretAccessKey: awsSecretKey,
region: 'ap-south-1',
apiVersion: '2006-03-01',
signatureVersion: 'v4',
});
インスピレーション: https://advancedweb.hu/cacheable-s3-signed-urls/