in source/custom-resource/index.ts [304:364]
async function copyS3Assets(requestProperties: CopyS3AssetsRequestProperties): Promise<{ Message: string; Manifest: { Files: string[] } }> {
const { ManifestKey, SourceS3Bucket, SourceS3key, DestS3Bucket } = requestProperties;
console.info(`Source bucket: ${SourceS3Bucket}`);
console.info(`Source prefix: ${SourceS3key}`);
console.info(`Destination bucket: ${DestS3Bucket}`);
let manifest: { files: string[] };
// Download manifest
for (let retry = 1; retry <= RETRY_COUNT; retry++) {
try {
const getParams = {
Bucket: SourceS3Bucket,
Key: ManifestKey
};
const response = await s3Client.getObject(getParams).promise();
manifest = JSON.parse(response.Body.toString());
break;
} catch (error) {
if (retry === RETRY_COUNT || error.code !== ErrorCodes.ACCESS_DENIED) {
console.error('Error occurred while getting manifest file.');
console.error(error);
throw new CustomResourceError('GetManifestFailure', 'Copy of website assets failed.');
} else {
console.info('Waiting for retry...');
await sleep(getRetryTimeout(retry));
}
}
}
// Copy asset files
try {
await Promise.all(
manifest.files.map(async (fileName: string) => {
const copyObjectParams = {
Bucket: DestS3Bucket,
CopySource: `${SourceS3Bucket}/${SourceS3key}/${fileName}`,
Key: fileName,
ContentType: getContentType(fileName)
};
console.debug(`Copying ${fileName} to ${DestS3Bucket}`);
return s3Client.copyObject(copyObjectParams).promise();
})
);
return {
Message: 'Copy assets completed.',
Manifest: { Files: manifest.files }
};
} catch (error) {
console.error('Error occurred while copying assets.');
console.error(error);
throw new CustomResourceError('CopyAssetsFailure', 'Copy of website assets failed.');
}
}