in source/custom-resource/index.ts [254:297]
async function putConfigFile(requestProperties: PutConfigRequestProperties): Promise<{ Message: string; Content: string }> {
const { ConfigItem, DestS3Bucket, DestS3key } = requestProperties;
console.info(`Attempting to save content blob destination location: ${DestS3Bucket}/${DestS3key}`);
console.info(JSON.stringify(ConfigItem, null, 2));
const configFieldValues = Object.entries(ConfigItem)
.map(([key, value]) => `${key}: '${value}'`)
.join(',\n');
const content = `'use strict';\n\nconst appVariables = {\n${configFieldValues}\n};`;
// In case getting object fails due to asynchronous IAM permission creation, it retries.
const params = {
Bucket: DestS3Bucket,
Body: content,
Key: DestS3key,
ContentType: getContentType(DestS3key)
};
for (let retry = 1; retry <= RETRY_COUNT; retry++) {
try {
console.info(`Putting ${DestS3key}... Try count: ${retry}`);
await s3Client.putObject(params).promise();
console.info(`Putting ${DestS3key} completed.`);
break;
} catch (error) {
if (retry === RETRY_COUNT || error.code !== ErrorCodes.ACCESS_DENIED) {
console.info(`Error occurred while putting ${DestS3key} into ${DestS3Bucket} bucket.`, error);
throw new CustomResourceError('ConfigFileCreationFailure', `Saving config file to ${DestS3Bucket}/${DestS3key} failed.`);
} else {
console.info('Waiting for retry...');
await sleep(getRetryTimeout(retry));
}
}
}
return {
Message: 'Config file uploaded.',
Content: content
};
}