@intentius/chant-lexicon-aws 0.124.31 → 0.124.32

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 (644) hide show
  1. package/dist/actions/dynamodb.js +41 -0
  2. package/dist/actions/ecr.js +9 -0
  3. package/dist/actions/ecs.js +5 -0
  4. package/dist/actions/iam.js +3 -0
  5. package/dist/actions/index.js +9 -0
  6. package/dist/actions/lambda.js +11 -0
  7. package/dist/actions/logs.js +4 -0
  8. package/dist/actions/s3.js +40 -0
  9. package/dist/actions/sns.js +5 -0
  10. package/dist/actions/sqs.js +15 -0
  11. package/dist/agentcore/trace-fetch.d.ts.map +1 -1
  12. package/dist/agentcore/trace-fetch.js +472 -0
  13. package/dist/agentcore/trace-render.js +359 -0
  14. package/dist/ambient.js +148 -0
  15. package/dist/api/credential-chain.d.ts +30 -3
  16. package/dist/api/credential-chain.d.ts.map +1 -1
  17. package/dist/api/credential-chain.js +509 -0
  18. package/dist/api/read-client.d.ts +16 -43
  19. package/dist/api/read-client.d.ts.map +1 -1
  20. package/dist/api/read-client.js +458 -0
  21. package/dist/api/sigv4.d.ts +4 -4
  22. package/dist/api/sigv4.js +185 -0
  23. package/dist/behaviour-kinds.js +114 -0
  24. package/dist/caller-identity.d.ts +3 -5
  25. package/dist/caller-identity.d.ts.map +1 -1
  26. package/dist/caller-identity.js +146 -0
  27. package/dist/codegen/docs-cli.js +2 -0
  28. package/dist/codegen/docs.js +120 -0
  29. package/dist/codegen/enum-overlay.js +162 -0
  30. package/dist/codegen/extensions.js +139 -0
  31. package/dist/codegen/fallback.js +32 -0
  32. package/dist/codegen/generate-cli.js +15 -0
  33. package/dist/codegen/generate-lexicon.js +70 -0
  34. package/dist/codegen/generate-typescript.js +226 -0
  35. package/dist/codegen/generate.d.ts.map +1 -1
  36. package/dist/codegen/generate.js +234 -0
  37. package/dist/codegen/naming.js +135 -0
  38. package/dist/codegen/package.js +67 -0
  39. package/dist/codegen/patches.d.ts +26 -1
  40. package/dist/codegen/patches.d.ts.map +1 -1
  41. package/dist/codegen/patches.js +90 -0
  42. package/dist/codegen/property-overlay.js +85 -0
  43. package/dist/codegen/property-overlay.json +1 -16
  44. package/dist/codegen/sam.js +402 -0
  45. package/dist/codegen/typecheck.js +4 -0
  46. package/dist/codegen/versions.js +31 -0
  47. package/dist/components/__tests__/mock-cloud-executor.js +326 -0
  48. package/dist/components/apply.d.ts +44 -1
  49. package/dist/components/apply.d.ts.map +1 -1
  50. package/dist/components/apply.js +752 -0
  51. package/dist/components/builders.js +37 -0
  52. package/dist/components/capability-plugin.js +66 -0
  53. package/dist/components/cloud-executor.d.ts +35 -0
  54. package/dist/components/cloud-executor.d.ts.map +1 -1
  55. package/dist/components/cloud-executor.js +576 -0
  56. package/dist/components/config-bom.js +207 -0
  57. package/dist/components/host-delivery.js +117 -0
  58. package/dist/components/index.js +18 -0
  59. package/dist/components/job-submission.js +77 -0
  60. package/dist/components/publish.js +234 -0
  61. package/dist/components/safety.js +62 -0
  62. package/dist/components/wait-aws.js +68 -0
  63. package/dist/composites/agentcore-agent.js +187 -0
  64. package/dist/composites/agentcore-trust-policy.js +13 -0
  65. package/dist/composites/alb-shared.js +84 -0
  66. package/dist/composites/bucket-deployment.js +93 -0
  67. package/dist/composites/catalog.js +2714 -0
  68. package/dist/composites/dynamodb-table.js +66 -0
  69. package/dist/composites/ec2-instance-bundle.js +75 -0
  70. package/dist/composites/ec2-instance-role.js +26 -0
  71. package/dist/composites/ecr-repository.js +64 -0
  72. package/dist/composites/ecs-trust-policy.js +10 -0
  73. package/dist/composites/efs-with-access-point.js +44 -0
  74. package/dist/composites/eks-cluster.js +118 -0
  75. package/dist/composites/fargate-alb.js +216 -0
  76. package/dist/composites/fargate-service.js +222 -0
  77. package/dist/composites/index.js +28 -0
  78. package/dist/composites/lambda-api.js +15 -0
  79. package/dist/composites/lambda-dynamodb.js +77 -0
  80. package/dist/composites/lambda-eventbridge.js +27 -0
  81. package/dist/composites/lambda-function.js +54 -0
  82. package/dist/composites/lambda-s3.js +93 -0
  83. package/dist/composites/lambda-sns.js +23 -0
  84. package/dist/composites/lambda-sqs.js +34 -0
  85. package/dist/composites/landing-zone.js +82 -0
  86. package/dist/composites/microvm-app.js +293 -0
  87. package/dist/composites/minimal-vpc.js +40 -0
  88. package/dist/composites/monitoring-stack.js +105 -0
  89. package/dist/composites/nlb-service.js +61 -0
  90. package/dist/composites/rds-instance.js +98 -0
  91. package/dist/composites/scheduled-lambda.js +28 -0
  92. package/dist/composites/solr-fargate-service.js +33 -0
  93. package/dist/composites/step-functions-workflow.js +78 -0
  94. package/dist/composites/vpc-default.js +132 -0
  95. package/dist/condition.js +43 -0
  96. package/dist/coverage.js +4 -0
  97. package/dist/deep-observe.d.ts.map +1 -1
  98. package/dist/deep-observe.js +709 -0
  99. package/dist/deep-topology.js +226 -0
  100. package/dist/default-tags.js +50 -0
  101. package/dist/defaults.js +85 -0
  102. package/dist/dependencies.js +269 -0
  103. package/dist/detect.js +21 -0
  104. package/dist/disruption.d.ts.map +1 -1
  105. package/dist/disruption.js +129 -0
  106. package/dist/effect-receipt-row.js +107 -0
  107. package/dist/generated/index.d.ts +1297 -82
  108. package/dist/generated/index.d.ts.map +1 -1
  109. package/dist/generated/index.js +12382 -0
  110. package/dist/generated/runtime.js +4 -0
  111. package/dist/governance.js +131 -0
  112. package/dist/identity-observe.d.ts.map +1 -1
  113. package/dist/identity-observe.js +127 -0
  114. package/dist/import/generator.js +757 -0
  115. package/dist/import/live-export.js +34 -0
  116. package/dist/import/parser.js +394 -0
  117. package/dist/index.js +69 -0
  118. package/dist/integrity.json +6 -6
  119. package/dist/intrinsics.js +393 -0
  120. package/dist/lint/audit-catalog.js +87 -0
  121. package/dist/lint/audit-lineage.js +150 -0
  122. package/dist/lint/post-synth/cf-refs.js +247 -0
  123. package/dist/lint/post-synth/cor020.js +60 -0
  124. package/dist/lint/post-synth/ext001.d.ts.map +1 -1
  125. package/dist/lint/post-synth/ext001.js +197 -0
  126. package/dist/lint/post-synth/index.js +124 -0
  127. package/dist/lint/post-synth/waw010.js +41 -0
  128. package/dist/lint/post-synth/waw011.js +41 -0
  129. package/dist/lint/post-synth/waw013.js +38 -0
  130. package/dist/lint/post-synth/waw014.js +42 -0
  131. package/dist/lint/post-synth/waw015.js +88 -0
  132. package/dist/lint/post-synth/waw016.d.ts.map +1 -1
  133. package/dist/lint/post-synth/waw016.js +116 -0
  134. package/dist/lint/post-synth/waw017.js +43 -0
  135. package/dist/lint/post-synth/waw018.js +61 -0
  136. package/dist/lint/post-synth/waw019.js +64 -0
  137. package/dist/lint/post-synth/waw020.js +56 -0
  138. package/dist/lint/post-synth/waw021.js +44 -0
  139. package/dist/lint/post-synth/waw022.js +36 -0
  140. package/dist/lint/post-synth/waw023.js +40 -0
  141. package/dist/lint/post-synth/waw024.js +46 -0
  142. package/dist/lint/post-synth/waw025.js +36 -0
  143. package/dist/lint/post-synth/waw026.js +38 -0
  144. package/dist/lint/post-synth/waw027.js +41 -0
  145. package/dist/lint/post-synth/waw028.js +39 -0
  146. package/dist/lint/post-synth/waw029.js +54 -0
  147. package/dist/lint/post-synth/waw030.js +282 -0
  148. package/dist/lint/post-synth/waw031.js +58 -0
  149. package/dist/lint/post-synth/waw032.js +45 -0
  150. package/dist/lint/post-synth/waw033.js +75 -0
  151. package/dist/lint/post-synth/waw034.js +52 -0
  152. package/dist/lint/post-synth/waw035.js +56 -0
  153. package/dist/lint/post-synth/waw036.js +79 -0
  154. package/dist/lint/post-synth/waw037.js +67 -0
  155. package/dist/lint/post-synth/waw038.js +42 -0
  156. package/dist/lint/post-synth/waw039.js +42 -0
  157. package/dist/lint/post-synth/waw040.js +45 -0
  158. package/dist/lint/post-synth/waw041.js +40 -0
  159. package/dist/lint/post-synth/waw042.js +99 -0
  160. package/dist/lint/post-synth/waw043.js +51 -0
  161. package/dist/lint/post-synth/waw044.js +64 -0
  162. package/dist/lint/post-synth/waw045.js +49 -0
  163. package/dist/lint/post-synth/waw046.js +52 -0
  164. package/dist/lint/post-synth/waw047.js +43 -0
  165. package/dist/lint/post-synth/waw048.js +40 -0
  166. package/dist/lint/post-synth/waw049.js +78 -0
  167. package/dist/lint/post-synth/waw050.js +44 -0
  168. package/dist/lint/post-synth/waw051.js +41 -0
  169. package/dist/lint/post-synth/waw052.js +43 -0
  170. package/dist/lint/post-synth/waw053.js +43 -0
  171. package/dist/lint/post-synth/waw054.js +41 -0
  172. package/dist/lint/post-synth/waw055.js +41 -0
  173. package/dist/lint/post-synth/waw056.js +65 -0
  174. package/dist/lint/post-synth/waw057.js +43 -0
  175. package/dist/lint/post-synth/waw058.js +61 -0
  176. package/dist/lint/post-synth/waw059.js +338 -0
  177. package/dist/lint/post-synth/waw060.js +83 -0
  178. package/dist/lint/post-synth/waw061.js +60 -0
  179. package/dist/lint/post-synth/waw062.js +0 -0
  180. package/dist/lint/post-synth/waw063.js +0 -0
  181. package/dist/lint/post-synth/waw064.js +45 -0
  182. package/dist/lint/post-synth/waw065.js +104 -0
  183. package/dist/lint/post-synth/waw066.js +145 -0
  184. package/dist/lint/post-synth/waw067.js +115 -0
  185. package/dist/lint/post-synth/waw068.js +69 -0
  186. package/dist/lint/post-synth/waw069.js +0 -0
  187. package/dist/lint/rules/hardcoded-region.js +38 -0
  188. package/dist/lint/rules/iam-wildcard.js +60 -0
  189. package/dist/lint/rules/index.js +6 -0
  190. package/dist/lint/rules/s3-encryption.js +60 -0
  191. package/dist/live-attrs.js +42 -0
  192. package/dist/lsp/completions.d.ts.map +1 -1
  193. package/dist/lsp/completions.js +18 -0
  194. package/dist/lsp/hover.d.ts.map +1 -1
  195. package/dist/lsp/hover.js +66 -0
  196. package/dist/manifest.json +1 -1
  197. package/dist/mapping.js +33 -0
  198. package/dist/meta.json +17359 -784
  199. package/dist/nested-stack.js +95 -0
  200. package/dist/okf/index.md +203 -0
  201. package/dist/okf/rules/EXT001.md +1 -0
  202. package/dist/okf/rules/WAW016.md +2 -0
  203. package/dist/okf/rules/WAW019.md +1 -0
  204. package/dist/okf/rules/WAW028.md +1 -0
  205. package/dist/okf/rules/WAW030.md +2 -0
  206. package/dist/okf/rules/WAW039.md +1 -0
  207. package/dist/okf/rules/WAW049.md +1 -0
  208. package/dist/okf/rules/WAW056.md +1 -0
  209. package/dist/okf/rules/WAW058.md +1 -0
  210. package/dist/okf/rules/WAW062.md +1 -0
  211. package/dist/okf/rules/WAW064.md +1 -0
  212. package/dist/okf/rules/WAW065.md +1 -0
  213. package/dist/okf/rules/WAW066.md +1 -0
  214. package/dist/okf/rules/WAW067.md +1 -0
  215. package/dist/okf/rules/WAW068.md +1 -0
  216. package/dist/okf/rules/WAW069.md +4 -0
  217. package/dist/okf/types/AIWorkloadConfig.md +23 -0
  218. package/dist/okf/types/ARCRegionSwitchPlan.md +1 -0
  219. package/dist/okf/types/AccountAccessApplication.md +28 -0
  220. package/dist/okf/types/AccountAccessEntitlement.md +22 -0
  221. package/dist/okf/types/ActionTarget.md +20 -0
  222. package/dist/okf/types/AdConfiguration.md +21 -0
  223. package/dist/okf/types/Adapter.md +26 -0
  224. package/dist/okf/types/AgentContext.md +35 -0
  225. package/dist/okf/types/AgentGoal.md +31 -0
  226. package/dist/okf/types/AgentProfile.md +34 -0
  227. package/dist/okf/types/Alarm.md +3 -1
  228. package/dist/okf/types/AlarmModel.md +14 -9
  229. package/dist/okf/types/AmplifyWebhook.md +25 -0
  230. package/dist/okf/types/ApiCache.md +8 -8
  231. package/dist/okf/types/ApiGatewayManagedOverrides.md +5 -5
  232. package/dist/okf/types/AppAuthorization.md +35 -0
  233. package/dist/okf/types/AppBlockBuilder.md +1 -0
  234. package/dist/okf/types/AppInstance.md +2 -2
  235. package/dist/okf/types/AppInstanceBot.md +2 -2
  236. package/dist/okf/types/AppStreamFleet.md +3 -2
  237. package/dist/okf/types/AppSyncApiKey.md +6 -6
  238. package/dist/okf/types/AppSyncType.md +22 -0
  239. package/dist/okf/types/ApplicationStatusCheck.md +36 -0
  240. package/dist/okf/types/ApplicationVersion.md +4 -1
  241. package/dist/okf/types/ApplicationsList.md +26 -0
  242. package/dist/okf/types/ApprovalPolicy.md +28 -0
  243. package/dist/okf/types/ArchiveRule.md +24 -0
  244. package/dist/okf/types/Asset.md +30 -0
  245. package/dist/okf/types/Backup.md +31 -0
  246. package/dist/okf/types/BedrockAgentCoreDataset.md +1 -1
  247. package/dist/okf/types/BedrockAgentCoreGateway.md +3 -0
  248. package/dist/okf/types/BedrockSession.md +28 -0
  249. package/dist/okf/types/BillEstimate.md +35 -0
  250. package/dist/okf/types/Brand.md +32 -0
  251. package/dist/okf/types/CallAnalyticsCategory.md +25 -0
  252. package/dist/okf/types/Campaign.md +28 -0
  253. package/dist/okf/types/CapacityProvider.md +30 -0
  254. package/dist/okf/types/Case.md +24 -0
  255. package/dist/okf/types/CertificateAssociation.md +13 -0
  256. package/dist/okf/types/ChangeSet.md +36 -0
  257. package/dist/okf/types/ChannelFlow.md +29 -0
  258. package/dist/okf/types/ChimeChannel.md +39 -0
  259. package/dist/okf/types/Classifier.md +6 -6
  260. package/dist/okf/types/ClientVpnAuthorizationRule.md +6 -6
  261. package/dist/okf/types/ClientVpnEndpoint.md +2 -0
  262. package/dist/okf/types/ClientVpnRoute.md +5 -5
  263. package/dist/okf/types/CloudConnector.md +29 -0
  264. package/dist/okf/types/Cluster.md +39 -0
  265. package/dist/okf/types/ClusterSchedulerConfig.md +30 -0
  266. package/dist/okf/types/CodeCommitRepository.md +12 -12
  267. package/dist/okf/types/CodeConnectionsHost.md +26 -0
  268. package/dist/okf/types/CodeRepository.md +5 -5
  269. package/dist/okf/types/CompositeAlarm.md +1 -0
  270. package/dist/okf/types/ComputeEnvironment.md +2 -0
  271. package/dist/okf/types/ComputeNodeGroup.md +1 -1
  272. package/dist/okf/types/ComputeQuota.md +34 -0
  273. package/dist/okf/types/ConfigRule.md +1 -1
  274. package/dist/okf/types/ConfigurationRecorder.md +7 -6
  275. package/dist/okf/types/ConnectAttachment.md +2 -0
  276. package/dist/okf/types/ConnectQueue.md +5 -1
  277. package/dist/okf/types/ConnectVocabulary.md +28 -0
  278. package/dist/okf/types/ConnectionType.md +24 -0
  279. package/dist/okf/types/ConsentPortal.md +33 -0
  280. package/dist/okf/types/ContactMethod.md +29 -0
  281. package/dist/okf/types/ContainerAssociation.md +26 -0
  282. package/dist/okf/types/ContainerFleet.md +1 -1
  283. package/dist/okf/types/ContainerGroupDefinition.md +1 -1
  284. package/dist/okf/types/Content.md +40 -0
  285. package/dist/okf/types/ContentAssociation.md +28 -0
  286. package/dist/okf/types/CustomDetectionRuleAssociation.md +28 -0
  287. package/dist/okf/types/CustomEntityType.md +4 -9
  288. package/dist/okf/types/Customization.md +22 -0
  289. package/dist/okf/types/CwIntegration.md +31 -0
  290. package/dist/okf/types/DAXParameterGroup.md +3 -8
  291. package/dist/okf/types/DAXSubnetGroup.md +0 -5
  292. package/dist/okf/types/DBClusterEndpoint.md +31 -0
  293. package/dist/okf/types/DBProxyTargetGroup.md +1 -0
  294. package/dist/okf/types/DBSnapshot.md +62 -0
  295. package/dist/okf/types/DLMLifecyclePolicy.md +12 -12
  296. package/dist/okf/types/DLPSetting.md +31 -0
  297. package/dist/okf/types/DMSInstanceProfile.md +1 -1
  298. package/dist/okf/types/DRSLaunchConfigurationTemplate.md +28 -0
  299. package/dist/okf/types/Daemon.md +1 -0
  300. package/dist/okf/types/DataExchangeDataSet.md +29 -0
  301. package/dist/okf/types/DataIntegrationFlow.md +27 -0
  302. package/dist/okf/types/DataMigration.md +1 -1
  303. package/dist/okf/types/DataProvider.md +2 -1
  304. package/dist/okf/types/DataQualityRuleset.md +6 -11
  305. package/dist/okf/types/DataSource.md +23 -0
  306. package/dist/okf/types/Dataset.md +20 -0
  307. package/dist/okf/types/DatasetIntegration.md +23 -0
  308. package/dist/okf/types/DbCluster.md +1 -1
  309. package/dist/okf/types/DbInstance.md +8 -2
  310. package/dist/okf/types/DeadlineBudget.md +29 -0
  311. package/dist/okf/types/DelegationSet.md +23 -0
  312. package/dist/okf/types/DeliveryChannel.md +6 -11
  313. package/dist/okf/types/DevOpsAgentAgentSpace.md +4 -0
  314. package/dist/okf/types/DevOpsAgentService.md +1 -0
  315. package/dist/okf/types/DevOpsAgentTrigger.md +28 -0
  316. package/dist/okf/types/DirectConnectGatewayAttachment.md +2 -0
  317. package/dist/okf/types/Directory.md +60 -0
  318. package/dist/okf/types/DocDBDBClusterParameterGroup.md +5 -10
  319. package/dist/okf/types/DocDBDBSubnetGroup.md +4 -9
  320. package/dist/okf/types/DocDBElasticClusterSnapshot.md +36 -0
  321. package/dist/okf/types/DocumentClassifierEndpoint.md +27 -0
  322. package/dist/okf/types/Domain.md +27 -0
  323. package/dist/okf/types/EKSCertificateAuthority.md +42 -0
  324. package/dist/okf/types/EKSCluster.md +8 -0
  325. package/dist/okf/types/EcSnapshot.md +66 -0
  326. package/dist/okf/types/EmailIdentityCertificate.md +15 -0
  327. package/dist/okf/types/EndpointConfig.md +14 -13
  328. package/dist/okf/types/EntityRecognizer.md +27 -0
  329. package/dist/okf/types/EntityRecognizerEndpoint.md +31 -0
  330. package/dist/okf/types/EnvironmentEC2.md +13 -13
  331. package/dist/okf/types/EvaluationForm.md +1 -0
  332. package/dist/okf/types/Evaluator.md +6 -2
  333. package/dist/okf/types/EventAction.md +26 -0
  334. package/dist/okf/types/EventRule.md +2 -0
  335. package/dist/okf/types/EventSource.md +30 -0
  336. package/dist/okf/types/EventTracker.md +22 -0
  337. package/dist/okf/types/EventsV2EventBus.md +28 -0
  338. package/dist/okf/types/EventsV2ResourcePolicy.md +19 -0
  339. package/dist/okf/types/EventsV2Subscriber.md +39 -0
  340. package/dist/okf/types/ExperimentDefinition.md +39 -0
  341. package/dist/okf/types/ExperimentRun.md +33 -0
  342. package/dist/okf/types/ExperimentTrialComponent.md +13 -11
  343. package/dist/okf/types/FHIRDatastore.md +3 -0
  344. package/dist/okf/types/FSxSnapshot.md +5 -5
  345. package/dist/okf/types/FSxVolume.md +9 -9
  346. package/dist/okf/types/FeaturedResultsSet.md +26 -0
  347. package/dist/okf/types/Feed.md +1 -0
  348. package/dist/okf/types/FieldLevelEncryptionConfig.md +25 -0
  349. package/dist/okf/types/FieldLevelEncryptionProfile.md +22 -0
  350. package/dist/okf/types/FileCache.md +45 -0
  351. package/dist/okf/types/Filter.md +27 -0
  352. package/dist/okf/types/Firewall.md +6 -0
  353. package/dist/okf/types/FlowMediaStream.md +28 -0
  354. package/dist/okf/types/FlowOutput.md +1 -0
  355. package/dist/okf/types/FpgaImage.md +38 -0
  356. package/dist/okf/types/Function.md +2 -2
  357. package/dist/okf/types/Gateway.md +41 -0
  358. package/dist/okf/types/GatewayClusterAssociations.md +23 -0
  359. package/dist/okf/types/GatewayRateLimit.md +26 -0
  360. package/dist/okf/types/GatewayRule.md +32 -0
  361. package/dist/okf/types/GlobalReplicationGroup.md +3 -0
  362. package/dist/okf/types/GlobalResolver.md +1 -1
  363. package/dist/okf/types/GlobalTable.md +1 -0
  364. package/dist/okf/types/GlueConnection.md +5 -4
  365. package/dist/okf/types/GlueSecurityConfiguration.md +1 -6
  366. package/dist/okf/types/GlueSession.md +38 -0
  367. package/dist/okf/types/GlueTable.md +5 -10
  368. package/dist/okf/types/GlueWorkflow.md +5 -10
  369. package/dist/okf/types/Group.md +27 -0
  370. package/dist/okf/types/Harness.md +1 -0
  371. package/dist/okf/types/HostKey.md +33 -0
  372. package/dist/okf/types/HostedZone.md +1 -0
  373. package/dist/okf/types/HttpApi.md +2 -0
  374. package/dist/okf/types/HttpNamespace.md +5 -5
  375. package/dist/okf/types/HubV2.md +1 -0
  376. package/dist/okf/types/HumanTaskUi.md +22 -0
  377. package/dist/okf/types/IPv4Pool.md +28 -0
  378. package/dist/okf/types/ImageBuilder.md +1 -0
  379. package/dist/okf/types/ImageBuilderImage.md +1 -1
  380. package/dist/okf/types/ImagePipeline.md +1 -1
  381. package/dist/okf/types/InferenceComponent.md +5 -1
  382. package/dist/okf/types/InfluxDBBackup.md +65 -0
  383. package/dist/okf/types/InfluxDBCluster.md +3 -0
  384. package/dist/okf/types/InfrastructureConfiguration.md +2 -0
  385. package/dist/okf/types/IngestionDestination.md +28 -0
  386. package/dist/okf/types/InputSecurityGroup.md +6 -4
  387. package/dist/okf/types/InspectorV2Connector.md +38 -0
  388. package/dist/okf/types/InstanceEventWindow.md +25 -0
  389. package/dist/okf/types/InstanceFleetConfig.md +10 -10
  390. package/dist/okf/types/InstanceGroupConfig.md +3 -3
  391. package/dist/okf/types/InstrumentationConfig.md +31 -0
  392. package/dist/okf/types/IntegrationAssociation.md +3 -0
  393. package/dist/okf/types/IoTSiteWiseApplication.md +34 -0
  394. package/dist/okf/types/IoTSiteWiseDataset.md +5 -2
  395. package/dist/okf/types/IoTSiteWiseTask.md +24 -0
  396. package/dist/okf/types/IpamExternalResourceVerificationToken.md +35 -0
  397. package/dist/okf/types/IpamInternetRegistryAssociation.md +32 -0
  398. package/dist/okf/types/Job.md +35 -0
  399. package/dist/okf/types/JobTemplate.md +26 -0
  400. package/dist/okf/types/KinesisChannel.md +31 -0
  401. package/dist/okf/types/KinesisStream.md +1 -0
  402. package/dist/okf/types/LambdaResourcePolicy.md +14 -0
  403. package/dist/okf/types/Lexicon.md +34 -0
  404. package/dist/okf/types/LicenseAssetGroup.md +23 -0
  405. package/dist/okf/types/LicenseConfiguration.md +33 -0
  406. package/dist/okf/types/LicenseServerEndpoint.md +32 -0
  407. package/dist/okf/types/LightsailKeyPair.md +29 -0
  408. package/dist/okf/types/LimitsProfile.md +27 -0
  409. package/dist/okf/types/LocationAzureBlob.md +2 -1
  410. package/dist/okf/types/LocationObjectStorage.md +1 -0
  411. package/dist/okf/types/LogAlarm.md +2 -0
  412. package/dist/okf/types/MGNConnector.md +23 -0
  413. package/dist/okf/types/MGNLaunchConfigurationTemplate.md +37 -0
  414. package/dist/okf/types/MLTransform.md +15 -15
  415. package/dist/okf/types/MWAAServerlessWorkflow.md +3 -0
  416. package/dist/okf/types/ManagedNotificationAccountContactAssociation.md +1 -0
  417. package/dist/okf/types/ManagedNotificationAdditionalChannelAssociation.md +1 -0
  418. package/dist/okf/types/MediaConvertJobTemplate.md +11 -13
  419. package/dist/okf/types/MediaConvertQueue.md +8 -10
  420. package/dist/okf/types/MediaInsightsPipelineConfiguration.md +28 -0
  421. package/dist/okf/types/MediaLiveInput.md +41 -18
  422. package/dist/okf/types/MediaPackageV2Channel.md +3 -0
  423. package/dist/okf/types/MediaPackageV2OriginEndpoint.md +1 -0
  424. package/dist/okf/types/MediaPipelineKinesisVideoStreamPool.md +28 -0
  425. package/dist/okf/types/MediaTailorFunction.md +27 -0
  426. package/dist/okf/types/MedicalVocabulary.md +21 -0
  427. package/dist/okf/types/Member.md +26 -0
  428. package/dist/okf/types/Memory.md +6 -0
  429. package/dist/okf/types/MemoryDBSnapshot.md +29 -0
  430. package/dist/okf/types/Metric.md +59 -0
  431. package/dist/okf/types/MetricAttribution.md +23 -0
  432. package/dist/okf/types/MicrosoftAD.md +11 -11
  433. package/dist/okf/types/MigrationProject.md +8 -1
  434. package/dist/okf/types/Monitor.md +26 -0
  435. package/dist/okf/types/NFSFileShare.md +44 -0
  436. package/dist/okf/types/NeptuneGraphGraph.md +1 -0
  437. package/dist/okf/types/NetworkConnector.md +4 -0
  438. package/dist/okf/types/NetworkFlowMonitorScope.md +23 -0
  439. package/dist/okf/types/NetworkMigrationDefinition.md +31 -0
  440. package/dist/okf/types/NetworkSecurityManagerDeployment.md +31 -0
  441. package/dist/okf/types/NetworkSecurityManagerPolicy.md +32 -0
  442. package/dist/okf/types/NetworkSecurityManagerScope.md +29 -0
  443. package/dist/okf/types/NotebookInstance.md +18 -18
  444. package/dist/okf/types/NotebookInstanceLifecycleConfig.md +6 -5
  445. package/dist/okf/types/NotifyConfiguration.md +35 -0
  446. package/dist/okf/types/OTelEnrichment.md +2 -0
  447. package/dist/okf/types/OnlineEvaluationConfig.md +0 -1
  448. package/dist/okf/types/OrganizationConfigRule.md +7 -7
  449. package/dist/okf/types/Outpost.md +32 -0
  450. package/dist/okf/types/ParallelData.md +40 -0
  451. package/dist/okf/types/Partition.md +5 -5
  452. package/dist/okf/types/PaymentConnector.md +4 -1
  453. package/dist/okf/types/Pentest.md +1 -0
  454. package/dist/okf/types/PerfReports.md +28 -0
  455. package/dist/okf/types/PermissionAssociation.md +30 -0
  456. package/dist/okf/types/PersonalizeDataset.md +1 -0
  457. package/dist/okf/types/PersonalizeDatasetGroup.md +1 -0
  458. package/dist/okf/types/PersonalizeSchema.md +1 -0
  459. package/dist/okf/types/Pipeline.md +25 -0
  460. package/dist/okf/types/PlaybackConfiguration.md +1 -0
  461. package/dist/okf/types/PolicyAssociation.md +1 -1
  462. package/dist/okf/types/PolicyGrant.md +2 -2
  463. package/dist/okf/types/PolicyPrincipalAttachment.md +2 -7
  464. package/dist/okf/types/PortalProduct.md +24 -0
  465. package/dist/okf/types/PrefetchSchedule.md +25 -0
  466. package/dist/okf/types/PricingPlanManagerSubscription.md +31 -0
  467. package/dist/okf/types/PrincipalAssociation.md +27 -0
  468. package/dist/okf/types/PrivateDnsNamespace.md +8 -8
  469. package/dist/okf/types/PrivateVirtualInterface.md +1 -0
  470. package/dist/okf/types/ProcurementPortalPreference.md +45 -0
  471. package/dist/okf/types/Program.md +33 -0
  472. package/dist/okf/types/ProjectMembership.md +1 -1
  473. package/dist/okf/types/ProtocolsList.md +26 -0
  474. package/dist/okf/types/PublicDnsNamespace.md +7 -7
  475. package/dist/okf/types/PublicVirtualInterface.md +1 -0
  476. package/dist/okf/types/QEV2IdcApplication.md +25 -0
  477. package/dist/okf/types/QueryLoggingConfig.md +21 -0
  478. package/dist/okf/types/QuerySuggestionsBlockList.md +25 -0
  479. package/dist/okf/types/QuickSightAssignment.md +24 -0
  480. package/dist/okf/types/RAMResourceAssociation.md +27 -0
  481. package/dist/okf/types/RDSClusterSnapshot.md +54 -0
  482. package/dist/okf/types/RDSDBParameterGroup.md +5 -0
  483. package/dist/okf/types/RDSDeployment.md +41 -0
  484. package/dist/okf/types/RcsAgent.md +38 -0
  485. package/dist/okf/types/ReceiptRule.md +5 -5
  486. package/dist/okf/types/ReceiptRuleSet.md +1 -6
  487. package/dist/okf/types/RecommenderFilter.md +27 -0
  488. package/dist/okf/types/RecommenderSchema.md +25 -0
  489. package/dist/okf/types/RecordSet.md +16 -22
  490. package/dist/okf/types/RecoveryPlan.md +28 -0
  491. package/dist/okf/types/RedshiftIdcApplication.md +31 -0
  492. package/dist/okf/types/RedshiftSnapshot.md +59 -0
  493. package/dist/okf/types/RegistrationAttachment.md +28 -0
  494. package/dist/okf/types/Registry.md +41 -0
  495. package/dist/okf/types/RegistryRecord.md +38 -0
  496. package/dist/okf/types/RelatedItem.md +24 -0
  497. package/dist/okf/types/ReplicationConfigurationTemplate.md +35 -0
  498. package/dist/okf/types/ReplicationSubnetGroup.md +4 -9
  499. package/dist/okf/types/ReplicationTask.md +14 -14
  500. package/dist/okf/types/ReportGenerator.md +29 -0
  501. package/dist/okf/types/ReportGroup.md +1 -3
  502. package/dist/okf/types/ResilienceHubV2Policy.md +1 -0
  503. package/dist/okf/types/ResilienceHubV2Service.md +1 -0
  504. package/dist/okf/types/ResourceConfiguration.md +1 -1
  505. package/dist/okf/types/ResourceMetricsConfiguration.md +21 -0
  506. package/dist/okf/types/RestApi.md +1 -0
  507. package/dist/okf/types/RetrievalInstruction.md +32 -0
  508. package/dist/okf/types/RouterOutput.md +1 -0
  509. package/dist/okf/types/Rule.md +31 -0
  510. package/dist/okf/types/RunCache.md +29 -0
  511. package/dist/okf/types/Runtime.md +2 -1
  512. package/dist/okf/types/SCNInstance.md +33 -0
  513. package/dist/okf/types/SDBDomain.md +2 -2
  514. package/dist/okf/types/SMBFileShare.md +49 -0
  515. package/dist/okf/types/SageMakerArtifact.md +27 -0
  516. package/dist/okf/types/SageMakerEndpoint.md +0 -1
  517. package/dist/okf/types/ScalableTarget.md +1 -0
  518. package/dist/okf/types/ScalingPlan.md +6 -6
  519. package/dist/okf/types/ScheduledReport.md +31 -0
  520. package/dist/okf/types/SecondaryNetwork.md +26 -0
  521. package/dist/okf/types/SecurityAgentArtifact.md +25 -0
  522. package/dist/okf/types/SecurityAgentIntegration.md +31 -0
  523. package/dist/okf/types/Server.md +1 -0
  524. package/dist/okf/types/ServerlessCache.md +2 -0
  525. package/dist/okf/types/ServerlessCacheSnapshot.md +31 -0
  526. package/dist/okf/types/ServerlessRepoApplication.md +32 -0
  527. package/dist/okf/types/ServiceDiscoveryInstance.md +3 -7
  528. package/dist/okf/types/SipMediaApplication.md +27 -0
  529. package/dist/okf/types/SiteToSiteVpnAttachment.md +2 -0
  530. package/dist/okf/types/SnapshotCopyGrant.md +20 -0
  531. package/dist/okf/types/Solution.md +1 -0
  532. package/dist/okf/types/SourceAssociation.md +25 -0
  533. package/dist/okf/types/SourceCredential.md +6 -6
  534. package/dist/okf/types/SourceNetwork.md +23 -0
  535. package/dist/okf/types/StackFleetAssociation.md +2 -7
  536. package/dist/okf/types/StorageTierPolicy.md +20 -0
  537. package/dist/okf/types/StorageVirtualMachine.md +9 -9
  538. package/dist/okf/types/Stream.md +28 -0
  539. package/dist/okf/types/SubnetCidrReservation.md +26 -0
  540. package/dist/okf/types/SubscriptionProvider.md +26 -0
  541. package/dist/okf/types/SupportPermit.md +29 -0
  542. package/dist/okf/types/Table.md +2 -1
  543. package/dist/okf/types/TableOptimizer.md +5 -10
  544. package/dist/okf/types/Tape.md +31 -0
  545. package/dist/okf/types/Template.md +36 -0
  546. package/dist/okf/types/Tenant.md +2 -0
  547. package/dist/okf/types/Terminology.md +39 -0
  548. package/dist/okf/types/Thesaurus.md +25 -0
  549. package/dist/okf/types/ThingPrincipalAttachment.md +3 -8
  550. package/dist/okf/types/Topic.md +1 -0
  551. package/dist/okf/types/TopicRuleDestination.md +1 -0
  552. package/dist/okf/types/TrafficPolicy.md +26 -0
  553. package/dist/okf/types/TrafficPolicyInstance.md +28 -0
  554. package/dist/okf/types/TranscribeVocabulary.md +27 -0
  555. package/dist/okf/types/TransitGatewayRouteTableAttachment.md +2 -0
  556. package/dist/okf/types/TransitVirtualInterface.md +1 -0
  557. package/dist/okf/types/Tunnel.md +25 -0
  558. package/dist/okf/types/UsageLimit.md +26 -0
  559. package/dist/okf/types/UseCase.md +23 -0
  560. package/dist/okf/types/User.md +47 -0
  561. package/dist/okf/types/VPCEndpoint.md +1 -1
  562. package/dist/okf/types/VPCEndpointService.md +6 -0
  563. package/dist/okf/types/VPCPeeringConnection.md +2 -2
  564. package/dist/okf/types/VPNConcentrator.md +1 -1
  565. package/dist/okf/types/VPNConnection.md +1 -1
  566. package/dist/okf/types/VerifiedDestinationNumber.md +25 -0
  567. package/dist/okf/types/View.md +27 -0
  568. package/dist/okf/types/VoiceConnector.md +30 -0
  569. package/dist/okf/types/Volume.md +44 -0
  570. package/dist/okf/types/Vpc.md +1 -1
  571. package/dist/okf/types/VpcAttachment.md +2 -0
  572. package/dist/okf/types/WebFunction.md +27 -0
  573. package/dist/okf/types/WebFunctionEndpoint.md +44 -0
  574. package/dist/okf/types/WebFunctionRevision.md +32 -0
  575. package/dist/okf/types/WickrNetwork.md +27 -0
  576. package/dist/okf/types/Worker.md +29 -0
  577. package/dist/okf/types/Workforce.md +26 -0
  578. package/dist/okf/types/Workload.md +35 -0
  579. package/dist/okf/types/WorkloadEstimate.md +35 -0
  580. package/dist/okf/types/Workspace.md +28 -0
  581. package/dist/okf/types/Workteam.md +8 -8
  582. package/dist/op/activities/aws-apply.js +214 -0
  583. package/dist/op/activities/floci.js +97 -0
  584. package/dist/op/activities/index.js +32 -0
  585. package/dist/op/builders.js +50 -0
  586. package/dist/ownership.js +52 -0
  587. package/dist/package-cli.js +25 -0
  588. package/dist/parameter.js +19 -0
  589. package/dist/plugin.d.ts.map +1 -1
  590. package/dist/plugin.js +1006 -0
  591. package/dist/properties.js +166 -0
  592. package/dist/pseudo.js +25 -0
  593. package/dist/receipt-store.d.ts.map +1 -1
  594. package/dist/receipt-store.js +233 -0
  595. package/dist/reference-catalog.js +106 -0
  596. package/dist/rules/ext001.ts +3 -3
  597. package/dist/rules/waw016.ts +2 -2
  598. package/dist/serializer.js +529 -0
  599. package/dist/spec/fetch.js +193 -0
  600. package/dist/spec/parse.js +259 -0
  601. package/dist/spec/pin.js +185 -0
  602. package/dist/spec/pinned-types.json +203 -0
  603. package/dist/stack-errors.js +14 -0
  604. package/dist/taggable.d.ts.map +1 -1
  605. package/dist/taggable.js +33 -0
  606. package/dist/teardown.js +199 -0
  607. package/dist/template-sections.js +53 -0
  608. package/dist/template-transform.js +50 -0
  609. package/dist/types/index.d.ts +18847 -1124
  610. package/dist/validate-cli.js +16 -0
  611. package/dist/validate.js +33 -0
  612. package/package.json +9 -9
  613. package/src/agentcore/trace-fetch.ts +2 -1
  614. package/src/api/credential-chain.ts +119 -9
  615. package/src/api/credential-isolation.test.ts +72 -0
  616. package/src/api/read-client-chain.test.ts +159 -0
  617. package/src/api/read-client.ts +42 -6
  618. package/src/api/sigv4.ts +4 -4
  619. package/src/caller-identity.ts +3 -5
  620. package/src/codegen/any-budget.test.ts +12 -2
  621. package/src/codegen/generate.ts +9 -0
  622. package/src/codegen/package.ts +2 -2
  623. package/src/codegen/patches.test.ts +95 -0
  624. package/src/codegen/patches.ts +53 -9
  625. package/src/codegen/property-overlay.json +1 -16
  626. package/src/components/apply.ts +218 -6
  627. package/src/components/cfn-plan-floci.e2e.test.ts +76 -0
  628. package/src/components/cfn-plan.test.ts +225 -16
  629. package/src/components/cloud-executor.ts +73 -25
  630. package/src/deep-observe.ts +2 -1
  631. package/src/disruption.ts +2 -1
  632. package/src/generated/index.d.ts +18847 -1124
  633. package/src/generated/index.ts +1376 -161
  634. package/src/generated/lexicon-aws.json +17359 -784
  635. package/src/identity-observe.ts +2 -1
  636. package/src/lint/post-synth/ext001.ts +3 -3
  637. package/src/lint/post-synth/waw016.ts +2 -2
  638. package/src/lsp/completions.ts +2 -1
  639. package/src/lsp/hover.ts +2 -1
  640. package/src/plugin.ts +2 -1
  641. package/src/receipt-store.ts +2 -1
  642. package/src/spec/pin.ts +3 -3
  643. package/src/spec/pinned-types.json +203 -0
  644. package/src/taggable.ts +2 -2
@@ -0,0 +1,293 @@
1
+ /**
2
+ * MicrovmApp — composite-first delivery of AWS Lambda MicroVM support (#879).
3
+ *
4
+ * Emits `AWS::Lambda::MicrovmImage` (a preview CFN resource type — see the
5
+ * issue's "Preview-API gate") plus the least-privilege build/execution IAM
6
+ * roles the upstream `ran-isenberg/lambda-microvm-cdk-python` construct
7
+ * creates, and — only when build-time VPC egress is requested — an
8
+ * `AWS::Lambda::NetworkConnector`, its deny-all-egress security group, and its
9
+ * ENI operator role.
10
+ *
11
+ * Base path only (#879 scope): `chant build` serializes this composite to a
12
+ * CloudFormation template; `cfn-deploy` + `wait-for-stack` deploy it and wait
13
+ * for the image snapshot to build, with no bespoke verb. The
14
+ * `microvm-image-build` capability (build-once / promote-by-ARN) is deferred
15
+ * — see the issue's "Settled decisions".
16
+ *
17
+ * The IAM shapes below mirror `lambda_microvm_cdk._impl.security` (build role
18
+ * scoped to the exact S3 code-artifact object + the image's own log group;
19
+ * execution role scoped to runtime logs only; connector operator role scoped
20
+ * to the AWS-documented `ec2:CreateNetworkInterface`/`CreateTags` grant), and
21
+ * the deny-all security group reproduces `aws-cdk-lib`'s own
22
+ * `MATCH_NO_TRAFFIC` placeholder rule (`aws-ec2/lib/security-group.ts`) —
23
+ * spot-checked against both upstream sources so the shapes match what the
24
+ * MicroVM service actually expects, not a guess.
25
+ */
26
+ import { Composite, mergeDefaults } from "@intentius/chant";
27
+ import { MicrovmImage, MicrovmImage_CloudWatchLogging, MicrovmImage_CodeArtifact, MicrovmImage_CpuConfiguration, MicrovmImage_EnvironmentVariable, MicrovmImage_Hooks, MicrovmImage_Logging, MicrovmImage_Resources, NetworkConnector, NetworkConnector_Config, NetworkConnector_VpcEgressConfiguration, Role, Role_Policy, SecurityGroup, SecurityGroup_Egress, } from "../generated/index.js";
28
+ import { Sub } from "../intrinsics.js";
29
+ const MICROVM_SERVICE_PRINCIPAL = "lambda.amazonaws.com";
30
+ const CONNECTOR_MANAGED_RESOURCE_OPERATOR = "network-connectors.lambda.amazonaws.com";
31
+ /**
32
+ * The Lambda MicroVMs service's real limits, verified against the upstream
33
+ * `ran-isenberg/lambda-microvm-cdk-python` construct and the AWS docs.
34
+ *
35
+ * Exported because a consumer driving the same service through a different
36
+ * control plane needs the same numbers, and copying them is how two sources of
37
+ * truth start (#1374). The CFN schema types most of these as open ints and
38
+ * strings, so nothing but this object knows them.
39
+ */
40
+ export const MICROVM_LIMITS = {
41
+ /** Documented baseline memory tiers (MiB). The schema says int; the service accepts five values. vCPU auto-scales with the tier. */
42
+ memoryMiB: [512, 1024, 2048, 4096, 8192],
43
+ namePattern: /^[a-zA-Z0-9-_]+$/,
44
+ maxNameLength: 64,
45
+ /** Set by the service on every MicroVM; supplying it is rejected. */
46
+ reservedEnvironmentKeys: ["AWS_REGION"],
47
+ maxEnvironmentVariables: 50,
48
+ maxEgressConnectors: 10,
49
+ connectorSubnets: { min: 1, max: 16 },
50
+ };
51
+ const VALID_MEMORY_MIB = MICROVM_LIMITS.memoryMiB;
52
+ const NAME_PATTERN = MICROVM_LIMITS.namePattern;
53
+ const MAX_NAME_LENGTH = MICROVM_LIMITS.maxNameLength;
54
+ const RESERVED_ENV_KEYS = new Set(MICROVM_LIMITS.reservedEnvironmentKeys);
55
+ const MAX_ENVIRONMENT_VARIABLES = MICROVM_LIMITS.maxEnvironmentVariables;
56
+ const MAX_EGRESS_CONNECTORS = MICROVM_LIMITS.maxEgressConnectors;
57
+ const MIN_CONNECTOR_SUBNETS = MICROVM_LIMITS.connectorSubnets.min;
58
+ const MAX_CONNECTOR_SUBNETS = MICROVM_LIMITS.connectorSubnets.max;
59
+ /**
60
+ * `sts:AssumeRole` + `sts:TagSession` trust for `lambda.amazonaws.com` — the
61
+ * MicroVM service assumes the build/execution roles with session tags
62
+ * (`lambda_microvm_cdk._impl.security._microvm_service_trust`).
63
+ */
64
+ const microvmServiceTrustPolicy = {
65
+ Version: "2012-10-17",
66
+ Statement: [
67
+ { Effect: "Allow", Principal: { Service: MICROVM_SERVICE_PRINCIPAL }, Action: "sts:AssumeRole" },
68
+ { Effect: "Allow", Principal: { Service: MICROVM_SERVICE_PRINCIPAL }, Action: "sts:TagSession" },
69
+ ],
70
+ };
71
+ /** Plain `sts:AssumeRole` trust — the connector operator role's documented trust (no session tags). */
72
+ const lambdaTrustPolicy = {
73
+ Version: "2012-10-17",
74
+ Statement: [
75
+ { Effect: "Allow", Principal: { Service: MICROVM_SERVICE_PRINCIPAL }, Action: "sts:AssumeRole" },
76
+ ],
77
+ };
78
+ /**
79
+ * CDK's synthesized "deny all outbound" placeholder rule. A security group
80
+ * with no egress rules gets CloudFormation's allow-all-outbound default, so
81
+ * this rule (which matches no real traffic — `255.255.255.255/32` is
82
+ * unassignable) is added explicitly to override that default. Verbatim
83
+ * `MATCH_NO_TRAFFIC` from `aws-cdk-lib/aws-ec2/lib/security-group.ts`.
84
+ */
85
+ const DENY_ALL_EGRESS = new SecurityGroup_Egress({
86
+ CidrIp: "255.255.255.255/32",
87
+ Description: "Disallow all traffic",
88
+ IpProtocol: "icmp",
89
+ FromPort: 252,
90
+ ToPort: 86,
91
+ });
92
+ export const MicrovmApp = Composite((props) => {
93
+ if (!NAME_PATTERN.test(props.name) || props.name.length > MAX_NAME_LENGTH) {
94
+ throw new Error(`MicrovmApp name must match ${NAME_PATTERN} and be ≤${MAX_NAME_LENGTH} chars, got: ${JSON.stringify(props.name)}`);
95
+ }
96
+ const memoryMiB = props.memoryMiB ?? 2048;
97
+ if (!VALID_MEMORY_MIB.includes(memoryMiB)) {
98
+ throw new Error(`MicrovmApp memoryMiB must be one of ${VALID_MEMORY_MIB.join(", ")}, got: ${memoryMiB}`);
99
+ }
100
+ const environment = props.environment ?? {};
101
+ const environmentKeys = Object.keys(environment);
102
+ if (environmentKeys.length > MAX_ENVIRONMENT_VARIABLES) {
103
+ throw new Error(`MicrovmApp environment supports at most ${MAX_ENVIRONMENT_VARIABLES} variables, got ${environmentKeys.length}`);
104
+ }
105
+ for (const key of environmentKeys) {
106
+ if (RESERVED_ENV_KEYS.has(key)) {
107
+ throw new Error(`MicrovmApp environment key "${key}" is reserved — the MicroVM runtime injects it`);
108
+ }
109
+ }
110
+ const additionalEgressConnectors = props.additionalEgressConnectors ?? [];
111
+ const totalConnectors = additionalEgressConnectors.length + (props.buildConnector ? 1 : 0);
112
+ if (totalConnectors > MAX_EGRESS_CONNECTORS) {
113
+ throw new Error(`MicrovmApp supports at most ${MAX_EGRESS_CONNECTORS} egress connectors total, got ${totalConnectors}`);
114
+ }
115
+ if (props.buildConnector) {
116
+ const subnetCount = props.buildConnector.subnetIds.length;
117
+ if (subnetCount < MIN_CONNECTOR_SUBNETS || subnetCount > MAX_CONNECTOR_SUBNETS) {
118
+ throw new Error(`MicrovmApp buildConnector needs ${MIN_CONNECTOR_SUBNETS}-${MAX_CONNECTOR_SUBNETS} subnets, got ${subnetCount}`);
119
+ }
120
+ }
121
+ const { defaults } = props;
122
+ // Service-owned log group the build + execution roles are scoped to
123
+ // (`lambda_microvm_cdk._impl.security.log_group_arn`) — the MicroVM service
124
+ // creates and owns this group; this composite only references its ARN for
125
+ // the IAM grants, never declares the group itself.
126
+ const logGroupName = `/aws/lambda/microvms/${props.name}`;
127
+ const logGroupArn = Sub `arn:\${AWS::Partition}:logs:\${AWS::Region}:\${AWS::AccountId}:log-group:${logGroupName}`;
128
+ const logGroupArnWildcard = Sub `arn:\${AWS::Partition}:logs:\${AWS::Region}:\${AWS::AccountId}:log-group:${logGroupName}:*`;
129
+ // ── Build role ── s3:GetObject on the exact code artifact object, logs:* on the image's own log group.
130
+ const buildRole = new Role(mergeDefaults({
131
+ AssumeRolePolicyDocument: microvmServiceTrustPolicy,
132
+ Description: "Least-privilege build role for the Lambda MicroVM image build",
133
+ Policies: [
134
+ new Role_Policy({
135
+ PolicyName: "MicrovmImageBuild",
136
+ PolicyDocument: {
137
+ Version: "2012-10-17",
138
+ Statement: [
139
+ {
140
+ Sid: "ReadExactCodeArtifact",
141
+ Effect: "Allow",
142
+ Action: "s3:GetObject",
143
+ Resource: props.codeArtifactObjectArn,
144
+ },
145
+ {
146
+ Sid: "WriteBuildLogs",
147
+ Effect: "Allow",
148
+ Action: ["logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents"],
149
+ Resource: [logGroupArn, logGroupArnWildcard],
150
+ },
151
+ ],
152
+ },
153
+ }),
154
+ ],
155
+ }, defaults?.buildRole));
156
+ // ── Execution role ── runtime-logs only; the consumer adds workload permissions on top.
157
+ const executionRole = new Role(mergeDefaults({
158
+ AssumeRolePolicyDocument: microvmServiceTrustPolicy,
159
+ Description: "Least-privilege execution role assumed by the running MicroVM",
160
+ Policies: [
161
+ new Role_Policy({
162
+ PolicyName: "MicrovmRuntimeLogs",
163
+ PolicyDocument: {
164
+ Version: "2012-10-17",
165
+ Statement: [
166
+ {
167
+ Sid: "WriteRuntimeLogs",
168
+ Effect: "Allow",
169
+ Action: ["logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents"],
170
+ Resource: [logGroupArn, logGroupArnWildcard],
171
+ },
172
+ ],
173
+ },
174
+ }),
175
+ ],
176
+ }, defaults?.executionRole));
177
+ // ── Optional build-time egress connector ──────────────────────────────────
178
+ let connectorSecurityGroup;
179
+ let connectorOperatorRole;
180
+ let connector;
181
+ const egressConnectorArns = [...additionalEgressConnectors];
182
+ // A closure (invoked below) keeps the connector `new`s out of the `if` (EVL002);
183
+ // the early-return guard also narrows `props.buildConnector` for the body.
184
+ const buildConnectorResources = () => {
185
+ if (!props.buildConnector)
186
+ return;
187
+ // Deny-all by default — the security group's rules ARE the egress policy;
188
+ // open specific traffic via `defaults.connectorSecurityGroup`.
189
+ connectorSecurityGroup = new SecurityGroup(mergeDefaults({
190
+ GroupDescription: "MicroVM egress connector security group (rules ARE the egress policy)",
191
+ VpcId: props.buildConnector.vpcId,
192
+ SecurityGroupEgress: [DENY_ALL_EGRESS],
193
+ }, defaults?.connectorSecurityGroup));
194
+ // Reproduces verbatim the AWS-documented `NetworkConnector` operator-role
195
+ // policy: `ec2:CreateNetworkInterface` on the ENI/subnet/security-group
196
+ // resource types (region/account wildcarded — Lambda creates the ENIs in
197
+ // its own context, so pinning them would deny the call and the connector
198
+ // would never become ACTIVE), plus `ec2:CreateTags` on ENIs conditioned on
199
+ // the connector's own managed-resource operator so the grant can't tag
200
+ // arbitrary interfaces.
201
+ connectorOperatorRole = new Role(mergeDefaults({
202
+ AssumeRolePolicyDocument: lambdaTrustPolicy,
203
+ Description: "Least-privilege operator role Lambda assumes to manage the MicroVM connector ENIs",
204
+ Policies: [
205
+ new Role_Policy({
206
+ PolicyName: "MicrovmConnectorEnis",
207
+ PolicyDocument: {
208
+ Version: "2012-10-17",
209
+ Statement: [
210
+ {
211
+ Sid: "CreateENI",
212
+ Effect: "Allow",
213
+ Action: "ec2:CreateNetworkInterface",
214
+ Resource: [
215
+ Sub `arn:\${AWS::Partition}:ec2:*:*:network-interface/*`,
216
+ Sub `arn:\${AWS::Partition}:ec2:*:*:subnet/*`,
217
+ Sub `arn:\${AWS::Partition}:ec2:*:*:security-group/*`,
218
+ ],
219
+ },
220
+ {
221
+ Sid: "TagENI",
222
+ Effect: "Allow",
223
+ Action: "ec2:CreateTags",
224
+ Resource: Sub `arn:\${AWS::Partition}:ec2:*:*:network-interface/*`,
225
+ Condition: {
226
+ StringEquals: { "ec2:ManagedResourceOperator": CONNECTOR_MANAGED_RESOURCE_OPERATOR },
227
+ },
228
+ },
229
+ ],
230
+ },
231
+ }),
232
+ ],
233
+ }, defaults?.connectorOperatorRole));
234
+ connector = new NetworkConnector(mergeDefaults({
235
+ OperatorRole: connectorOperatorRole.Arn,
236
+ Configuration: new NetworkConnector_Config({
237
+ VpcEgressConfiguration: new NetworkConnector_VpcEgressConfiguration({
238
+ AssociatedComputeResourceTypes: ["MicroVm"],
239
+ SubnetIds: props.buildConnector.subnetIds,
240
+ SecurityGroupIds: [connectorSecurityGroup.GroupId],
241
+ NetworkProtocol: props.buildConnector.networkProtocol ?? "IPv4",
242
+ }),
243
+ }),
244
+ }, defaults?.connector));
245
+ egressConnectorArns.push(connector.Arn);
246
+ };
247
+ if (props.buildConnector)
248
+ buildConnectorResources();
249
+ // ── The image itself ───────────────────────────────────────────────────────
250
+ const logging = props.disableLogging
251
+ ? new MicrovmImage_Logging({ Disabled: true })
252
+ : new MicrovmImage_Logging({ CloudWatch: new MicrovmImage_CloudWatchLogging({ LogGroup: logGroupName }) });
253
+ // Object.entries avoids the computed `environment[key]` access (EVL003, #952).
254
+ const environmentVariables = Object.entries(environment).map(([key, value]) => new MicrovmImage_EnvironmentVariable({ Key: key, Value: value }));
255
+ // `Hooks` is required by the CFN schema but every nested field is optional —
256
+ // "no hooks configured" (all lifecycle hooks disabled) is a real, valid `{}`.
257
+ // The serializer drops a wrapped property object down to `undefined` when its
258
+ // `.props` has zero keys (so an *optional* empty nested object vanishes
259
+ // rather than serializing as `{}`), which would silently drop this
260
+ // *required* property from the template. Emit a plain object literal instead
261
+ // of the `MicrovmImage_Hooks` wrapper so an empty `Hooks` still serializes
262
+ // as `{}`, not nothing.
263
+ const hasHooks = props.hooks !== undefined && Object.keys(props.hooks).length > 0;
264
+ const hooks = hasHooks ? new MicrovmImage_Hooks(props.hooks) : {};
265
+ // Short alias (e.g. "al2023-1") -> the AWS-managed base-image ARN; full ARNs pass through.
266
+ const baseImageArn = props.baseImage.startsWith("arn:")
267
+ ? props.baseImage
268
+ : Sub `arn:\${AWS::Partition}:lambda:\${AWS::Region}:aws:microvm-image:${props.baseImage}`;
269
+ const image = new MicrovmImage(mergeDefaults({
270
+ Name: props.name,
271
+ Description: props.description ?? "",
272
+ BaseImageArn: baseImageArn,
273
+ BaseImageVersion: props.baseImageVersion ?? "0",
274
+ BuildRoleArn: buildRole.Arn,
275
+ CodeArtifact: new MicrovmImage_CodeArtifact({ Uri: props.codeArtifactUri }),
276
+ // ARM_64 is the only architecture the service accepts today.
277
+ CpuConfigurations: [new MicrovmImage_CpuConfiguration({ Architecture: "ARM_64" })],
278
+ Resources: [new MicrovmImage_Resources({ MinimumMemoryInMiB: memoryMiB })],
279
+ AdditionalOsCapabilities: props.additionalOsCapabilities ?? [],
280
+ EgressNetworkConnectors: egressConnectorArns,
281
+ EnvironmentVariables: environmentVariables,
282
+ Hooks: hooks,
283
+ Logging: logging,
284
+ }, defaults?.image));
285
+ return {
286
+ buildRole,
287
+ executionRole,
288
+ image,
289
+ ...(connectorSecurityGroup ? { connectorSecurityGroup } : {}),
290
+ ...(connectorOperatorRole ? { connectorOperatorRole } : {}),
291
+ ...(connector ? { connector } : {}),
292
+ };
293
+ }, "MicrovmApp");
@@ -0,0 +1,40 @@
1
+ import { Composite, mergeDefaults } from "@intentius/chant";
2
+ import { Vpc, Subnet, InternetGateway, VPCGatewayAttachment, RouteTable, EC2Route, SubnetRouteTableAssociation, SecurityGroup, } from "../generated/index.js";
3
+ import { Select, GetAZs } from "../intrinsics.js";
4
+ /** A VPC with one public subnet, an internet gateway, a public route and a security group. */
5
+ export const MinimalVpc = Composite((props) => {
6
+ const { defaults } = props;
7
+ const cidr = props.cidr ?? "10.0.0.0/24";
8
+ const subnetCidr = props.subnetCidr ?? "10.0.0.0/25";
9
+ const vpc = new Vpc(mergeDefaults({
10
+ CidrBlock: cidr,
11
+ EnableDnsHostnames: true,
12
+ EnableDnsSupport: true,
13
+ }, defaults?.vpc));
14
+ const subnet = new Subnet(mergeDefaults({
15
+ VpcId: vpc.VpcId,
16
+ CidrBlock: subnetCidr,
17
+ AvailabilityZone: Select(0, GetAZs("")),
18
+ MapPublicIpOnLaunch: true,
19
+ }, defaults?.subnet));
20
+ const igw = new InternetGateway({});
21
+ const igwAttachment = new VPCGatewayAttachment({
22
+ VpcId: vpc.VpcId,
23
+ InternetGatewayId: igw.InternetGatewayId,
24
+ });
25
+ const routeTable = new RouteTable({ VpcId: vpc.VpcId });
26
+ const defaultRoute = new EC2Route({
27
+ RouteTableId: routeTable.RouteTableId,
28
+ DestinationCidrBlock: "0.0.0.0/0",
29
+ GatewayId: igw.InternetGatewayId,
30
+ }, { DependsOn: [igwAttachment] });
31
+ const subnetRta = new SubnetRouteTableAssociation({
32
+ SubnetId: subnet.SubnetId,
33
+ RouteTableId: routeTable.RouteTableId,
34
+ });
35
+ const securityGroup = new SecurityGroup(mergeDefaults({
36
+ GroupDescription: "MinimalVpc default security group",
37
+ VpcId: vpc.VpcId,
38
+ }, defaults?.securityGroup));
39
+ return { vpc, subnet, igw, igwAttachment, routeTable, defaultRoute, subnetRta, securityGroup };
40
+ }, "MinimalVpc");
@@ -0,0 +1,105 @@
1
+ /**
2
+ * MonitoringStack — a CloudWatch dashboard wired to up to three named
3
+ * metrics, with an optional alarm per metric.
4
+ *
5
+ * The recurring hand-rolled shape the aws-bench corpus surfaced: a team
6
+ * stands up a `cloudwatch.Dashboard`, a `cloudwatch.Metric` per resource it
7
+ * cares about, and a near-identical `cloudwatch.Alarm` next to each one — 44
8
+ * combined dashboard+alarm+metric instantiations across the corpus' 8 real
9
+ * CDK apps, nothing equivalent shipped in chant (epic #1139).
10
+ *
11
+ * Fixed `metric1..metric3` slots, not a `metrics: MetricSpec[]` array — a
12
+ * loop building `Alarm` resources from an array is exactly the control-flow-
13
+ * over-resources shape EVL002/EVL003 rule out for reference composites (see
14
+ * `EksCluster`'s `addon1..addon3`, this directory). A fourth metric is a bare
15
+ * `Alarm` + a hand-edited `CwDashboard.DashboardBody` the estate declares
16
+ * directly.
17
+ *
18
+ * What is deliberately NOT here:
19
+ * - Notification wiring. `alarm.alarmActions` on each metric takes ARNs the
20
+ * caller already has (an SNS topic from `LambdaSns`, or hand-declared);
21
+ * this composite does not create a `Topic`/`Subscription` itself — who
22
+ * gets paged and on what channel is a real per-estate decision, not a
23
+ * default worth guessing. `defaults.alarm1..3` is the escape hatch for
24
+ * anything else on the alarm (e.g. `OKActions`, `DatapointsToAlarm`).
25
+ * - Math-expression / composite / anomaly-detection alarms (`Alarm.Metrics`,
26
+ * `AlarmModel`) — single-metric threshold alarms only.
27
+ * - Dynamic (`Ref`/`GetAtt`/`Sub`) values inside the dashboard body.
28
+ * `CwDashboard.DashboardBody` is one flat JSON string CloudFormation does
29
+ * not template, so each metric's `namespace`/`metricName`/`dimension.value`
30
+ * must be a literal the caller already knows — the physical name they set
31
+ * on the monitored resource, not one CloudFormation generates. The `Alarm`
32
+ * resources carry no such limit: `Dimensions` is a real structured
33
+ * property, so `alarm.dimensionValue` accepts `Value<string>` and can
34
+ * reference a sibling resource by `Ref`/`GetAtt`.
35
+ */
36
+ import { Composite, mergeDefaults } from "@intentius/chant";
37
+ import { Alarm, CwDashboard } from "../generated/index.js";
38
+ /** A CloudWatch dashboard "metric" widget, stacked full-width below the last. */
39
+ function widget(spec, index) {
40
+ // Two literal-array branches, not a spread — EVL004 only traces a spread
41
+ // source to a *module-level* const (packages/core/src/lint/rules/
42
+ // evl004-spread-non-const.ts's isConstIdentifier walks sourceFile.statements
43
+ // only), so a same-function `const dims = [...]` here reads as non-const
44
+ // even though it is one. A ternary between two literals sidesteps the gap
45
+ // instead of fighting it.
46
+ const metricTuple = spec.dimension
47
+ ? [spec.namespace, spec.metricName, spec.dimension.name, spec.dimension.value]
48
+ : [spec.namespace, spec.metricName];
49
+ return {
50
+ type: "metric",
51
+ x: 0,
52
+ y: index * 6,
53
+ width: 24,
54
+ height: 6,
55
+ properties: {
56
+ title: spec.title,
57
+ metrics: [metricTuple],
58
+ period: spec.period ?? 300,
59
+ stat: spec.statistic ?? "Sum",
60
+ view: "timeSeries",
61
+ },
62
+ };
63
+ }
64
+ function alarmProps(spec) {
65
+ const a = spec.alarm;
66
+ return {
67
+ AlarmName: spec.title,
68
+ AlarmDescription: `${spec.title} breached its threshold`,
69
+ Namespace: spec.namespace,
70
+ MetricName: spec.metricName,
71
+ Dimensions: spec.dimension
72
+ ? [{ Name: spec.dimension.name, Value: a.dimensionValue ?? spec.dimension.value }]
73
+ : undefined,
74
+ Statistic: spec.statistic ?? "Sum",
75
+ Period: spec.period ?? 300,
76
+ Threshold: a.threshold,
77
+ ComparisonOperator: a.comparisonOperator ?? "GreaterThanThreshold",
78
+ EvaluationPeriods: a.evaluationPeriods ?? 1,
79
+ TreatMissingData: a.treatMissingData,
80
+ AlarmActions: a.alarmActions,
81
+ };
82
+ }
83
+ export const MonitoringStack = Composite((props) => {
84
+ const { defaults } = props;
85
+ const specs = [props.metric1, props.metric2, props.metric3].filter((s) => s !== undefined);
86
+ const dashboard = new CwDashboard(mergeDefaults({
87
+ DashboardName: props.dashboardName,
88
+ DashboardBody: JSON.stringify({ widgets: specs.map(widget) }),
89
+ }, defaults?.dashboard));
90
+ const alarm1 = props.metric1.alarm
91
+ ? new Alarm(mergeDefaults(alarmProps(props.metric1), defaults?.alarm1))
92
+ : undefined;
93
+ const alarm2 = props.metric2?.alarm
94
+ ? new Alarm(mergeDefaults(alarmProps(props.metric2), defaults?.alarm2))
95
+ : undefined;
96
+ const alarm3 = props.metric3?.alarm
97
+ ? new Alarm(mergeDefaults(alarmProps(props.metric3), defaults?.alarm3))
98
+ : undefined;
99
+ return {
100
+ dashboard,
101
+ ...(alarm1 ? { alarm1 } : {}),
102
+ ...(alarm2 ? { alarm2 } : {}),
103
+ ...(alarm3 ? { alarm3 } : {}),
104
+ };
105
+ }, "MonitoringStack");
@@ -0,0 +1,61 @@
1
+ import { Composite, mergeDefaults } from "@intentius/chant";
2
+ import { LoadBalancer, TargetGroup, TargetGroup_TargetDescription, Listener, Listener_Action, Listener_Certificate, } from "../generated/index.js";
3
+ /** A Network Load Balancer with a target group and listener. */
4
+ export const NlbService = Composite((props) => {
5
+ if (props.protocol === "TLS" && !props.certificateArn) {
6
+ throw new Error("NlbService requires certificateArn when protocol is TLS");
7
+ }
8
+ const listenerPort = props.listenerPort ?? 80;
9
+ const targetPort = props.targetPort ?? listenerPort;
10
+ const protocol = props.protocol ?? "TCP";
11
+ const scheme = props.scheme ?? "internet-facing";
12
+ const targetType = props.targetType ?? "ip";
13
+ const { defaults: defs } = props;
14
+ // Network Load Balancer. Unlike the ALB composites, no security group is
15
+ // created here — NLBs pass through the client's source IP by default, so
16
+ // access control belongs on the target side (or via an explicit SG passed
17
+ // through `defaults.nlb`), not on the load balancer itself.
18
+ const nlb = new LoadBalancer(mergeDefaults({
19
+ Type: "network",
20
+ Scheme: scheme,
21
+ Subnets: props.subnetIds,
22
+ }, defs?.nlb));
23
+ // Target group. Static targets are optional — a `.map` keeps the `new`s
24
+ // out of a conditional (EVL002).
25
+ const targets = props.targets?.map((t) => new TargetGroup_TargetDescription({
26
+ Id: t.id,
27
+ Port: t.port,
28
+ AvailabilityZone: t.availabilityZone,
29
+ }));
30
+ const targetGroup = new TargetGroup(mergeDefaults({
31
+ TargetType: targetType,
32
+ Protocol: protocol,
33
+ Port: targetPort,
34
+ VpcId: props.vpcId,
35
+ HealthCheckProtocol: props.healthCheckProtocol ?? "TCP",
36
+ HealthCheckPort: props.healthCheckPort,
37
+ HealthCheckPath: props.healthCheckPath,
38
+ Targets: targets,
39
+ }, defs?.targetGroup));
40
+ // Listener — forwards to the target group. TLS carries the cert; a
41
+ // ternary keeps the `new` out of the `if` (EVL002).
42
+ const forwardAction = new Listener_Action({
43
+ Type: "forward",
44
+ TargetGroupArn: targetGroup.TargetGroupArn,
45
+ });
46
+ const listenerProps = {
47
+ LoadBalancerArn: nlb.LoadBalancerArn,
48
+ Port: listenerPort,
49
+ Protocol: protocol,
50
+ DefaultActions: [forwardAction],
51
+ Certificates: protocol === "TLS" && props.certificateArn
52
+ ? [new Listener_Certificate({ CertificateArn: props.certificateArn })]
53
+ : undefined,
54
+ };
55
+ const listener = new Listener(mergeDefaults(listenerProps, defs?.listener));
56
+ return {
57
+ nlb,
58
+ targetGroup,
59
+ listener,
60
+ };
61
+ }, "NlbService");
@@ -0,0 +1,98 @@
1
+ import { Composite, mergeDefaults } from "@intentius/chant";
2
+ import { DbInstance, RDSDBSubnetGroup, RDSDBParameterGroup, SecurityGroup, SecurityGroup_Ingress, } from "../generated/index.js";
3
+ // A Map (not a Record) so the per-engine lookup uses `.get()` rather than the
4
+ // computed `ENGINE_DEFAULTS[engine]` element access the evaluability lint flags (#952).
5
+ const ENGINE_DEFAULTS = new Map([
6
+ ["postgres", { port: 5432, username: "postgres", version: "16.6", logExport: "postgresql" }],
7
+ ["mysql", { port: 3306, username: "admin", version: "8.0.40", logExport: "general" }],
8
+ ["mariadb", { port: 3306, username: "admin", version: "11.4.3", logExport: "general" }],
9
+ ]);
10
+ /** An RDS database instance with its subnet group, parameter group and security group, defaulting to PostgreSQL. */
11
+ export const RdsInstance = Composite((props) => {
12
+ const engine = props.engine ?? "postgres";
13
+ const defaults = ENGINE_DEFAULTS.get(engine);
14
+ const port = props.port ?? defaults.port;
15
+ const masterUsername = props.masterUsername ?? defaults.username;
16
+ const engineVersion = props.engineVersion ?? defaults.version;
17
+ const instanceClass = props.instanceClass ?? "db.t4g.micro";
18
+ const allocatedStorage = props.allocatedStorage ?? 20;
19
+ const storageType = props.storageType ?? "gp3";
20
+ const multiAZ = props.multiAZ ?? false;
21
+ const storageEncrypted = props.storageEncrypted ?? true;
22
+ const backupRetentionPeriod = props.backupRetentionPeriod ?? 7;
23
+ const copyTagsToSnapshot = props.copyTagsToSnapshot ?? true;
24
+ const autoMinorVersionUpgrade = props.autoMinorVersionUpgrade ?? true;
25
+ const publiclyAccessible = props.publiclyAccessible ?? false;
26
+ const deletionProtection = props.deletionProtection ?? false;
27
+ const { defaults: defs } = props;
28
+ // DB Subnet Group
29
+ const subnetGroup = new RDSDBSubnetGroup(mergeDefaults({
30
+ DBSubnetGroupDescription: "Subnet group for RDS instance",
31
+ SubnetIds: props.subnetIds,
32
+ }, defs?.subnetGroup));
33
+ // Security Group
34
+ // Ternary (not push-inside-if) keeps the `new`s out of control flow (EVL002).
35
+ const ingressRules = props.ingressSourceSG
36
+ ? [new SecurityGroup_Ingress({ IpProtocol: "tcp", FromPort: port, ToPort: port, SourceSecurityGroupId: props.ingressSourceSG })]
37
+ : props.ingressCidr
38
+ ? [new SecurityGroup_Ingress({ IpProtocol: "tcp", FromPort: port, ToPort: port, CidrIp: props.ingressCidr })]
39
+ : [];
40
+ const sg = new SecurityGroup(mergeDefaults({
41
+ GroupDescription: "Security group for RDS instance",
42
+ VpcId: props.vpcId,
43
+ SecurityGroupIngress: ingressRules.length > 0 ? ingressRules : undefined,
44
+ }, defs?.sg));
45
+ // Optional Parameter Group — ternary keeps the `new` out of the `if` (EVL002).
46
+ const parameterGroup = props.parameterGroupFamily
47
+ ? new RDSDBParameterGroup(mergeDefaults({
48
+ Family: props.parameterGroupFamily,
49
+ Description: "Custom parameter group",
50
+ Parameters: props.parameters,
51
+ }, defs?.parameterGroup))
52
+ : undefined;
53
+ // DB Instance
54
+ const dbProps = {
55
+ Engine: engine,
56
+ EngineVersion: engineVersion,
57
+ DBInstanceClass: instanceClass,
58
+ MasterUsername: masterUsername,
59
+ MasterUserPassword: props.masterPassword,
60
+ AllocatedStorage: String(allocatedStorage),
61
+ StorageType: storageType,
62
+ DBSubnetGroupName: subnetGroup.Ref,
63
+ VPCSecurityGroups: [sg.GroupId],
64
+ Port: String(port),
65
+ PubliclyAccessible: publiclyAccessible,
66
+ MultiAZ: multiAZ,
67
+ StorageEncrypted: storageEncrypted,
68
+ BackupRetentionPeriod: backupRetentionPeriod,
69
+ CopyTagsToSnapshot: copyTagsToSnapshot,
70
+ AutoMinorVersionUpgrade: autoMinorVersionUpgrade,
71
+ DeletionProtection: deletionProtection,
72
+ };
73
+ if (props.databaseName)
74
+ dbProps.DBName = props.databaseName;
75
+ if (props.kmsKeyId)
76
+ dbProps.KmsKeyId = props.kmsKeyId;
77
+ if (props.maxAllocatedStorage)
78
+ dbProps.MaxAllocatedStorage = props.maxAllocatedStorage;
79
+ if (props.preferredBackupWindow)
80
+ dbProps.PreferredBackupWindow = props.preferredBackupWindow;
81
+ if (props.preferredMaintenanceWindow)
82
+ dbProps.PreferredMaintenanceWindow = props.preferredMaintenanceWindow;
83
+ if (props.enableCloudwatchLogs)
84
+ dbProps.EnableCloudwatchLogsExports = [defaults.logExport];
85
+ if (props.enablePerformanceInsights) {
86
+ dbProps.EnablePerformanceInsights = true;
87
+ if (props.performanceInsightsRetentionPeriod) {
88
+ dbProps.PerformanceInsightsRetentionPeriod = props.performanceInsightsRetentionPeriod;
89
+ }
90
+ }
91
+ if (parameterGroup)
92
+ dbProps.DBParameterGroupName = parameterGroup.Ref;
93
+ const db = new DbInstance(mergeDefaults(dbProps, defs?.db));
94
+ const result = { subnetGroup, sg, db };
95
+ if (parameterGroup)
96
+ result.parameterGroup = parameterGroup;
97
+ return result;
98
+ }, "RdsInstance");
@@ -0,0 +1,28 @@
1
+ import { Composite, mergeDefaults } from "@intentius/chant";
2
+ import { EventRule, EventRule_Target, Permission } from "../generated/index.js";
3
+ import { LambdaFunction } from "./lambda-function.js";
4
+ /** A Lambda function run on a schedule by an EventBridge rule. */
5
+ export const LambdaScheduled = Composite((props) => {
6
+ const { defaults } = props;
7
+ const { role, func } = LambdaFunction(props);
8
+ const rule = new EventRule(mergeDefaults({
9
+ Name: props.ruleName,
10
+ ScheduleExpression: props.schedule,
11
+ State: (props.enabled ?? true) ? "ENABLED" : "DISABLED",
12
+ Targets: [
13
+ new EventRule_Target({
14
+ Arn: func.Arn,
15
+ Id: "Target0",
16
+ }),
17
+ ],
18
+ }, defaults?.rule));
19
+ const permission = new Permission(mergeDefaults({
20
+ FunctionName: func.Arn,
21
+ Action: "lambda:InvokeFunction",
22
+ Principal: "events.amazonaws.com",
23
+ SourceArn: rule.Arn,
24
+ }, defaults?.permission));
25
+ return { role, func, rule, permission };
26
+ }, "LambdaScheduled");
27
+ /** @deprecated Use `LambdaScheduled` instead */
28
+ export const ScheduledLambda = LambdaScheduled;
@@ -0,0 +1,33 @@
1
+ import { Composite } from "@intentius/chant";
2
+ import { FargateService } from "./fargate-service.js";
3
+ /**
4
+ * A FargateService preset for Apache Solr, with JVM heap and GC settings.
5
+ *
6
+ * A pass-through composite: it returns another composite's instance rather than
7
+ * building a members record. `CompositeFactoryMembers` admits that explicitly
8
+ * (#1366) — it works at runtime because a composite instance keeps `members`
9
+ * and `_definition` non-enumerable, so only its member resources are visible.
10
+ */
11
+ export const SolrFargateService = Composite((props) => {
12
+ const memoryMb = parseInt(props.memory ?? "4096");
13
+ const solrHeap = props.solrHeap ?? `${Math.floor(memoryMb * 0.45)}m`;
14
+ const gcOpts = props.gcOpts ?? "-XX:+UseG1GC -XX:MaxGCPauseMillis=200";
15
+ // Solr env defaults — user-supplied environment entries override these
16
+ const solrEnv = {
17
+ SOLR_HEAP: solrHeap,
18
+ GC_TUNE: gcOpts,
19
+ SOLR_OPTS: "-XX:-UseLargePages",
20
+ ...props.environment,
21
+ };
22
+ // Solr-specific ulimit default — user-supplied ulimits override
23
+ const solrUlimits = props.ulimits ?? [
24
+ { name: "nofile", softLimit: 65535, hardLimit: 65535 },
25
+ ];
26
+ return FargateService({
27
+ containerPort: 8983,
28
+ healthCheckPath: "/solr/admin/info/health",
29
+ ...props,
30
+ environment: solrEnv,
31
+ ulimits: solrUlimits,
32
+ });
33
+ }, "SolrFargateService");