@inizioevoke/evosynth 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.editorconfig +12 -0
- package/dist/constructs/certificatemanager.d.ts +12 -0
- package/dist/constructs/certificatemanager.js +19 -0
- package/dist/constructs/cloudfront.d.ts +55 -0
- package/dist/constructs/cloudfront.js +84 -0
- package/dist/constructs/codebuild.d.ts +31 -0
- package/dist/constructs/codebuild.js +95 -0
- package/dist/constructs/codepipeline.d.ts +30 -0
- package/dist/constructs/codepipeline.js +63 -0
- package/dist/constructs/route53.d.ts +14 -0
- package/dist/constructs/route53.js +24 -0
- package/dist/constructs/s3.d.ts +11 -0
- package/dist/constructs/s3.js +17 -0
- package/dist/constructs/ssm.d.ts +9 -0
- package/dist/constructs/ssm.js +17 -0
- package/dist/constructs/waf.d.ts +21 -0
- package/dist/constructs/waf.js +89 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +26 -0
- package/dist/lib/const.d.ts +1 -0
- package/dist/lib/const.js +2 -0
- package/dist/lib/csv-redirects.d.ts +3 -0
- package/dist/lib/csv-redirects.js +124 -0
- package/dist/lib/tags.d.ts +19 -0
- package/dist/lib/tags.js +47 -0
- package/dist/lib/types.d.ts +14 -0
- package/dist/lib/types.js +2 -0
- package/dist/lib/utils.d.ts +2 -0
- package/dist/lib/utils.js +7 -0
- package/dist/lib/version.d.ts +1 -0
- package/dist/lib/version.js +5 -0
- package/dist/stacks/web-static-serverless/codepipeline-stack.d.ts +17 -0
- package/dist/stacks/web-static-serverless/codepipeline-stack.js +28 -0
- package/dist/stacks/web-static-serverless/web-global-stack.d.ts +43 -0
- package/dist/stacks/web-static-serverless/web-global-stack.js +142 -0
- package/dist/stages/str8r-clm-stage.d.ts +17 -0
- package/dist/stages/str8r-clm-stage.js +41 -0
- package/dist/stages/web-static-serverless-stage.d.ts +19 -0
- package/dist/stages/web-static-serverless-stage.js +51 -0
- package/dist/templates/cffn-default-doc-basic-auth.js +155 -0
- package/dist/templates/cffn-default-doc.js +132 -0
- package/inizioevoke-evosynth.code-workspace +8 -0
- package/package.json +24 -0
- package/readme.md +114 -0
- package/samples/app.ts +103 -0
- package/samples/codebuild/buildspec.yml +24 -0
- package/samples/config/redirects.csv +6 -0
- package/src/constructs/certificatemanager.ts +28 -0
- package/src/constructs/cloudfront.ts +148 -0
- package/src/constructs/codebuild.ts +124 -0
- package/src/constructs/codepipeline.ts +93 -0
- package/src/constructs/route53.ts +34 -0
- package/src/constructs/s3.ts +25 -0
- package/src/constructs/ssm.ts +24 -0
- package/src/constructs/waf.ts +118 -0
- package/src/index.ts +35 -0
- package/src/lib/const.ts +1 -0
- package/src/lib/csv-redirects.ts +139 -0
- package/src/lib/tags.ts +55 -0
- package/src/lib/types.ts +17 -0
- package/src/lib/utils.ts +7 -0
- package/src/lib/version.ts +6 -0
- package/src/stacks/web-static-serverless/codepipeline-stack.ts +42 -0
- package/src/stacks/web-static-serverless/web-global-stack.ts +184 -0
- package/src/stages/str8r-clm-stage.ts +57 -0
- package/src/stages/web-static-serverless-stage.ts +69 -0
- package/src/templates/cffn-default-doc-basic-auth.js +155 -0
- package/src/templates/cffn-default-doc.js +132 -0
- package/tasks/clean.js +7 -0
- package/tasks/copy-templates.js +13 -0
- package/tsconfig.json +32 -0
package/.editorconfig
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Construct } from 'constructs';
|
|
2
|
+
import { Certificate } from "aws-cdk-lib/aws-certificatemanager";
|
|
3
|
+
import { IHostedZone } from "aws-cdk-lib/aws-route53";
|
|
4
|
+
import { ResourceProps } from "../lib/types.js";
|
|
5
|
+
export interface SSLCertificateProps extends ResourceProps {
|
|
6
|
+
hostedZone: IHostedZone;
|
|
7
|
+
domainName: string;
|
|
8
|
+
}
|
|
9
|
+
export declare class SSLCertificate extends Construct {
|
|
10
|
+
readonly certificate: Certificate;
|
|
11
|
+
constructor(scope: Construct, id: string, props: SSLCertificateProps);
|
|
12
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { RemovalPolicy } from "aws-cdk-lib";
|
|
2
|
+
import { Construct } from 'constructs';
|
|
3
|
+
import { Certificate, CertificateValidation } from "aws-cdk-lib/aws-certificatemanager";
|
|
4
|
+
import { tagResource } from "../lib/tags.js";
|
|
5
|
+
export class SSLCertificate extends Construct {
|
|
6
|
+
certificate;
|
|
7
|
+
constructor(scope, id, props) {
|
|
8
|
+
super(scope, id);
|
|
9
|
+
this.certificate = new Certificate(this, `Certificate-${props.domainName}`, {
|
|
10
|
+
domainName: props.domainName,
|
|
11
|
+
validation: CertificateValidation.fromDns(props.hostedZone),
|
|
12
|
+
});
|
|
13
|
+
tagResource(this.certificate, props.tags);
|
|
14
|
+
if (typeof props.destroy == 'boolean') {
|
|
15
|
+
this.certificate.applyRemovalPolicy(props.destroy ? RemovalPolicy.DESTROY : RemovalPolicy.RETAIN);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydGlmaWNhdGVtYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnN0cnVjdHMvY2VydGlmaWNhdGVtYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN2QyxPQUFPLEVBQUUsV0FBVyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFeEYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBUTdDLE1BQU0sT0FBTyxjQUFlLFNBQVEsU0FBUztJQUMzQixXQUFXLENBQWM7SUFFekMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUEwQjtRQUNsRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxFQUFFLGVBQWUsS0FBSyxDQUFDLFVBQVUsRUFBRSxFQUFFO1lBQzFFLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtZQUM1QixVQUFVLEVBQUUscUJBQXFCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUM7U0FDNUQsQ0FBQyxDQUFDO1FBQ0gsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLElBQUksT0FBTyxLQUFLLENBQUMsT0FBTyxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BHLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZW1vdmFsUG9saWN5IH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IENlcnRpZmljYXRlLCBDZXJ0aWZpY2F0ZVZhbGlkYXRpb24gfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNlcnRpZmljYXRlbWFuYWdlclwiO1xuaW1wb3J0IHsgSUhvc3RlZFpvbmUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTNcIjtcbmltcG9ydCB7IHRhZ1Jlc291cmNlIH0gZnJvbSBcIi4uL2xpYi90YWdzLnRzXCI7XG5pbXBvcnQgeyBSZXNvdXJjZVByb3BzIH0gZnJvbSBcIi4uL2xpYi90eXBlcy5qc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNTTENlcnRpZmljYXRlUHJvcHMgZXh0ZW5kcyBSZXNvdXJjZVByb3BzIHtcbiAgaG9zdGVkWm9uZTogSUhvc3RlZFpvbmU7XG4gIGRvbWFpbk5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFNTTENlcnRpZmljYXRlIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGNlcnRpZmljYXRlOiBDZXJ0aWZpY2F0ZTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogU1NMQ2VydGlmaWNhdGVQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLmNlcnRpZmljYXRlID0gbmV3IENlcnRpZmljYXRlKHRoaXMsIGBDZXJ0aWZpY2F0ZS0ke3Byb3BzLmRvbWFpbk5hbWV9YCwge1xuICAgICAgZG9tYWluTmFtZTogcHJvcHMuZG9tYWluTmFtZSxcbiAgICAgIHZhbGlkYXRpb246IENlcnRpZmljYXRlVmFsaWRhdGlvbi5mcm9tRG5zKHByb3BzLmhvc3RlZFpvbmUpLFxuICAgIH0pO1xuICAgIHRhZ1Jlc291cmNlKHRoaXMuY2VydGlmaWNhdGUsIHByb3BzLnRhZ3MpO1xuICAgIGlmICh0eXBlb2YgcHJvcHMuZGVzdHJveSA9PSAnYm9vbGVhbicpIHtcbiAgICAgIHRoaXMuY2VydGlmaWNhdGUuYXBwbHlSZW1vdmFsUG9saWN5KHByb3BzLmRlc3Ryb3kgPyBSZW1vdmFsUG9saWN5LkRFU1RST1kgOiBSZW1vdmFsUG9saWN5LlJFVEFJTik7XG4gICAgfVxuICB9XG59Il19
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Construct } from 'constructs';
|
|
2
|
+
import { ICertificate } from 'aws-cdk-lib/aws-certificatemanager';
|
|
3
|
+
import { BehaviorOptions, Distribution, Function } from 'aws-cdk-lib/aws-cloudfront';
|
|
4
|
+
import type { ResourceProps } from '../lib/types.js';
|
|
5
|
+
export interface CloudFrontDistributionProps extends ResourceProps {
|
|
6
|
+
domainName: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
defaultBehavior: BehaviorOptions;
|
|
9
|
+
additionalBehaviors?: Record<string, BehaviorOptions>;
|
|
10
|
+
priceClass?: 'PRICE_CLASS_ALL' | 'PRICE_CLASS_100' | 'PRICE_CLASS_200' | 'NOT_PROD' | 'PROD';
|
|
11
|
+
certificate: ICertificate;
|
|
12
|
+
webAclId?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare class CloudFrontDistribution extends Construct {
|
|
15
|
+
readonly distribution: Distribution;
|
|
16
|
+
constructor(scope: Construct, id: string, props: CloudFrontDistributionProps);
|
|
17
|
+
}
|
|
18
|
+
export type HttpRedirectCode = 301 | 302 | 303 | 307 | 308;
|
|
19
|
+
export type CloudFrontFunctionRedirectPaths = Record<string, string | [string, HttpRedirectCode]>;
|
|
20
|
+
export interface CloudFrontFunctionRedirects {
|
|
21
|
+
trailingSlash?: boolean;
|
|
22
|
+
defaultDocument?: string;
|
|
23
|
+
redirectDefaultDocument?: boolean;
|
|
24
|
+
paths?: CloudFrontFunctionRedirectPaths;
|
|
25
|
+
pathsCsvFile?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface ViewerRequestResponseFunctionProps extends ResourceProps {
|
|
28
|
+
functionName?: string;
|
|
29
|
+
defaultDocument?: string;
|
|
30
|
+
redirects?: CloudFrontFunctionRedirects;
|
|
31
|
+
redirectsCsvPath?: string;
|
|
32
|
+
credentials?: string;
|
|
33
|
+
code: string;
|
|
34
|
+
}
|
|
35
|
+
export interface DefaultDocFunctionProps extends ResourceProps, Pick<ViewerRequestResponseFunctionProps, 'functionName' | 'defaultDocument' | 'redirects' | 'redirectsCsvPath'> {
|
|
36
|
+
functionName?: string;
|
|
37
|
+
defaultDocument?: string;
|
|
38
|
+
redirects?: CloudFrontFunctionRedirects;
|
|
39
|
+
redirectsCsvPath?: string;
|
|
40
|
+
}
|
|
41
|
+
export interface BasicAuthDefaultDocFunctionProps extends DefaultDocFunctionProps {
|
|
42
|
+
credentials: string;
|
|
43
|
+
}
|
|
44
|
+
export interface CloudFrontFunctionProps extends ResourceProps {
|
|
45
|
+
code: string;
|
|
46
|
+
functionName?: string;
|
|
47
|
+
runtime?: 'JS_1_0' | 'JS_2_0';
|
|
48
|
+
}
|
|
49
|
+
export declare class CloudFrontFunction extends Construct {
|
|
50
|
+
readonly fn: Function;
|
|
51
|
+
constructor(scope: Construct, id: string, props: CloudFrontFunctionProps);
|
|
52
|
+
static createDefaultDoc(scope: Construct, props: DefaultDocFunctionProps): CloudFrontFunction;
|
|
53
|
+
static createBasicAuthDefaultDoc(scope: Construct, props: BasicAuthDefaultDocFunctionProps): CloudFrontFunction;
|
|
54
|
+
static createViewerRequestResponseFunction(scope: Construct, id: string | null, props: ViewerRequestResponseFunctionProps): CloudFrontFunction;
|
|
55
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { resolve } from 'node:path';
|
|
2
|
+
import { readFileSync } from 'node:fs';
|
|
3
|
+
import { RemovalPolicy } from "aws-cdk-lib";
|
|
4
|
+
import { Construct } from 'constructs';
|
|
5
|
+
import { Distribution, Function, FunctionCode, FunctionRuntime, PriceClass } from 'aws-cdk-lib/aws-cloudfront';
|
|
6
|
+
import { tagResource } from '../lib/tags.js';
|
|
7
|
+
import { parseCsvRedirects } from '../lib/csv-redirects.js';
|
|
8
|
+
const __dirname = import.meta.dirname;
|
|
9
|
+
export class CloudFrontDistribution extends Construct {
|
|
10
|
+
distribution;
|
|
11
|
+
constructor(scope, id, props) {
|
|
12
|
+
super(scope, id);
|
|
13
|
+
let priceClass = PriceClass.PRICE_CLASS_ALL;
|
|
14
|
+
switch (props.priceClass) {
|
|
15
|
+
case 'NOT_PROD':
|
|
16
|
+
case 'PRICE_CLASS_100':
|
|
17
|
+
priceClass = PriceClass.PRICE_CLASS_100;
|
|
18
|
+
break;
|
|
19
|
+
case 'PRICE_CLASS_200':
|
|
20
|
+
priceClass = PriceClass.PRICE_CLASS_200;
|
|
21
|
+
break;
|
|
22
|
+
}
|
|
23
|
+
this.distribution = new Distribution(this, `${id}|CloudFrontDistribution`, {
|
|
24
|
+
comment: props.description,
|
|
25
|
+
defaultBehavior: props.defaultBehavior,
|
|
26
|
+
additionalBehaviors: props.additionalBehaviors,
|
|
27
|
+
domainNames: [props.domainName],
|
|
28
|
+
certificate: props.certificate,
|
|
29
|
+
priceClass,
|
|
30
|
+
webAclId: props.webAclId
|
|
31
|
+
});
|
|
32
|
+
tagResource(this.distribution, props.tags);
|
|
33
|
+
if (typeof props.destroy == 'boolean') {
|
|
34
|
+
this.distribution.applyRemovalPolicy(props.destroy ? RemovalPolicy.DESTROY : RemovalPolicy.RETAIN);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export class CloudFrontFunction extends Construct {
|
|
39
|
+
fn;
|
|
40
|
+
constructor(scope, id, props) {
|
|
41
|
+
super(scope, id);
|
|
42
|
+
this.fn = new Function(this, 'CloudFrontFunction', {
|
|
43
|
+
functionName: props.functionName,
|
|
44
|
+
runtime: FunctionRuntime[props.runtime ?? 'JS_2_0'],
|
|
45
|
+
code: FunctionCode.fromInline(props.code)
|
|
46
|
+
});
|
|
47
|
+
tagResource(this.fn, props.tags);
|
|
48
|
+
if (typeof props.destroy == 'boolean') {
|
|
49
|
+
this.fn.applyRemovalPolicy(props.destroy ? RemovalPolicy.DESTROY : RemovalPolicy.RETAIN);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
static createDefaultDoc(scope, props) {
|
|
53
|
+
const code = readFileSync(resolve(__dirname, '../templates/cffn-default-doc.js'), 'utf8');
|
|
54
|
+
return this.createViewerRequestResponseFunction(scope, 'DefaultDocFunction', {
|
|
55
|
+
...props,
|
|
56
|
+
credentials: '',
|
|
57
|
+
code
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
static createBasicAuthDefaultDoc(scope, props) {
|
|
61
|
+
const code = readFileSync(resolve(__dirname, '../templates/cffn-default-doc-basic-auth.js'), 'utf8');
|
|
62
|
+
return this.createViewerRequestResponseFunction(scope, 'BasicAuthDefaultDocFunction', {
|
|
63
|
+
...props,
|
|
64
|
+
code
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
static createViewerRequestResponseFunction(scope, id, props) {
|
|
68
|
+
const csvPath = props.redirects?.pathsCsvFile ?? props.redirectsCsvPath;
|
|
69
|
+
const redirectPaths = csvPath ? parseCsvRedirects(csvPath) : (props.redirects?.paths ?? {});
|
|
70
|
+
const hasRedirects = Object.keys(redirectPaths).length > 0;
|
|
71
|
+
props.code = props.code
|
|
72
|
+
.replace('__DEFAULT_DOCUMENT__', props.defaultDocument ?? 'index.html')
|
|
73
|
+
.replace('__CREDENTIALS__', props.credentials ?? 'Og==')
|
|
74
|
+
.replace('__REDIRECTS__', hasRedirects ? JSON.stringify(redirectPaths) : 'null')
|
|
75
|
+
.replace('__TRAILING_SLASH__', props.redirects?.trailingSlash?.toString() ?? 'null')
|
|
76
|
+
.replace('__REDIR_DEF_DOC__', props.redirects?.redirectDefaultDocument?.toString() ?? 'false');
|
|
77
|
+
return new CloudFrontFunction(scope, id || 'ViewerRequestResponseFunction', {
|
|
78
|
+
functionName: props.functionName,
|
|
79
|
+
runtime: 'JS_2_0',
|
|
80
|
+
code: props.code
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvdWRmcm9udC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25zdHJ1Y3RzL2Nsb3VkZnJvbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV2QyxPQUFPLEVBQW1CLFlBQVksRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoSSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHNUQsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7QUFXdEMsTUFBTSxPQUFPLHNCQUF1QixTQUFRLFNBQVM7SUFDbkMsWUFBWSxDQUFlO0lBRTNDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBa0M7UUFDMUUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLFVBQVUsR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFDO1FBQzVDLFFBQVEsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3pCLEtBQUssVUFBVSxDQUFDO1lBQ2hCLEtBQUssaUJBQWlCO2dCQUNwQixVQUFVLEdBQUcsVUFBVSxDQUFDLGVBQWUsQ0FBQztnQkFDeEMsTUFBTTtZQUNSLEtBQUssaUJBQWlCO2dCQUNwQixVQUFVLEdBQUcsVUFBVSxDQUFDLGVBQWUsQ0FBQztnQkFDeEMsTUFBTTtRQUNWLENBQUM7UUFFRCxJQUFJLENBQUMsWUFBWSxH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QWlCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7UUFDNUYsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBRTNELEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUk7YUFDcEIsT0FBTyxDQUFDLHNCQUFzQixFQUFFLEtBQUssQ0FBQyxlQUFlLElBQUksWUFBWSxDQUFDO2FBQ3RFLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQzthQUN2RCxPQUFPLENBQUMsZUFBZSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO2FBQy9FLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLENBQUMsU0FBUyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsSUFBSSxNQUFNLENBQUM7YUFDbkYsT0FBTyxDQUFDLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUUsdUJBQXVCLEVBQUUsUUFBUSxFQUFFLElBQUksT0FBTyxDQUFDLENBQUM7UUFFakcsT0FBTyxJQUFJLGtCQUFrQixDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksK0JBQStCLEVBQUU7WUFDMUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO1lBQ2hDLE9BQU8sRUFBRSxRQUFRO1lBQ2pCLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtTQUNqQixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZXNvbHZlIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgUmVtb3ZhbFBvbGljeSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBJQ2VydGlmaWNhdGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2VydGlmaWNhdGVtYW5hZ2VyJztcbmltcG9ydCB7IEJlaGF2aW9yT3B0aW9ucywgRGlzdHJpYnV0aW9uLCBGdW5jdGlvbiwgRnVuY3Rpb25Db2RlLCBGdW5jdGlvblJ1bnRpbWUsIFByaWNlQ2xhc3MgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udCc7XG5pbXBvcnQgeyB0YWdSZXNvdXJjZSB9IGZyb20gJy4uL2xpYi90YWdzLmpzJztcbmltcG9ydCB7IHBhcnNlQ3N2UmVkaXJlY3RzIH0gZnJvbSAnLi4vbGliL2Nzdi1yZWRpcmVjdHMuanMnO1xuaW1wb3J0IHR5cGUgeyBSZXNvdXJjZVByb3BzIH0gZnJvbSAnLi4vbGliL3R5cGVzLmpzJztcblxuY29uc3QgX19kaXJuYW1lID0gaW1wb3J0Lm1ldGEuZGlybmFtZTtcblxuZXhwb3J0IGludGVyZmFjZSBDbG91ZEZyb250RGlzdHJpYnV0aW9uUHJvcHMgZXh0ZW5kcyBSZXNvdXJjZVByb3BzIHtcbiAgZG9tYWluTmFtZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgZGVmYXVsdEJlaGF2aW9yOiBCZWhhdmlvck9wdGlvbnM7XG4gIGFkZGl0aW9uYWxCZWhhdmlvcnM/OiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+O1xuICBwcmljZUNsYXNzPzogJ1BSSUNFX0NMQVNTX0FMTCcgfCAnUFJJQ0VfQ0xBU1NfMTAwJyB8ICdQUklDRV9DTEFTU18yMDAnIHwgJ05PVF9QUk9EJyB8ICdQUk9EJztcbiAgY2VydGlmaWNhdGU6IElDZXJ0aWZpY2F0ZTtcbiAgd2ViQWNsSWQ/OiBzdHJpbmc7XG59XG5leHBvcnQgY2xhc3MgQ2xvdWRGcm9udERpc3RyaWJ1dGlvbiBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBkaXN0cmlidXRpb246IERpc3RyaWJ1dGlvbjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQ2xvdWRGcm9udERpc3RyaWJ1dGlvblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGxldCBwcmljZUNsYXNzID0gUHJpY2VDbGFzcy5QUklDRV9DTEFTU19BTEw7XG4gICAgc3dpdGNoIChwcm9wcy5wcmljZUNsYXNzKSB7XG4gICAgICBjYXNlICdOT1RfUFJPRCc6XG4gICAgICBjYXNlICdQUklDRV9DTEFTU18xMDAnOlxuICAgICAgICBwcmljZUNsYXNzID0gUHJpY2VDbGFzcy5QUklDRV9DTEFTU18xMDA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnUFJJQ0VfQ0xBU1NfMjAwJzpcbiAgICAgICAgcHJpY2VDbGFzcyA9IFByaWNlQ2xhc3MuUFJJQ0VfQ0xBU1NfMjAwO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB0aGlzLmRpc3RyaWJ1dGlvbiA9IG5ldyBEaXN0cmlidXRpb24odGhpcywgYCR7aWR9fENsb3VkRnJvbnREaXN0cmlidXRpb25gLCB7XG4gICAgICBjb21tZW50OiBwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgIGRlZmF1bHRCZWhhdmlvcjogcHJvcHMuZGVmYXVsdEJlaGF2aW9yLFxuICAgICAgYWRkaXRpb25hbEJlaGF2aW9yczogcHJvcHMuYWRkaXRpb25hbEJlaGF2aW9ycyxcbiAgICAgIGRvbWFpbk5hbWVzOiBbcHJvcHMuZG9tYWluTmFtZV0sXG4gICAgICBjZXJ0aWZpY2F0ZTogcHJvcHMuY2VydGlmaWNhdGUsXG4gICAgICBwcmljZUNsYXNzLFxuICAgICAgd2ViQWNsSWQ6IHByb3BzLndlYkFjbElkXG4gICAgfSk7XG4gICAgdGFnUmVzb3VyY2UodGhpcy5kaXN0cmlidXRpb24sIHByb3BzLnRhZ3MpO1xuICAgIGlmICh0eXBlb2YgcHJvcHMuZGVzdHJveSA9PSAnYm9vbGVhbicpIHtcbiAgICAgIHRoaXMuZGlzdHJpYnV0aW9uLmFwcGx5UmVtb3ZhbFBvbGljeShwcm9wcy5kZXN0cm95ID8gUmVtb3ZhbFBvbGljeS5ERVNUUk9ZIDogUmVtb3ZhbFBvbGljeS5SRVRBSU4pO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgdHlwZSBIdHRwUmVkaXJlY3RDb2RlID0gMzAxIHwgMzAyIHwgMzAzIHwgMzA3IHwgMzA4O1xuZXhwb3J0IHR5cGUgQ2xvdWRGcm9udEZ1bmN0aW9uUmVkaXJlY3RQYXRocyA9IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IFtzdHJpbmcsIEh0dHBSZWRpcmVjdENvZGVdPjtcblxuZXhwb3J0IGludGVyZmFjZSBDbG91ZEZyb250RnVuY3Rpb25SZWRpcmVjdHMge1xuICB0cmFpbGluZ1NsYXNoPzogYm9vbGVhbjtcbiAgZGVmYXVsdERvY3VtZW50Pzogc3RyaW5nO1xuICByZWRpcmVjdERlZmF1bHREb2N1bWVudD86IGJvb2xlYW47XG4gIHBhdGhzPzogQ2xvdWRGcm9udEZ1bmN0aW9uUmVkaXJlY3RQYXRocztcbiAgcGF0aHNDc3ZGaWxlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZpZXdlclJlcXVlc3RSZXNwb25zZUZ1bmN0aW9uUHJvcHMgZXh0ZW5kcyBSZXNvdXJjZVByb3BzIHtcbiAgZnVuY3Rpb25OYW1lPzogc3RyaW5nO1xuICBkZWZhdWx0RG9jdW1lbnQ/OiBzdHJpbmc7XG4gIHJlZGlyZWN0cz86IENsb3VkRnJvbnRGdW5jdGlvblJlZGlyZWN0cztcbiAgcmVkaXJlY3RzQ3N2UGF0aD86IHN0cmluZztcbiAgY3JlZGVudGlhbHM/OiBzdHJpbmc7XG4gIGNvZGU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZWZhdWx0RG9jRnVuY3Rpb25Qcm9wcyBleHRlbmRzIFJlc291cmNlUHJvcHMsIFBpY2s8Vmlld2VyUmVxdWVzdFJlc3BvbnNlRnVuY3Rpb25Qcm9wcywgJ2Z1bmN0aW9uTmFtZScgfCAnZGVmYXVsdERvY3VtZW50JyB8ICdyZWRpcmVjdHMnIHwgJ3JlZGlyZWN0c0NzdlBhdGgnPiB7XG4gIGZ1bmN0aW9uTmFtZT86IHN0cmluZztcbiAgZGVmYXVsdERvY3VtZW50Pzogc3RyaW5nO1xuICByZWRpcmVjdHM/OiBDbG91ZEZyb250RnVuY3Rpb25SZWRpcmVjdHM7XG4gIHJlZGlyZWN0c0NzdlBhdGg/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFzaWNBdXRoRGVmYXVsdERvY0Z1bmN0aW9uUHJvcHMgZXh0ZW5kcyBEZWZhdWx0RG9jRnVuY3Rpb25Qcm9wcyB7XG4gIGNyZWRlbnRpYWxzOiBzdHJpbmc7XG59XG5cblxuZXhwb3J0IGludGVyZmFjZSBDbG91ZEZyb250RnVuY3Rpb25Qcm9wcyBleHRlbmRzIFJlc291cmNlUHJvcHMge1xuICBjb2RlOiBzdHJpbmc7XG4gIGZ1bmN0aW9uTmFtZT86IHN0cmluZztcbiAgcnVudGltZT86ICdKU18xXzAnIHwgJ0pTXzJfMCc7XG59XG5leHBvcnQgY2xhc3MgQ2xvdWRGcm9udEZ1bmN0aW9uIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGZuOiBGdW5jdGlvbjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQ2xvdWRGcm9udEZ1bmN0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5mbiA9IG5ldyBGdW5jdGlvbih0aGlzLCAnQ2xvdWRGcm9udEZ1bmN0aW9uJywge1xuICAgICAgZnVuY3Rpb25OYW1lOiBwcm9wcy5mdW5jdGlvbk5hbWUsXG4gICAgICBydW50aW1lOiBGdW5jdGlvblJ1bnRpbWVbcHJvcHMucnVudGltZSA/PyAnSlNfMl8wJ10sXG4gICAgICBjb2RlOiBGdW5jdGlvbkNvZGUuZnJvbUlubGluZShwcm9wcy5jb2RlKVxuICAgIH0pO1xuICAgIHRhZ1Jlc291cmNlKHRoaXMuZm4sIHByb3BzLnRhZ3MpO1xuXG4gICAgaWYgKHR5cGVvZiBwcm9wcy5kZXN0cm95ID09ICdib29sZWFuJykge1xuICAgICAgdGhpcy5mbi5hcHBseVJlbW92YWxQb2xpY3kocHJvcHMuZGVzdHJveSA/IFJlbW92YWxQb2xpY3kuREVTVFJPWSA6IFJlbW92YWxQb2xpY3kuUkVUQUlOKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlRGVmYXVsdERvYyhzY29wZTogQ29uc3RydWN0LCBwcm9wczogRGVmYXVsdERvY0Z1bmN0aW9uUHJvcHMpIHtcbiAgICBjb25zdCBjb2RlID0gcmVhZEZpbGVTeW5jKHJlc29sdmUoX19kaXJuYW1lLCAnLi4vdGVtcGxhdGVzL2NmZm4tZGVmYXVsdC1kb2MuanMnKSwgJ3V0ZjgnKTtcblxuICAgIHJldHVybiB0aGlzLmNyZWF0ZVZpZXdlclJlcXVlc3RSZXNwb25zZUZ1bmN0aW9uKHNjb3BlLCAnRGVmYXVsdERvY0Z1bmN0aW9uJywge1xuICAgICAgLi4ucHJvcHMsXG4gICAgICBjcmVkZW50aWFsczogJycsXG4gICAgICBjb2RlXG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlQmFzaWNBdXRoRGVmYXVsdERvYyhzY29wZTogQ29uc3RydWN0LCBwcm9wczogQmFzaWNBdXRoRGVmYXVsdERvY0Z1bmN0aW9uUHJvcHMpIHtcbiAgICBjb25zdCBjb2RlID0gcmVhZEZpbGVTeW5jKHJlc29sdmUoX19kaXJuYW1lLCAnLi4vdGVtcGxhdGVzL2NmZm4tZGVmYXVsdC1kb2MtYmFzaWMtYXV0aC5qcycpLCAndXRmOCcpO1xuXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlVmlld2VyUmVxdWVzdFJlc3BvbnNlRnVuY3Rpb24oc2NvcGUsICdCYXNpY0F1dGhEZWZhdWx0RG9jRnVuY3Rpb24nLCB7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIGNvZGVcbiAgICB9KTtcblxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVZpZXdlclJlcXVlc3RSZXNwb25zZUZ1bmN0aW9uKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcgfCBudWxsLCBwcm9wczogVmlld2VyUmVxdWVzdFJlc3BvbnNlRnVuY3Rpb25Qcm9wcykge1xuICAgIGNvbnN0IGNzdlBhdGggPSBwcm9wcy5yZWRpcmVjdHM/LnBhdGhzQ3N2RmlsZSA/PyBwcm9wcy5yZWRpcmVjdHNDc3ZQYXRoO1xuICAgIGNvbnN0IHJlZGlyZWN0UGF0aHMgPSBjc3ZQYXRoID8gcGFyc2VDc3ZSZWRpcmVjdHMoY3N2UGF0aCkgOiAocHJvcHMucmVkaXJlY3RzPy5wYXRocyA/PyB7fSk7XG4gICAgY29uc3QgaGFzUmVkaXJlY3RzID0gT2JqZWN0LmtleXMocmVkaXJlY3RQYXRocykubGVuZ3RoID4gMDtcblxuICAgIHByb3BzLmNvZGUgPSBwcm9wcy5jb2RlXG4gICAgICAucmVwbGFjZSgnX19ERUZBVUxUX0RPQ1VNRU5UX18nLCBwcm9wcy5kZWZhdWx0RG9jdW1lbnQgPz8gJ2luZGV4Lmh0bWwnKVxuICAgICAgLnJlcGxhY2UoJ19fQ1JFREVOVElBTFNfXycsIHByb3BzLmNyZWRlbnRpYWxzID8/ICdPZz09JylcbiAgICAgIC5yZXBsYWNlKCdfX1JFRElSRUNUU19fJywgaGFzUmVkaXJlY3RzID8gSlNPTi5zdHJpbmdpZnkocmVkaXJlY3RQYXRocykgOiAnbnVsbCcpXG4gICAgICAucmVwbGFjZSgnX19UUkFJTElOR19TTEFTSF9fJywgcHJvcHMucmVkaXJlY3RzPy50cmFpbGluZ1NsYXNoPy50b1N0cmluZygpID8/ICdudWxsJylcbiAgICAgIC5yZXBsYWNlKCdfX1JFRElSX0RFRl9ET0NfXycsIHByb3BzLnJlZGlyZWN0cz8ucmVkaXJlY3REZWZhdWx0RG9jdW1lbnQ/LnRvU3RyaW5nKCkgPz8gJ2ZhbHNlJyk7XG5cbiAgICByZXR1cm4gbmV3IENsb3VkRnJvbnRGdW5jdGlvbihzY29wZSwgaWQgfHwgJ1ZpZXdlclJlcXVlc3RSZXNwb25zZUZ1bmN0aW9uJywge1xuICAgICAgZnVuY3Rpb25OYW1lOiBwcm9wcy5mdW5jdGlvbk5hbWUsXG4gICAgICBydW50aW1lOiAnSlNfMl8wJyxcbiAgICAgIGNvZGU6IHByb3BzLmNvZGVcbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Construct } from 'constructs';
|
|
2
|
+
import { BuildEnvironmentVariableType, IBuildImage, PipelineProject } from 'aws-cdk-lib/aws-codebuild';
|
|
3
|
+
import { ResourceProps } from "../lib/types.js";
|
|
4
|
+
import { SsmStringParameter as _SsmStringParameter } from '../lib/types.ts';
|
|
5
|
+
export type EnvironmentVariables = Record<string, {
|
|
6
|
+
value: any;
|
|
7
|
+
type?: BuildEnvironmentVariableType;
|
|
8
|
+
}>;
|
|
9
|
+
interface SsmStringParameter extends _SsmStringParameter {
|
|
10
|
+
encrypted?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface EcrBuildImage {
|
|
13
|
+
repository: string;
|
|
14
|
+
tag: string;
|
|
15
|
+
}
|
|
16
|
+
export interface CodeBuildPipelineProjectProps extends ResourceProps {
|
|
17
|
+
projectName?: string;
|
|
18
|
+
buildSpec?: string | object;
|
|
19
|
+
buildImage?: ('STANDARD_5_0' | 'STANDARD_6_0' | 'STANDARD_7_0') | IBuildImage;
|
|
20
|
+
ecrBuildImage?: EcrBuildImage;
|
|
21
|
+
computeType?: ('SMALL' | 'MEDIUM' | 'LARGE' | 'X_LARGE' | 'X2_LARGE') | string;
|
|
22
|
+
environmentVariables?: EnvironmentVariables;
|
|
23
|
+
cloudFrontDistributionArn?: string;
|
|
24
|
+
s3BucketName?: string;
|
|
25
|
+
ssmParameters?: SsmStringParameter[];
|
|
26
|
+
}
|
|
27
|
+
export declare class CodeBuildPipelineProject extends Construct {
|
|
28
|
+
readonly project: PipelineProject;
|
|
29
|
+
constructor(scope: Construct, id: string, props: CodeBuildPipelineProjectProps);
|
|
30
|
+
}
|
|
31
|
+
export {};
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { RemovalPolicy } from "aws-cdk-lib";
|
|
2
|
+
import { Construct } from 'constructs';
|
|
3
|
+
import { BuildSpec, ComputeType, LinuxBuildImage, PipelineProject } from 'aws-cdk-lib/aws-codebuild';
|
|
4
|
+
import { Repository } from "aws-cdk-lib/aws-ecr";
|
|
5
|
+
import { PolicyStatement } from 'aws-cdk-lib/aws-iam';
|
|
6
|
+
import { Bucket } from 'aws-cdk-lib/aws-s3';
|
|
7
|
+
import { StringParameter } from 'aws-cdk-lib/aws-ssm';
|
|
8
|
+
import { tagResource } from "../lib/tags.js";
|
|
9
|
+
export class CodeBuildPipelineProject extends Construct {
|
|
10
|
+
project;
|
|
11
|
+
constructor(scope, id, props) {
|
|
12
|
+
super(scope, id);
|
|
13
|
+
if (!props.environmentVariables) {
|
|
14
|
+
props.environmentVariables = {};
|
|
15
|
+
}
|
|
16
|
+
if (props.cloudFrontDistributionArn && !props.environmentVariables.CLOUDFRONT_DISTRIBUTION_ID) {
|
|
17
|
+
props.environmentVariables.CLOUDFRONT_DISTRIBUTION_ID = {
|
|
18
|
+
value: props.cloudFrontDistributionArn.split('/').pop()
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
if (props.s3BucketName && !props.environmentVariables.S3_BUCKET_NAME) {
|
|
22
|
+
props.environmentVariables.S3_BUCKET_NAME = {
|
|
23
|
+
value: props.s3BucketName
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
let buildImage = undefined;
|
|
27
|
+
if (props.ecrBuildImage) {
|
|
28
|
+
const repository = props.ecrBuildImage.repository.startsWith('arn:aws') ?
|
|
29
|
+
Repository.fromRepositoryArn(this, 'EcrRepository', props.ecrBuildImage.repository) :
|
|
30
|
+
Repository.fromRepositoryName(this, 'EcrRepository', props.ecrBuildImage.repository);
|
|
31
|
+
buildImage = LinuxBuildImage.fromEcrRepository(repository, props.ecrBuildImage.tag);
|
|
32
|
+
}
|
|
33
|
+
else if (props.buildImage) {
|
|
34
|
+
if (typeof props.buildImage == 'string') {
|
|
35
|
+
buildImage = LinuxBuildImage[props.buildImage ?? 'STANDARD_7_0'];
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
buildImage = props.buildImage;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
this.project = new PipelineProject(this, 'CodeBuildPipelineProjectProps', {
|
|
42
|
+
projectName: props.projectName,
|
|
43
|
+
buildSpec: props.buildSpec ? typeof props.buildSpec == 'object' ? BuildSpec.fromObjectToYaml(props.buildSpec) : BuildSpec.fromSourceFilename(props.buildSpec ?? 'buildspec.yml') : undefined,
|
|
44
|
+
environment: {
|
|
45
|
+
buildImage: buildImage ?? LinuxBuildImage.STANDARD_7_0,
|
|
46
|
+
computeType: ComputeType[props.computeType ?? 'SMALL'],
|
|
47
|
+
environmentVariables: props.environmentVariables
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
tagResource(this.project, props.tags);
|
|
51
|
+
if (typeof props.destroy == 'boolean') {
|
|
52
|
+
this.project.applyRemovalPolicy(props.destroy ? RemovalPolicy.DESTROY : RemovalPolicy.RETAIN);
|
|
53
|
+
}
|
|
54
|
+
// Add CloudWatch log permissions
|
|
55
|
+
this.project.addToRolePolicy(new PolicyStatement({
|
|
56
|
+
actions: [
|
|
57
|
+
'logs:CreateLogGroup',
|
|
58
|
+
'logs:CreateLogStream',
|
|
59
|
+
'logs:PutLogEvents'
|
|
60
|
+
],
|
|
61
|
+
resources: [this.project.projectArn]
|
|
62
|
+
}));
|
|
63
|
+
// Allow the project to create an invalidation
|
|
64
|
+
if (props.cloudFrontDistributionArn) {
|
|
65
|
+
this.project.addToRolePolicy(new PolicyStatement({
|
|
66
|
+
actions: ['cloudfront:CreateInvalidation'],
|
|
67
|
+
resources: [props.cloudFrontDistributionArn]
|
|
68
|
+
}));
|
|
69
|
+
}
|
|
70
|
+
// Allow the project to sync files to S3
|
|
71
|
+
if (props.s3BucketName) {
|
|
72
|
+
const s3Bucket = Bucket.fromBucketName(this, 'S3BucketByName', props.s3BucketName);
|
|
73
|
+
s3Bucket.grantReadWrite(this.project);
|
|
74
|
+
}
|
|
75
|
+
if (props.ssmParameters) {
|
|
76
|
+
for (const param of props.ssmParameters) {
|
|
77
|
+
let strParam;
|
|
78
|
+
if (param.encrypted) {
|
|
79
|
+
strParam = StringParameter.fromSecureStringParameterAttributes(this, param.path, {
|
|
80
|
+
parameterName: param.path,
|
|
81
|
+
version: param.version
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
strParam = StringParameter.fromStringParameterAttributes(this, param.path, {
|
|
86
|
+
parameterName: param.path,
|
|
87
|
+
version: param.version
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
strParam.grantRead(this.project);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZWJ1aWxkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnN0cnVjdHMvY29kZWJ1aWxkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN2QyxPQUFPLEVBQWdDLFNBQVMsRUFBRSxXQUFXLEVBQWUsZUFBZSxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2hKLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBb0IsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBeUI3QyxNQUFNLE9BQU8sd0JBQXlCLFNBQVEsU0FBUztJQUNyQyxPQUFPLENBQWtCO0lBRXpDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBb0M7UUFDNUUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDaEMsS0FBSyxDQUFDLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztRQUNsQyxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMseUJBQXlCLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztZQUM5RixLQUFLLENBQUMsb0JBQW9CLENBQUMsMEJBQTBCLEdBQUc7Z0JBQ3RELEtBQUssRUFBRSxLQUFLLENBQUMseUJBQXlCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcs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QyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlbW92YWxQb2xpY3kgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQnVpbGRFbnZpcm9ubWVudFZhcmlhYmxlVHlwZSwgQnVpbGRTcGVjLCBDb21wdXRlVHlwZSwgSUJ1aWxkSW1hZ2UsIExpbnV4QnVpbGRJbWFnZSwgUGlwZWxpbmVQcm9qZWN0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNvZGVidWlsZCc7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lY3JcIjtcbmltcG9ydCB7IFBvbGljeVN0YXRlbWVudCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHsgQnVja2V0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCB7IElTdHJpbmdQYXJhbWV0ZXIsIFN0cmluZ1BhcmFtZXRlciB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zc20nO1xuaW1wb3J0IHsgdGFnUmVzb3VyY2UgfSBmcm9tIFwiLi4vbGliL3RhZ3MuanNcIjtcbmltcG9ydCB7IFJlc291cmNlUHJvcHMgfSBmcm9tIFwiLi4vbGliL3R5cGVzLmpzXCI7XG5pbXBvcnQgeyBTc21TdHJpbmdQYXJhbWV0ZXIgYXMgX1NzbVN0cmluZ1BhcmFtZXRlciB9IGZyb20gJy4uL2xpYi90eXBlcy50cyc7XG5cbmV4cG9ydCB0eXBlIEVudmlyb25tZW50VmFyaWFibGVzID0gUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogYW55LCB0eXBlPzogQnVpbGRFbnZpcm9ubWVudFZhcmlhYmxlVHlwZSB9PjtcblxuaW50ZXJmYWNlIFNzbVN0cmluZ1BhcmFtZXRlciBleHRlbmRzIF9Tc21TdHJpbmdQYXJhbWV0ZXIge1xuICBlbmNyeXB0ZWQ/OiBib29sZWFuO1xufVxuZXhwb3J0IGludGVyZmFjZSBFY3JCdWlsZEltYWdlIHtcbiAgcmVwb3NpdG9yeTogc3RyaW5nO1xuICB0YWc6IHN0cmluZztcbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ29kZUJ1aWxkUGlwZWxpbmVQcm9qZWN0UHJvcHMgZXh0ZW5kcyBSZXNvdXJjZVByb3BzIHtcbiAgcHJvamVjdE5hbWU/OiBzdHJpbmc7XG4gIGJ1aWxkU3BlYz86IHN0cmluZyB8IG9iamVjdDtcbiAgYnVpbGRJbWFnZT86ICgnU1RBTkRBUkRfNV8wJyB8ICdTVEFOREFSRF82XzAnIHwgJ1NUQU5EQVJEXzdfMCcpIHwgSUJ1aWxkSW1hZ2U7XG4gIGVjckJ1aWxkSW1hZ2U/OiBFY3JCdWlsZEltYWdlLFxuICBjb21wdXRlVHlwZT86ICgnU01BTEwnIHwgJ01FRElVTScgfCAnTEFSR0UnIHwgJ1hfTEFSR0UnIHwgJ1gyX0xBUkdFJykgfCBzdHJpbmc7XG4gIGVudmlyb25tZW50VmFyaWFibGVzPzogRW52aXJvbm1lbnRWYXJpYWJsZXM7XG4gIGNsb3VkRnJvbnREaXN0cmlidXRpb25Bcm4/OiBzdHJpbmc7XG4gIHMzQnVja2V0TmFtZT86IHN0cmluZztcbiAgc3NtUGFyYW1ldGVycz86IFNzbVN0cmluZ1BhcmFtZXRlcltdO1xufVxuXG5leHBvcnQgY2xhc3MgQ29kZUJ1aWxkUGlwZWxpbmVQcm9qZWN0IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IHByb2plY3Q6IFBpcGVsaW5lUHJvamVjdDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQ29kZUJ1aWxkUGlwZWxpbmVQcm9qZWN0UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgaWYgKCFwcm9wcy5lbnZpcm9ubWVudFZhcmlhYmxlcykge1xuICAgICAgcHJvcHMuZW52aXJvbm1lbnRWYXJpYWJsZXMgPSB7fTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmNsb3VkRnJvbnREaXN0cmlidXRpb25Bcm4gJiYgIXByb3BzLmVudmlyb25tZW50VmFyaWFibGVzLkNMT1VERlJPTlRfRElTVFJJQlVUSU9OX0lEKSB7XG4gICAgICBwcm9wcy5lbnZpcm9ubWVudFZhcmlhYmxlcy5DTE9VREZST05UX0RJU1RSSUJVVElPTl9JRCA9IHtcbiAgICAgICAgdmFsdWU6IHByb3BzLmNsb3VkRnJvbnREaXN0cmlidXRpb25Bcm4uc3BsaXQoJy8nKS5wb3AoKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMuczNCdWNrZXROYW1lICYmICFwcm9wcy5lbnZpcm9ubWVudFZhcmlhYmxlcy5TM19CVUNLRVRfTkFNRSkge1xuICAgICAgcHJvcHMuZW52aXJvbm1lbnRWYXJpYWJsZXMuUzNfQlVDS0VUX05BTUUgPSB7XG4gICAgICAgIHZhbHVlOiBwcm9wcy5zM0J1Y2tldE5hbWVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgbGV0IGJ1aWxkSW1hZ2U6IElCdWlsZEltYWdlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGlmIChwcm9wcy5lY3JCdWlsZEltYWdlKSB7XG4gICAgICBjb25zdCByZXBvc2l0b3J5ID0gcHJvcHMuZWNyQnVpbGRJbWFnZS5yZXBvc2l0b3J5LnN0YXJ0c1dpdGgoJ2Fybjphd3MnKSA/IFxuICAgICAgICBSZXBvc2l0b3J5LmZyb21SZXBvc2l0b3J5QXJuKHRoaXMsICdFY3JSZXBvc2l0b3J5JywgcHJvcHMuZWNyQnVpbGRJbWFnZS5yZXBvc2l0b3J5KSA6XG4gICAgICAgIFJlcG9zaXRvcnkuZnJvbVJlcG9zaXRvcnlOYW1lKHRoaXMsICdFY3JSZXBvc2l0b3J5JywgcHJvcHMuZWNyQnVpbGRJbWFnZS5yZXBvc2l0b3J5KTtcbiAgICAgIGJ1aWxkSW1hZ2UgPSBMaW51eEJ1aWxkSW1hZ2UuZnJvbUVjclJlcG9zaXRvcnkocmVwb3NpdG9yeSwgcHJvcHMuZWNyQnVpbGRJbWFnZS50YWcpO1xuICAgIH0gZWxzZSBpZiAocHJvcHMuYnVpbGRJbWFnZSkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wcy5idWlsZEltYWdlID09ICdzdHJpbmcnKSB7XG4gICAgICAgIGJ1aWxkSW1hZ2UgPSBMaW51eEJ1aWxkSW1hZ2VbcHJvcHMuYnVpbGRJbWFnZSA/PyAnU1RBTkRBUkRfN18wJ11cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJ1aWxkSW1hZ2UgPSBwcm9wcy5idWlsZEltYWdlIGFzIElCdWlsZEltYWdlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMucHJvamVjdCA9IG5ldyBQaXBlbGluZVByb2plY3QodGhpcywgJ0NvZGVCdWlsZFBpcGVsaW5lUHJvamVjdFByb3BzJywge1xuICAgICAgcHJvamVjdE5hbWU6IHByb3BzLnByb2plY3ROYW1lLFxuICAgICAgYnVpbGRTcGVjOiBwcm9wcy5idWlsZFNwZWMgPyB0eXBlb2YgcHJvcHMuYnVpbGRTcGVjID09ICdvYmplY3QnID8gQnVpbGRTcGVjLmZyb21PYmplY3RUb1lhbWwocHJvcHMuYnVpbGRTcGVjKSA6IEJ1aWxkU3BlYy5mcm9tU291cmNlRmlsZW5hbWUocHJvcHMuYnVpbGRTcGVjID8/ICdidWlsZHNwZWMueW1sJykgOiB1bmRlZmluZWQsXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBidWlsZEltYWdlOiBidWlsZEltYWdlID8/IExpbnV4QnVpbGRJbWFnZS5TVEFOREFSRF83XzAsXG4gICAgICAgIGNvbXB1dGVUeXBlOiBDb21wdXRlVHlwZVtwcm9wcy5jb21wdXRlVHlwZSBhcyAoa2V5b2YgdHlwZW9mIENvbXB1dGVUeXBlIHwgdW5kZWZpbmVkKSA/PyAnU01BTEwnXSxcbiAgICAgICAgZW52aXJvbm1lbnRWYXJpYWJsZXM6IHByb3BzLmVudmlyb25tZW50VmFyaWFibGVzXG4gICAgICB9XG4gICAgfSk7XG4gICAgdGFnUmVzb3VyY2UodGhpcy5wcm9qZWN0LCBwcm9wcy50YWdzKTtcbiAgICBpZiAodHlwZW9mIHByb3BzLmRlc3Ryb3kgPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aGlzLnByb2plY3QuYXBwbHlSZW1vdmFsUG9saWN5KHByb3BzLmRlc3Ryb3kgPyBSZW1vdmFsUG9saWN5LkRFU1RST1kgOiBSZW1vdmFsUG9saWN5LlJFVEFJTik7XG4gICAgfVxuXG4gICAgLy8gQWRkIENsb3VkV2F0Y2ggbG9nIHBlcm1pc3Npb25zXG4gICAgdGhpcy5wcm9qZWN0LmFkZFRvUm9sZVBvbGljeShuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgJ2xvZ3M6Q3JlYXRlTG9nR3JvdXAnLFxuICAgICAgICAnbG9nczpDcmVhdGVMb2dTdHJlYW0nLFxuICAgICAgICAnbG9nczpQdXRMb2dFdmVudHMnXG4gICAgICBdLFxuICAgICAgcmVzb3VyY2VzOiBbdGhpcy5wcm9qZWN0LnByb2plY3RBcm5dXG4gICAgfSkpO1xuXG4gICAgLy8gQWxsb3cgdGhlIHByb2plY3QgdG8gY3JlYXRlIGFuIGludmFsaWRhdGlvblxuICAgIGlmIChwcm9wcy5jbG91ZEZyb250RGlzdHJpYnV0aW9uQXJuKSB7XG4gICAgICB0aGlzLnByb2plY3QuYWRkVG9Sb2xlUG9saWN5KG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbJ2Nsb3VkZnJvbnQ6Q3JlYXRlSW52YWxpZGF0aW9uJ10sXG4gICAgICAgIHJlc291cmNlczogW3Byb3BzLmNsb3VkRnJvbnREaXN0cmlidXRpb25Bcm5dXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgLy8gQWxsb3cgdGhlIHByb2plY3QgdG8gc3luYyBmaWxlcyB0byBTM1xuICAgIGlmIChwcm9wcy5zM0J1Y2tldE5hbWUpIHtcbiAgICAgIGNvbnN0IHMzQnVja2V0ID0gQnVja2V0LmZyb21CdWNrZXROYW1lKHRoaXMsICdTM0J1Y2tldEJ5TmFtZScsIHByb3BzLnMzQnVja2V0TmFtZSk7XG4gICAgICBzM0J1Y2tldC5ncmFudFJlYWRXcml0ZSh0aGlzLnByb2plY3QpO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5zc21QYXJhbWV0ZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIHByb3BzLnNzbVBhcmFtZXRlcnMpIHtcbiAgICAgICAgbGV0IHN0clBhcmFtOiBJU3RyaW5nUGFyYW1ldGVyO1xuICAgICAgICBpZiAocGFyYW0uZW5jcnlwdGVkKSB7XG4gICAgICAgICAgc3RyUGFyYW0gPSBTdHJpbmdQYXJhbWV0ZXIuZnJvbVNlY3VyZVN0cmluZ1BhcmFtZXRlckF0dHJpYnV0ZXModGhpcywgcGFyYW0ucGF0aCwge1xuICAgICAgICAgICAgcGFyYW1ldGVyTmFtZTogcGFyYW0ucGF0aCxcbiAgICAgICAgICAgIHZlcnNpb246IHBhcmFtLnZlcnNpb25cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHJQYXJhbSA9IFN0cmluZ1BhcmFtZXRlci5mcm9tU3RyaW5nUGFyYW1ldGVyQXR0cmlidXRlcyh0aGlzLCBwYXJhbS5wYXRoLCB7XG4gICAgICAgICAgICBwYXJhbWV0ZXJOYW1lOiBwYXJhbS5wYXRoLFxuICAgICAgICAgICAgdmVyc2lvbjogcGFyYW0udmVyc2lvblxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHN0clBhcmFtLmdyYW50UmVhZCh0aGlzLnByb2plY3QpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufSJdfQ==
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Construct } from 'constructs';
|
|
2
|
+
import { IProject } from "aws-cdk-lib/aws-codebuild";
|
|
3
|
+
import { Artifact, Pipeline } from "aws-cdk-lib/aws-codepipeline";
|
|
4
|
+
import { Bucket } from 'aws-cdk-lib/aws-s3';
|
|
5
|
+
import type { EnvironmentVariables } from './codebuild.js';
|
|
6
|
+
import { ResourceProps, SsmStringParameter } from "../lib/types.js";
|
|
7
|
+
export interface AddSourceStageParams {
|
|
8
|
+
stageName?: string;
|
|
9
|
+
codestarConnection: string | SsmStringParameter;
|
|
10
|
+
repoOwner: string;
|
|
11
|
+
repo: string;
|
|
12
|
+
branch: string;
|
|
13
|
+
artifactFormat: 'default' | 'fullClone';
|
|
14
|
+
}
|
|
15
|
+
export interface AddBuildStageParams {
|
|
16
|
+
stageName?: string;
|
|
17
|
+
codeBuildProject: IProject;
|
|
18
|
+
sourceArtifact: Artifact;
|
|
19
|
+
environmentVariables?: EnvironmentVariables;
|
|
20
|
+
}
|
|
21
|
+
export interface CodePipelineProjectProps extends ResourceProps {
|
|
22
|
+
pipelineName?: string;
|
|
23
|
+
}
|
|
24
|
+
export declare class CodePipelineProject extends Construct {
|
|
25
|
+
readonly s3Bucket: Bucket;
|
|
26
|
+
readonly pipeline: Pipeline;
|
|
27
|
+
constructor(scope: Construct, id: string, props: CodePipelineProjectProps);
|
|
28
|
+
addSourceStage(params: AddSourceStageParams): Artifact;
|
|
29
|
+
addBuildStage(params: AddBuildStageParams): void;
|
|
30
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { RemovalPolicy, PhysicalName } from "aws-cdk-lib";
|
|
2
|
+
import { Construct } from 'constructs';
|
|
3
|
+
import { Artifact, Pipeline } from "aws-cdk-lib/aws-codepipeline";
|
|
4
|
+
import { CodeBuildAction, CodeStarConnectionsSourceAction } from "aws-cdk-lib/aws-codepipeline-actions";
|
|
5
|
+
import { Bucket } from 'aws-cdk-lib/aws-s3';
|
|
6
|
+
import { StringParameter } from 'aws-cdk-lib/aws-ssm';
|
|
7
|
+
import { tagResource } from "../lib/tags.js";
|
|
8
|
+
export class CodePipelineProject extends Construct {
|
|
9
|
+
s3Bucket;
|
|
10
|
+
pipeline;
|
|
11
|
+
constructor(scope, id, props) {
|
|
12
|
+
super(scope, id);
|
|
13
|
+
this.s3Bucket = new Bucket(this, 'CodePipelineArtifactBucket', {
|
|
14
|
+
bucketName: PhysicalName.GENERATE_IF_NEEDED,
|
|
15
|
+
removalPolicy: props.destroy !== undefined ? props.destroy ? RemovalPolicy.DESTROY : RemovalPolicy.RETAIN : undefined,
|
|
16
|
+
autoDeleteObjects: props.destroy === true ? true : undefined
|
|
17
|
+
});
|
|
18
|
+
tagResource(this.s3Bucket, props.tags);
|
|
19
|
+
this.pipeline = new Pipeline(this, 'CodePipelineProject', {
|
|
20
|
+
pipelineName: props.pipelineName,
|
|
21
|
+
artifactBucket: this.s3Bucket
|
|
22
|
+
});
|
|
23
|
+
tagResource(this.pipeline, props.tags);
|
|
24
|
+
if (typeof props.destroy == 'boolean') {
|
|
25
|
+
this.pipeline.applyRemovalPolicy(props.destroy ? RemovalPolicy.DESTROY : RemovalPolicy.RETAIN);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
addSourceStage(params) {
|
|
29
|
+
const artifact = new Artifact();
|
|
30
|
+
const connectionArn = typeof params.codestarConnection == 'string' ?
|
|
31
|
+
params.codestarConnection :
|
|
32
|
+
StringParameter.valueForStringParameter(this, params.codestarConnection.path, params.codestarConnection.version);
|
|
33
|
+
this.pipeline.addStage({
|
|
34
|
+
stageName: params.stageName ?? 'Source',
|
|
35
|
+
actions: [
|
|
36
|
+
new CodeStarConnectionsSourceAction({
|
|
37
|
+
actionName: params.stageName ?? 'Source',
|
|
38
|
+
output: artifact,
|
|
39
|
+
connectionArn,
|
|
40
|
+
owner: params.repoOwner,
|
|
41
|
+
repo: params.repo,
|
|
42
|
+
branch: params.branch,
|
|
43
|
+
codeBuildCloneOutput: params.artifactFormat === 'fullClone'
|
|
44
|
+
})
|
|
45
|
+
]
|
|
46
|
+
});
|
|
47
|
+
return artifact;
|
|
48
|
+
}
|
|
49
|
+
addBuildStage(params) {
|
|
50
|
+
this.pipeline.addStage({
|
|
51
|
+
stageName: params.stageName ?? 'Build',
|
|
52
|
+
actions: [
|
|
53
|
+
new CodeBuildAction({
|
|
54
|
+
actionName: params.stageName ?? 'Build',
|
|
55
|
+
project: params.codeBuildProject,
|
|
56
|
+
input: params.sourceArtifact,
|
|
57
|
+
environmentVariables: params.environmentVariables
|
|
58
|
+
})
|
|
59
|
+
]
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZXBpcGVsaW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnN0cnVjdHMvY29kZXBpcGVsaW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFPLE1BQU0sYUFBYSxDQUFDO0FBQy9ELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFdkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZUFBZSxFQUFFLCtCQUErQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDeEcsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUd0RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFxQjdDLE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxTQUFTO0lBQ2hDLFFBQVEsQ0FBUztJQUNqQixRQUFRLENBQVc7SUFFbkMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUErQjtRQUN2RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLDRCQUE0QixFQUFFO1lBQzdELFVBQVUsRUFBRSxZQUFZLENBQUMsa0JBQWtCO1lBQzNDLGFBQWEsRUFBRSxLQUFLLENBQUMsT0FBTyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUztZQUNySCxpQkFBaUIsRUFBRSxLQUFLLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTO1NBQzdELENBQUMsQ0FBQztRQUNILFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV2QyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxxQkFBcUIsRUFBRTtZQUN4RCxZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVk7WUFDaEMsY0FBYyxFQUFFLElBQUksQ0FBQyxRQUFRO1NBQzlCLENBQUMsQ0FBQztRQUVILFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QyxJQUFJLE9BQU8sS0FBSyxDQUFDLE9BQU8sSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqRyxDQUFDO0lBQ0gsQ0FBQztJQUVELGNBQWMsQ0FBQyxNQUE0QjtRQUN6QyxNQUFNLFFBQVEsR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBRWhDLE1BQU0sYUFBYSxHQUFXLE9BQU8sTUFBTSxDQUFDLGtCQUFrQixJQUFJLFFBQVEsQ0FBQyxDQUFDO1lBQ3pFLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQzNCLGVBQWUsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLEVBQUcsTUFBTSxDQUFDLGtCQUF5QyxDQUFDLElBQUksRUFBRyxNQUFNLENBQUMsa0JBQXlDLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFcEssSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFDckIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTLElBQUksUUFBUTtZQUN2QyxPQUFPLEVBQUU7Z0JBQ1AsSUFBSSwrQkFBK0IsQ0FBQztvQkFDbEMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxTQUFTLElBQUksUUFBUTtvQkFDeEMsTUFBTSxFQUFFLFFBQVE7b0JBQ2hCLGFBQWE7b0JBQ2IsS0FBSyxFQUFFLE1BQU0sQ0FBQyxTQUFTO29CQUN2QixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7b0JBQ2pCLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtvQkFDckIsb0JBQW9CLEVBQUUsTUFBTSxDQUFDLGNBQWMsS0FBSyxXQUFXO2lCQUM1RCxDQUFDO2FBQ0g7U0FDRixDQUFDLENBQUM7UUFDSCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsYUFBYSxDQUFDLE1BQTJCO1FBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1lBQ3JCLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUyxJQUFJLE9BQU87WUFDdEMsT0FBTyxFQUFFO2dCQUNQLElBQUksZUFBZSxDQUFDO29CQUNsQixVQUFVLEVBQUUsTUFBTSxDQUFDLFNBQVMsSUFBSSxPQUFPO29CQUN2QyxPQUFPLEVBQUUsTUFBTSxDQUFDLGdCQUFnQjtvQkFDaEMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxjQUFjO29CQUM1QixvQkFBb0IsRUFBRSxNQUFNLENBQUMsb0JBQW9CO2lCQUNsRCxDQUFDO2FBQ0g7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZW1vdmFsUG9saWN5LCBQaHlzaWNhbE5hbWUsIEF3cyB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBJUHJvamVjdCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY29kZWJ1aWxkXCI7XG5pbXBvcnQgeyBBcnRpZmFjdCwgUGlwZWxpbmUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNvZGVwaXBlbGluZVwiO1xuaW1wb3J0IHsgQ29kZUJ1aWxkQWN0aW9uLCBDb2RlU3RhckNvbm5lY3Rpb25zU291cmNlQWN0aW9uIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jb2RlcGlwZWxpbmUtYWN0aW9uc1wiO1xuaW1wb3J0IHsgQnVja2V0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCB7IFN0cmluZ1BhcmFtZXRlciB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zc20nO1xuXG5pbXBvcnQgdHlwZSB7IEVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnLi9jb2RlYnVpbGQuanMnO1xuaW1wb3J0IHsgdGFnUmVzb3VyY2UgfSBmcm9tIFwiLi4vbGliL3RhZ3MuanNcIjtcbmltcG9ydCB7IFJlc291cmNlUHJvcHMsIFNzbVN0cmluZ1BhcmFtZXRlciB9IGZyb20gXCIuLi9saWIvdHlwZXMuanNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBBZGRTb3VyY2VTdGFnZVBhcmFtcyB7XG4gIHN0YWdlTmFtZT86IHN0cmluZztcbiAgY29kZXN0YXJDb25uZWN0aW9uOiBzdHJpbmcgfCBTc21TdHJpbmdQYXJhbWV0ZXI7XG4gIHJlcG9Pd25lcjogc3RyaW5nO1xuICByZXBvOiBzdHJpbmc7XG4gIGJyYW5jaDogc3RyaW5nO1xuICBhcnRpZmFjdEZvcm1hdDogJ2RlZmF1bHQnIHwgJ2Z1bGxDbG9uZSdcbn1cbmV4cG9ydCBpbnRlcmZhY2UgQWRkQnVpbGRTdGFnZVBhcmFtcyB7XG4gIHN0YWdlTmFtZT86IHN0cmluZztcbiAgY29kZUJ1aWxkUHJvamVjdDogSVByb2plY3Q7XG4gIHNvdXJjZUFydGlmYWN0OiBBcnRpZmFjdDtcbiAgZW52aXJvbm1lbnRWYXJpYWJsZXM/OiBFbnZpcm9ubWVudFZhcmlhYmxlcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2RlUGlwZWxpbmVQcm9qZWN0UHJvcHMgZXh0ZW5kcyBSZXNvdXJjZVByb3BzIHtcbiAgcGlwZWxpbmVOYW1lPzogc3RyaW5nO1xufVxuZXhwb3J0IGNsYXNzIENvZGVQaXBlbGluZVByb2plY3QgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgczNCdWNrZXQ6IEJ1Y2tldDtcbiAgcHVibGljIHJlYWRvbmx5IHBpcGVsaW5lOiBQaXBlbGluZTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQ29kZVBpcGVsaW5lUHJvamVjdFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMuczNCdWNrZXQgPSBuZXcgQnVja2V0KHRoaXMsICdDb2RlUGlwZWxpbmVBcnRpZmFjdEJ1Y2tldCcsIHtcbiAgICAgIGJ1Y2tldE5hbWU6IFBoeXNpY2FsTmFtZS5HRU5FUkFURV9JRl9ORUVERUQsXG4gICAgICByZW1vdmFsUG9saWN5OiBwcm9wcy5kZXN0cm95ICE9PSB1bmRlZmluZWQgPyBwcm9wcy5kZXN0cm95ID8gUmVtb3ZhbFBvbGljeS5ERVNUUk9ZIDogUmVtb3ZhbFBvbGljeS5SRVRBSU4gOiB1bmRlZmluZWQsXG4gICAgICBhdXRvRGVsZXRlT2JqZWN0czogcHJvcHMuZGVzdHJveSA9PT0gdHJ1ZSA/IHRydWUgOiB1bmRlZmluZWRcbiAgICB9KTtcbiAgICB0YWdSZXNvdXJjZSh0aGlzLnMzQnVja2V0LCBwcm9wcy50YWdzKTtcblxuICAgIHRoaXMucGlwZWxpbmUgPSBuZXcgUGlwZWxpbmUodGhpcywgJ0NvZGVQaXBlbGluZVByb2plY3QnLCB7XG4gICAgICBwaXBlbGluZU5hbWU6IHByb3BzLnBpcGVsaW5lTmFtZSxcbiAgICAgIGFydGlmYWN0QnVja2V0OiB0aGlzLnMzQnVja2V0XG4gICAgfSk7XG5cbiAgICB0YWdSZXNvdXJjZSh0aGlzLnBpcGVsaW5lLCBwcm9wcy50YWdzKTtcbiAgICBpZiAodHlwZW9mIHByb3BzLmRlc3Ryb3kgPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aGlzLnBpcGVsaW5lLmFwcGx5UmVtb3ZhbFBvbGljeShwcm9wcy5kZXN0cm95ID8gUmVtb3ZhbFBvbGljeS5ERVNUUk9ZIDogUmVtb3ZhbFBvbGljeS5SRVRBSU4pO1xuICAgIH1cbiAgfVxuXG4gIGFkZFNvdXJjZVN0YWdlKHBhcmFtczogQWRkU291cmNlU3RhZ2VQYXJhbXMpOiBBcnRpZmFjdCB7XG4gICAgY29uc3QgYXJ0aWZhY3QgPSBuZXcgQXJ0aWZhY3QoKTtcblxuICAgIGNvbnN0IGNvbm5lY3Rpb25Bcm46IHN0cmluZyA9IHR5cGVvZiBwYXJhbXMuY29kZXN0YXJDb25uZWN0aW9uID09ICdzdHJpbmcnID9cbiAgICAgICBwYXJhbXMuY29kZXN0YXJDb25uZWN0aW9uIDpcbiAgICAgICBTdHJpbmdQYXJhbWV0ZXIudmFsdWVGb3JTdHJpbmdQYXJhbWV0ZXIodGhpcywgKHBhcmFtcy5jb2Rlc3RhckNvbm5lY3Rpb24gYXMgU3NtU3RyaW5nUGFyYW1ldGVyKS5wYXRoLCAocGFyYW1zLmNvZGVzdGFyQ29ubmVjdGlvbiBhcyBTc21TdHJpbmdQYXJhbWV0ZXIpLnZlcnNpb24pO1xuXG4gICAgdGhpcy5waXBlbGluZS5hZGRTdGFnZSh7XG4gICAgICBzdGFnZU5hbWU6IHBhcmFtcy5zdGFnZU5hbWUgPz8gJ1NvdXJjZScsXG4gICAgICBhY3Rpb25zOiBbXG4gICAgICAgIG5ldyBDb2RlU3RhckNvbm5lY3Rpb25zU291cmNlQWN0aW9uKHtcbiAgICAgICAgICBhY3Rpb25OYW1lOiBwYXJhbXMuc3RhZ2VOYW1lID8/ICdTb3VyY2UnLFxuICAgICAgICAgIG91dHB1dDogYXJ0aWZhY3QsXG4gICAgICAgICAgY29ubmVjdGlvbkFybixcbiAgICAgICAgICBvd25lcjogcGFyYW1zLnJlcG9Pd25lcixcbiAgICAgICAgICByZXBvOiBwYXJhbXMucmVwbyxcbiAgICAgICAgICBicmFuY2g6IHBhcmFtcy5icmFuY2gsXG4gICAgICAgICAgY29kZUJ1aWxkQ2xvbmVPdXRwdXQ6IHBhcmFtcy5hcnRpZmFjdEZvcm1hdCA9PT0gJ2Z1bGxDbG9uZSdcbiAgICAgICAgfSlcbiAgICAgIF1cbiAgICB9KTtcbiAgICByZXR1cm4gYXJ0aWZhY3Q7XG4gIH1cblxuICBhZGRCdWlsZFN0YWdlKHBhcmFtczogQWRkQnVpbGRTdGFnZVBhcmFtcykge1xuICAgIHRoaXMucGlwZWxpbmUuYWRkU3RhZ2Uoe1xuICAgICAgc3RhZ2VOYW1lOiBwYXJhbXMuc3RhZ2VOYW1lID8/ICdCdWlsZCcsXG4gICAgICBhY3Rpb25zOiBbXG4gICAgICAgIG5ldyBDb2RlQnVpbGRBY3Rpb24oe1xuICAgICAgICAgIGFjdGlvbk5hbWU6IHBhcmFtcy5zdGFnZU5hbWUgPz8gJ0J1aWxkJyxcbiAgICAgICAgICBwcm9qZWN0OiBwYXJhbXMuY29kZUJ1aWxkUHJvamVjdCxcbiAgICAgICAgICBpbnB1dDogcGFyYW1zLnNvdXJjZUFydGlmYWN0LFxuICAgICAgICAgIGVudmlyb25tZW50VmFyaWFibGVzOiBwYXJhbXMuZW52aXJvbm1lbnRWYXJpYWJsZXNcbiAgICAgICAgfSlcbiAgICAgIF1cbiAgICB9KTtcbiAgfVxufSJdfQ==
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { IDistribution } from "aws-cdk-lib/aws-cloudfront";
|
|
2
|
+
import { ARecord, AaaaRecord, IHostedZone } from "aws-cdk-lib/aws-route53";
|
|
3
|
+
import { Construct } from "constructs";
|
|
4
|
+
export interface CloudFrontAliasProps {
|
|
5
|
+
hostedZone: IHostedZone;
|
|
6
|
+
domainName: string;
|
|
7
|
+
distribution: IDistribution;
|
|
8
|
+
}
|
|
9
|
+
export declare class CloudFrontAlias extends Construct {
|
|
10
|
+
readonly aRecord: ARecord;
|
|
11
|
+
readonly aaaaRecord: AaaaRecord;
|
|
12
|
+
constructor(scope: Construct, id: string, props: CloudFrontAliasProps);
|
|
13
|
+
}
|
|
14
|
+
export declare function getHostedZone(scope: Construct, id: string, domainName: string): IHostedZone;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ARecord, AaaaRecord, HostedZone, RecordTarget } from "aws-cdk-lib/aws-route53";
|
|
2
|
+
import { CloudFrontTarget } from "aws-cdk-lib/aws-route53-targets";
|
|
3
|
+
import { Construct } from "constructs";
|
|
4
|
+
export class CloudFrontAlias extends Construct {
|
|
5
|
+
aRecord;
|
|
6
|
+
aaaaRecord;
|
|
7
|
+
constructor(scope, id, props) {
|
|
8
|
+
super(scope, id);
|
|
9
|
+
this.aRecord = new ARecord(this, `ARecord-${props.domainName}`, {
|
|
10
|
+
zone: props.hostedZone,
|
|
11
|
+
target: RecordTarget.fromAlias(new CloudFrontTarget(props.distribution)),
|
|
12
|
+
recordName: props.domainName
|
|
13
|
+
});
|
|
14
|
+
this.aaaaRecord = new AaaaRecord(this, `AaaaRecord-${props.domainName}`, {
|
|
15
|
+
zone: props.hostedZone,
|
|
16
|
+
target: RecordTarget.fromAlias(new CloudFrontTarget(props.distribution)),
|
|
17
|
+
recordName: props.domainName
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export function getHostedZone(scope, id, domainName) {
|
|
22
|
+
return HostedZone.fromLookup(scope, `getHostedZone-${domainName}`, { domainName });
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGU1My5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25zdHJ1Y3RzL3JvdXRlNTMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFlLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3JHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFPdkMsTUFBTSxPQUFPLGVBQWdCLFNBQVEsU0FBUztJQUM1QixPQUFPLENBQVU7SUFDakIsVUFBVSxDQUFhO0lBRXZDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMkI7UUFDbkUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxXQUFXLEtBQUssQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUM5RCxJQUFJLEVBQUUsS0FBSyxDQUFDLFVBQVU7WUFDdEIsTUFBTSxFQUFFLFlBQVksQ0FBQyxTQUFTLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDeEUsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO1NBQzdCLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFLGNBQWMsS0FBSyxDQUFDLFVBQVUsRUFBRSxFQUFFO1lBQ3ZFLElBQUksRUFBRSxLQUFLLENBQUMsVUFBVTtZQUN0QixNQUFNLEVBQUUsWUFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFJLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN4RSxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7U0FDN0IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxLQUFnQixFQUFFLEVBQVUsRUFBRSxVQUFrQjtJQUM1RSxPQUFPLFVBQVUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLGlCQUFpQixVQUFVLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7QUFDckYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElEaXN0cmlidXRpb24gfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnRcIjtcbmltcG9ydCB7IEFSZWNvcmQsIEFhYWFSZWNvcmQsIEhvc3RlZFpvbmUsIElIb3N0ZWRab25lLCBSZWNvcmRUYXJnZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTNcIjtcbmltcG9ydCB7IENsb3VkRnJvbnRUYXJnZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTMtdGFyZ2V0c1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBDbG91ZEZyb250QWxpYXNQcm9wcyB7XG4gIGhvc3RlZFpvbmU6IElIb3N0ZWRab25lO1xuICBkb21haW5OYW1lOiBzdHJpbmc7XG4gIGRpc3RyaWJ1dGlvbjogSURpc3RyaWJ1dGlvbjsgXG59XG5leHBvcnQgY2xhc3MgQ2xvdWRGcm9udEFsaWFzIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGFSZWNvcmQ6IEFSZWNvcmQ7XG4gIHB1YmxpYyByZWFkb25seSBhYWFhUmVjb3JkOiBBYWFhUmVjb3JkO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBDbG91ZEZyb250QWxpYXNQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLmFSZWNvcmQgPSBuZXcgQVJlY29yZCh0aGlzLCBgQVJlY29yZC0ke3Byb3BzLmRvbWFpbk5hbWV9YCwge1xuICAgICAgem9uZTogcHJvcHMuaG9zdGVkWm9uZSxcbiAgICAgIHRhcmdldDogUmVjb3JkVGFyZ2V0LmZyb21BbGlhcyhuZXcgQ2xvdWRGcm9udFRhcmdldChwcm9wcy5kaXN0cmlidXRpb24pKSxcbiAgICAgIHJlY29yZE5hbWU6IHByb3BzLmRvbWFpbk5hbWVcbiAgICB9KTtcblxuICAgIHRoaXMuYWFhYVJlY29yZCA9IG5ldyBBYWFhUmVjb3JkKHRoaXMsIGBBYWFhUmVjb3JkLSR7cHJvcHMuZG9tYWluTmFtZX1gLCB7XG4gICAgICB6b25lOiBwcm9wcy5ob3N0ZWRab25lLFxuICAgICAgdGFyZ2V0OiBSZWNvcmRUYXJnZXQuZnJvbUFsaWFzKG5ldyBDbG91ZEZyb250VGFyZ2V0KHByb3BzLmRpc3RyaWJ1dGlvbikpLFxuICAgICAgcmVjb3JkTmFtZTogcHJvcHMuZG9tYWluTmFtZVxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRIb3N0ZWRab25lKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGRvbWFpbk5hbWU6IHN0cmluZykge1xuICByZXR1cm4gSG9zdGVkWm9uZS5mcm9tTG9va3VwKHNjb3BlLCBgZ2V0SG9zdGVkWm9uZS0ke2RvbWFpbk5hbWV9YCwgeyBkb21haW5OYW1lIH0pO1xufSJdfQ==
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Construct } from 'constructs';
|
|
2
|
+
import { Bucket } from 'aws-cdk-lib/aws-s3';
|
|
3
|
+
import { ResourceProps } from "../lib/types.js";
|
|
4
|
+
export interface S3BucketProps extends ResourceProps {
|
|
5
|
+
/** The name of the S3 bucket */
|
|
6
|
+
bucketName?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare class S3Bucket extends Construct {
|
|
9
|
+
readonly bucket: Bucket;
|
|
10
|
+
constructor(scope: Construct, id: string, props: S3BucketProps);
|
|
11
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { RemovalPolicy } from "aws-cdk-lib";
|
|
2
|
+
import { Construct } from 'constructs';
|
|
3
|
+
import { Bucket } from 'aws-cdk-lib/aws-s3';
|
|
4
|
+
import { tagResource } from '../lib/tags.js';
|
|
5
|
+
export class S3Bucket extends Construct {
|
|
6
|
+
bucket;
|
|
7
|
+
constructor(scope, id, props) {
|
|
8
|
+
super(scope, id);
|
|
9
|
+
this.bucket = new Bucket(this, 'S3Bucket', {
|
|
10
|
+
bucketName: props.bucketName,
|
|
11
|
+
removalPolicy: props.destroy !== undefined ? props.destroy ? RemovalPolicy.DESTROY : RemovalPolicy.RETAIN : undefined,
|
|
12
|
+
autoDeleteObjects: props.destroy === true ? true : undefined
|
|
13
|
+
});
|
|
14
|
+
tagResource(this.bucket, props.tags);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiczMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uc3RydWN0cy9zMy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDdkMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQVE3QyxNQUFNLE9BQU8sUUFBUyxTQUFRLFNBQVM7SUFDckIsTUFBTSxDQUFTO0lBRS9CLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBb0I7UUFDNUQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDekMsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO1lBQzVCLGFBQWEsRUFBRSxLQUFLLENBQUMsT0FBTyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUztZQUNySCxpQkFBaUIsRUFBRSxLQUFLLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTO1NBQzdELENBQUMsQ0FBQztRQUNILFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZW1vdmFsUG9saWN5IH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IEJ1Y2tldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgeyB0YWdSZXNvdXJjZSB9IGZyb20gJy4uL2xpYi90YWdzLmpzJztcbmltcG9ydCB7IFJlc291cmNlUHJvcHMgfSBmcm9tIFwiLi4vbGliL3R5cGVzLmpzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUzNCdWNrZXRQcm9wcyBleHRlbmRzIFJlc291cmNlUHJvcHMge1xuICAvKiogVGhlIG5hbWUgb2YgdGhlIFMzIGJ1Y2tldCAqL1xuICBidWNrZXROYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgUzNCdWNrZXQgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgYnVja2V0OiBCdWNrZXQ7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFMzQnVja2V0UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5idWNrZXQgPSBuZXcgQnVja2V0KHRoaXMsICdTM0J1Y2tldCcsIHtcbiAgICAgIGJ1Y2tldE5hbWU6IHByb3BzLmJ1Y2tldE5hbWUsXG4gICAgICByZW1vdmFsUG9saWN5OiBwcm9wcy5kZXN0cm95ICE9PSB1bmRlZmluZWQgPyBwcm9wcy5kZXN0cm95ID8gUmVtb3ZhbFBvbGljeS5ERVNUUk9ZIDogUmVtb3ZhbFBvbGljeS5SRVRBSU4gOiB1bmRlZmluZWQsXG4gICAgICBhdXRvRGVsZXRlT2JqZWN0czogcHJvcHMuZGVzdHJveSA9PT0gdHJ1ZSA/IHRydWUgOiB1bmRlZmluZWRcbiAgICB9KTtcbiAgICB0YWdSZXNvdXJjZSh0aGlzLmJ1Y2tldCwgcHJvcHMudGFncyk7XG4gIH1cbn0iXX0=
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Construct } from 'constructs';
|
|
2
|
+
import { StringParameter } from 'aws-cdk-lib/aws-ssm';
|
|
3
|
+
interface CreateStringParameterProps {
|
|
4
|
+
parameterName: string;
|
|
5
|
+
stringValue: string;
|
|
6
|
+
overwrite?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function createStringParameter(scope: Construct, id: string, { parameterName, stringValue, overwrite }: CreateStringParameterProps): StringParameter | undefined;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { StringParameter } from 'aws-cdk-lib/aws-ssm';
|
|
2
|
+
export function createStringParameter(scope, id, { parameterName, stringValue, overwrite = false }) {
|
|
3
|
+
let param = undefined;
|
|
4
|
+
let flag = overwrite;
|
|
5
|
+
if (!flag) {
|
|
6
|
+
const existingValue = StringParameter.valueFromLookup(scope, parameterName, 'a8a79532-4163-46b9-a907-429dad04e93b');
|
|
7
|
+
flag = existingValue === 'a8a79532-4163-46b9-a907-429dad04e93b';
|
|
8
|
+
}
|
|
9
|
+
if (flag) {
|
|
10
|
+
param = new StringParameter(scope, id, {
|
|
11
|
+
parameterName,
|
|
12
|
+
stringValue
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
return param;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3NtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnN0cnVjdHMvc3NtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQU90RCxNQUFNLFVBQVUscUJBQXFCLENBQUMsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLFNBQVMsR0FBRyxLQUFLLEVBQThCO0lBQy9JLElBQUksS0FBSyxHQUFnQyxTQUFTLENBQUM7SUFDbkQsSUFBSSxJQUFJLEdBQUcsU0FBUyxDQUFDO0lBQ3JCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNWLE1BQU0sYUFBYSxHQUFHLGVBQWUsQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRSxzQ0FBc0MsQ0FBQyxDQUFDO1FBQ3BILElBQUksR0FBRyxhQUFhLEtBQUssc0NBQXNDLENBQUM7SUFDbEUsQ0FBQztJQUNELElBQUksSUFBSSxFQUFFLENBQUM7UUFDVCxLQUFLLEdBQUcsSUFBSSxlQUFlLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNyQyxhQUFhO1lBQ2IsV0FBVztTQUNaLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgU3RyaW5nUGFyYW1ldGVyIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXNzbSc7XG5cbmludGVyZmFjZSBDcmVhdGVTdHJpbmdQYXJhbWV0ZXJQcm9wcyB7XG4gIHBhcmFtZXRlck5hbWU6IHN0cmluZztcbiAgc3RyaW5nVmFsdWU6IHN0cmluZztcbiAgb3ZlcndyaXRlPzogYm9vbGVhbjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTdHJpbmdQYXJhbWV0ZXIoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgeyBwYXJhbWV0ZXJOYW1lLCBzdHJpbmdWYWx1ZSwgb3ZlcndyaXRlID0gZmFsc2UgfTogQ3JlYXRlU3RyaW5nUGFyYW1ldGVyUHJvcHMpOiBTdHJpbmdQYXJhbWV0ZXIgfCB1bmRlZmluZWQge1xuICBsZXQgcGFyYW06IFN0cmluZ1BhcmFtZXRlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgbGV0IGZsYWcgPSBvdmVyd3JpdGU7XG4gIGlmICghZmxhZykge1xuICAgIGNvbnN0IGV4aXN0aW5nVmFsdWUgPSBTdHJpbmdQYXJhbWV0ZXIudmFsdWVGcm9tTG9va3VwKHNjb3BlLCBwYXJhbWV0ZXJOYW1lLCAnYThhNzk1MzItNDE2My00NmI5LWE5MDctNDI5ZGFkMDRlOTNiJyk7XG4gICAgZmxhZyA9IGV4aXN0aW5nVmFsdWUgPT09ICdhOGE3OTUzMi00MTYzLTQ2YjktYTkwNy00MjlkYWQwNGU5M2InO1xuICB9XG4gIGlmIChmbGFnKSB7XG4gICAgcGFyYW0gPSBuZXcgU3RyaW5nUGFyYW1ldGVyKHNjb3BlLCBpZCwge1xuICAgICAgcGFyYW1ldGVyTmFtZSxcbiAgICAgIHN0cmluZ1ZhbHVlXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHBhcmFtO1xufSJdfQ==
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Construct } from 'constructs';
|
|
2
|
+
import { CfnWebACL } from 'aws-cdk-lib/aws-wafv2';
|
|
3
|
+
import type { ResourceProps } from '../lib/types.js';
|
|
4
|
+
export type WebAclManagedRule = 'AWSManagedRulesAmazonIpReputationList' | 'AWSManagedRulesAnonymousIpList' | 'AWSManagedRulesAntiDDoSRuleSet' | 'AWSManagedRulesBotControlRuleSet' | 'AWSManagedRulesCommonRuleSet' | 'AWSManagedRulesKnownBadInputsRuleSet' | 'AWSManagedRulesSQLiRuleSet';
|
|
5
|
+
export interface CloudFrontWebAclProps extends ResourceProps {
|
|
6
|
+
name: string;
|
|
7
|
+
managedRules?: (WebAclManagedRule & string)[];
|
|
8
|
+
}
|
|
9
|
+
export declare class CloudFrontWebAcl extends Construct {
|
|
10
|
+
readonly acl: CfnWebACL;
|
|
11
|
+
constructor(scope: Construct, id: string, props: CloudFrontWebAclProps);
|
|
12
|
+
}
|
|
13
|
+
export interface ApiGatewayWebAclProps extends ResourceProps {
|
|
14
|
+
name: string;
|
|
15
|
+
aclScope?: 'CLOUDFRONT' | 'REGIONAL';
|
|
16
|
+
managedRules?: (WebAclManagedRule & string)[];
|
|
17
|
+
}
|
|
18
|
+
export declare class ApiGatewayWebAcl extends Construct {
|
|
19
|
+
readonly acl: CfnWebACL;
|
|
20
|
+
constructor(scope: Construct, id: string, props: ApiGatewayWebAclProps);
|
|
21
|
+
}
|