😑
aws-sdk v3のpresignedUrlのサンプルコード
S3Clientにバケットのエンドポイントをつけていたら、返ってくるpresignedUrlが hoge-bucket.hoge-bucket.s3-ap-northeast-1.amazonaws.com/hoge のようにバケット名が連続して NET::ERR_CERT_COMMON_NAME_INVALID エラーが発生し、しばらくハマっていた。どうやら本番ではエンドポイントを指定してはいけないみたい。
import { PutObjectCommand, S3Client } from '@aws-sdk/client-s3';
import { getSignedUrl } from '@aws-sdk/s3-request-presigner';
const fileName = 'hoge';
const fileType = 'jpg';
const client = new S3Client({
region: process.env.S3_REGION,
endpoint: process.env.S3_ENDPOINT, // これは開発時のみlocalstackのurlを指定。本番ではundefinedにすべき。
forcePathStyle: process.env.S3_FORCE_PATH_STYLE, // これは開発時のみtrueにする。localstackがパススタイルにしか対応していないため。
});
const key = '${fileName}-${Date.now()}`; // 同名のファイル回避のため最後尾にhashをつける。
const params = {
Bucket: process.env.S3_BUCKET_NAME,
Key: key,
ContentType: fileType,
};
const command = new PutObjectCommand(params);
const url = await getSignedUrl(client, command, { expiresIn: 3600 });
console.log(url);
Discussion