@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.
Files changed (112) hide show
  1. package/README.md +3 -3
  2. package/dist/lib/app.d.ts +166 -6
  3. package/dist/lib/app.js +212 -20
  4. package/dist/lib/aspects/resourceInventory.d.ts +4 -4
  5. package/dist/lib/aspects/resourceInventory.js +3 -3
  6. package/dist/lib/config/aws/backupGlobalSettings.js +1 -2
  7. package/dist/lib/config/aws/identityCenter.js +1 -5
  8. package/dist/lib/config/aws/organisation.js +1 -4
  9. package/dist/lib/index.d.ts +1 -0
  10. package/dist/lib/index.js +7 -1
  11. package/dist/lib/patterns/aws/buildkite.js +3 -2
  12. package/dist/lib/patterns/aws/cdn.d.ts +164 -0
  13. package/dist/lib/patterns/aws/cdn.js +264 -0
  14. package/dist/lib/patterns/aws/compute.d.ts +278 -59
  15. package/dist/lib/patterns/aws/compute.js +384 -188
  16. package/dist/lib/patterns/aws/connections.d.ts +46 -0
  17. package/dist/lib/patterns/aws/connections.js +159 -0
  18. package/dist/lib/patterns/aws/database.d.ts +124 -11
  19. package/dist/lib/patterns/aws/database.js +188 -66
  20. package/dist/lib/patterns/aws/hostedZone.js +1 -1
  21. package/dist/lib/patterns/aws/index.d.ts +3 -0
  22. package/dist/lib/patterns/aws/index.js +4 -1
  23. package/dist/lib/patterns/aws/interfaces/compute.d.ts +121 -0
  24. package/dist/lib/patterns/aws/interfaces/compute.js +48 -0
  25. package/dist/lib/patterns/aws/interfaces/connector.d.ts +183 -0
  26. package/dist/lib/patterns/aws/interfaces/connector.js +117 -0
  27. package/dist/lib/patterns/aws/interfaces/database.d.ts +136 -0
  28. package/dist/lib/patterns/aws/interfaces/database.js +65 -0
  29. package/dist/lib/patterns/aws/interfaces/index.d.ts +12 -0
  30. package/dist/lib/patterns/aws/interfaces/index.js +49 -0
  31. package/dist/lib/patterns/aws/interfaces/messaging.d.ts +146 -0
  32. package/dist/lib/patterns/aws/interfaces/messaging.js +56 -0
  33. package/dist/lib/patterns/aws/interfaces/pattern.d.ts +403 -0
  34. package/dist/lib/patterns/aws/interfaces/pattern.js +36 -0
  35. package/dist/lib/patterns/aws/interfaces/storage.d.ts +136 -0
  36. package/dist/lib/patterns/aws/interfaces/storage.js +48 -0
  37. package/dist/lib/patterns/aws/messaging.d.ts +183 -0
  38. package/dist/lib/patterns/aws/messaging.js +239 -0
  39. package/dist/lib/patterns/aws/network.js +4 -4
  40. package/dist/lib/patterns/aws/pattern.d.ts +67 -0
  41. package/dist/lib/patterns/aws/pattern.js +69 -0
  42. package/dist/lib/patterns/aws/payload.d.ts +87 -0
  43. package/dist/lib/patterns/aws/payload.js +526 -0
  44. package/dist/lib/patterns/aws/storage.d.ts +127 -15
  45. package/dist/lib/patterns/aws/storage.js +234 -38
  46. package/dist/lib/resources/aws/backup/backupPlan.js +1 -6
  47. package/dist/lib/resources/aws/backup/backupVault.js +1 -2
  48. package/dist/lib/resources/aws/base/awsStack.d.ts +0 -2
  49. package/dist/lib/resources/aws/base/awsStack.js +1 -7
  50. package/dist/lib/resources/aws/cdn/cloudFront.d.ts +71 -0
  51. package/dist/lib/resources/aws/cdn/cloudFront.js +176 -0
  52. package/dist/lib/resources/aws/cdn/index.d.ts +1 -0
  53. package/dist/lib/resources/aws/cdn/index.js +18 -0
  54. package/dist/lib/resources/aws/compute/ec2.d.ts +5 -0
  55. package/dist/lib/resources/aws/compute/ec2.js +33 -6
  56. package/dist/lib/resources/aws/compute/ecs.d.ts +32 -25
  57. package/dist/lib/resources/aws/compute/ecs.js +31 -115
  58. package/dist/lib/resources/aws/compute/lambda.d.ts +94 -5
  59. package/dist/lib/resources/aws/compute/lambda.js +209 -32
  60. package/dist/lib/resources/aws/database/database.js +1 -1
  61. package/dist/lib/resources/aws/database/dynamodb.d.ts +70 -0
  62. package/dist/lib/resources/aws/database/dynamodb.js +181 -0
  63. package/dist/lib/resources/aws/database/index.d.ts +1 -0
  64. package/dist/lib/resources/aws/database/index.js +2 -1
  65. package/dist/lib/resources/aws/database/migrationLambda.d.ts +80 -0
  66. package/dist/lib/resources/aws/database/migrationLambda.js +119 -0
  67. package/dist/lib/resources/aws/database/rdsAurora.d.ts +15 -0
  68. package/dist/lib/resources/aws/database/rdsAurora.js +41 -18
  69. package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +12 -8
  70. package/dist/lib/resources/aws/database/rdsInstance.js +2 -2
  71. package/dist/lib/resources/aws/index.d.ts +2 -0
  72. package/dist/lib/resources/aws/index.js +3 -1
  73. package/dist/lib/resources/aws/messaging/eventbridge.d.ts +28 -0
  74. package/dist/lib/resources/aws/messaging/eventbridge.js +53 -0
  75. package/dist/lib/resources/aws/messaging/index.d.ts +3 -0
  76. package/dist/lib/resources/aws/messaging/index.js +20 -0
  77. package/dist/lib/resources/aws/messaging/sns.d.ts +35 -0
  78. package/dist/lib/resources/aws/messaging/sns.js +70 -0
  79. package/dist/lib/resources/aws/messaging/sqs.d.ts +105 -0
  80. package/dist/lib/resources/aws/messaging/sqs.js +231 -0
  81. package/dist/lib/resources/aws/messaging/utils.d.ts +3 -0
  82. package/dist/lib/resources/aws/messaging/utils.js +7 -0
  83. package/dist/lib/resources/aws/networking/ipam.js +1 -2
  84. package/dist/lib/resources/aws/networking/ipamPool.js +3 -2
  85. package/dist/lib/resources/aws/networking/vpc.js +1 -2
  86. package/dist/lib/resources/aws/storage/ecr.js +8 -5
  87. package/dist/lib/resources/aws/storage/s3.js +1 -2
  88. package/dist/lib/resources/aws/utilities/awsCustomResource.js +1 -1
  89. package/dist/lib/resources/aws/utilities/customResource.js +1 -1
  90. package/dist/lib/utils/getConfig.js +3 -2
  91. package/dist/lib/utils/index.d.ts +1 -0
  92. package/dist/lib/utils/index.js +2 -1
  93. package/dist/lib/utils/manifestWriter.d.ts +174 -0
  94. package/dist/lib/utils/manifestWriter.js +233 -0
  95. package/dist/lib/utils/standardTagsAspect.js +1 -8
  96. package/dist/lib/utils/validationLogger.d.ts +34 -0
  97. package/dist/lib/utils/validationLogger.js +83 -0
  98. package/package.json +3 -3
  99. package/dist/lib/__tests__/setup.d.ts +0 -48
  100. package/dist/lib/__tests__/setup.js +0 -1
  101. package/dist/lib/patterns/aws/cicdRole.d.ts +0 -67
  102. package/dist/lib/patterns/aws/cicdRole.js +0 -68
  103. package/dist/lib/resources/aws/cicd/cicdRole.d.ts +0 -65
  104. package/dist/lib/resources/aws/cicd/cicdRole.js +0 -191
  105. package/dist/lib/resources/aws/compute/ecsFreeTier.d.ts +0 -75
  106. package/dist/lib/resources/aws/compute/ecsFreeTier.js +0 -1
  107. package/dist/lib/resources/aws/compute/ecsSpot.d.ts +0 -75
  108. package/dist/lib/resources/aws/compute/ecsSpot.js +0 -1
  109. package/dist/lib/resources/aws/compute/utilities/capacityProviderDrainWaiter.d.ts +0 -20
  110. package/dist/lib/resources/aws/compute/utilities/capacityProviderDrainWaiter.js +0 -1
  111. package/dist/lib/resources/aws/utilities/cfnOutput.d.ts +0 -5
  112. 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==
@@ -1,3 +1,4 @@
1
1
  export * from "./database";
2
2
  export * from "./rdsAurora";
3
3
  export * from "./rdsInstance";
4
+ export * from "./dynamodb";
@@ -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
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9kYXRhYmFzZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQTJCO0FBQzNCLDhDQUE0QjtBQUM1QixnREFBOEIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLi9kYXRhYmFzZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmRzQXVyb3JhXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yZHNJbnN0YW5jZVwiO1xuIl19
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;