async function putConfigFile()

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
  };
}