86 lines
14 KiB
JavaScript
86 lines
14 KiB
JavaScript
import { Construct } from 'constructs';
|
|||
|
|
import { Bucket, HttpMethods, } from 'aws-cdk-lib/aws-s3';
|
||
|
|
import { RemovalPolicy, Stack } from 'aws-cdk-lib';
|
||
|
|
import { CDKContextKey } from '@aws-amplify/platform-core';
|
||
|
|
import { AttributionMetadataStorage } from '@aws-amplify/backend-output-storage';
|
||
|
|
import { fileURLToPath } from 'node:url';
|
||
|
|
import { S3EventSourceV2 } from 'aws-cdk-lib/aws-lambda-event-sources';
|
||
|
|
// Be very careful editing this value. It is the string that is used to attribute stacks to Amplify Storage in BI metrics
|
||
|
|
const storageStackType = 'storage-S3';
|
||
|
|
/**
|
||
|
|
* Amplify Storage CDK Construct
|
||
|
|
*
|
||
|
|
* Currently just a thin wrapper around an S3 bucket
|
||
|
|
*/
|
||
|
|
export class AmplifyStorage extends Construct {
|
||
|
|
stack;
|
||
|
|
resources;
|
||
|
|
isDefault;
|
||
|
|
name;
|
||
|
|
accessDefinition;
|
||
|
|
/**
|
||
|
|
* Create a new AmplifyStorage instance
|
||
|
|
*/
|
||
|
|
constructor(scope, id, props) {
|
||
|
|
super(scope, id);
|
||
|
|
this.isDefault = props.isDefault || false;
|
||
|
|
this.name = props.name;
|
||
|
|
this.stack = Stack.of(scope);
|
||
|
|
const deploymentType = Stack.of(scope).node.tryGetContext(CDKContextKey.DEPLOYMENT_TYPE);
|
||
|
|
const isSandbox = deploymentType === 'sandbox';
|
||
|
|
const isDestroy = isSandbox || !props.keepOnDelete;
|
||
|
|
if (isSandbox && props.keepOnDelete) {
|
||
|
|
// eslint-disable-next-line no-console
|
||
|
|
console.warn(`[@aws-amplify/backend-storage] keepOnDelete is ignored in sandbox deployments. The bucket will be deleted.`);
|
||
|
|
}
|
||
|
|
const bucketProps = {
|
||
|
|
versioned: props.versioned || false,
|
||
|
|
cors: [
|
||
|
|
{
|
||
|
|
maxAge: 3000,
|
||
|
|
exposedHeaders: [
|
||
|
|
'x-amz-server-side-encryption',
|
||
|
|
'x-amz-request-id',
|
||
|
|
'x-amz-id-2',
|
||
|
|
'ETag',
|
||
|
|
],
|
||
|
|
allowedHeaders: ['*'],
|
||
|
|
allowedOrigins: ['*'],
|
||
|
|
allowedMethods: [
|
||
|
|
HttpMethods.GET,
|
||
|
|
HttpMethods.HEAD,
|
||
|
|
HttpMethods.PUT,
|
||
|
|
HttpMethods.POST,
|
||
|
|
HttpMethods.DELETE,
|
||
|
|
],
|
||
|
|
},
|
||
|
|
],
|
||
|
|
autoDeleteObjects: isDestroy,
|
||
|
|
removalPolicy: isDestroy ? RemovalPolicy.DESTROY : RemovalPolicy.RETAIN,
|
||
|
|
enforceSSL: true,
|
||
|
|
};
|
||
|
|
const bucket = new Bucket(this, 'Bucket', bucketProps);
|
||
|
|
this.resources = {
|
||
|
|
bucket,
|
||
|
|
cfnResources: {
|
||
|
|
cfnBucket: bucket.node.findChild('Resource'),
|
||
|
|
},
|
||
|
|
};
|
||
|
|
new AttributionMetadataStorage().storeAttributionMetadata(Stack.of(this), storageStackType, fileURLToPath(new URL('../package.json', import.meta.url)));
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* Attach a Lambda function trigger handler to the S3 events
|
||
|
|
* @param events - list of S3 events that will trigger the handler
|
||
|
|
* @param handler - The function that will handle the event
|
||
|
|
*/
|
||
|
|
addTrigger = (events, handler) => {
|
||
|
|
handler.addEventSource(new S3EventSourceV2(this.resources.bucket, { events }));
|
||
|
|
};
|
||
|
|
/**
|
||
|
|
* Add access definitions to storage
|
||
|
|
*/
|
||
|
|
addAccessDefinition = (accessOutput) => {
|
||
|
|
this.accessDefinition = accessOutput;
|
||
|
|
};
|
||
|
|
}
|
||
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RydWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnN0cnVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3ZDLE9BQU8sRUFDTCxNQUFNLEVBSU4sV0FBVyxHQUVaLE1BQU0sb0JBQW9CLENBQUM7QUFVNUIsT0FBTyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFekMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBR3ZFLHlIQUF5SDtBQUN6SCxNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQztBQWtFdEM7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxjQUNYLFNBQVEsU0FBUztJQUdSLEtBQUssQ0FBUTtJQUNiLFNBQVMsQ0FBbUI7SUFDNUIsU0FBUyxDQUFVO0lBQ25CLElBQUksQ0FBUztJQUN0QixnQkFBZ0IsQ0FBZ0M7SUFDaEQ7O09BRUc7SUFDSCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQTBCO1FBQ2xFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQztRQUMxQyxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTdCLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FDdkQsYUFBYSxDQUFDLGVBQWUsQ0FDQSxDQUFDO1FBQ2hDLE1BQU0sU0FBUyxHQUFHLGNBQWMsS0FBSyxTQUFTLENBQUM7UUFDL0MsTUFBTSxTQUFTLEdBQUcsU0FBUyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQztRQUVuRCxJQUFJLFNBQVMsSUFBSSxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDcEMsc0NBQXNDO1lBQ3RDLE9BQU8sQ0FBQyxJQUFJLENBQ1YsNEdBQTRHLENBQzdHLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQWdCO1lBQy9CLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUyxJQUFJLEtBQUs7WUFDbkMsSUFBSSxFQUFFO2dCQUNKO29CQUNFLE1BQU0sRUFBRSxJQUFJO29CQUNaLGNBQWMsRUFBRTt3QkFDZCw4QkFBOEI7d0JBQzlCLGtCQUFrQjt3QkFDbEIsWUFBWTt3QkFDWixNQUFNO3FCQUNQO29CQUNELGNBQWMsRUFBRSxDQUFDLEdBQUcsQ0FBQztvQkFDckIsY0FBYyxFQUFFLENBQUMsR0FBRyxDQUFDO29CQUNyQixjQUFjLEVBQUU7d0JBQ2QsV0FBVyxDQUFDLEdBQUc7d0JBQ2YsV0FBVyxDQUFDLElBQUk7d0JBQ2hCLFdBQVcsQ0FBQyxHQUFHO3dCQUNmLFdBQVcsQ0FBQyxJQUFJO3dCQUNoQixXQUFXLENBQUMsTUFBTTtxQkFDbkI7aUJBQ0Y7YUFDRjtZQUNELGlCQUFpQixFQUFFLFNBQVM7WUFDNUIsYUFBYSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU07WUFDdkUsVUFBVSxFQUFFLElBQUk7U0FDakIsQ0FBQztRQUVGLE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFFdkQsSUFBSSxDQUFDLFNBQVMsR0FBRztZQUNmLE1BQU07WUFDTixZQUFZLEVBQUU7Z0JBQ1osU0FBUyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBYzthQUMxRDtTQUNGLENBQUM7UUFFRixJQUFJLDBCQUEwQixFQUFFLENBQUMsd0JBQXdCLENBQ3ZELEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQ2QsZ0JBQWdCLEVBQ2hCLGFBQWEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQzNELENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFVBQVUsR0FBRyxDQUFDLE1BQW1CLEVBQUUsT0FBa0IsRUFBUSxFQUFFO1FBQzdELE9BQU8sQ0FBQyxjQUFjLENBQ3BCLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FDdkQsQ0FBQztJQUNKLENBQUMsQ0FBQztJQUVGOztPQUVHO0lBQ0gsbUJBQW1CLEdBQUcsQ0FBQyxZQUEyQyxFQUFFLEVBQUU7UUFDcEUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFlBQVksQ0FBQztJQUN2QyxDQUFDLENBQUM7Q0FDSCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHtcbiAgQnVja2V0LFxuICBCdWNrZXRQcm9wcyxcbiAgQ2ZuQnVja2V0LFxuICBFdmVudFR5cGUsXG4gIEh0dHBNZXRob2RzLFxuICBJQnVja2V0LFxufSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0IHtcbiAgQmFja2VuZE91dHB1dFN0b3JhZ2VTdHJhdGVneSxcbiAgQ29uc3RydWN0RmFjdG9yeSxcbiAgRGVwbG95bWVudFR5cGUsXG4gIEZ1bmN0aW9uUmVzb3VyY2VzLFxuICBSZXNvdXJjZVByb3ZpZGVyLFxuICBTdGFja1Byb3ZpZGVyLFxufSBmcm9tICdAYXdzLWFtcGxpZnkvcGx1Z2luLXR5cGVzJztcbmltcG9ydCB7IFN0b3JhZ2VPdXRwdXQgfSBmcm9tICdAYXdzLWFtcGxpZnkvYmFja2VuZC1vdXRwdXQtc2NoZW1hcyc7XG5pbXBvcnQgeyBSZW1vdmFsUG9saWN5LCBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IENES0NvbnRleHRLZXkgfSBmcm9tICdAYXdzLWFtcGxpZnkvcGxhdGZvcm0tY29yZSc7XG5pbXBvcnQgeyBBdHRyaWJ1dGlvbk1ldGFkYXRhU3RvcmFnZSB9IGZyb20gJ0Bhd3MtYW1wbGlmeS9iYWNrZW5kLW91dHB1dC1zdG9yYWdlJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICdub2RlOnVybCc7XG5pbXBvcnQgeyBJRnVuY3Rpb24gf
|