cdk-s3-upload-presignedurl-api
Version:
API to get an S3 presigned url for file uploads
41 lines • 5.16 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const client_s3_1 = require("@aws-sdk/client-s3");
const s3_request_presigner_1 = require("@aws-sdk/s3-request-presigner");
const es_mime_types_1 = require("es-mime-types");
const client = new client_s3_1.S3Client({
region: process.env.AWS_REGION,
});
exports.handler = async (event) => {
// console.log(event);
const uploadURL = await getUploadURL(event);
return {
statusCode: 200,
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Headers': 'Authorization, *',
'Access-Control-Allow-Origin': process.env.ALLOWED_ORIGIN || '*',
'Access-Control-Allow-Methods': 'OPTIONS,GET',
},
body: JSON.stringify(uploadURL),
};
};
const getUploadURL = async function (event) {
const apiRequestId = event.requestContext.requestId;
const contentType = event.queryStringParameters.contentType;
const extension = es_mime_types_1.extension(contentType);
const s3Key = `${apiRequestId}.${extension}`;
// Get signed URL from S3
const putObjectParams = {
Bucket: process.env.UPLOAD_BUCKET,
Key: s3Key,
ContentType: contentType,
};
const command = new client_s3_1.PutObjectCommand(putObjectParams);
const signedUrl = await s3_request_presigner_1.getSignedUrl(client, command, { expiresIn: parseInt(process.env.URL_EXPIRATION_SECONDS || '300') });
return {
uploadURL: signedUrl,
key: s3Key,
};
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubGFtYmRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2luZGV4LmxhbWJkYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGtEQUFnRTtBQUNoRSx3RUFBNkQ7QUFDN0QsaURBQTBEO0FBRTFELE1BQU0sTUFBTSxHQUFHLElBQUksb0JBQVEsQ0FBQztJQUMxQixNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVO0NBQy9CLENBQUMsQ0FBQztBQUVILE9BQU8sQ0FBQyxPQUFPLEdBQUcsS0FBSyxFQUFFLEtBQVUsRUFBRSxFQUFFO0lBQ3JDLHNCQUFzQjtJQUV0QixNQUFNLFNBQVMsR0FBRyxNQUFNLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUU1QyxPQUFPO1FBQ0wsVUFBVSxFQUFFLEdBQUc7UUFDZixPQUFPLEVBQUU7WUFDUCxjQUFjLEVBQUUsa0JBQWtCO1lBQ2xDLDhCQUE4QixFQUFFLGtCQUFrQjtZQUNsRCw2QkFBNkIsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsSUFBSSxHQUFHO1lBQ2hFLDhCQUE4QixFQUFFLGFBQWE7U0FDOUM7UUFDRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUM7S0FDaEMsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGLE1BQU0sWUFBWSxHQUFHLEtBQUssV0FBVSxLQUFVO0lBRTVDLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDO0lBQ3BELE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLENBQUM7SUFDNUQsTUFBTSxTQUFTLEdBQUcseUJBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM1QyxNQUFNLEtBQUssR0FBRyxHQUFHLFlBQVksSUFBSSxTQUFTLEVBQUUsQ0FBQztJQUU3Qyx5QkFBeUI7SUFDekIsTUFBTSxlQUFlLEdBQUc7UUFDdEIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYTtRQUNqQyxHQUFHLEVBQUUsS0FBSztRQUNWLFdBQVcsRUFBRSxXQUFXO0tBQ3pCLENBQUM7SUFDRixNQUFNLE9BQU8sR0FBRyxJQUFJLDRCQUFnQixDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBRXRELE1BQU0sU0FBUyxHQUFHLE1BQU0sbUNBQVksQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUU1SCxPQUFPO1FBQ0wsU0FBUyxFQUFFLFNBQVM7UUFDcEIsR0FBRyxFQUFFLEtBQUs7S0FDWCxDQUFDO0FBQ0osQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUzNDbGllbnQsIFB1dE9iamVjdENvbW1hbmQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtczMnO1xuaW1wb3J0IHsgZ2V0U2lnbmVkVXJsIH0gZnJvbSAnQGF3cy1zZGsvczMtcmVxdWVzdC1wcmVzaWduZXInO1xuaW1wb3J0IHsgZXh0ZW5zaW9uIGFzIGdldEV4dGVuc2lvbiB9IGZyb20gJ2VzLW1pbWUtdHlwZXMnO1xuXG5jb25zdCBjbGllbnQgPSBuZXcgUzNDbGllbnQoe1xuICByZWdpb246IHByb2Nlc3MuZW52LkFXU19SRUdJT04sXG59KTtcblxuZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKGV2ZW50OiBhbnkpID0+IHtcbiAgLy8gY29uc29sZS5sb2coZXZlbnQpO1xuXG4gIGNvbnN0IHVwbG9hZFVSTCA9IGF3YWl0IGdldFVwbG9hZFVSTChldmVudCk7XG5cbiAgcmV0dXJuIHtcbiAgICBzdGF0dXNDb2RlOiAyMDAsXG4gICAgaGVhZGVyczoge1xuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzJzogJ0F1dGhvcml6YXRpb24sIConLFxuICAgICAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbic6IHByb2Nlc3MuZW52LkFMTE9XRURfT1JJR0lOIHx8ICcqJyxcbiAgICAgICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzJzogJ09QVElPTlMsR0VUJyxcbiAgICB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHVwbG9hZFVSTCksXG4gIH07XG59O1xuXG5jb25zdCBnZXRVcGxvYWRVUkwgPSBhc3luYyBmdW5jdGlvbihldmVudDogYW55KSB7XG5cbiAgY29uc3QgYXBpUmVxdWVzdElkID0gZXZlbnQucmVxdWVzdENvbnRleHQucmVxdWVzdElkO1xuICBjb25zdCBjb250ZW50VHlwZSA9IGV2ZW50LnF1ZXJ5U3RyaW5nUGFyYW1ldGVycy5jb250ZW50VHlwZTtcbiAgY29uc3QgZXh0ZW5zaW9uID0gZ2V0RXh0ZW5zaW9uKGNvbnRlbnRUeXBlKTtcbiAgY29uc3QgczNLZXkgPSBgJHthcGlSZXF1ZXN0SWR9LiR7ZXh0ZW5zaW9ufWA7XG5cbiAgLy8gR2V0IHNpZ25lZCBVUkwgZnJvbSBTM1xuICBjb25zdCBwdXRPYmplY3RQYXJhbXMgPSB7XG4gICAgQnVja2V0OiBwcm9jZXNzLmVudi5VUExPQURfQlVDS0VULFxuICAgIEtleTogczNLZXksXG4gICAgQ29udGVudFR5cGU6IGNvbnRlbnRUeXBlLFxuICB9O1xuICBjb25zdCBjb21tYW5kID0gbmV3IFB1dE9iamVjdENvbW1hbmQocHV0T2JqZWN0UGFyYW1zKTtcblxuICBjb25zdCBzaWduZWRVcmwgPSBhd2FpdCBnZXRTaWduZWRVcmwoY2xpZW50LCBjb21tYW5kLCB7IGV4cGlyZXNJbjogcGFyc2VJbnQocHJvY2Vzcy5lbnYuVVJMX0VYUElSQVRJT05fU0VDT05EUyB8fCAnMzAwJykgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICB1cGxvYWRVUkw6IHNpZ25lZFVybCxcbiAgICBrZXk6IHMzS2V5LFxuICB9O1xufTsiXX0=