in source/custom-resource/index.ts [510:579]
async function createCloudFrontLoggingBucket(requestProperties: CreateLoggingBucketRequestProperties) {
const logBucketSuffix = createHash('md5').update(`${requestProperties.BucketSuffix}${moment.utc().valueOf()}`).digest('hex');
const bucketName = `serverless-image-handler-logs-${logBucketSuffix.substring(0, 8)}`.toLowerCase();
// the S3 bucket will be created in 'us-east-1' if the current region is in opt-in regions,
// because CloudFront does not currently deliver access logs to opt-in region buckets
const isOptInRegion = await checkRegionOptInStatus(AWS_REGION);
const targetRegion = isOptInRegion ? 'us-east-1' : AWS_REGION;
console.info(`The opt-in status of the '${AWS_REGION}' region is '${isOptInRegion ? 'opted-in' : 'opt-in-not-required'}'`);
// create bucket
try {
const s3Client = new S3({ ...awsSdkOptions, apiVersion: '2006-03-01', region: targetRegion });
const createBucketRequestParams: CreateBucketRequest = { Bucket: bucketName, ACL: 'log-delivery-write' };
await s3Client.createBucket(createBucketRequestParams).promise();
console.info(`Successfully created bucket '${bucketName}' in '${targetRegion}' region`);
} catch (error) {
console.error(`Could not create bucket '${bucketName}'`);
console.error(error);
throw error;
}
// add encryption to bucket
console.info('Adding Encryption...');
try {
const putBucketEncryptionRequestParams: PutBucketEncryptionRequest = {
Bucket: bucketName,
ServerSideEncryptionConfiguration: { Rules: [{ ApplyServerSideEncryptionByDefault: { SSEAlgorithm: 'AES256' } }] }
};
await s3Client.putBucketEncryption(putBucketEncryptionRequestParams).promise();
console.info(`Successfully enabled encryption on bucket '${bucketName}'`);
} catch (error) {
console.error(`Failed to add encryption to bucket '${bucketName}'`);
console.error(error);
throw error;
}
// add policy to bucket
try {
console.info('Adding policy...');
const bucketPolicyStatement = {
Resource: `arn:aws:s3:::${bucketName}/*`,
Action: '*',
Effect: 'Deny',
Principal: '*',
Sid: 'HttpsOnly',
Condition: { Bool: { 'aws:SecureTransport': 'false' } }
};
const bucketPolicy = { Version: '2012-10-17', Statement: [bucketPolicyStatement] };
const putBucketPolicyRequestParams: PutBucketPolicyRequest = { Bucket: bucketName, Policy: JSON.stringify(bucketPolicy) };
await s3Client.putBucketPolicy(putBucketPolicyRequestParams).promise();
console.info(`Successfully added policy added to bucket '${bucketName}'`);
} catch (error) {
console.error(`Failed to add policy to bucket '${bucketName}'`);
console.error(error);
throw error;
}
return { BucketName: bucketName, Region: targetRegion };
}