@intentius/chant-lexicon-aws 0.124.31 → 0.124.33

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 (649) 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/health.d.ts +61 -0
  113. package/dist/health.d.ts.map +1 -0
  114. package/dist/health.js +216 -0
  115. package/dist/identity-observe.d.ts.map +1 -1
  116. package/dist/identity-observe.js +127 -0
  117. package/dist/import/generator.js +757 -0
  118. package/dist/import/live-export.js +34 -0
  119. package/dist/import/parser.js +394 -0
  120. package/dist/index.js +69 -0
  121. package/dist/integrity.json +6 -6
  122. package/dist/intrinsics.js +393 -0
  123. package/dist/lint/audit-catalog.js +87 -0
  124. package/dist/lint/audit-lineage.js +150 -0
  125. package/dist/lint/post-synth/cf-refs.js +247 -0
  126. package/dist/lint/post-synth/cor020.js +60 -0
  127. package/dist/lint/post-synth/ext001.d.ts.map +1 -1
  128. package/dist/lint/post-synth/ext001.js +197 -0
  129. package/dist/lint/post-synth/index.js +124 -0
  130. package/dist/lint/post-synth/waw010.js +41 -0
  131. package/dist/lint/post-synth/waw011.js +41 -0
  132. package/dist/lint/post-synth/waw013.js +38 -0
  133. package/dist/lint/post-synth/waw014.js +42 -0
  134. package/dist/lint/post-synth/waw015.js +88 -0
  135. package/dist/lint/post-synth/waw016.d.ts.map +1 -1
  136. package/dist/lint/post-synth/waw016.js +116 -0
  137. package/dist/lint/post-synth/waw017.js +43 -0
  138. package/dist/lint/post-synth/waw018.js +61 -0
  139. package/dist/lint/post-synth/waw019.js +64 -0
  140. package/dist/lint/post-synth/waw020.js +56 -0
  141. package/dist/lint/post-synth/waw021.js +44 -0
  142. package/dist/lint/post-synth/waw022.js +36 -0
  143. package/dist/lint/post-synth/waw023.js +40 -0
  144. package/dist/lint/post-synth/waw024.js +46 -0
  145. package/dist/lint/post-synth/waw025.js +36 -0
  146. package/dist/lint/post-synth/waw026.js +38 -0
  147. package/dist/lint/post-synth/waw027.js +41 -0
  148. package/dist/lint/post-synth/waw028.js +39 -0
  149. package/dist/lint/post-synth/waw029.js +54 -0
  150. package/dist/lint/post-synth/waw030.js +282 -0
  151. package/dist/lint/post-synth/waw031.js +58 -0
  152. package/dist/lint/post-synth/waw032.js +45 -0
  153. package/dist/lint/post-synth/waw033.js +75 -0
  154. package/dist/lint/post-synth/waw034.js +52 -0
  155. package/dist/lint/post-synth/waw035.js +56 -0
  156. package/dist/lint/post-synth/waw036.js +79 -0
  157. package/dist/lint/post-synth/waw037.js +67 -0
  158. package/dist/lint/post-synth/waw038.js +42 -0
  159. package/dist/lint/post-synth/waw039.js +42 -0
  160. package/dist/lint/post-synth/waw040.js +45 -0
  161. package/dist/lint/post-synth/waw041.js +40 -0
  162. package/dist/lint/post-synth/waw042.js +99 -0
  163. package/dist/lint/post-synth/waw043.js +51 -0
  164. package/dist/lint/post-synth/waw044.js +64 -0
  165. package/dist/lint/post-synth/waw045.js +49 -0
  166. package/dist/lint/post-synth/waw046.js +52 -0
  167. package/dist/lint/post-synth/waw047.js +43 -0
  168. package/dist/lint/post-synth/waw048.js +40 -0
  169. package/dist/lint/post-synth/waw049.js +78 -0
  170. package/dist/lint/post-synth/waw050.js +44 -0
  171. package/dist/lint/post-synth/waw051.js +41 -0
  172. package/dist/lint/post-synth/waw052.js +43 -0
  173. package/dist/lint/post-synth/waw053.js +43 -0
  174. package/dist/lint/post-synth/waw054.js +41 -0
  175. package/dist/lint/post-synth/waw055.js +41 -0
  176. package/dist/lint/post-synth/waw056.js +65 -0
  177. package/dist/lint/post-synth/waw057.js +43 -0
  178. package/dist/lint/post-synth/waw058.js +61 -0
  179. package/dist/lint/post-synth/waw059.js +338 -0
  180. package/dist/lint/post-synth/waw060.js +83 -0
  181. package/dist/lint/post-synth/waw061.js +60 -0
  182. package/dist/lint/post-synth/waw062.js +0 -0
  183. package/dist/lint/post-synth/waw063.js +0 -0
  184. package/dist/lint/post-synth/waw064.js +45 -0
  185. package/dist/lint/post-synth/waw065.js +104 -0
  186. package/dist/lint/post-synth/waw066.js +145 -0
  187. package/dist/lint/post-synth/waw067.js +115 -0
  188. package/dist/lint/post-synth/waw068.js +69 -0
  189. package/dist/lint/post-synth/waw069.js +0 -0
  190. package/dist/lint/rules/hardcoded-region.js +38 -0
  191. package/dist/lint/rules/iam-wildcard.js +60 -0
  192. package/dist/lint/rules/index.js +6 -0
  193. package/dist/lint/rules/s3-encryption.js +60 -0
  194. package/dist/live-attrs.js +42 -0
  195. package/dist/lsp/completions.d.ts.map +1 -1
  196. package/dist/lsp/completions.js +18 -0
  197. package/dist/lsp/hover.d.ts.map +1 -1
  198. package/dist/lsp/hover.js +66 -0
  199. package/dist/manifest.json +1 -1
  200. package/dist/mapping.js +33 -0
  201. package/dist/meta.json +17359 -784
  202. package/dist/nested-stack.js +95 -0
  203. package/dist/okf/index.md +203 -0
  204. package/dist/okf/rules/EXT001.md +1 -0
  205. package/dist/okf/rules/WAW016.md +2 -0
  206. package/dist/okf/rules/WAW019.md +1 -0
  207. package/dist/okf/rules/WAW028.md +1 -0
  208. package/dist/okf/rules/WAW030.md +2 -0
  209. package/dist/okf/rules/WAW039.md +1 -0
  210. package/dist/okf/rules/WAW049.md +1 -0
  211. package/dist/okf/rules/WAW056.md +1 -0
  212. package/dist/okf/rules/WAW058.md +1 -0
  213. package/dist/okf/rules/WAW062.md +1 -0
  214. package/dist/okf/rules/WAW064.md +1 -0
  215. package/dist/okf/rules/WAW065.md +1 -0
  216. package/dist/okf/rules/WAW066.md +1 -0
  217. package/dist/okf/rules/WAW067.md +1 -0
  218. package/dist/okf/rules/WAW068.md +1 -0
  219. package/dist/okf/rules/WAW069.md +4 -0
  220. package/dist/okf/types/AIWorkloadConfig.md +23 -0
  221. package/dist/okf/types/ARCRegionSwitchPlan.md +1 -0
  222. package/dist/okf/types/AccountAccessApplication.md +28 -0
  223. package/dist/okf/types/AccountAccessEntitlement.md +22 -0
  224. package/dist/okf/types/ActionTarget.md +20 -0
  225. package/dist/okf/types/AdConfiguration.md +21 -0
  226. package/dist/okf/types/Adapter.md +26 -0
  227. package/dist/okf/types/AgentContext.md +35 -0
  228. package/dist/okf/types/AgentGoal.md +31 -0
  229. package/dist/okf/types/AgentProfile.md +34 -0
  230. package/dist/okf/types/Alarm.md +3 -1
  231. package/dist/okf/types/AlarmModel.md +14 -9
  232. package/dist/okf/types/AmplifyWebhook.md +25 -0
  233. package/dist/okf/types/ApiCache.md +8 -8
  234. package/dist/okf/types/ApiGatewayManagedOverrides.md +5 -5
  235. package/dist/okf/types/AppAuthorization.md +35 -0
  236. package/dist/okf/types/AppBlockBuilder.md +1 -0
  237. package/dist/okf/types/AppInstance.md +2 -2
  238. package/dist/okf/types/AppInstanceBot.md +2 -2
  239. package/dist/okf/types/AppStreamFleet.md +3 -2
  240. package/dist/okf/types/AppSyncApiKey.md +6 -6
  241. package/dist/okf/types/AppSyncType.md +22 -0
  242. package/dist/okf/types/ApplicationStatusCheck.md +36 -0
  243. package/dist/okf/types/ApplicationVersion.md +4 -1
  244. package/dist/okf/types/ApplicationsList.md +26 -0
  245. package/dist/okf/types/ApprovalPolicy.md +28 -0
  246. package/dist/okf/types/ArchiveRule.md +24 -0
  247. package/dist/okf/types/Asset.md +30 -0
  248. package/dist/okf/types/Backup.md +31 -0
  249. package/dist/okf/types/BedrockAgentCoreDataset.md +1 -1
  250. package/dist/okf/types/BedrockAgentCoreGateway.md +3 -0
  251. package/dist/okf/types/BedrockSession.md +28 -0
  252. package/dist/okf/types/BillEstimate.md +35 -0
  253. package/dist/okf/types/Brand.md +32 -0
  254. package/dist/okf/types/CallAnalyticsCategory.md +25 -0
  255. package/dist/okf/types/Campaign.md +28 -0
  256. package/dist/okf/types/CapacityProvider.md +30 -0
  257. package/dist/okf/types/Case.md +24 -0
  258. package/dist/okf/types/CertificateAssociation.md +13 -0
  259. package/dist/okf/types/ChangeSet.md +36 -0
  260. package/dist/okf/types/ChannelFlow.md +29 -0
  261. package/dist/okf/types/ChimeChannel.md +39 -0
  262. package/dist/okf/types/Classifier.md +6 -6
  263. package/dist/okf/types/ClientVpnAuthorizationRule.md +6 -6
  264. package/dist/okf/types/ClientVpnEndpoint.md +2 -0
  265. package/dist/okf/types/ClientVpnRoute.md +5 -5
  266. package/dist/okf/types/CloudConnector.md +29 -0
  267. package/dist/okf/types/Cluster.md +39 -0
  268. package/dist/okf/types/ClusterSchedulerConfig.md +30 -0
  269. package/dist/okf/types/CodeCommitRepository.md +12 -12
  270. package/dist/okf/types/CodeConnectionsHost.md +26 -0
  271. package/dist/okf/types/CodeRepository.md +5 -5
  272. package/dist/okf/types/CompositeAlarm.md +1 -0
  273. package/dist/okf/types/ComputeEnvironment.md +2 -0
  274. package/dist/okf/types/ComputeNodeGroup.md +1 -1
  275. package/dist/okf/types/ComputeQuota.md +34 -0
  276. package/dist/okf/types/ConfigRule.md +1 -1
  277. package/dist/okf/types/ConfigurationRecorder.md +7 -6
  278. package/dist/okf/types/ConnectAttachment.md +2 -0
  279. package/dist/okf/types/ConnectQueue.md +5 -1
  280. package/dist/okf/types/ConnectVocabulary.md +28 -0
  281. package/dist/okf/types/ConnectionType.md +24 -0
  282. package/dist/okf/types/ConsentPortal.md +33 -0
  283. package/dist/okf/types/ContactMethod.md +29 -0
  284. package/dist/okf/types/ContainerAssociation.md +26 -0
  285. package/dist/okf/types/ContainerFleet.md +1 -1
  286. package/dist/okf/types/ContainerGroupDefinition.md +1 -1
  287. package/dist/okf/types/Content.md +40 -0
  288. package/dist/okf/types/ContentAssociation.md +28 -0
  289. package/dist/okf/types/CustomDetectionRuleAssociation.md +28 -0
  290. package/dist/okf/types/CustomEntityType.md +4 -9
  291. package/dist/okf/types/Customization.md +22 -0
  292. package/dist/okf/types/CwIntegration.md +31 -0
  293. package/dist/okf/types/DAXParameterGroup.md +3 -8
  294. package/dist/okf/types/DAXSubnetGroup.md +0 -5
  295. package/dist/okf/types/DBClusterEndpoint.md +31 -0
  296. package/dist/okf/types/DBProxyTargetGroup.md +1 -0
  297. package/dist/okf/types/DBSnapshot.md +62 -0
  298. package/dist/okf/types/DLMLifecyclePolicy.md +12 -12
  299. package/dist/okf/types/DLPSetting.md +31 -0
  300. package/dist/okf/types/DMSInstanceProfile.md +1 -1
  301. package/dist/okf/types/DRSLaunchConfigurationTemplate.md +28 -0
  302. package/dist/okf/types/Daemon.md +1 -0
  303. package/dist/okf/types/DataExchangeDataSet.md +29 -0
  304. package/dist/okf/types/DataIntegrationFlow.md +27 -0
  305. package/dist/okf/types/DataMigration.md +1 -1
  306. package/dist/okf/types/DataProvider.md +2 -1
  307. package/dist/okf/types/DataQualityRuleset.md +6 -11
  308. package/dist/okf/types/DataSource.md +23 -0
  309. package/dist/okf/types/Dataset.md +20 -0
  310. package/dist/okf/types/DatasetIntegration.md +23 -0
  311. package/dist/okf/types/DbCluster.md +1 -1
  312. package/dist/okf/types/DbInstance.md +8 -2
  313. package/dist/okf/types/DeadlineBudget.md +29 -0
  314. package/dist/okf/types/DelegationSet.md +23 -0
  315. package/dist/okf/types/DeliveryChannel.md +6 -11
  316. package/dist/okf/types/DevOpsAgentAgentSpace.md +4 -0
  317. package/dist/okf/types/DevOpsAgentService.md +1 -0
  318. package/dist/okf/types/DevOpsAgentTrigger.md +28 -0
  319. package/dist/okf/types/DirectConnectGatewayAttachment.md +2 -0
  320. package/dist/okf/types/Directory.md +60 -0
  321. package/dist/okf/types/DocDBDBClusterParameterGroup.md +5 -10
  322. package/dist/okf/types/DocDBDBSubnetGroup.md +4 -9
  323. package/dist/okf/types/DocDBElasticClusterSnapshot.md +36 -0
  324. package/dist/okf/types/DocumentClassifierEndpoint.md +27 -0
  325. package/dist/okf/types/Domain.md +27 -0
  326. package/dist/okf/types/EKSCertificateAuthority.md +42 -0
  327. package/dist/okf/types/EKSCluster.md +8 -0
  328. package/dist/okf/types/EcSnapshot.md +66 -0
  329. package/dist/okf/types/EmailIdentityCertificate.md +15 -0
  330. package/dist/okf/types/EndpointConfig.md +14 -13
  331. package/dist/okf/types/EntityRecognizer.md +27 -0
  332. package/dist/okf/types/EntityRecognizerEndpoint.md +31 -0
  333. package/dist/okf/types/EnvironmentEC2.md +13 -13
  334. package/dist/okf/types/EvaluationForm.md +1 -0
  335. package/dist/okf/types/Evaluator.md +6 -2
  336. package/dist/okf/types/EventAction.md +26 -0
  337. package/dist/okf/types/EventRule.md +2 -0
  338. package/dist/okf/types/EventSource.md +30 -0
  339. package/dist/okf/types/EventTracker.md +22 -0
  340. package/dist/okf/types/EventsV2EventBus.md +28 -0
  341. package/dist/okf/types/EventsV2ResourcePolicy.md +19 -0
  342. package/dist/okf/types/EventsV2Subscriber.md +39 -0
  343. package/dist/okf/types/ExperimentDefinition.md +39 -0
  344. package/dist/okf/types/ExperimentRun.md +33 -0
  345. package/dist/okf/types/ExperimentTrialComponent.md +13 -11
  346. package/dist/okf/types/FHIRDatastore.md +3 -0
  347. package/dist/okf/types/FSxSnapshot.md +5 -5
  348. package/dist/okf/types/FSxVolume.md +9 -9
  349. package/dist/okf/types/FeaturedResultsSet.md +26 -0
  350. package/dist/okf/types/Feed.md +1 -0
  351. package/dist/okf/types/FieldLevelEncryptionConfig.md +25 -0
  352. package/dist/okf/types/FieldLevelEncryptionProfile.md +22 -0
  353. package/dist/okf/types/FileCache.md +45 -0
  354. package/dist/okf/types/Filter.md +27 -0
  355. package/dist/okf/types/Firewall.md +6 -0
  356. package/dist/okf/types/FlowMediaStream.md +28 -0
  357. package/dist/okf/types/FlowOutput.md +1 -0
  358. package/dist/okf/types/FpgaImage.md +38 -0
  359. package/dist/okf/types/Function.md +2 -2
  360. package/dist/okf/types/Gateway.md +41 -0
  361. package/dist/okf/types/GatewayClusterAssociations.md +23 -0
  362. package/dist/okf/types/GatewayRateLimit.md +26 -0
  363. package/dist/okf/types/GatewayRule.md +32 -0
  364. package/dist/okf/types/GlobalReplicationGroup.md +3 -0
  365. package/dist/okf/types/GlobalResolver.md +1 -1
  366. package/dist/okf/types/GlobalTable.md +1 -0
  367. package/dist/okf/types/GlueConnection.md +5 -4
  368. package/dist/okf/types/GlueSecurityConfiguration.md +1 -6
  369. package/dist/okf/types/GlueSession.md +38 -0
  370. package/dist/okf/types/GlueTable.md +5 -10
  371. package/dist/okf/types/GlueWorkflow.md +5 -10
  372. package/dist/okf/types/Group.md +27 -0
  373. package/dist/okf/types/Harness.md +1 -0
  374. package/dist/okf/types/HostKey.md +33 -0
  375. package/dist/okf/types/HostedZone.md +1 -0
  376. package/dist/okf/types/HttpApi.md +2 -0
  377. package/dist/okf/types/HttpNamespace.md +5 -5
  378. package/dist/okf/types/HubV2.md +1 -0
  379. package/dist/okf/types/HumanTaskUi.md +22 -0
  380. package/dist/okf/types/IPv4Pool.md +28 -0
  381. package/dist/okf/types/ImageBuilder.md +1 -0
  382. package/dist/okf/types/ImageBuilderImage.md +1 -1
  383. package/dist/okf/types/ImagePipeline.md +1 -1
  384. package/dist/okf/types/InferenceComponent.md +5 -1
  385. package/dist/okf/types/InfluxDBBackup.md +65 -0
  386. package/dist/okf/types/InfluxDBCluster.md +3 -0
  387. package/dist/okf/types/InfrastructureConfiguration.md +2 -0
  388. package/dist/okf/types/IngestionDestination.md +28 -0
  389. package/dist/okf/types/InputSecurityGroup.md +6 -4
  390. package/dist/okf/types/InspectorV2Connector.md +38 -0
  391. package/dist/okf/types/InstanceEventWindow.md +25 -0
  392. package/dist/okf/types/InstanceFleetConfig.md +10 -10
  393. package/dist/okf/types/InstanceGroupConfig.md +3 -3
  394. package/dist/okf/types/InstrumentationConfig.md +31 -0
  395. package/dist/okf/types/IntegrationAssociation.md +3 -0
  396. package/dist/okf/types/IoTSiteWiseApplication.md +34 -0
  397. package/dist/okf/types/IoTSiteWiseDataset.md +5 -2
  398. package/dist/okf/types/IoTSiteWiseTask.md +24 -0
  399. package/dist/okf/types/IpamExternalResourceVerificationToken.md +35 -0
  400. package/dist/okf/types/IpamInternetRegistryAssociation.md +32 -0
  401. package/dist/okf/types/Job.md +35 -0
  402. package/dist/okf/types/JobTemplate.md +26 -0
  403. package/dist/okf/types/KinesisChannel.md +31 -0
  404. package/dist/okf/types/KinesisStream.md +1 -0
  405. package/dist/okf/types/LambdaResourcePolicy.md +14 -0
  406. package/dist/okf/types/Lexicon.md +34 -0
  407. package/dist/okf/types/LicenseAssetGroup.md +23 -0
  408. package/dist/okf/types/LicenseConfiguration.md +33 -0
  409. package/dist/okf/types/LicenseServerEndpoint.md +32 -0
  410. package/dist/okf/types/LightsailKeyPair.md +29 -0
  411. package/dist/okf/types/LimitsProfile.md +27 -0
  412. package/dist/okf/types/LocationAzureBlob.md +2 -1
  413. package/dist/okf/types/LocationObjectStorage.md +1 -0
  414. package/dist/okf/types/LogAlarm.md +2 -0
  415. package/dist/okf/types/MGNConnector.md +23 -0
  416. package/dist/okf/types/MGNLaunchConfigurationTemplate.md +37 -0
  417. package/dist/okf/types/MLTransform.md +15 -15
  418. package/dist/okf/types/MWAAServerlessWorkflow.md +3 -0
  419. package/dist/okf/types/ManagedNotificationAccountContactAssociation.md +1 -0
  420. package/dist/okf/types/ManagedNotificationAdditionalChannelAssociation.md +1 -0
  421. package/dist/okf/types/MediaConvertJobTemplate.md +11 -13
  422. package/dist/okf/types/MediaConvertQueue.md +8 -10
  423. package/dist/okf/types/MediaInsightsPipelineConfiguration.md +28 -0
  424. package/dist/okf/types/MediaLiveInput.md +41 -18
  425. package/dist/okf/types/MediaPackageV2Channel.md +3 -0
  426. package/dist/okf/types/MediaPackageV2OriginEndpoint.md +1 -0
  427. package/dist/okf/types/MediaPipelineKinesisVideoStreamPool.md +28 -0
  428. package/dist/okf/types/MediaTailorFunction.md +27 -0
  429. package/dist/okf/types/MedicalVocabulary.md +21 -0
  430. package/dist/okf/types/Member.md +26 -0
  431. package/dist/okf/types/Memory.md +6 -0
  432. package/dist/okf/types/MemoryDBSnapshot.md +29 -0
  433. package/dist/okf/types/Metric.md +59 -0
  434. package/dist/okf/types/MetricAttribution.md +23 -0
  435. package/dist/okf/types/MicrosoftAD.md +11 -11
  436. package/dist/okf/types/MigrationProject.md +8 -1
  437. package/dist/okf/types/Monitor.md +26 -0
  438. package/dist/okf/types/NFSFileShare.md +44 -0
  439. package/dist/okf/types/NeptuneGraphGraph.md +1 -0
  440. package/dist/okf/types/NetworkConnector.md +4 -0
  441. package/dist/okf/types/NetworkFlowMonitorScope.md +23 -0
  442. package/dist/okf/types/NetworkMigrationDefinition.md +31 -0
  443. package/dist/okf/types/NetworkSecurityManagerDeployment.md +31 -0
  444. package/dist/okf/types/NetworkSecurityManagerPolicy.md +32 -0
  445. package/dist/okf/types/NetworkSecurityManagerScope.md +29 -0
  446. package/dist/okf/types/NotebookInstance.md +18 -18
  447. package/dist/okf/types/NotebookInstanceLifecycleConfig.md +6 -5
  448. package/dist/okf/types/NotifyConfiguration.md +35 -0
  449. package/dist/okf/types/OTelEnrichment.md +2 -0
  450. package/dist/okf/types/OnlineEvaluationConfig.md +0 -1
  451. package/dist/okf/types/OrganizationConfigRule.md +7 -7
  452. package/dist/okf/types/Outpost.md +32 -0
  453. package/dist/okf/types/ParallelData.md +40 -0
  454. package/dist/okf/types/Partition.md +5 -5
  455. package/dist/okf/types/PaymentConnector.md +4 -1
  456. package/dist/okf/types/Pentest.md +1 -0
  457. package/dist/okf/types/PerfReports.md +28 -0
  458. package/dist/okf/types/PermissionAssociation.md +30 -0
  459. package/dist/okf/types/PersonalizeDataset.md +1 -0
  460. package/dist/okf/types/PersonalizeDatasetGroup.md +1 -0
  461. package/dist/okf/types/PersonalizeSchema.md +1 -0
  462. package/dist/okf/types/Pipeline.md +25 -0
  463. package/dist/okf/types/PlaybackConfiguration.md +1 -0
  464. package/dist/okf/types/PolicyAssociation.md +1 -1
  465. package/dist/okf/types/PolicyGrant.md +2 -2
  466. package/dist/okf/types/PolicyPrincipalAttachment.md +2 -7
  467. package/dist/okf/types/PortalProduct.md +24 -0
  468. package/dist/okf/types/PrefetchSchedule.md +25 -0
  469. package/dist/okf/types/PricingPlanManagerSubscription.md +31 -0
  470. package/dist/okf/types/PrincipalAssociation.md +27 -0
  471. package/dist/okf/types/PrivateDnsNamespace.md +8 -8
  472. package/dist/okf/types/PrivateVirtualInterface.md +1 -0
  473. package/dist/okf/types/ProcurementPortalPreference.md +45 -0
  474. package/dist/okf/types/Program.md +33 -0
  475. package/dist/okf/types/ProjectMembership.md +1 -1
  476. package/dist/okf/types/ProtocolsList.md +26 -0
  477. package/dist/okf/types/PublicDnsNamespace.md +7 -7
  478. package/dist/okf/types/PublicVirtualInterface.md +1 -0
  479. package/dist/okf/types/QEV2IdcApplication.md +25 -0
  480. package/dist/okf/types/QueryLoggingConfig.md +21 -0
  481. package/dist/okf/types/QuerySuggestionsBlockList.md +25 -0
  482. package/dist/okf/types/QuickSightAssignment.md +24 -0
  483. package/dist/okf/types/RAMResourceAssociation.md +27 -0
  484. package/dist/okf/types/RDSClusterSnapshot.md +54 -0
  485. package/dist/okf/types/RDSDBParameterGroup.md +5 -0
  486. package/dist/okf/types/RDSDeployment.md +41 -0
  487. package/dist/okf/types/RcsAgent.md +38 -0
  488. package/dist/okf/types/ReceiptRule.md +5 -5
  489. package/dist/okf/types/ReceiptRuleSet.md +1 -6
  490. package/dist/okf/types/RecommenderFilter.md +27 -0
  491. package/dist/okf/types/RecommenderSchema.md +25 -0
  492. package/dist/okf/types/RecordSet.md +16 -22
  493. package/dist/okf/types/RecoveryPlan.md +28 -0
  494. package/dist/okf/types/RedshiftIdcApplication.md +31 -0
  495. package/dist/okf/types/RedshiftSnapshot.md +59 -0
  496. package/dist/okf/types/RegistrationAttachment.md +28 -0
  497. package/dist/okf/types/Registry.md +41 -0
  498. package/dist/okf/types/RegistryRecord.md +38 -0
  499. package/dist/okf/types/RelatedItem.md +24 -0
  500. package/dist/okf/types/ReplicationConfigurationTemplate.md +35 -0
  501. package/dist/okf/types/ReplicationSubnetGroup.md +4 -9
  502. package/dist/okf/types/ReplicationTask.md +14 -14
  503. package/dist/okf/types/ReportGenerator.md +29 -0
  504. package/dist/okf/types/ReportGroup.md +1 -3
  505. package/dist/okf/types/ResilienceHubV2Policy.md +1 -0
  506. package/dist/okf/types/ResilienceHubV2Service.md +1 -0
  507. package/dist/okf/types/ResourceConfiguration.md +1 -1
  508. package/dist/okf/types/ResourceMetricsConfiguration.md +21 -0
  509. package/dist/okf/types/RestApi.md +1 -0
  510. package/dist/okf/types/RetrievalInstruction.md +32 -0
  511. package/dist/okf/types/RouterOutput.md +1 -0
  512. package/dist/okf/types/Rule.md +31 -0
  513. package/dist/okf/types/RunCache.md +29 -0
  514. package/dist/okf/types/Runtime.md +2 -1
  515. package/dist/okf/types/SCNInstance.md +33 -0
  516. package/dist/okf/types/SDBDomain.md +2 -2
  517. package/dist/okf/types/SMBFileShare.md +49 -0
  518. package/dist/okf/types/SageMakerArtifact.md +27 -0
  519. package/dist/okf/types/SageMakerEndpoint.md +0 -1
  520. package/dist/okf/types/ScalableTarget.md +1 -0
  521. package/dist/okf/types/ScalingPlan.md +6 -6
  522. package/dist/okf/types/ScheduledReport.md +31 -0
  523. package/dist/okf/types/SecondaryNetwork.md +26 -0
  524. package/dist/okf/types/SecurityAgentArtifact.md +25 -0
  525. package/dist/okf/types/SecurityAgentIntegration.md +31 -0
  526. package/dist/okf/types/Server.md +1 -0
  527. package/dist/okf/types/ServerlessCache.md +2 -0
  528. package/dist/okf/types/ServerlessCacheSnapshot.md +31 -0
  529. package/dist/okf/types/ServerlessRepoApplication.md +32 -0
  530. package/dist/okf/types/ServiceDiscoveryInstance.md +3 -7
  531. package/dist/okf/types/SipMediaApplication.md +27 -0
  532. package/dist/okf/types/SiteToSiteVpnAttachment.md +2 -0
  533. package/dist/okf/types/SnapshotCopyGrant.md +20 -0
  534. package/dist/okf/types/Solution.md +1 -0
  535. package/dist/okf/types/SourceAssociation.md +25 -0
  536. package/dist/okf/types/SourceCredential.md +6 -6
  537. package/dist/okf/types/SourceNetwork.md +23 -0
  538. package/dist/okf/types/StackFleetAssociation.md +2 -7
  539. package/dist/okf/types/StorageTierPolicy.md +20 -0
  540. package/dist/okf/types/StorageVirtualMachine.md +9 -9
  541. package/dist/okf/types/Stream.md +28 -0
  542. package/dist/okf/types/SubnetCidrReservation.md +26 -0
  543. package/dist/okf/types/SubscriptionProvider.md +26 -0
  544. package/dist/okf/types/SupportPermit.md +29 -0
  545. package/dist/okf/types/Table.md +2 -1
  546. package/dist/okf/types/TableOptimizer.md +5 -10
  547. package/dist/okf/types/Tape.md +31 -0
  548. package/dist/okf/types/Template.md +36 -0
  549. package/dist/okf/types/Tenant.md +2 -0
  550. package/dist/okf/types/Terminology.md +39 -0
  551. package/dist/okf/types/Thesaurus.md +25 -0
  552. package/dist/okf/types/ThingPrincipalAttachment.md +3 -8
  553. package/dist/okf/types/Topic.md +1 -0
  554. package/dist/okf/types/TopicRuleDestination.md +1 -0
  555. package/dist/okf/types/TrafficPolicy.md +26 -0
  556. package/dist/okf/types/TrafficPolicyInstance.md +28 -0
  557. package/dist/okf/types/TranscribeVocabulary.md +27 -0
  558. package/dist/okf/types/TransitGatewayRouteTableAttachment.md +2 -0
  559. package/dist/okf/types/TransitVirtualInterface.md +1 -0
  560. package/dist/okf/types/Tunnel.md +25 -0
  561. package/dist/okf/types/UsageLimit.md +26 -0
  562. package/dist/okf/types/UseCase.md +23 -0
  563. package/dist/okf/types/User.md +47 -0
  564. package/dist/okf/types/VPCEndpoint.md +1 -1
  565. package/dist/okf/types/VPCEndpointService.md +6 -0
  566. package/dist/okf/types/VPCPeeringConnection.md +2 -2
  567. package/dist/okf/types/VPNConcentrator.md +1 -1
  568. package/dist/okf/types/VPNConnection.md +1 -1
  569. package/dist/okf/types/VerifiedDestinationNumber.md +25 -0
  570. package/dist/okf/types/View.md +27 -0
  571. package/dist/okf/types/VoiceConnector.md +30 -0
  572. package/dist/okf/types/Volume.md +44 -0
  573. package/dist/okf/types/Vpc.md +1 -1
  574. package/dist/okf/types/VpcAttachment.md +2 -0
  575. package/dist/okf/types/WebFunction.md +27 -0
  576. package/dist/okf/types/WebFunctionEndpoint.md +44 -0
  577. package/dist/okf/types/WebFunctionRevision.md +32 -0
  578. package/dist/okf/types/WickrNetwork.md +27 -0
  579. package/dist/okf/types/Worker.md +29 -0
  580. package/dist/okf/types/Workforce.md +26 -0
  581. package/dist/okf/types/Workload.md +35 -0
  582. package/dist/okf/types/WorkloadEstimate.md +35 -0
  583. package/dist/okf/types/Workspace.md +28 -0
  584. package/dist/okf/types/Workteam.md +8 -8
  585. package/dist/op/activities/aws-apply.js +214 -0
  586. package/dist/op/activities/floci.js +97 -0
  587. package/dist/op/activities/index.js +32 -0
  588. package/dist/op/builders.js +50 -0
  589. package/dist/ownership.js +52 -0
  590. package/dist/package-cli.js +25 -0
  591. package/dist/parameter.js +19 -0
  592. package/dist/plugin.d.ts.map +1 -1
  593. package/dist/plugin.js +1012 -0
  594. package/dist/properties.js +166 -0
  595. package/dist/pseudo.js +25 -0
  596. package/dist/receipt-store.d.ts.map +1 -1
  597. package/dist/receipt-store.js +233 -0
  598. package/dist/reference-catalog.js +106 -0
  599. package/dist/rules/ext001.ts +3 -3
  600. package/dist/rules/waw016.ts +2 -2
  601. package/dist/serializer.js +529 -0
  602. package/dist/spec/fetch.js +193 -0
  603. package/dist/spec/parse.js +259 -0
  604. package/dist/spec/pin.js +185 -0
  605. package/dist/spec/pinned-types.json +203 -0
  606. package/dist/stack-errors.js +14 -0
  607. package/dist/taggable.d.ts.map +1 -1
  608. package/dist/taggable.js +33 -0
  609. package/dist/teardown.js +199 -0
  610. package/dist/template-sections.js +53 -0
  611. package/dist/template-transform.js +50 -0
  612. package/dist/types/index.d.ts +18847 -1124
  613. package/dist/validate-cli.js +16 -0
  614. package/dist/validate.js +33 -0
  615. package/package.json +9 -9
  616. package/src/agentcore/trace-fetch.ts +2 -1
  617. package/src/api/credential-chain.ts +119 -9
  618. package/src/api/credential-isolation.test.ts +72 -0
  619. package/src/api/read-client-chain.test.ts +159 -0
  620. package/src/api/read-client.ts +42 -6
  621. package/src/api/sigv4.ts +4 -4
  622. package/src/caller-identity.ts +3 -5
  623. package/src/codegen/any-budget.test.ts +12 -2
  624. package/src/codegen/generate.ts +9 -0
  625. package/src/codegen/package.ts +2 -2
  626. package/src/codegen/patches.test.ts +95 -0
  627. package/src/codegen/patches.ts +53 -9
  628. package/src/codegen/property-overlay.json +1 -16
  629. package/src/components/apply.ts +218 -6
  630. package/src/components/cfn-plan-floci.e2e.test.ts +76 -0
  631. package/src/components/cfn-plan.test.ts +225 -16
  632. package/src/components/cloud-executor.ts +73 -25
  633. package/src/deep-observe.ts +2 -1
  634. package/src/disruption.ts +2 -1
  635. package/src/generated/index.d.ts +18847 -1124
  636. package/src/generated/index.ts +1376 -161
  637. package/src/generated/lexicon-aws.json +17359 -784
  638. package/src/health.test.ts +136 -0
  639. package/src/health.ts +281 -0
  640. package/src/identity-observe.ts +2 -1
  641. package/src/lint/post-synth/ext001.ts +3 -3
  642. package/src/lint/post-synth/waw016.ts +2 -2
  643. package/src/lsp/completions.ts +2 -1
  644. package/src/lsp/hover.ts +2 -1
  645. package/src/plugin.ts +10 -1
  646. package/src/receipt-store.ts +2 -1
  647. package/src/spec/pin.ts +3 -3
  648. package/src/spec/pinned-types.json +203 -0
  649. package/src/taggable.ts +2 -2
@@ -0,0 +1,65 @@
1
+ /**
2
+ * WAW056: SCP Guardrail Denies Nothing
3
+ *
4
+ * Flags SERVICE_CONTROL_POLICY resources whose document contains no Deny
5
+ * statement. SCPs never grant permissions — they only filter — so an SCP
6
+ * without a Deny is a no-op guardrail: the posture it appears to declare
7
+ * does not exist.
8
+ */
9
+ import { parseCFTemplate, isIntrinsic } from "./cf-refs.js";
10
+ function statementsOf(content) {
11
+ let doc = content;
12
+ if (typeof doc === "string") {
13
+ try {
14
+ doc = JSON.parse(doc);
15
+ }
16
+ catch {
17
+ return undefined;
18
+ }
19
+ }
20
+ if (typeof doc !== "object" || doc === null)
21
+ return undefined;
22
+ const statement = doc.Statement;
23
+ if (Array.isArray(statement))
24
+ return statement;
25
+ if (typeof statement === "object" && statement !== null)
26
+ return [statement];
27
+ return [];
28
+ }
29
+ export function checkScpDeniesNothing(ctx) {
30
+ const diagnostics = [];
31
+ for (const [_lexicon, output] of ctx.outputs) {
32
+ const template = parseCFTemplate(output);
33
+ if (!template?.Resources)
34
+ continue;
35
+ for (const [logicalId, resource] of Object.entries(template.Resources)) {
36
+ if (resource.Type !== "AWS::Organizations::Policy")
37
+ continue;
38
+ const props = resource.Properties ?? {};
39
+ if (props.Type !== "SERVICE_CONTROL_POLICY")
40
+ continue;
41
+ if (isIntrinsic(props.Content))
42
+ continue;
43
+ const statements = statementsOf(props.Content);
44
+ if (statements === undefined)
45
+ continue;
46
+ if (!statements.some((s) => s.Effect === "Deny")) {
47
+ diagnostics.push({
48
+ checkId: "WAW056",
49
+ severity: "error",
50
+ message: `SCP "${logicalId}" has no Deny statement — SCPs only filter permissions, so a Deny-less SCP guards nothing`,
51
+ entity: logicalId,
52
+ lexicon: "aws",
53
+ });
54
+ }
55
+ }
56
+ }
57
+ return diagnostics;
58
+ }
59
+ export const waw056 = {
60
+ id: "WAW056",
61
+ description: "SCP guardrail has no Deny statement — it constrains nothing",
62
+ check(ctx) {
63
+ return checkScpDeniesNothing(ctx);
64
+ },
65
+ };
@@ -0,0 +1,43 @@
1
+ /**
2
+ * WAW057: SCP Guardrail Attached to No Targets
3
+ *
4
+ * Flags SERVICE_CONTROL_POLICY resources with no TargetIds. A defined but
5
+ * unattached SCP enforces nothing — the usual shape of a guardrail that was
6
+ * "kept" in a template while being detached from the root or its OUs.
7
+ */
8
+ import { parseCFTemplate, isIntrinsic } from "./cf-refs.js";
9
+ export function checkScpUnattached(ctx) {
10
+ const diagnostics = [];
11
+ for (const [_lexicon, output] of ctx.outputs) {
12
+ const template = parseCFTemplate(output);
13
+ if (!template?.Resources)
14
+ continue;
15
+ for (const [logicalId, resource] of Object.entries(template.Resources)) {
16
+ if (resource.Type !== "AWS::Organizations::Policy")
17
+ continue;
18
+ const props = resource.Properties ?? {};
19
+ if (props.Type !== "SERVICE_CONTROL_POLICY")
20
+ continue;
21
+ const targets = props.TargetIds;
22
+ if (isIntrinsic(targets))
23
+ continue;
24
+ if (Array.isArray(targets) && targets.length > 0)
25
+ continue;
26
+ diagnostics.push({
27
+ checkId: "WAW057",
28
+ severity: "error",
29
+ message: `SCP "${logicalId}" is attached to no targets — a detached guardrail enforces nothing; attach it to the root or an OU via TargetIds`,
30
+ entity: logicalId,
31
+ lexicon: "aws",
32
+ });
33
+ }
34
+ }
35
+ return diagnostics;
36
+ }
37
+ export const waw057 = {
38
+ id: "WAW057",
39
+ description: "SCP guardrail is attached to no targets — it enforces nothing",
40
+ check(ctx) {
41
+ return checkScpUnattached(ctx);
42
+ },
43
+ };
@@ -0,0 +1,61 @@
1
+ /**
2
+ * WAW058: Organization Audit Trail Dropped or Scoped Down
3
+ *
4
+ * The audit-sink posture regressions on AWS: a trail with logging switched
5
+ * off, an organization trail narrowed to a single region, or an organization
6
+ * declared with no CloudTrail trail at all. Audit evidence is the layer the
7
+ * other guardrails depend on, so losing it is merge-worthy.
8
+ */
9
+ import { parseCFTemplate, isIntrinsic } from "./cf-refs.js";
10
+ export function checkAuditTrailPosture(ctx) {
11
+ const diagnostics = [];
12
+ for (const [_lexicon, output] of ctx.outputs) {
13
+ const template = parseCFTemplate(output);
14
+ if (!template?.Resources)
15
+ continue;
16
+ let declaresOrganization = false;
17
+ let trailCount = 0;
18
+ for (const [logicalId, resource] of Object.entries(template.Resources)) {
19
+ if (resource.Type === "AWS::Organizations::Organization")
20
+ declaresOrganization = true;
21
+ if (resource.Type !== "AWS::CloudTrail::Trail")
22
+ continue;
23
+ trailCount++;
24
+ const props = resource.Properties ?? {};
25
+ if (!isIntrinsic(props.IsLogging) && props.IsLogging === false) {
26
+ diagnostics.push({
27
+ checkId: "WAW058",
28
+ severity: "error",
29
+ message: `Trail "${logicalId}" has IsLogging: false — the audit sink is declared but delivers nothing`,
30
+ entity: logicalId,
31
+ lexicon: "aws",
32
+ });
33
+ }
34
+ if (props.IsOrganizationTrail === true && !isIntrinsic(props.IsMultiRegionTrail) && props.IsMultiRegionTrail !== true) {
35
+ diagnostics.push({
36
+ checkId: "WAW058",
37
+ severity: "error",
38
+ message: `Organization trail "${logicalId}" is not multi-region — audit evidence is scoped down to a single region`,
39
+ entity: logicalId,
40
+ lexicon: "aws",
41
+ });
42
+ }
43
+ }
44
+ if (declaresOrganization && trailCount === 0) {
45
+ diagnostics.push({
46
+ checkId: "WAW058",
47
+ severity: "error",
48
+ message: "Template creates an AWS::Organizations::Organization with no CloudTrail trail — the landing zone has no audit sink",
49
+ lexicon: "aws",
50
+ });
51
+ }
52
+ }
53
+ return diagnostics;
54
+ }
55
+ export const waw058 = {
56
+ id: "WAW058",
57
+ description: "Organization audit trail missing, not logging, or scoped down to a single region",
58
+ check(ctx) {
59
+ return checkAuditTrailPosture(ctx);
60
+ },
61
+ };
@@ -0,0 +1,338 @@
1
+ /**
2
+ * WAW059: Wildcard Resource where the declared graph enumerates the touched set
3
+ *
4
+ * An identity policy that allows resource-scopable actions on `Resource: "*"`
5
+ * (or a service-wide ARN pattern) when every consumer of the attached role
6
+ * only touches resources declared in the same template. In that case the
7
+ * declared graph already enumerates the touched set, so the statement can be
8
+ * tightened to the `Fn::GetAtt` Arn list of those declared entities.
9
+ *
10
+ * Deliberately narrow (#1225). Fires only when ALL of these hold:
11
+ * - the statement is an `Effect: Allow` identity-policy statement (role inline
12
+ * policy, IAM::Policy, IAM::ManagedPolicy) — trust policies carry a
13
+ * Principal and are skipped, resource policies live on other types;
14
+ * - no Condition/NotAction/NotResource and no intrinsics in Action/Resource;
15
+ * - `Resource` is `"*"` or a service-wide ARN pattern;
16
+ * - every Action is in the curated resource-scopable table (s3, dynamodb,
17
+ * sqs) — actions that genuinely need `"*"` (s3:ListAllMyBuckets,
18
+ * dynamodb:ListTables, sqs:ListQueues) are not in the table;
19
+ * - the attached principal resolves to declared roles only, those roles have
20
+ * consumers in the template, and no consumer carries a foreign edge (a
21
+ * literal ARN of the service) or an intrinsic edge (Fn::ImportValue) that
22
+ * would put resources outside the declared graph in reach.
23
+ *
24
+ * Anything the static graph cannot prove stays quiet.
25
+ */
26
+ import { parseCFTemplate, walkPolicyStatements, findResourceRefs, buildReverseRefIndex, isIntrinsic, } from "./cf-refs.js";
27
+ /**
28
+ * Curated table of actions that support resource-level permissions, per
29
+ * service. Lower-cased (IAM action matching is case-insensitive). An action
30
+ * outside this table gates the whole statement off — it may legitimately
31
+ * require `Resource: "*"`.
32
+ */
33
+ export const RESOURCE_SCOPABLE_ACTIONS = {
34
+ s3: new Set([
35
+ "getobject",
36
+ "getobjectversion",
37
+ "getobjectacl",
38
+ "getobjecttagging",
39
+ "putobject",
40
+ "putobjectacl",
41
+ "putobjecttagging",
42
+ "deleteobject",
43
+ "deleteobjectversion",
44
+ "listbucket",
45
+ "listbucketversions",
46
+ "listbucketmultipartuploads",
47
+ "listmultipartuploadparts",
48
+ "abortmultipartupload",
49
+ "getbucketlocation",
50
+ ]),
51
+ dynamodb: new Set([
52
+ "getitem",
53
+ "batchgetitem",
54
+ "query",
55
+ "scan",
56
+ "putitem",
57
+ "updateitem",
58
+ "deleteitem",
59
+ "batchwriteitem",
60
+ "conditioncheckitem",
61
+ "describetable",
62
+ "getrecords",
63
+ "getsharditerator",
64
+ "describestream",
65
+ ]),
66
+ sqs: new Set([
67
+ "sendmessage",
68
+ "sendmessagebatch",
69
+ "receivemessage",
70
+ "deletemessage",
71
+ "deletemessagebatch",
72
+ "changemessagevisibility",
73
+ "changemessagevisibilitybatch",
74
+ "getqueueattributes",
75
+ "getqueueurl",
76
+ "purgequeue",
77
+ ]),
78
+ };
79
+ /** CloudFormation types that declare an entity of each curated service. */
80
+ const SERVICE_RESOURCE_TYPES = {
81
+ s3: new Set(["AWS::S3::Bucket"]),
82
+ dynamodb: new Set(["AWS::DynamoDB::Table", "AWS::DynamoDB::GlobalTable"]),
83
+ sqs: new Set(["AWS::SQS::Queue"]),
84
+ };
85
+ /**
86
+ * ARN resource segments that make an ARN service-wide rather than
87
+ * entity-scoped. `arn:aws:s3:::my-bucket/*` is bucket-scoped and NOT here.
88
+ */
89
+ const SERVICE_WIDE_REST = {
90
+ s3: new Set(["*"]),
91
+ dynamodb: new Set(["*", "table/*"]),
92
+ sqs: new Set(["*"]),
93
+ };
94
+ const IAM_TYPES = new Set(["AWS::IAM::Policy", "AWS::IAM::Role", "AWS::IAM::ManagedPolicy"]);
95
+ const ARN_SERVICE_RE = /arn:[^:\s]*:([a-z0-9-]+):/g;
96
+ function asStringArray(value) {
97
+ if (typeof value === "string")
98
+ return [value];
99
+ if (Array.isArray(value) && value.every((v) => typeof v === "string")) {
100
+ return value;
101
+ }
102
+ return null;
103
+ }
104
+ /** `"*"`, or an ARN whose service is in `services` and whose resource segment is service-wide. */
105
+ function isServiceWideResource(value, services) {
106
+ if (value === "*")
107
+ return true;
108
+ const m = /^arn:[^:]*:([^:]*):[^:]*:[^:]*:(.+)$/.exec(value);
109
+ if (!m)
110
+ return false;
111
+ const [, service, rest] = m;
112
+ if (!services.has(service))
113
+ return false;
114
+ return SERVICE_WIDE_REST[service]?.has(rest) ?? false;
115
+ }
116
+ /**
117
+ * The services an Allow statement touches, if every action lands in the
118
+ * curated resource-scopable table. Null when any action is outside it
119
+ * (or malformed / an action-name wildcard).
120
+ */
121
+ function curatedServices(actions) {
122
+ const services = new Set();
123
+ for (const action of actions) {
124
+ const m = /^([a-z0-9-]+):([A-Za-z0-9]+)$/.exec(action);
125
+ if (!m)
126
+ return null;
127
+ const [, service, name] = m;
128
+ const table = RESOURCE_SCOPABLE_ACTIONS[service];
129
+ if (!table || !table.has(name.toLowerCase()))
130
+ return null;
131
+ services.add(service);
132
+ }
133
+ return services.size > 0 ? services : null;
134
+ }
135
+ /**
136
+ * Resolve which declared roles a policy resource is attached to. Null means
137
+ * "cannot prove" (users/groups, literal role names, no roles at all).
138
+ */
139
+ function attachedRoles(logicalId, resource, template) {
140
+ const resources = template.Resources ?? {};
141
+ if (resource.Type === "AWS::IAM::Role")
142
+ return new Set([logicalId]);
143
+ const props = resource.Properties ?? {};
144
+ // Users/groups have no consumers in the resource graph — untraceable.
145
+ if (Array.isArray(props.Users) && props.Users.length > 0)
146
+ return null;
147
+ if (Array.isArray(props.Groups) && props.Groups.length > 0)
148
+ return null;
149
+ const roles = new Set();
150
+ if (props.Roles !== undefined) {
151
+ if (!Array.isArray(props.Roles))
152
+ return null;
153
+ for (const entry of props.Roles) {
154
+ // A literal role name points outside the declared graph.
155
+ if (typeof entry === "string")
156
+ return null;
157
+ const refs = findResourceRefs(entry);
158
+ if (refs.size !== 1)
159
+ return null;
160
+ const [id] = refs;
161
+ if (resources[id]?.Type !== "AWS::IAM::Role")
162
+ return null;
163
+ roles.add(id);
164
+ }
165
+ }
166
+ // A managed policy can also be attached from the role side (ManagedPolicyArns).
167
+ if (resource.Type === "AWS::IAM::ManagedPolicy") {
168
+ for (const [roleId, candidate] of Object.entries(resources)) {
169
+ if (candidate.Type !== "AWS::IAM::Role")
170
+ continue;
171
+ if (findResourceRefs(candidate.Properties?.ManagedPolicyArns).has(logicalId)) {
172
+ roles.add(roleId);
173
+ }
174
+ }
175
+ }
176
+ return roles.size > 0 ? roles : null;
177
+ }
178
+ /**
179
+ * The non-IAM resources that reference any of the roles (the role's
180
+ * consumers). An IAM::InstanceProfile is a pass-through hop: its own
181
+ * consumers count instead.
182
+ */
183
+ function consumersOf(roleIds, reverseIndex, template) {
184
+ const resources = template.Resources ?? {};
185
+ const seen = new Set();
186
+ const queue = [...roleIds].flatMap((id) => [...(reverseIndex.get(id) ?? [])]);
187
+ const consumers = [];
188
+ while (queue.length > 0) {
189
+ const id = queue.shift();
190
+ if (seen.has(id))
191
+ continue;
192
+ seen.add(id);
193
+ const resource = resources[id];
194
+ if (!resource)
195
+ continue;
196
+ if (resource.Type === "AWS::IAM::InstanceProfile") {
197
+ queue.push(...(reverseIndex.get(id) ?? []));
198
+ continue;
199
+ }
200
+ if (resource.Type.startsWith("AWS::IAM::"))
201
+ continue; // attachment, not consumption
202
+ consumers.push([id, resource]);
203
+ }
204
+ return consumers;
205
+ }
206
+ /**
207
+ * A consumer edge the declared graph cannot enumerate: a literal ARN of one
208
+ * of the statement's services (a foreign, undeclared entity) or an
209
+ * Fn::ImportValue anywhere in the consumer (a cross-stack edge).
210
+ */
211
+ function hasForeignOrIntrinsicEdge(value, services) {
212
+ if (value === null || value === undefined)
213
+ return false;
214
+ if (typeof value === "string") {
215
+ for (const m of value.matchAll(ARN_SERVICE_RE)) {
216
+ if (services.has(m[1]))
217
+ return true;
218
+ }
219
+ return false;
220
+ }
221
+ if (typeof value !== "object")
222
+ return false;
223
+ if (Array.isArray(value)) {
224
+ return value.some((item) => hasForeignOrIntrinsicEdge(item, services));
225
+ }
226
+ const obj = value;
227
+ if ("Fn::ImportValue" in obj)
228
+ return true;
229
+ return Object.values(obj).some((v) => hasForeignOrIntrinsicEdge(v, services));
230
+ }
231
+ const S3_OBJECT_ACTIONS = new Set([
232
+ "getobject",
233
+ "getobjectversion",
234
+ "getobjectacl",
235
+ "getobjecttagging",
236
+ "putobject",
237
+ "putobjectacl",
238
+ "putobjecttagging",
239
+ "deleteobject",
240
+ "deleteobjectversion",
241
+ "listmultipartuploadparts",
242
+ "abortmultipartupload",
243
+ ]);
244
+ function policyKind(type) {
245
+ if (type === "AWS::IAM::Role")
246
+ return "role";
247
+ if (type === "AWS::IAM::ManagedPolicy")
248
+ return "managed policy";
249
+ return "policy";
250
+ }
251
+ export function checkWildcardResourceEnumerable(ctx) {
252
+ const diagnostics = [];
253
+ for (const [_lexicon, output] of ctx.outputs) {
254
+ const template = parseCFTemplate(output);
255
+ if (!template?.Resources)
256
+ continue;
257
+ const reverseIndex = buildReverseRefIndex(template);
258
+ for (const [logicalId, resource] of Object.entries(template.Resources)) {
259
+ if (!IAM_TYPES.has(resource.Type))
260
+ continue;
261
+ // walkPolicyStatements also yields a role's AssumeRolePolicyDocument
262
+ // statements; those always carry a Principal and are gated off below.
263
+ for (const stmt of walkPolicyStatements(resource)) {
264
+ if (stmt.Effect !== "Allow")
265
+ continue;
266
+ if ("Condition" in stmt || "NotAction" in stmt || "NotResource" in stmt)
267
+ continue;
268
+ if ("Principal" in stmt || "NotPrincipal" in stmt)
269
+ continue;
270
+ if (isIntrinsic(stmt.Action) || isIntrinsic(stmt.Resource))
271
+ continue;
272
+ const actions = asStringArray(stmt.Action);
273
+ const resources = asStringArray(stmt.Resource);
274
+ if (!actions || !resources || actions.length === 0 || resources.length === 0)
275
+ continue;
276
+ const services = curatedServices(actions);
277
+ if (!services)
278
+ continue;
279
+ if (!resources.every((r) => isServiceWideResource(r, services)))
280
+ continue;
281
+ const roles = attachedRoles(logicalId, resource, template);
282
+ if (!roles)
283
+ continue;
284
+ const consumers = consumersOf(roles, reverseIndex, template);
285
+ if (consumers.length === 0)
286
+ continue;
287
+ // Every consumer edge must stay inside the declared graph.
288
+ if (consumers.some(([, c]) => hasForeignOrIntrinsicEdge(c.Properties, services)))
289
+ continue;
290
+ // The declared entities of each granted service the consumers touch.
291
+ const touched = new Set();
292
+ let enumerable = true;
293
+ for (const service of services) {
294
+ const types = SERVICE_RESOURCE_TYPES[service];
295
+ const serviceTouched = new Set();
296
+ for (const [, consumer] of consumers) {
297
+ for (const ref of findResourceRefs(consumer.Properties)) {
298
+ if (types.has(template.Resources[ref]?.Type ?? ""))
299
+ serviceTouched.add(ref);
300
+ }
301
+ }
302
+ if (serviceTouched.size === 0) {
303
+ enumerable = false;
304
+ break;
305
+ }
306
+ for (const id of serviceTouched)
307
+ touched.add(id);
308
+ }
309
+ if (!enumerable)
310
+ continue;
311
+ const suggestion = JSON.stringify([...touched].sort().map((id) => ({ "Fn::GetAtt": [id, "Arn"] })));
312
+ const objectHint = actions.some((a) => {
313
+ const [service, name] = a.split(":");
314
+ return service === "s3" && S3_OBJECT_ACTIONS.has(name.toLowerCase());
315
+ })
316
+ ? ' (s3 object-level actions also need the "/*" object suffix on the bucket Arn)'
317
+ : "";
318
+ diagnostics.push({
319
+ checkId: "WAW059",
320
+ severity: "warning",
321
+ message: `IAM ${policyKind(resource.Type)} "${logicalId}" allows ${actions.join(", ")} on ` +
322
+ `Resource ${JSON.stringify(stmt.Resource)}, but the declared graph enumerates the touched set — ` +
323
+ `tighten Resource to ${suggestion}${objectHint}`,
324
+ entity: logicalId,
325
+ lexicon: "aws",
326
+ });
327
+ }
328
+ }
329
+ }
330
+ return diagnostics;
331
+ }
332
+ export const waw059 = {
333
+ id: "WAW059",
334
+ description: "Wildcard Resource where the declared graph enumerates the touched set — tighten to the consumers' declared Arns",
335
+ check(ctx) {
336
+ return checkWildcardResourceEnumerable(ctx);
337
+ },
338
+ };
@@ -0,0 +1,83 @@
1
+ /**
2
+ * WAW060: IAM Policy Attached to No Principal
3
+ *
4
+ * Flags AWS::IAM::Policy / AWS::IAM::ManagedPolicy resources with empty or
5
+ * absent Roles, Users, and Groups that no other part of the template
6
+ * references. A policy attached to no principal grants nothing — the same
7
+ * detached-guardrail shape WAW057 catches for SCPs. Any Ref/GetAtt edge to
8
+ * the policy (a role's ManagedPolicyArns, an attachment-style resource, a
9
+ * stack Output exporting it for another stack to attach) keeps it quiet;
10
+ * plain AWS-managed ARN strings elsewhere are not references to the
11
+ * template's own policy.
12
+ */
13
+ import { parseCFTemplate, findResourceRefs, isIntrinsic } from "./cf-refs.js";
14
+ const POLICY_TYPES = new Set(["AWS::IAM::Policy", "AWS::IAM::ManagedPolicy"]);
15
+ const PRINCIPAL_PROPS = ["Roles", "Users", "Groups"];
16
+ /**
17
+ * Collect every logical id referenced via Ref/Fn::GetAtt from anywhere in the
18
+ * template except the policy resources themselves — other resources'
19
+ * properties and the Outputs section. An Output edge counts as attachment
20
+ * evidence: the policy may be exported for a consuming stack to attach.
21
+ */
22
+ function collectExternalRefs(template, excludeIds) {
23
+ const refs = new Set();
24
+ for (const [logicalId, resource] of Object.entries(template.Resources ?? {})) {
25
+ if (excludeIds.has(logicalId))
26
+ continue;
27
+ for (const ref of findResourceRefs(resource))
28
+ refs.add(ref);
29
+ }
30
+ for (const ref of findResourceRefs(template.Outputs))
31
+ refs.add(ref);
32
+ return refs;
33
+ }
34
+ export function checkPolicyUnattached(ctx) {
35
+ const diagnostics = [];
36
+ for (const [_lexicon, output] of ctx.outputs) {
37
+ const template = parseCFTemplate(output);
38
+ if (!template?.Resources)
39
+ continue;
40
+ const policyIds = new Set(Object.entries(template.Resources)
41
+ .filter(([, resource]) => POLICY_TYPES.has(resource.Type))
42
+ .map(([logicalId]) => logicalId));
43
+ if (policyIds.size === 0)
44
+ continue;
45
+ const externalRefs = collectExternalRefs(template, policyIds);
46
+ for (const logicalId of policyIds) {
47
+ const resource = template.Resources[logicalId];
48
+ const props = resource.Properties ?? {};
49
+ // Any declared principal list keeps the policy quiet. An intrinsic
50
+ // can't be statically evaluated, so it counts as attached.
51
+ let attached = false;
52
+ for (const prop of PRINCIPAL_PROPS) {
53
+ const value = props[prop];
54
+ if (isIntrinsic(value))
55
+ attached = true;
56
+ else if (Array.isArray(value) && value.length > 0)
57
+ attached = true;
58
+ }
59
+ if (attached)
60
+ continue;
61
+ // Reverse lookup: anything else in the template holding a Ref/GetAtt
62
+ // edge to this policy attaches (or exports) it.
63
+ if (externalRefs.has(logicalId))
64
+ continue;
65
+ const kind = resource.Type === "AWS::IAM::ManagedPolicy" ? "Managed policy" : "Policy";
66
+ diagnostics.push({
67
+ checkId: "WAW060",
68
+ severity: "warning",
69
+ message: `${kind} "${logicalId}" is attached to no principal — no Roles/Users/Groups and nothing in the template references it; an unattached policy grants nothing`,
70
+ entity: logicalId,
71
+ lexicon: "aws",
72
+ });
73
+ }
74
+ }
75
+ return diagnostics;
76
+ }
77
+ export const waw060 = {
78
+ id: "WAW060",
79
+ description: "IAM policy attached to no principal — it grants nothing",
80
+ check(ctx) {
81
+ return checkPolicyUnattached(ctx);
82
+ },
83
+ };
@@ -0,0 +1,60 @@
1
+ /**
2
+ * WAW061: Subnet CIDR Not Contained In VPC CIDR
3
+ *
4
+ * A subnet's CidrBlock must fall entirely inside its VPC's CidrBlock.
5
+ * Stock CDK does not check this — CloudFormation accepts the template and
6
+ * only fails the `AWS::EC2::Subnet` resource at deploy time
7
+ * ("The CIDR ... is invalid" / "does not fall within the CIDR range of the
8
+ * VPC"), after the rest of the stack may have already started rolling out.
9
+ * This is a cheap static graph check: follow the subnet's VpcId Ref to a
10
+ * declared VPC in the same template and do IPv4 CIDR-range math.
11
+ *
12
+ * Stays quiet whenever the graph can't prove it: intrinsic CIDR blocks,
13
+ * IPv6, a VpcId that isn't a simple Ref to a declared AWS::EC2::VPC, or a
14
+ * VPC whose own CidrBlock isn't a literal string.
15
+ */
16
+ import { parseCFTemplate, findResourceRefs, ipv4CidrContains } from "./cf-refs.js";
17
+ export function checkSubnetCidrContainment(ctx) {
18
+ const diagnostics = [];
19
+ for (const [_lexicon, output] of ctx.outputs) {
20
+ const template = parseCFTemplate(output);
21
+ if (!template?.Resources)
22
+ continue;
23
+ for (const [logicalId, resource] of Object.entries(template.Resources)) {
24
+ if (resource.Type !== "AWS::EC2::Subnet")
25
+ continue;
26
+ const props = resource.Properties ?? {};
27
+ const subnetCidr = props.CidrBlock;
28
+ if (typeof subnetCidr !== "string")
29
+ continue;
30
+ const vpcRefs = findResourceRefs(props.VpcId);
31
+ if (vpcRefs.size !== 1)
32
+ continue;
33
+ const [vpcId] = vpcRefs;
34
+ const vpc = template.Resources[vpcId];
35
+ if (!vpc || vpc.Type !== "AWS::EC2::VPC")
36
+ continue;
37
+ const vpcCidr = vpc.Properties?.CidrBlock;
38
+ if (typeof vpcCidr !== "string")
39
+ continue;
40
+ const contained = ipv4CidrContains(vpcCidr, subnetCidr);
41
+ if (contained === false) {
42
+ diagnostics.push({
43
+ checkId: "WAW061",
44
+ severity: "error",
45
+ message: `Subnet "${logicalId}" CidrBlock ${subnetCidr} is not contained within VPC "${vpcId}"'s CidrBlock ${vpcCidr} — CloudFormation rejects this at deploy time`,
46
+ entity: logicalId,
47
+ lexicon: "aws",
48
+ });
49
+ }
50
+ }
51
+ }
52
+ return diagnostics;
53
+ }
54
+ export const waw061 = {
55
+ id: "WAW061",
56
+ description: "Subnet CidrBlock falls outside its VPC's CidrBlock — fails at deploy time",
57
+ check(ctx) {
58
+ return checkSubnetCidrContainment(ctx);
59
+ },
60
+ };
Binary file
Binary file