@fjall/components-infrastructure 0.86.1 → 0.87.3
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/README.md +3 -3
- package/dist/lib/app.d.ts +166 -6
- package/dist/lib/app.js +212 -20
- package/dist/lib/aspects/resourceInventory.d.ts +4 -4
- package/dist/lib/aspects/resourceInventory.js +3 -3
- package/dist/lib/config/aws/backupGlobalSettings.js +1 -2
- package/dist/lib/config/aws/identityCenter.js +1 -5
- package/dist/lib/config/aws/organisation.js +1 -4
- package/dist/lib/index.d.ts +1 -0
- package/dist/lib/index.js +7 -1
- package/dist/lib/patterns/aws/buildkite.js +3 -2
- package/dist/lib/patterns/aws/cdn.d.ts +164 -0
- package/dist/lib/patterns/aws/cdn.js +264 -0
- package/dist/lib/patterns/aws/compute.d.ts +278 -59
- package/dist/lib/patterns/aws/compute.js +384 -188
- package/dist/lib/patterns/aws/connections.d.ts +46 -0
- package/dist/lib/patterns/aws/connections.js +159 -0
- package/dist/lib/patterns/aws/database.d.ts +124 -11
- package/dist/lib/patterns/aws/database.js +188 -66
- package/dist/lib/patterns/aws/hostedZone.js +1 -1
- package/dist/lib/patterns/aws/index.d.ts +3 -0
- package/dist/lib/patterns/aws/index.js +4 -1
- package/dist/lib/patterns/aws/interfaces/compute.d.ts +121 -0
- package/dist/lib/patterns/aws/interfaces/compute.js +48 -0
- package/dist/lib/patterns/aws/interfaces/connector.d.ts +183 -0
- package/dist/lib/patterns/aws/interfaces/connector.js +117 -0
- package/dist/lib/patterns/aws/interfaces/database.d.ts +136 -0
- package/dist/lib/patterns/aws/interfaces/database.js +65 -0
- package/dist/lib/patterns/aws/interfaces/index.d.ts +12 -0
- package/dist/lib/patterns/aws/interfaces/index.js +49 -0
- package/dist/lib/patterns/aws/interfaces/messaging.d.ts +146 -0
- package/dist/lib/patterns/aws/interfaces/messaging.js +56 -0
- package/dist/lib/patterns/aws/interfaces/pattern.d.ts +403 -0
- package/dist/lib/patterns/aws/interfaces/pattern.js +36 -0
- package/dist/lib/patterns/aws/interfaces/storage.d.ts +136 -0
- package/dist/lib/patterns/aws/interfaces/storage.js +48 -0
- package/dist/lib/patterns/aws/messaging.d.ts +183 -0
- package/dist/lib/patterns/aws/messaging.js +239 -0
- package/dist/lib/patterns/aws/network.js +4 -4
- package/dist/lib/patterns/aws/pattern.d.ts +67 -0
- package/dist/lib/patterns/aws/pattern.js +69 -0
- package/dist/lib/patterns/aws/payload.d.ts +87 -0
- package/dist/lib/patterns/aws/payload.js +526 -0
- package/dist/lib/patterns/aws/storage.d.ts +127 -15
- package/dist/lib/patterns/aws/storage.js +234 -38
- package/dist/lib/resources/aws/backup/backupPlan.js +1 -6
- package/dist/lib/resources/aws/backup/backupVault.js +1 -2
- package/dist/lib/resources/aws/base/awsStack.d.ts +0 -2
- package/dist/lib/resources/aws/base/awsStack.js +1 -7
- package/dist/lib/resources/aws/cdn/cloudFront.d.ts +71 -0
- package/dist/lib/resources/aws/cdn/cloudFront.js +176 -0
- package/dist/lib/resources/aws/cdn/index.d.ts +1 -0
- package/dist/lib/resources/aws/cdn/index.js +18 -0
- package/dist/lib/resources/aws/compute/ec2.d.ts +5 -0
- package/dist/lib/resources/aws/compute/ec2.js +33 -6
- package/dist/lib/resources/aws/compute/ecs.d.ts +32 -25
- package/dist/lib/resources/aws/compute/ecs.js +31 -115
- package/dist/lib/resources/aws/compute/lambda.d.ts +94 -5
- package/dist/lib/resources/aws/compute/lambda.js +209 -32
- package/dist/lib/resources/aws/database/database.js +1 -1
- package/dist/lib/resources/aws/database/dynamodb.d.ts +70 -0
- package/dist/lib/resources/aws/database/dynamodb.js +181 -0
- package/dist/lib/resources/aws/database/index.d.ts +1 -0
- package/dist/lib/resources/aws/database/index.js +2 -1
- package/dist/lib/resources/aws/database/migrationLambda.d.ts +80 -0
- package/dist/lib/resources/aws/database/migrationLambda.js +119 -0
- package/dist/lib/resources/aws/database/rdsAurora.d.ts +15 -0
- package/dist/lib/resources/aws/database/rdsAurora.js +41 -18
- package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +12 -8
- package/dist/lib/resources/aws/database/rdsInstance.js +2 -2
- package/dist/lib/resources/aws/index.d.ts +2 -0
- package/dist/lib/resources/aws/index.js +3 -1
- package/dist/lib/resources/aws/messaging/eventbridge.d.ts +28 -0
- package/dist/lib/resources/aws/messaging/eventbridge.js +53 -0
- package/dist/lib/resources/aws/messaging/index.d.ts +3 -0
- package/dist/lib/resources/aws/messaging/index.js +20 -0
- package/dist/lib/resources/aws/messaging/sns.d.ts +35 -0
- package/dist/lib/resources/aws/messaging/sns.js +70 -0
- package/dist/lib/resources/aws/messaging/sqs.d.ts +105 -0
- package/dist/lib/resources/aws/messaging/sqs.js +231 -0
- package/dist/lib/resources/aws/messaging/utils.d.ts +3 -0
- package/dist/lib/resources/aws/messaging/utils.js +7 -0
- package/dist/lib/resources/aws/networking/ipam.js +1 -2
- package/dist/lib/resources/aws/networking/ipamPool.js +3 -2
- package/dist/lib/resources/aws/networking/vpc.js +1 -2
- package/dist/lib/resources/aws/storage/ecr.js +8 -5
- package/dist/lib/resources/aws/storage/s3.js +1 -2
- package/dist/lib/resources/aws/utilities/awsCustomResource.js +1 -1
- package/dist/lib/resources/aws/utilities/customResource.js +1 -1
- package/dist/lib/utils/getConfig.js +3 -2
- package/dist/lib/utils/index.d.ts +1 -0
- package/dist/lib/utils/index.js +2 -1
- package/dist/lib/utils/manifestWriter.d.ts +174 -0
- package/dist/lib/utils/manifestWriter.js +233 -0
- package/dist/lib/utils/standardTagsAspect.js +1 -8
- package/dist/lib/utils/validationLogger.d.ts +34 -0
- package/dist/lib/utils/validationLogger.js +83 -0
- package/package.json +3 -3
- package/dist/lib/__tests__/setup.d.ts +0 -48
- package/dist/lib/__tests__/setup.js +0 -1
- package/dist/lib/patterns/aws/cicdRole.d.ts +0 -67
- package/dist/lib/patterns/aws/cicdRole.js +0 -68
- package/dist/lib/resources/aws/cicd/cicdRole.d.ts +0 -65
- package/dist/lib/resources/aws/cicd/cicdRole.js +0 -191
- package/dist/lib/resources/aws/compute/ecsFreeTier.d.ts +0 -75
- package/dist/lib/resources/aws/compute/ecsFreeTier.js +0 -1
- package/dist/lib/resources/aws/compute/ecsSpot.d.ts +0 -75
- package/dist/lib/resources/aws/compute/ecsSpot.js +0 -1
- package/dist/lib/resources/aws/compute/utilities/capacityProviderDrainWaiter.d.ts +0 -20
- package/dist/lib/resources/aws/compute/utilities/capacityProviderDrainWaiter.js +0 -1
- package/dist/lib/resources/aws/utilities/cfnOutput.d.ts +0 -5
- package/dist/lib/resources/aws/utilities/cfnOutput.js +0 -1
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DynamoDBTable = void 0;
|
|
4
|
+
const constructs_1 = require("constructs");
|
|
5
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
6
|
+
const aws_dynamodb_1 = require("aws-cdk-lib/aws-dynamodb");
|
|
7
|
+
function toAttributeType(type) {
|
|
8
|
+
switch (type) {
|
|
9
|
+
case "S":
|
|
10
|
+
return aws_dynamodb_1.AttributeType.STRING;
|
|
11
|
+
case "N":
|
|
12
|
+
return aws_dynamodb_1.AttributeType.NUMBER;
|
|
13
|
+
case "B":
|
|
14
|
+
return aws_dynamodb_1.AttributeType.BINARY;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function toBillingMode(mode) {
|
|
18
|
+
switch (mode) {
|
|
19
|
+
case "PROVISIONED":
|
|
20
|
+
return aws_dynamodb_1.BillingMode.PROVISIONED;
|
|
21
|
+
case "PAY_PER_REQUEST":
|
|
22
|
+
default:
|
|
23
|
+
return aws_dynamodb_1.BillingMode.PAY_PER_REQUEST;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function toStreamViewType(stream) {
|
|
27
|
+
switch (stream) {
|
|
28
|
+
case "NEW_IMAGE":
|
|
29
|
+
return aws_dynamodb_1.StreamViewType.NEW_IMAGE;
|
|
30
|
+
case "OLD_IMAGE":
|
|
31
|
+
return aws_dynamodb_1.StreamViewType.OLD_IMAGE;
|
|
32
|
+
case "NEW_AND_OLD_IMAGES":
|
|
33
|
+
return aws_dynamodb_1.StreamViewType.NEW_AND_OLD_IMAGES;
|
|
34
|
+
case "KEYS_ONLY":
|
|
35
|
+
return aws_dynamodb_1.StreamViewType.KEYS_ONLY;
|
|
36
|
+
default:
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function toRemovalPolicy(policy) {
|
|
41
|
+
switch (policy) {
|
|
42
|
+
case "RETAIN":
|
|
43
|
+
return aws_cdk_lib_1.RemovalPolicy.RETAIN;
|
|
44
|
+
case "SNAPSHOT":
|
|
45
|
+
return aws_cdk_lib_1.RemovalPolicy.SNAPSHOT;
|
|
46
|
+
case "DESTROY":
|
|
47
|
+
default:
|
|
48
|
+
return aws_cdk_lib_1.RemovalPolicy.DESTROY;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function toProjectionType(type) {
|
|
52
|
+
switch (type) {
|
|
53
|
+
case "ALL":
|
|
54
|
+
return aws_dynamodb_1.ProjectionType.ALL;
|
|
55
|
+
case "KEYS_ONLY":
|
|
56
|
+
return aws_dynamodb_1.ProjectionType.KEYS_ONLY;
|
|
57
|
+
case "INCLUDE":
|
|
58
|
+
return aws_dynamodb_1.ProjectionType.INCLUDE;
|
|
59
|
+
default:
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
class DynamoDBTable extends constructs_1.Construct {
|
|
64
|
+
constructor(scope, id, props) {
|
|
65
|
+
super(scope, id);
|
|
66
|
+
this.id = id;
|
|
67
|
+
this.table = new aws_dynamodb_1.Table(this, `${id}Table`, {
|
|
68
|
+
tableName: props.tableName,
|
|
69
|
+
partitionKey: {
|
|
70
|
+
name: props.partitionKey.name,
|
|
71
|
+
type: toAttributeType(props.partitionKey.type)
|
|
72
|
+
},
|
|
73
|
+
sortKey: props.sortKey
|
|
74
|
+
? {
|
|
75
|
+
name: props.sortKey.name,
|
|
76
|
+
type: toAttributeType(props.sortKey.type)
|
|
77
|
+
}
|
|
78
|
+
: undefined,
|
|
79
|
+
billingMode: toBillingMode(props.billingMode),
|
|
80
|
+
readCapacity: props.billingMode === "PROVISIONED" ? props.readCapacity : undefined,
|
|
81
|
+
writeCapacity: props.billingMode === "PROVISIONED" ? props.writeCapacity : undefined,
|
|
82
|
+
stream: toStreamViewType(props.stream),
|
|
83
|
+
pointInTimeRecovery: props.pointInTimeRecovery ?? true,
|
|
84
|
+
removalPolicy: toRemovalPolicy(props.removalPolicy),
|
|
85
|
+
timeToLiveAttribute: props.timeToLiveAttribute
|
|
86
|
+
});
|
|
87
|
+
if (props.globalSecondaryIndexes) {
|
|
88
|
+
for (const gsi of props.globalSecondaryIndexes) {
|
|
89
|
+
const gsiProps = {
|
|
90
|
+
indexName: gsi.indexName,
|
|
91
|
+
partitionKey: {
|
|
92
|
+
name: gsi.partitionKey.name,
|
|
93
|
+
type: toAttributeType(gsi.partitionKey.type)
|
|
94
|
+
},
|
|
95
|
+
sortKey: gsi.sortKey
|
|
96
|
+
? {
|
|
97
|
+
name: gsi.sortKey.name,
|
|
98
|
+
type: toAttributeType(gsi.sortKey.type)
|
|
99
|
+
}
|
|
100
|
+
: undefined,
|
|
101
|
+
projectionType: toProjectionType(gsi.projectionType),
|
|
102
|
+
nonKeyAttributes: gsi.nonKeyAttributes
|
|
103
|
+
};
|
|
104
|
+
this.table.addGlobalSecondaryIndex(gsiProps);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
new aws_cdk_lib_1.CfnOutput(this, `${id}TableName`, {
|
|
108
|
+
key: `${id}TableName`,
|
|
109
|
+
value: this.table.tableName,
|
|
110
|
+
description: `DynamoDB table name for ${id}`
|
|
111
|
+
});
|
|
112
|
+
new aws_cdk_lib_1.CfnOutput(this, `${id}TableArn`, {
|
|
113
|
+
key: `${id}TableArn`,
|
|
114
|
+
value: this.table.tableArn,
|
|
115
|
+
description: `DynamoDB table ARN for ${id}`
|
|
116
|
+
});
|
|
117
|
+
if (props.stream) {
|
|
118
|
+
new aws_cdk_lib_1.CfnOutput(this, `${id}TableStreamArn`, {
|
|
119
|
+
key: `${id}TableStreamArn`,
|
|
120
|
+
value: this.table.tableStreamArn || "",
|
|
121
|
+
description: `DynamoDB table stream ARN for ${id}`
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Get the DynamoDB table name.
|
|
127
|
+
*/
|
|
128
|
+
getTableName() {
|
|
129
|
+
return this.table.tableName;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Get the DynamoDB table ARN.
|
|
133
|
+
*/
|
|
134
|
+
getTableArn() {
|
|
135
|
+
return this.table.tableArn;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Get the DynamoDB table stream ARN (if streaming is enabled).
|
|
139
|
+
*/
|
|
140
|
+
getTableStreamArn() {
|
|
141
|
+
return this.table.tableStreamArn;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Get the underlying CDK Table construct.
|
|
145
|
+
*/
|
|
146
|
+
getTable() {
|
|
147
|
+
return this.table;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Grant read permissions to the grantee.
|
|
151
|
+
*/
|
|
152
|
+
grantRead(grantee) {
|
|
153
|
+
return this.table.grantReadData(grantee);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Grant write permissions to the grantee.
|
|
157
|
+
*/
|
|
158
|
+
grantWrite(grantee) {
|
|
159
|
+
return this.table.grantWriteData(grantee);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Grant read and write permissions to the grantee.
|
|
163
|
+
*/
|
|
164
|
+
grantReadWrite(grantee) {
|
|
165
|
+
return this.table.grantReadWriteData(grantee);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Grant full access (read, write, delete) to the grantee.
|
|
169
|
+
*/
|
|
170
|
+
grantFullAccess(grantee) {
|
|
171
|
+
return this.table.grantFullAccess(grantee);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Grant stream read permissions to the grantee.
|
|
175
|
+
*/
|
|
176
|
+
grantStreamRead(grantee) {
|
|
177
|
+
return this.table.grantStreamRead(grantee);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
exports.DynamoDBTable = DynamoDBTable;
|
|
181
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1vZGIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9kYXRhYmFzZS9keW5hbW9kYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQ0FBdUM7QUFDdkMsNkNBQXVEO0FBQ3ZELDJEQVFrQztBQWlDbEMsU0FBUyxlQUFlLENBQUMsSUFBMkI7SUFDbEQsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUNiLEtBQUssR0FBRztZQUNOLE9BQU8sNEJBQWEsQ0FBQyxNQUFNLENBQUM7UUFDOUIsS0FBSyxHQUFHO1lBQ04sT0FBTyw0QkFBYSxDQUFDLE1BQU0sQ0FBQztRQUM5QixLQUFLLEdBQUc7WUFDTixPQUFPLDRCQUFhLENBQUMsTUFBTSxDQUFDO0lBQ2hDLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsSUFBd0M7SUFDN0QsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUNiLEtBQUssYUFBYTtZQUNoQixPQUFPLDBCQUFXLENBQUMsV0FBVyxDQUFDO1FBQ2pDLEtBQUssaUJBQWlCLENBQUM7UUFDdkI7WUFDRSxPQUFPLDBCQUFXLENBQUMsZUFBZSxDQUFDO0lBQ3ZDLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FDdkIsTUFBdUU7SUFFdkUsUUFBUSxNQUFNLEVBQUUsQ0FBQztRQUNmLEtBQUssV0FBVztZQUNkLE9BQU8sNkJBQWMsQ0FBQyxTQUFTLENBQUM7UUFDbEMsS0FBSyxXQUFXO1lBQ2QsT0FBTyw2QkFBYyxDQUFDLFNBQVMsQ0FBQztRQUNsQyxLQUFLLG9CQUFvQjtZQUN2QixPQUFPLDZCQUFjLENBQUMsa0JBQWtCLENBQUM7UUFDM0MsS0FBSyxXQUFXO1lBQ2QsT0FBTyw2QkFBYyxDQUFDLFNBQVMsQ0FBQztRQUNsQztZQUNFLE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxlQUFlLENBQ3RCLE1BQTBDO0lB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Q0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7T0FFRztJQUNJLGlCQUFpQjtRQUN0QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7T0FFRztJQUNJLFFBQVE7UUFDYixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksU0FBUyxDQUFDLE9BQW1CO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOztPQUVHO0lBQ0ksVUFBVSxDQUFDLE9BQW1CO1FBQ25DLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksY0FBYyxDQUFDLE9BQW1CO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxlQUFlLENBQUMsT0FBbUI7UUFDeEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxlQUFlLENBQUMsT0FBbUI7UUFDeEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3QyxDQUFDO0NBQ0Y7QUF2SUQsc0NBdUlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IENmbk91dHB1dCwgUmVtb3ZhbFBvbGljeSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHtcbiAgVGFibGUsXG4gIEF0dHJpYnV0ZVR5cGUsXG4gIEJpbGxpbmdNb2RlLFxuICBTdHJlYW1WaWV3VHlwZSxcbiAgUHJvamVjdGlvblR5cGUsXG4gIHR5cGUgR2xvYmFsU2Vjb25kYXJ5SW5kZXhQcm9wcyxcbiAgdHlwZSBJVGFibGVcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1keW5hbW9kYlwiO1xuaW1wb3J0IHsgdHlwZSBJR3JhbnRhYmxlLCB0eXBlIEdyYW50IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcblxuZXhwb3J0IHR5cGUgRHluYW1vREJBdHRyaWJ1dGVUeXBlID0gXCJTXCIgfCBcIk5cIiB8IFwiQlwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIER5bmFtb0RCS2V5U2NoZW1hIHtcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlOiBEeW5hbW9EQkF0dHJpYnV0ZVR5cGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHluYW1vREJHbG9iYWxTZWNvbmRhcnlJbmRleCB7XG4gIGluZGV4TmFtZTogc3RyaW5nO1xuICBwYXJ0aXRpb25LZXk6IER5bmFtb0RCS2V5U2NoZW1hO1xuICBzb3J0S2V5PzogRHluYW1vREJLZXlTY2hlbWE7XG4gIHByb2plY3Rpb25UeXBlPzogXCJBTExcIiB8IFwiS0VZU19PTkxZXCIgfCBcIklOQ0xVREVcIjtcbiAgbm9uS2V5QXR0cmlidXRlcz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIER5bmFtb0RCVGFibGVQcm9wcyB7XG4gIHRhYmxlTmFtZT86IHN0cmluZztcbiAgcGFydGl0aW9uS2V5OiBEeW5hbW9EQktleVNjaGVtYTtcbiAgc29ydEtleT86IER5bmFtb0RCS2V5U2NoZW1hO1xuICBiaWxsaW5nTW9kZT86IFwiUEFZX1BFUl9SRVFVRVNUXCIgfCBcIlBST1ZJU0lPTkVEXCI7XG4gIHJlYWRDYXBhY2l0eT86IG51bWJlcjtcbiAgd3JpdGVDYXBhY2l0eT86IG51bWJlcjtcbiAgZ2xvYmFsU2Vjb25kYXJ5SW5kZXhlcz86IER5bmFtb0RCR2xvYmFsU2Vjb25kYXJ5SW5kZXhbXTtcbiAgdGltZVRvTGl2ZUF0dHJpYnV0ZT86IHN0cmluZztcbiAgc3RyZWFtPzogXCJORVdfSU1BR0VcIiB8IFwiT0xEX0lNQUdFXCIgfCBcIk5FV19BTkRfT0xEX0lNQUdFU1wiIHwgXCJLRVlTX09OTFlcIjtcbiAgcG9pbnRJblRpbWVSZWNvdmVyeT86IGJvb2xlYW47XG4gIGVuY3J5cHRpb24/OiBcIkFXU19PV05FRFwiIHwgXCJBV1NfTUFOQUdFRFwiIHwgXCJDVVNUT01FUl9NQU5BR0VEXCI7XG4gIHJlbW92YWxQb2xpY3k/OiBcIkRFU1RST1lcIiB8IFwiUkVUQUlOXCIgfCBcIlNOQVBTSE9UXCI7XG59XG5cbmZ1bmN0aW9uIHRvQXR0cmlidXRlVHlwZSh0eXBlOiBEeW5hbW9EQkF0dHJpYnV0ZVR5cGUpOiBBdHRyaWJ1dGVUeXBlIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBcIlNcIjpcbiAgICAgIHJldHVybiBBdHRyaWJ1dGVUeXBlLlNUUklORztcbiAgICBjYXNlIFwiTlwiOlxuICAgICAgcmV0dXJuIEF0dHJpYnV0ZVR5cGUuTlVNQkVSO1xuICAgIGNhc2UgXCJCXCI6XG4gICAgICByZXR1cm4gQXR0cmlidXRlVHlwZS5CSU5BUlk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9CaWxsaW5nTW9kZShtb2RlPzogXCJQQVlfUEVSX1JFUVVFU1RcIiB8IFwiUFJPVklTSU9ORURcIik6IEJpbGxpbmdNb2RlIHtcbiAgc3dpdGNoIChtb2RlKSB7XG4gICAgY2FzZSBcIlBST1ZJU0lPTkVEXCI6XG4gICAgICByZXR1cm4gQmlsbGluZ01vZGUuUFJPVklTSU9ORUQ7XG4gICAgY2FzZSBcIlBBWV9QRVJfUkVRVUVTVFwiOlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gQmlsbGluZ01vZGUuUEFZX1BFUl9SRVFVRVNUO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvU3RyZWFtVmlld1R5cGUoXG4gIHN0cmVhbT86IFwiTkVXX0lNQUdFXCIgfCBcIk9MRF9JTUFHRVwiIHwgXCJORVdfQU5EX09MRF9JTUFHRVNcIiB8IFwiS0VZU19PTkxZXCJcbik6IFN0cmVhbVZpZXdUeXBlIHwgdW5kZWZpbmVkIHtcbiAgc3dpdGNoIChzdHJlYW0pIHtcbiAgICBjYXNlIFwiTkVXX0lNQUdFXCI6XG4gICAgICByZXR1cm4gU3RyZWFtVmlld1R5cGUuTkVXX0lNQUdFO1xuICAgIGNhc2UgXCJPTERfSU1BR0VcIjpcbiAgICAgIHJldHVybiBTdHJlYW1WaWV3VHlwZS5PTERfSU1BR0U7XG4gICAgY2FzZSBcIk5FV19BTkRfT0xEX0lNQUdFU1wiOlxuICAgICAgcmV0dXJuIFN0cmVhbVZpZXdUeXBlLk5FV19BTkRfT0xEX0lNQUdFUztcbiAgICBjYXNlIFwiS0VZU19PTkxZXCI6XG4gICAgICByZXR1cm4gU3RyZWFtVmlld1R5cGUuS0VZU19PTkxZO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvUmVtb3ZhbFBvbGljeShcbiAgcG9saWN5PzogXCJERVNUUk9ZXCIgfCBcIlJFVEFJTlwiIHwgXCJTTkFQU0hPVFwiXG4pOiBSZW1vdmFsUG9saWN5IHtcbiAgc3dpdGNoIChwb2xpY3kpIHtcbiAgICBjYXNlIFwiUkVUQUlOXCI6XG4gICAgICByZXR1cm4gUmVtb3ZhbFBvbGljeS5SRVRBSU47XG4gICAgY2FzZSBcIlNOQVBTSE9UXCI6XG4gICAgICByZXR1cm4gUmVtb3ZhbFBvbGljeS5TTkFQU0hPVDtcbiAgICBjYXNlIFwiREVTVFJPWVwiOlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gUmVtb3ZhbFBvbGljeS5ERVNUUk9ZO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvUHJvamVjdGlvblR5cGUoXG4gIHR5cGU/OiBcIkFMTFwiIHwgXCJLRVlTX09OTFlcIiB8IFwiSU5DTFVERVwiXG4pOiBQcm9qZWN0aW9uVHlwZSB8IHVuZGVmaW5lZCB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgXCJBTExcIjpcbiAgICAgIHJldHVybiBQcm9qZWN0aW9uVHlwZS5BTEw7XG4gICAgY2FzZSBcIktFWVNfT05MWVwiOlxuICAgICAgcmV0dXJuIFByb2plY3Rpb25UeXBlLktFWVNfT05MWTtcbiAgICBjYXNlIFwiSU5DTFVERVwiOlxuICAgICAgcmV0dXJuIFByb2plY3Rpb25UeXBlLklOQ0xVREU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIER5bmFtb0RCVGFibGUgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgcHJpdmF0ZSB0YWJsZTogVGFibGU7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IER5bmFtb0RCVGFibGVQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy5pZCA9IGlkO1xuXG4gICAgdGhpcy50YWJsZSA9IG5ldyBUYWJsZSh0aGlzLCBgJHtpZH1UYWJsZWAsIHtcbiAgICAgIHRhYmxlTmFtZTogcHJvcHMudGFibGVOYW1lLFxuICAgICAgcGFydGl0aW9uS2V5OiB7XG4gICAgICAgIG5hbWU6IHByb3BzLnBhcnRpdGlvbktleS5uYW1lLFxuICAgICAgICB0eXBlOiB0b0F0dHJpYnV0ZVR5cGUocHJvcHMucGFydGl0aW9uS2V5LnR5cGUpXG4gICAgICB9LFxuICAgICAgc29ydEtleTogcHJvcHMuc29ydEtleVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIG5hbWU6IHByb3BzLnNvcnRLZXkubmFtZSxcbiAgICAgICAgICAgIHR5cGU6IHRvQXR0cmlidXRlVHlwZShwcm9wcy5zb3J0S2V5LnR5cGUpXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGJpbGxpbmdNb2RlOiB0b0JpbGxpbmdNb2RlKHByb3BzLmJpbGxpbmdNb2RlKSxcbiAgICAgIHJlYWRDYXBhY2l0eTpcbiAgICAgICAgcHJvcHMuYmlsbGluZ01vZGUgPT09IFwiUFJPVklTSU9ORURcIiA/IHByb3BzLnJlYWRDYXBhY2l0eSA6IHVuZGVmaW5lZCxcbiAgICAgIHdyaXRlQ2FwYWNpdHk6XG4gICAgICAgIHByb3BzLmJpbGxpbmdNb2RlID09PSBcIlBST1ZJU0lPTkVEXCIgPyBwcm9wcy53cml0ZUNhcGFjaXR5IDogdW5kZWZpbmVkLFxuICAgICAgc3RyZWFtOiB0b1N0cmVhbVZpZXdUeXBlKHByb3BzLnN0cmVhbSksXG4gICAgICBwb2ludEluVGltZVJlY292ZXJ5OiBwcm9wcy5wb2ludEluVGltZVJlY292ZXJ5ID8/IHRydWUsXG4gICAgICByZW1vdmFsUG9saWN5OiB0b1JlbW92YWxQb2xpY3kocHJvcHMucmVtb3ZhbFBvbGljeSksXG4gICAgICB0aW1lVG9MaXZlQXR0cmlidXRlOiBwcm9wcy50aW1lVG9MaXZlQXR0cmlidXRlXG4gICAgfSk7XG5cbiAgICBpZiAocHJvcHMuZ2xvYmFsU2Vjb25kYXJ5SW5kZXhlcykge1xuICAgICAgZm9yIChjb25zdCBnc2kgb2YgcHJvcHMuZ2xvYmFsU2Vjb25kYXJ5SW5kZXhlcykge1xuICAgICAgICBjb25zdCBnc2lQcm9wczogR2xvYmFsU2Vjb25kYXJ5SW5kZXhQcm9wcyA9IHtcbiAgICAgICAgICBpbmRleE5hbWU6IGdzaS5pbmRleE5hbWUsXG4gICAgICAgICAgcGFydGl0aW9uS2V5OiB7XG4gICAgICAgICAgICBuYW1lOiBnc2kucGFydGl0aW9uS2V5Lm5hbWUsXG4gICAgICAgICAgICB0eXBlOiB0b0F0dHJpYnV0ZVR5cGUoZ3NpLnBhcnRpdGlvbktleS50eXBlKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgc29ydEtleTogZ3NpLnNvcnRLZXlcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIG5hbWU6IGdzaS5zb3J0S2V5Lm5hbWUsXG4gICAgICAgICAgICAgICAgdHlwZTogdG9BdHRyaWJ1dGVUeXBlKGdzaS5zb3J0S2V5LnR5cGUpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIHByb2plY3Rpb25UeXBlOiB0b1Byb2plY3Rpb25UeXBlKGdzaS5wcm9qZWN0aW9uVHlwZSksXG4gICAgICAgICAgbm9uS2V5QXR0cmlidXRlczogZ3NpLm5vbktleUF0dHJpYnV0ZXNcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy50YWJsZS5hZGRHbG9iYWxTZWNvbmRhcnlJbmRleChnc2lQcm9wcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtpZH1UYWJsZU5hbWVgLCB7XG4gICAgICBrZXk6IGAke2lkfVRhYmxlTmFtZWAsXG4gICAgICB2YWx1ZTogdGhpcy50YWJsZS50YWJsZU5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogYER5bmFtb0RCIHRhYmxlIG5hbWUgZm9yICR7aWR9YFxuICAgIH0pO1xuXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtpZH1UYWJsZUFybmAsIHtcbiAgICAgIGtleTogYCR7aWR9VGFibGVBcm5gLFxuICAgICAgdmFsdWU6IHRoaXMudGFibGUudGFibGVBcm4sXG4gICAgICBkZXNjcmlwdGlvbjogYER5bmFtb0RCIHRhYmxlIEFSTiBmb3IgJHtpZH1gXG4gICAgfSk7XG5cbiAgICBpZiAocHJvcHMuc3RyZWFtKSB7XG4gICAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke2lkfVRhYmxlU3RyZWFtQXJuYCwge1xuICAgICAgICBrZXk6IGAke2lkfVRhYmxlU3RyZWFtQXJuYCxcbiAgICAgICAgdmFsdWU6IHRoaXMudGFibGUudGFibGVTdHJlYW1Bcm4gfHwgXCJcIixcbiAgICAgICAgZGVzY3JpcHRpb246IGBEeW5hbW9EQiB0YWJsZSBzdHJlYW0gQVJOIGZvciAke2lkfWBcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIER5bmFtb0RCIHRhYmxlIG5hbWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0VGFibGVOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGFibGUudGFibGVOYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgRHluYW1vREIgdGFibGUgQVJOLlxuICAgKi9cbiAgcHVibGljIGdldFRhYmxlQXJuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGFibGUudGFibGVBcm47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBEeW5hbW9EQiB0YWJsZSBzdHJlYW0gQVJOIChpZiBzdHJlYW1pbmcgaXMgZW5hYmxlZCkuXG4gICAqL1xuICBwdWJsaWMgZ2V0VGFibGVTdHJlYW1Bcm4oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy50YWJsZS50YWJsZVN0cmVhbUFybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHVuZGVybHlpbmcgQ0RLIFRhYmxlIGNvbnN0cnVjdC5cbiAgICovXG4gIHB1YmxpYyBnZXRUYWJsZSgpOiBJVGFibGUge1xuICAgIHJldHVybiB0aGlzLnRhYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IHJlYWQgcGVybWlzc2lvbnMgdG8gdGhlIGdyYW50ZWUuXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRSZWFkKGdyYW50ZWU6IElHcmFudGFibGUpOiBHcmFudCB7XG4gICAgcmV0dXJuIHRoaXMudGFibGUuZ3JhbnRSZWFkRGF0YShncmFudGVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCB3cml0ZSBwZXJtaXNzaW9ucyB0byB0aGUgZ3JhbnRlZS5cbiAgICovXG4gIHB1YmxpYyBncmFudFdyaXRlKGdyYW50ZWU6IElHcmFudGFibGUpOiBHcmFudCB7XG4gICAgcmV0dXJuIHRoaXMudGFibGUuZ3JhbnRXcml0ZURhdGEoZ3JhbnRlZSk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgcmVhZCBhbmQgd3JpdGUgcGVybWlzc2lvbnMgdG8gdGhlIGdyYW50ZWUuXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRSZWFkV3JpdGUoZ3JhbnRlZTogSUdyYW50YWJsZSk6IEdyYW50IHtcbiAgICByZXR1cm4gdGhpcy50YWJsZS5ncmFudFJlYWRXcml0ZURhdGEoZ3JhbnRlZSk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgZnVsbCBhY2Nlc3MgKHJlYWQsIHdyaXRlLCBkZWxldGUpIHRvIHRoZSBncmFudGVlLlxuICAgKi9cbiAgcHVibGljIGdyYW50RnVsbEFjY2VzcyhncmFudGVlOiBJR3JhbnRhYmxlKTogR3JhbnQge1xuICAgIHJldHVybiB0aGlzLnRhYmxlLmdyYW50RnVsbEFjY2VzcyhncmFudGVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCBzdHJlYW0gcmVhZCBwZXJtaXNzaW9ucyB0byB0aGUgZ3JhbnRlZS5cbiAgICovXG4gIHB1YmxpYyBncmFudFN0cmVhbVJlYWQoZ3JhbnRlZTogSUdyYW50YWJsZSk6IEdyYW50IHtcbiAgICByZXR1cm4gdGhpcy50YWJsZS5ncmFudFN0cmVhbVJlYWQoZ3JhbnRlZSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -17,4 +17,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
17
17
|
__exportStar(require("./database"), exports);
|
|
18
18
|
__exportStar(require("./rdsAurora"), exports);
|
|
19
19
|
__exportStar(require("./rdsInstance"), exports);
|
|
20
|
-
|
|
20
|
+
__exportStar(require("./dynamodb"), exports);
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9kYXRhYmFzZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQTJCO0FBQzNCLDhDQUE0QjtBQUM1QixnREFBOEI7QUFDOUIsNkNBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vZGF0YWJhc2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Jkc0F1cm9yYVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmRzSW5zdGFuY2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2R5bmFtb2RiXCI7XG4iXX0=
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { Construct } from "constructs";
|
|
2
|
+
import { Function } from "aws-cdk-lib/aws-lambda";
|
|
3
|
+
import { type IVpc, type IConnectable } from "aws-cdk-lib/aws-ec2";
|
|
4
|
+
/**
|
|
5
|
+
* Props for creating a Migration Lambda
|
|
6
|
+
*/
|
|
7
|
+
export interface MigrationLambdaProps {
|
|
8
|
+
/**
|
|
9
|
+
* VPC where the Lambda will be deployed.
|
|
10
|
+
* Must be the same VPC as the database.
|
|
11
|
+
*/
|
|
12
|
+
vpc: IVpc;
|
|
13
|
+
/**
|
|
14
|
+
* Database construct to connect to.
|
|
15
|
+
* Used for security group configuration.
|
|
16
|
+
*/
|
|
17
|
+
database: IConnectable;
|
|
18
|
+
/**
|
|
19
|
+
* Database credentials secret ARN.
|
|
20
|
+
* Lambda will fetch credentials from this secret.
|
|
21
|
+
*/
|
|
22
|
+
secretArn: string;
|
|
23
|
+
/**
|
|
24
|
+
* Database endpoint hostname.
|
|
25
|
+
*/
|
|
26
|
+
databaseEndpoint: string;
|
|
27
|
+
/**
|
|
28
|
+
* Database port.
|
|
29
|
+
*/
|
|
30
|
+
databasePort: string;
|
|
31
|
+
/**
|
|
32
|
+
* Database name.
|
|
33
|
+
*/
|
|
34
|
+
databaseName: string;
|
|
35
|
+
/**
|
|
36
|
+
* Database engine type.
|
|
37
|
+
* Currently only PostgreSQL is supported.
|
|
38
|
+
*/
|
|
39
|
+
databaseEngine: "postgresql";
|
|
40
|
+
/**
|
|
41
|
+
* Optional timeout in seconds.
|
|
42
|
+
* Default: 300 (5 minutes)
|
|
43
|
+
*/
|
|
44
|
+
timeout?: number;
|
|
45
|
+
/**
|
|
46
|
+
* Optional memory size in MB.
|
|
47
|
+
* Default: 256
|
|
48
|
+
*/
|
|
49
|
+
memorySize?: number;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Migration Lambda construct for executing database migrations inside a VPC.
|
|
53
|
+
*
|
|
54
|
+
* This Lambda can be invoked by the Fjall CLI to run migrations against databases
|
|
55
|
+
* that are not accessible from the deployment machine (e.g., private VPC databases).
|
|
56
|
+
*
|
|
57
|
+
* The Lambda:
|
|
58
|
+
* 1. Fetches database credentials from Secrets Manager
|
|
59
|
+
* 2. Connects to the database using the bundled pg driver
|
|
60
|
+
* 3. Executes provided SQL statements
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* ```typescript
|
|
64
|
+
* const migrationLambda = new MigrationLambda(this, "Migration", {
|
|
65
|
+
* vpc: network.getVpc(),
|
|
66
|
+
* database: databaseConstruct,
|
|
67
|
+
* secretArn: credentials.secret.secretArn,
|
|
68
|
+
* databaseEndpoint: cluster.clusterEndpoint.hostname,
|
|
69
|
+
* databasePort: "5432",
|
|
70
|
+
* databaseName: "payload",
|
|
71
|
+
* databaseEngine: "postgresql"
|
|
72
|
+
* });
|
|
73
|
+
* ```
|
|
74
|
+
*/
|
|
75
|
+
export declare class MigrationLambda extends Construct {
|
|
76
|
+
readonly function: Function;
|
|
77
|
+
readonly functionArn: string;
|
|
78
|
+
readonly functionName: string;
|
|
79
|
+
constructor(scope: Construct, id: string, props: MigrationLambdaProps);
|
|
80
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MigrationLambda = void 0;
|
|
4
|
+
const constructs_1 = require("constructs");
|
|
5
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
6
|
+
const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
|
|
7
|
+
const aws_iam_1 = require("aws-cdk-lib/aws-iam");
|
|
8
|
+
const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
|
|
9
|
+
const aws_logs_1 = require("aws-cdk-lib/aws-logs");
|
|
10
|
+
const path = require("path");
|
|
11
|
+
/**
|
|
12
|
+
* Migration Lambda construct for executing database migrations inside a VPC.
|
|
13
|
+
*
|
|
14
|
+
* This Lambda can be invoked by the Fjall CLI to run migrations against databases
|
|
15
|
+
* that are not accessible from the deployment machine (e.g., private VPC databases).
|
|
16
|
+
*
|
|
17
|
+
* The Lambda:
|
|
18
|
+
* 1. Fetches database credentials from Secrets Manager
|
|
19
|
+
* 2. Connects to the database using the bundled pg driver
|
|
20
|
+
* 3. Executes provided SQL statements
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* const migrationLambda = new MigrationLambda(this, "Migration", {
|
|
25
|
+
* vpc: network.getVpc(),
|
|
26
|
+
* database: databaseConstruct,
|
|
27
|
+
* secretArn: credentials.secret.secretArn,
|
|
28
|
+
* databaseEndpoint: cluster.clusterEndpoint.hostname,
|
|
29
|
+
* databasePort: "5432",
|
|
30
|
+
* databaseName: "payload",
|
|
31
|
+
* databaseEngine: "postgresql"
|
|
32
|
+
* });
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
class MigrationLambda extends constructs_1.Construct {
|
|
36
|
+
constructor(scope, id, props) {
|
|
37
|
+
super(scope, id);
|
|
38
|
+
const stackName = aws_cdk_lib_1.Stack.of(this).stackName;
|
|
39
|
+
// Create security group for the Lambda
|
|
40
|
+
const securityGroup = new aws_ec2_1.SecurityGroup(this, `${id}SecurityGroup`, {
|
|
41
|
+
vpc: props.vpc,
|
|
42
|
+
description: `Security group for ${id} migration Lambda`,
|
|
43
|
+
allowAllOutbound: true
|
|
44
|
+
});
|
|
45
|
+
// Allow Lambda to connect to the database
|
|
46
|
+
props.database.connections.allowFrom(securityGroup, aws_ec2_1.Port.tcp(parseInt(props.databasePort, 10)), `Allow ${id} migration Lambda to connect to database`);
|
|
47
|
+
// Create execution role with necessary permissions
|
|
48
|
+
const executionRole = new aws_iam_1.Role(this, `${id}ExecutionRole`, {
|
|
49
|
+
assumedBy: new aws_iam_1.ServicePrincipal("lambda.amazonaws.com"),
|
|
50
|
+
description: `Execution role for ${id} migration Lambda`,
|
|
51
|
+
managedPolicies: [
|
|
52
|
+
aws_iam_1.ManagedPolicy.fromManagedPolicyArn(scope, `${id}VpcExecutionPolicy`, "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole")
|
|
53
|
+
]
|
|
54
|
+
});
|
|
55
|
+
// Add Secrets Manager permissions
|
|
56
|
+
executionRole.addToPolicy(new aws_iam_1.PolicyStatement({
|
|
57
|
+
effect: aws_iam_1.Effect.ALLOW,
|
|
58
|
+
actions: ["secretsmanager:GetSecretValue"],
|
|
59
|
+
resources: [props.secretArn]
|
|
60
|
+
}));
|
|
61
|
+
// Create log group with retention
|
|
62
|
+
const logGroup = new aws_logs_1.LogGroup(this, `${id}LogGroup`, {
|
|
63
|
+
logGroupName: `/aws/lambda/${stackName}-${id}`,
|
|
64
|
+
retention: aws_logs_1.RetentionDays.ONE_WEEK
|
|
65
|
+
});
|
|
66
|
+
// Path to the Lambda handler code
|
|
67
|
+
// This directory contains index.mjs and package.json with pg dependency
|
|
68
|
+
const handlerPath = path.join(__dirname, "migration-lambda-handler");
|
|
69
|
+
// Create the Lambda function with bundled dependencies
|
|
70
|
+
// The handler directory must have node_modules installed during CDK synth
|
|
71
|
+
// or use CDK's bundling feature
|
|
72
|
+
this.function = new aws_lambda_1.Function(this, `${id}Function`, {
|
|
73
|
+
functionName: `${stackName}-${id}`,
|
|
74
|
+
runtime: aws_lambda_1.Runtime.NODEJS_20_X,
|
|
75
|
+
handler: "index.handler",
|
|
76
|
+
code: aws_lambda_1.Code.fromAsset(handlerPath, {
|
|
77
|
+
bundling: {
|
|
78
|
+
image: aws_lambda_1.Runtime.NODEJS_20_X.bundlingImage,
|
|
79
|
+
command: [
|
|
80
|
+
"bash",
|
|
81
|
+
"-c",
|
|
82
|
+
["npm install --omit=dev", "cp -r . /asset-output/"].join(" && ")
|
|
83
|
+
]
|
|
84
|
+
}
|
|
85
|
+
}),
|
|
86
|
+
vpc: props.vpc,
|
|
87
|
+
vpcSubnets: { subnetType: aws_ec2_1.SubnetType.PRIVATE_WITH_EGRESS },
|
|
88
|
+
securityGroups: [securityGroup],
|
|
89
|
+
role: executionRole,
|
|
90
|
+
timeout: aws_cdk_lib_1.Duration.seconds(props.timeout ?? 300),
|
|
91
|
+
memorySize: props.memorySize ?? 256,
|
|
92
|
+
environment: {
|
|
93
|
+
SECRET_ARN: props.secretArn,
|
|
94
|
+
DATABASE_ENDPOINT: props.databaseEndpoint,
|
|
95
|
+
DATABASE_PORT: props.databasePort,
|
|
96
|
+
DATABASE_NAME: props.databaseName,
|
|
97
|
+
DATABASE_ENGINE: props.databaseEngine
|
|
98
|
+
},
|
|
99
|
+
logGroup
|
|
100
|
+
});
|
|
101
|
+
this.functionArn = this.function.functionArn;
|
|
102
|
+
this.functionName = this.function.functionName;
|
|
103
|
+
// Export function ARN for CLI use
|
|
104
|
+
new aws_cdk_lib_1.CfnOutput(this, `${id}FunctionArn`, {
|
|
105
|
+
key: `${stackName}${id}FunctionArn`,
|
|
106
|
+
exportName: `${stackName}${id}FunctionArn`,
|
|
107
|
+
value: this.functionArn,
|
|
108
|
+
description: `ARN of the ${id} migration Lambda function`
|
|
109
|
+
});
|
|
110
|
+
new aws_cdk_lib_1.CfnOutput(this, `${id}FunctionName`, {
|
|
111
|
+
key: `${stackName}${id}FunctionName`,
|
|
112
|
+
exportName: `${stackName}${id}FunctionName`,
|
|
113
|
+
value: this.functionName,
|
|
114
|
+
description: `Name of the ${id} migration Lambda function`
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
exports.MigrationLambda = MigrationLambda;
|
|
119
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0aW9uTGFtYmRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3Jlc291cmNlcy9hd3MvZGF0YWJhc2UvbWlncmF0aW9uTGFtYmRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUF1QztBQUN2Qyw2Q0FBeUQ7QUFDekQsdURBQWlFO0FBQ2pFLGlEQU02QjtBQUM3QixpREFNNkI7QUFDN0IsbURBQStEO0FBQy9ELDZCQUE2QjtBQTBEN0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBQ0gsTUFBYSxlQUFnQixTQUFRLHNCQUFTO0lBSzVDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMkI7UUFDbkUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixNQUFNLFNBQVMsR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFM0MsdUNBQXVDO1FBQ3ZDLE1BQU0sYUFBYSxHQUFHLElBQUksdUJBQWEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRTtZQUNsRSxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUc7WUFDZCxXQUFXLEVBQUUsc0JBQXNCLEVBQUUsbUJBQW1CO1lBQ3hELGdCQUFnQixFQUFFLElBQUk7U0FDdkIsQ0FBQyxDQUFDO1FBRUgsMENBQTBDO1FBQzFDLEtBQUssQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FDbEMsYUFBYSxFQUNiLGNBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFDMUMsU0FBUyxFQUFFLDBDQUEwQyxDQUN0RCxDQUFDO1FBRUYsbURBQW1EO1FBQ25ELE1BQU0sYUFBYSxHQUFHLElBQUksY0FBSSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFFO1lBQ3pELFNBQVMsRUFB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QixXQUFXLEVBQUUsY0FBYyxFQUFFLDRCQUE0QjtTQUMxRCxDQUFDLENBQUM7UUFFSCxJQUFJLHVCQUFTLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxjQUFjLEVBQUU7WUFDdkMsR0FBRyxFQUFFLEdBQUcsU0FBUyxHQUFHLEVBQUUsY0FBYztZQUNwQyxVQUFVLEVBQUUsR0FBRyxTQUFTLEdBQUcsRUFBRSxjQUFjO1lBQzNDLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWTtZQUN4QixXQUFXLEVBQUUsZUFBZSxFQUFFLDRCQUE0QjtTQUMzRCxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUEzR0QsMENBMkdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IER1cmF0aW9uLCBDZm5PdXRwdXQsIFN0YWNrIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBDb2RlLCBSdW50aW1lLCBGdW5jdGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQge1xuICBQb2xpY3lTdGF0ZW1lbnQsXG4gIEVmZmVjdCxcbiAgUm9sZSxcbiAgU2VydmljZVByaW5jaXBhbCxcbiAgTWFuYWdlZFBvbGljeVxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBJVnBjLFxuICBTdWJuZXRUeXBlLFxuICBTZWN1cml0eUdyb3VwLFxuICBQb3J0LFxuICB0eXBlIElDb25uZWN0YWJsZVxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHsgTG9nR3JvdXAsIFJldGVudGlvbkRheXMgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxvZ3NcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcblxuLyoqXG4gKiBQcm9wcyBmb3IgY3JlYXRpbmcgYSBNaWdyYXRpb24gTGFtYmRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWlncmF0aW9uTGFtYmRhUHJvcHMge1xuICAvKipcbiAgICogVlBDIHdoZXJlIHRoZSBMYW1iZGEgd2lsbCBiZSBkZXBsb3llZC5cbiAgICogTXVzdCBiZSB0aGUgc2FtZSBWUEMgYXMgdGhlIGRhdGFiYXNlLlxuICAgKi9cbiAgdnBjOiBJVnBjO1xuXG4gIC8qKlxuICAgKiBEYXRhYmFzZSBjb25zdHJ1Y3QgdG8gY29ubmVjdCB0by5cbiAgICogVXNlZCBmb3Igc2VjdXJpdHkgZ3JvdXAgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIGRhdGFiYXNlOiBJQ29ubmVjdGFibGU7XG5cbiAgLyoqXG4gICAqIERhdGFiYXNlIGNyZWRlbnRpYWxzIHNlY3JldCBBUk4uXG4gICAqIExhbWJkYSB3aWxsIGZldGNoIGNyZWRlbnRpYWxzIGZyb20gdGhpcyBzZWNyZXQuXG4gICAqL1xuICBzZWNyZXRBcm46IHN0cmluZztcblxuICAvKipcbiAgICogRGF0YWJhc2UgZW5kcG9pbnQgaG9zdG5hbWUuXG4gICAqL1xuICBkYXRhYmFzZUVuZHBvaW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERhdGFiYXNlIHBvcnQuXG4gICAqL1xuICBkYXRhYmFzZVBvcnQ6IHN0cmluZztcblxuICAvKipcbiAgICogRGF0YWJhc2UgbmFtZS5cbiAgICovXG4gIGRhdGFiYXNlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEYXRhYmFzZSBlbmdpbmUgdHlwZS5cbiAgICogQ3VycmVudGx5IG9ubHkgUG9zdGdyZVNRTCBpcyBzdXBwb3J0ZWQuXG4gICAqL1xuICBkYXRhYmFzZUVuZ2luZTogXCJwb3N0Z3Jlc3FsXCI7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIHRpbWVvdXQgaW4gc2Vjb25kcy5cbiAgICogRGVmYXVsdDogMzAwICg1IG1pbnV0ZXMpXG4gICAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBtZW1vcnkgc2l6ZSBpbiBNQi5cbiAgICogRGVmYXVsdDogMjU2XG4gICAqL1xuICBtZW1vcnlTaXplPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIE1pZ3JhdGlvbiBMYW1iZGEgY29uc3RydWN0IGZvciBleGVjdXRpbmcgZGF0YWJhc2UgbWlncmF0aW9ucyBpbnNpZGUgYSBWUEMuXG4gKlxuICogVGhpcyBMYW1iZGEgY2FuIGJlIGludm9rZWQgYnkgdGhlIEZqYWxsIENMSSB0byBydW4gbWlncmF0aW9ucyBhZ2FpbnN0IGRhdGFiYXNlc1xuICogdGhhdCBhcmUgbm90IGFjY2Vzc2libGUgZnJvbSB0aGUgZGVwbG95bWVudCBtYWNoaW5lIChlLmcuLCBwcml2YXRlIFZQQyBkYXRhYmFzZXMpLlxuICpcbiAqIFRoZSBMYW1iZGE6XG4gKiAxLiBGZXRjaGVzIGRhdGFiYXNlIGNyZWRlbnRpYWxzIGZyb20gU2VjcmV0cyBNYW5hZ2VyXG4gKiAyLiBDb25uZWN0cyB0byB0aGUgZGF0YWJhc2UgdXNpbmcgdGhlIGJ1bmRsZWQgcGcgZHJpdmVyXG4gKiAzLiBFeGVjdXRlcyBwcm92aWRlZCBTUUwgc3RhdGVtZW50c1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBtaWdyYXRpb25MYW1iZGEgPSBuZXcgTWlncmF0aW9uTGFtYmRhKHRoaXMsIFwiTWlncmF0aW9uXCIsIHtcbiAqICAgdnBjOiBuZXR3b3JrLmdldFZwYygpLFxuICogICBkYXRhYmFzZTogZGF0YWJhc2VDb25zdHJ1Y3QsXG4gKiAgIHNlY3JldEFybjogY3JlZGVudGlhbHMuc2VjcmV0LnNlY3JldEFybixcbiAqICAgZGF0YWJhc2VFbmRwb2ludDogY2x1c3Rlci5jbHVzdGVyRW5kcG9pbnQuaG9zdG5hbWUsXG4gKiAgIGRhdGFiYXNlUG9ydDogXCI1NDMyXCIsXG4gKiAgIGRhdGFiYXNlTmFtZTogXCJwYXlsb2FkXCIsXG4gKiAgIGRhdGFiYXNlRW5naW5lOiBcInBvc3RncmVzcWxcIlxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIE1pZ3JhdGlvbkxhbWJkYSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBmdW5jdGlvbjogRnVuY3Rpb247XG4gIHB1YmxpYyByZWFkb25seSBmdW5jdGlvbkFybjogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgZnVuY3Rpb25OYW1lOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE1pZ3JhdGlvbkxhbWJkYVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IHN0YWNrTmFtZSA9IFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZTtcblxuICAgIC8vIENyZWF0ZSBzZWN1cml0eSBncm91cCBmb3IgdGhlIExhbWJkYVxuICAgIGNvbnN0IHNlY3VyaXR5R3JvdXAgPSBuZXcgU2VjdXJpdHlHcm91cCh0aGlzLCBgJHtpZH1TZWN1cml0eUdyb3VwYCwge1xuICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICBkZXNjcmlwdGlvbjogYFNlY3VyaXR5IGdyb3VwIGZvciAke2lkfSBtaWdyYXRpb24gTGFtYmRhYCxcbiAgICAgIGFsbG93QWxsT3V0Ym91bmQ6IHRydWVcbiAgICB9KTtcblxuICAgIC8vIEFsbG93IExhbWJkYSB0byBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZVxuICAgIHByb3BzLmRhdGFiYXNlLmNvbm5lY3Rpb25zLmFsbG93RnJvbShcbiAgICAgIHNlY3VyaXR5R3JvdXAsXG4gICAgICBQb3J0LnRjcChwYXJzZUludChwcm9wcy5kYXRhYmFzZVBvcnQsIDEwKSksXG4gICAgICBgQWxsb3cgJHtpZH0gbWlncmF0aW9uIExhbWJkYSB0byBjb25uZWN0IHRvIGRhdGFiYXNlYFxuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgZXhlY3V0aW9uIHJvbGUgd2l0aCBuZWNlc3NhcnkgcGVybWlzc2lvbnNcbiAgICBjb25zdCBleGVjdXRpb25Sb2xlID0gbmV3IFJvbGUodGhpcywgYCR7aWR9RXhlY3V0aW9uUm9sZWAsIHtcbiAgICAgIGFzc3VtZWRCeTogbmV3IFNlcnZpY2VQcmluY2lwYWwoXCJsYW1iZGEuYW1hem9uYXdzLmNvbVwiKSxcbiAgICAgIGRlc2NyaXB0aW9uOiBgRXhlY3V0aW9uIHJvbGUgZm9yICR7aWR9IG1pZ3JhdGlvbiBMYW1iZGFgLFxuICAgICAgbWFuYWdlZFBvbGljaWVzOiBbXG4gICAgICAgIE1hbmFnZWRQb2xpY3kuZnJvbU1hbmFnZWRQb2xpY3lBcm4oXG4gICAgICAgICAgc2NvcGUsXG4gICAgICAgICAgYCR7aWR9VnBjRXhlY3V0aW9uUG9saWN5YCxcbiAgICAgICAgICBcImFybjphd3M6aWFtOjphd3M6cG9saWN5L3NlcnZpY2Utcm9sZS9BV1NMYW1iZGFWUENBY2Nlc3NFeGVjdXRpb25Sb2xlXCJcbiAgICAgICAgKVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgLy8gQWRkIFNlY3JldHMgTWFuYWdlciBwZXJtaXNzaW9uc1xuICAgIGV4ZWN1dGlvblJvbGUuYWRkVG9Qb2xpY3koXG4gICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICAgIGFjdGlvbnM6IFtcInNlY3JldHNtYW5hZ2VyOkdldFNlY3JldFZhbHVlXCJdLFxuICAgICAgICByZXNvdXJjZXM6IFtwcm9wcy5zZWNyZXRBcm5dXG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgbG9nIGdyb3VwIHdpdGggcmV0ZW50aW9uXG4gICAgY29uc3QgbG9nR3JvdXAgPSBuZXcgTG9nR3JvdXAodGhpcywgYCR7aWR9TG9nR3JvdXBgLCB7XG4gICAgICBsb2dHcm91cE5hbWU6IGAvYXdzL2xhbWJkYS8ke3N0YWNrTmFtZX0tJHtpZH1gLFxuICAgICAgcmV0ZW50aW9uOiBSZXRlbnRpb25EYXlzLk9ORV9XRUVLXG4gICAgfSk7XG5cbiAgICAvLyBQYXRoIHRvIHRoZSBMYW1iZGEgaGFuZGxlciBjb2RlXG4gICAgLy8gVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgaW5kZXgubWpzIGFuZCBwYWNrYWdlLmpzb24gd2l0aCBwZyBkZXBlbmRlbmN5XG4gICAgY29uc3QgaGFuZGxlclBhdGggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCBcIm1pZ3JhdGlvbi1sYW1iZGEtaGFuZGxlclwiKTtcblxuICAgIC8vIENyZWF0ZSB0aGUgTGFtYmRhIGZ1bmN0aW9uIHdpdGggYnVuZGxlZCBkZXBlbmRlbmNpZXNcbiAgICAvLyBUaGUgaGFuZGxlciBkaXJlY3RvcnkgbXVzdCBoYXZlIG5vZGVfbW9kdWxlcyBpbnN0YWxsZWQgZHVyaW5nIENESyBzeW50aFxuICAgIC8vIG9yIHVzZSBDREsncyBidW5kbGluZyBmZWF0dXJlXG4gICAgdGhpcy5mdW5jdGlvbiA9IG5ldyBGdW5jdGlvbih0aGlzLCBgJHtpZH1GdW5jdGlvbmAsIHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogYCR7c3RhY2tOYW1lfS0ke2lkfWAsXG4gICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMF9YLFxuICAgICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChoYW5kbGVyUGF0aCwge1xuICAgICAgICBidW5kbGluZzoge1xuICAgICAgICAgIGltYWdlOiBSdW50aW1lLk5PREVKU18yMF9YLmJ1bmRsaW5nSW1hZ2UsXG4gICAgICAgICAgY29tbWFuZDogW1xuICAgICAgICAgICAgXCJiYXNoXCIsXG4gICAgICAgICAgICBcIi1jXCIsXG4gICAgICAgICAgICBbXCJucG0gaW5zdGFsbCAtLW9taXQ9ZGV2XCIsIFwiY3AgLXIgLiAvYXNzZXQtb3V0cHV0L1wiXS5qb2luKFwiICYmIFwiKVxuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgIHZwY1N1Ym5ldHM6IHsgc3VibmV0VHlwZTogU3VibmV0VHlwZS5QUklWQVRFX1dJVEhfRUdSRVNTIH0sXG4gICAgICBzZWN1cml0eUdyb3VwczogW3NlY3VyaXR5R3JvdXBdLFxuICAgICAgcm9sZTogZXhlY3V0aW9uUm9sZSxcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMocHJvcHMudGltZW91dCA/PyAzMDApLFxuICAgICAgbWVtb3J5U2l6ZTogcHJvcHMubWVtb3J5U2l6ZSA/PyAyNTYsXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBTRUNSRVRfQVJOOiBwcm9wcy5zZWNyZXRBcm4sXG4gICAgICAgIERBVEFCQVNFX0VORFBPSU5UOiBwcm9wcy5kYXRhYmFzZUVuZHBvaW50LFxuICAgICAgICBEQVRBQkFTRV9QT1JUOiBwcm9wcy5kYXRhYmFzZVBvcnQsXG4gICAgICAgIERBVEFCQVNFX05BTUU6IHByb3BzLmRhdGFiYXNlTmFtZSxcbiAgICAgICAgREFUQUJBU0VfRU5HSU5FOiBwcm9wcy5kYXRhYmFzZUVuZ2luZVxuICAgICAgfSxcbiAgICAgIGxvZ0dyb3VwXG4gICAgfSk7XG5cbiAgICB0aGlzLmZ1bmN0aW9uQXJuID0gdGhpcy5mdW5jdGlvbi5mdW5jdGlvbkFybjtcbiAgICB0aGlzLmZ1bmN0aW9uTmFtZSA9IHRoaXMuZnVuY3Rpb24uZnVuY3Rpb25OYW1lO1xuXG4gICAgLy8gRXhwb3J0IGZ1bmN0aW9uIEFSTiBmb3IgQ0xJIHVzZVxuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7aWR9RnVuY3Rpb25Bcm5gLCB7XG4gICAgICBrZXk6IGAke3N0YWNrTmFtZX0ke2lkfUZ1bmN0aW9uQXJuYCxcbiAgICAgIGV4cG9ydE5hbWU6IGAke3N0YWNrTmFtZX0ke2lkfUZ1bmN0aW9uQXJuYCxcbiAgICAgIHZhbHVlOiB0aGlzLmZ1bmN0aW9uQXJuLFxuICAgICAgZGVzY3JpcHRpb246IGBBUk4gb2YgdGhlICR7aWR9IG1pZ3JhdGlvbiBMYW1iZGEgZnVuY3Rpb25gXG4gICAgfSk7XG5cbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke2lkfUZ1bmN0aW9uTmFtZWAsIHtcbiAgICAgIGtleTogYCR7c3RhY2tOYW1lfSR7aWR9RnVuY3Rpb25OYW1lYCxcbiAgICAgIGV4cG9ydE5hbWU6IGAke3N0YWNrTmFtZX0ke2lkfUZ1bmN0aW9uTmFtZWAsXG4gICAgICB2YWx1ZTogdGhpcy5mdW5jdGlvbk5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogYE5hbWUgb2YgdGhlICR7aWR9IG1pZ3JhdGlvbiBMYW1iZGEgZnVuY3Rpb25gXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -28,6 +28,21 @@ interface RdsProps {
|
|
|
28
28
|
snapshotIdentifier?: string;
|
|
29
29
|
/** Username from the snapshot (required when restoring from snapshot to reset password) */
|
|
30
30
|
snapshotUsername?: string;
|
|
31
|
+
/** Allow access from VPC CIDR (avoids cross-stack cyclic dependencies with Lambda) */
|
|
32
|
+
allowVpcAccess?: boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Make database publicly accessible from the internet.
|
|
35
|
+
* WARNING: This is a security risk and should only be used for development
|
|
36
|
+
* or when building Payload apps locally that need database access.
|
|
37
|
+
* When enabled, the database is placed in public subnets.
|
|
38
|
+
*/
|
|
39
|
+
publiclyAccessible?: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* IP address to allow access from when publiclyAccessible is true.
|
|
42
|
+
* If not specified, access is restricted to VPC only even when public.
|
|
43
|
+
* Format: CIDR notation (e.g., "203.0.113.0/32" for single IP)
|
|
44
|
+
*/
|
|
45
|
+
allowedIpCidr?: string;
|
|
31
46
|
}
|
|
32
47
|
export declare class RdsAurora extends Construct implements IConnectable {
|
|
33
48
|
connections: Connections;
|