@aws/nx-plugin 1.0.0-rc.4 → 1.0.0-rc.41

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 (1138) hide show
  1. package/LICENSE-THIRD-PARTY +5449 -4980
  2. package/README.md +7 -7
  3. package/executors.json +9 -0
  4. package/generators.json +101 -2
  5. package/package.json +35 -17
  6. package/src/agentcore-gateway/attach-upstream.d.ts +33 -0
  7. package/src/agentcore-gateway/attach-upstream.js +38 -0
  8. package/src/agentcore-gateway/attach-upstream.js.map +1 -0
  9. package/src/agentcore-gateway/files/cedar/policies/README.md +52 -0
  10. package/src/agentcore-gateway/files/cedar/policies/permit-all.cedar +11 -0
  11. package/src/agentcore-gateway/files/project/local-dev.ts.template +134 -0
  12. package/src/agentcore-gateway/gateway-connection/generator.d.ts +21 -0
  13. package/src/agentcore-gateway/gateway-connection/generator.js +101 -0
  14. package/src/agentcore-gateway/gateway-connection/generator.js.map +1 -0
  15. package/src/agentcore-gateway/gateway-connection/schema.d.js +6 -0
  16. package/src/agentcore-gateway/gateway-connection/schema.d.js.map +1 -0
  17. package/src/agentcore-gateway/gateway-connection/schema.d.ts +13 -0
  18. package/src/agentcore-gateway/gateway-connection/schema.json +31 -0
  19. package/src/agentcore-gateway/generator.d.ts +25 -0
  20. package/src/agentcore-gateway/generator.js +149 -0
  21. package/src/agentcore-gateway/generator.js.map +1 -0
  22. package/src/agentcore-gateway/mcp-connection/generator.d.ts +19 -0
  23. package/src/agentcore-gateway/mcp-connection/generator.js +59 -0
  24. package/src/agentcore-gateway/mcp-connection/generator.js.map +1 -0
  25. package/src/agentcore-gateway/mcp-connection/schema.d.js +6 -0
  26. package/src/agentcore-gateway/mcp-connection/schema.d.js.map +1 -0
  27. package/src/agentcore-gateway/mcp-connection/schema.d.ts +13 -0
  28. package/src/agentcore-gateway/mcp-connection/schema.json +31 -0
  29. package/src/agentcore-gateway/schema.d.js +6 -0
  30. package/src/agentcore-gateway/schema.d.js.map +1 -0
  31. package/src/agentcore-gateway/schema.d.ts +17 -0
  32. package/src/agentcore-gateway/schema.json +70 -0
  33. package/src/bin/aws-nx-mcp.js +14 -0
  34. package/src/bin/aws-nx-mcp.js.map +1 -0
  35. package/src/connection/{agent-serve-local.d.ts → agent-local-dev.d.ts} +7 -7
  36. package/src/connection/agent-local-dev.js +42 -0
  37. package/src/connection/agent-local-dev.js.map +1 -0
  38. package/src/connection/agent-runtime-config.d.ts +1 -1
  39. package/src/connection/agent-runtime-config.js +9 -14
  40. package/src/connection/agent-runtime-config.js.map +1 -1
  41. package/src/connection/generator.d.ts +7 -14
  42. package/src/connection/generator.js +167 -194
  43. package/src/connection/generator.js.map +1 -1
  44. package/src/connection/local-dev.d.ts +15 -0
  45. package/src/connection/local-dev.js +37 -0
  46. package/src/connection/local-dev.js.map +1 -0
  47. package/src/connection/schema.d.js +6 -0
  48. package/src/connection/schema.d.js.map +1 -0
  49. package/src/connection/schema.d.ts +1 -0
  50. package/src/connection/schema.json +5 -0
  51. package/src/connection/supported-connections.d.ts +107 -0
  52. package/src/connection/supported-connections.js +151 -0
  53. package/src/connection/supported-connections.js.map +1 -0
  54. package/src/index.js +2 -5
  55. package/src/index.js.map +1 -1
  56. package/src/infra/app/__snapshots__/generator.spec.ts.snap +97 -85
  57. package/src/infra/app/files/app/src/main.ts.template +1 -1
  58. package/src/infra/app/files/app/src/stages/application-stage.ts.template +1 -1
  59. package/src/infra/app/generator.d.ts +3 -3
  60. package/src/infra/app/generator.js +142 -122
  61. package/src/infra/app/generator.js.map +1 -1
  62. package/src/infra/app/schema.d.js +6 -0
  63. package/src/infra/app/schema.d.js.map +1 -0
  64. package/src/infra/app/schema.d.ts +1 -1
  65. package/src/infra/app/schema.json +5 -0
  66. package/src/init/generator.d.ts +18 -0
  67. package/src/init/generator.js +35 -0
  68. package/src/init/generator.js.map +1 -0
  69. package/src/init/schema.d.js +6 -0
  70. package/src/init/schema.d.js.map +1 -0
  71. package/src/init/schema.d.ts +16 -0
  72. package/src/init/schema.json +35 -0
  73. package/src/license/__snapshots__/config.spec.ts.snap +23 -0
  74. package/src/license/config-types.d.ts +18 -1
  75. package/src/license/config-types.js +8 -2
  76. package/src/license/config-types.js.map +1 -1
  77. package/src/license/config.d.ts +65 -7
  78. package/src/license/config.js +442 -109
  79. package/src/license/config.js.map +1 -1
  80. package/src/license/dependency-check/check.d.ts +16 -0
  81. package/src/license/dependency-check/check.js +116 -0
  82. package/src/license/dependency-check/check.js.map +1 -0
  83. package/src/license/dependency-check/collectors/collector.d.ts +21 -0
  84. package/src/license/dependency-check/collectors/collector.js +46 -0
  85. package/src/license/dependency-check/collectors/collector.js.map +1 -0
  86. package/src/license/dependency-check/collectors/npm-collector.d.ts +10 -0
  87. package/src/license/dependency-check/collectors/npm-collector.js +68 -0
  88. package/src/license/dependency-check/collectors/npm-collector.js.map +1 -0
  89. package/src/license/dependency-check/collectors/python-collector.d.ts +23 -0
  90. package/src/license/dependency-check/collectors/python-collector.js +114 -0
  91. package/src/license/dependency-check/collectors/python-collector.js.map +1 -0
  92. package/src/license/dependency-check/evaluator.d.ts +9 -0
  93. package/src/license/dependency-check/evaluator.js +94 -0
  94. package/src/license/dependency-check/evaluator.js.map +1 -0
  95. package/src/license/dependency-check/executor-schema.json +6 -0
  96. package/src/license/dependency-check/executor.d.ts +9 -0
  97. package/src/license/dependency-check/executor.js +51 -0
  98. package/src/license/dependency-check/executor.js.map +1 -0
  99. package/src/license/dependency-check/pre-approved.d.ts +6 -0
  100. package/src/license/dependency-check/pre-approved.js +1893 -0
  101. package/src/license/dependency-check/pre-approved.js.map +1 -0
  102. package/src/license/dependency-check/types.d.ts +45 -0
  103. package/src/license/dependency-check/types.js +6 -0
  104. package/src/license/dependency-check/types.js.map +1 -0
  105. package/src/license/generator.d.ts +3 -3
  106. package/src/license/generator.js +126 -30
  107. package/src/license/generator.js.map +1 -1
  108. package/src/license/index.d.ts +8 -0
  109. package/src/license/index.js +7 -0
  110. package/src/license/index.js.map +1 -0
  111. package/src/license/known-exceptions.d.ts +7 -0
  112. package/src/license/known-exceptions.js +39 -0
  113. package/src/license/known-exceptions.js.map +1 -0
  114. package/src/license/schema.d.js +6 -0
  115. package/src/license/schema.d.js.map +1 -0
  116. package/src/license/schema.d.ts +7 -0
  117. package/src/license/schema.json +11 -0
  118. package/src/license/sync/generator.d.ts +2 -2
  119. package/src/license/sync/generator.js +100 -125
  120. package/src/license/sync/generator.js.map +1 -1
  121. package/src/license/sync/project-file-sync.d.ts +3 -3
  122. package/src/license/sync/project-file-sync.js +28 -35
  123. package/src/license/sync/project-file-sync.js.map +1 -1
  124. package/src/mcp-server/generator-info.d.ts +5 -1
  125. package/src/mcp-server/generator-info.js +149 -165
  126. package/src/mcp-server/generator-info.js.map +1 -1
  127. package/src/mcp-server/guide-pipeline.d.ts +1 -1
  128. package/src/mcp-server/guide-pipeline.js +199 -206
  129. package/src/mcp-server/guide-pipeline.js.map +1 -1
  130. package/src/mcp-server/guide-render.js +10 -25
  131. package/src/mcp-server/guide-render.js.map +1 -1
  132. package/src/mcp-server/index.js +6 -10
  133. package/src/mcp-server/index.js.map +1 -1
  134. package/src/mcp-server/mdx-ast.js +42 -56
  135. package/src/mcp-server/mdx-ast.js.map +1 -1
  136. package/src/mcp-server/option-filter.js +33 -47
  137. package/src/mcp-server/option-filter.js.map +1 -1
  138. package/src/mcp-server/schema-registry.d.ts +9 -3
  139. package/src/mcp-server/schema-registry.js +41 -38
  140. package/src/mcp-server/schema-registry.js.map +1 -1
  141. package/src/mcp-server/schema.js +9 -7
  142. package/src/mcp-server/schema.js.map +1 -1
  143. package/src/mcp-server/server.js +22 -24
  144. package/src/mcp-server/server.js.map +1 -1
  145. package/src/mcp-server/tools/add-to-existing-project.d.ts +12 -0
  146. package/src/mcp-server/tools/add-to-existing-project.js +36 -0
  147. package/src/mcp-server/tools/add-to-existing-project.js.map +1 -0
  148. package/src/mcp-server/tools/create-workspace-command.d.ts +1 -1
  149. package/src/mcp-server/tools/create-workspace-command.js +23 -24
  150. package/src/mcp-server/tools/create-workspace-command.js.map +1 -1
  151. package/src/mcp-server/tools/general-guidance.d.ts +3 -3
  152. package/src/mcp-server/tools/general-guidance.js +47 -25
  153. package/src/mcp-server/tools/general-guidance.js.map +1 -1
  154. package/src/mcp-server/tools/generator-guide.d.ts +2 -2
  155. package/src/mcp-server/tools/generator-guide.js +29 -37
  156. package/src/mcp-server/tools/generator-guide.js.map +1 -1
  157. package/src/mcp-server/tools/list-generators.d.ts +2 -2
  158. package/src/mcp-server/tools/list-generators.js +19 -25
  159. package/src/mcp-server/tools/list-generators.js.map +1 -1
  160. package/src/open-api/ts-client/__snapshots__/generator.additional-properties.spec.ts.snap +147 -33
  161. package/src/open-api/ts-client/__snapshots__/generator.arrays.spec.ts.snap +308 -75
  162. package/src/open-api/ts-client/__snapshots__/generator.complex-types.spec.ts.snap +298 -74
  163. package/src/open-api/ts-client/__snapshots__/generator.composite-types.spec.ts.snap +748 -103
  164. package/src/open-api/ts-client/__snapshots__/generator.content-type.spec.ts.snap +230 -37
  165. package/src/open-api/ts-client/__snapshots__/generator.duplicate-types.spec.ts.snap +249 -52
  166. package/src/open-api/ts-client/__snapshots__/generator.edge-cases.spec.ts.snap +5535 -0
  167. package/src/open-api/ts-client/__snapshots__/generator.fast-api-gaps.spec.ts.snap +736 -0
  168. package/src/open-api/ts-client/__snapshots__/generator.fast-api.spec.ts.snap +305 -71
  169. package/src/open-api/ts-client/__snapshots__/generator.multipart.spec.ts.snap +298 -0
  170. package/src/open-api/ts-client/__snapshots__/generator.primitive-types.spec.ts.snap +353 -82
  171. package/src/open-api/ts-client/__snapshots__/generator.request.spec.ts.snap +176 -55
  172. package/src/open-api/ts-client/__snapshots__/generator.reserved-keywords.spec.ts.snap +101 -25
  173. package/src/open-api/ts-client/__snapshots__/generator.response.spec.ts.snap +147 -33
  174. package/src/open-api/ts-client/__snapshots__/generator.spec-compliance.spec.ts.snap +1883 -0
  175. package/src/open-api/ts-client/__snapshots__/generator.streaming.spec.ts.snap +392 -88
  176. package/src/open-api/ts-client/__snapshots__/generator.tags.spec.ts.snap +200 -48
  177. package/src/open-api/ts-client/files/client.gen.ts.template +358 -24
  178. package/src/open-api/ts-client/files/types.gen.ts.template +6 -4
  179. package/src/open-api/ts-client/generator.d.ts +3 -3
  180. package/src/open-api/ts-client/generator.js +41 -26
  181. package/src/open-api/ts-client/generator.js.map +1 -1
  182. package/src/open-api/ts-client/schema.d.js +6 -0
  183. package/src/open-api/ts-client/schema.d.js.map +1 -0
  184. package/src/open-api/ts-hooks/files/options-proxy.gen.ts.template +7 -2
  185. package/src/open-api/ts-hooks/generator.d.ts +3 -3
  186. package/src/open-api/ts-hooks/generator.js +17 -21
  187. package/src/open-api/ts-hooks/generator.js.map +1 -1
  188. package/src/open-api/ts-hooks/generator.spec.tsx +84 -14
  189. package/src/open-api/ts-hooks/schema.d.js +6 -0
  190. package/src/open-api/ts-hooks/schema.d.js.map +1 -0
  191. package/src/open-api/ts-metadata/generator.d.ts +3 -3
  192. package/src/open-api/ts-metadata/generator.js +12 -20
  193. package/src/open-api/ts-metadata/generator.js.map +1 -1
  194. package/src/open-api/ts-metadata/schema.d.js +6 -0
  195. package/src/open-api/ts-metadata/schema.d.js.map +1 -0
  196. package/src/open-api/utils/codegen-data/languages.d.ts +3 -5
  197. package/src/open-api/utils/codegen-data/languages.js +59 -66
  198. package/src/open-api/utils/codegen-data/languages.js.map +1 -1
  199. package/src/open-api/utils/codegen-data/types.d.ts +255 -10
  200. package/src/open-api/utils/codegen-data/types.js +54 -30
  201. package/src/open-api/utils/codegen-data/types.js.map +1 -1
  202. package/src/open-api/utils/codegen-data.d.ts +8 -4
  203. package/src/open-api/utils/codegen-data.js +494 -674
  204. package/src/open-api/utils/codegen-data.js.map +1 -1
  205. package/src/open-api/utils/normalise.d.ts +5 -1
  206. package/src/open-api/utils/normalise.js +437 -246
  207. package/src/open-api/utils/normalise.js.map +1 -1
  208. package/src/open-api/utils/parse.d.ts +2 -2
  209. package/src/open-api/utils/parse.js +11 -13
  210. package/src/open-api/utils/parse.js.map +1 -1
  211. package/src/open-api/utils/parser.d.ts +55 -0
  212. package/src/open-api/utils/parser.js +787 -0
  213. package/src/open-api/utils/parser.js.map +1 -0
  214. package/src/open-api/utils/refs.d.ts +1 -1
  215. package/src/open-api/utils/refs.js +12 -22
  216. package/src/open-api/utils/refs.js.map +1 -1
  217. package/src/open-api/utils/types.d.ts +18 -0
  218. package/src/open-api/utils/types.js +5 -2
  219. package/src/open-api/utils/types.js.map +1 -1
  220. package/src/preset/__snapshots__/generator.spec.ts.snap +109 -28
  221. package/src/preset/generator.d.ts +4 -4
  222. package/src/preset/generator.js +64 -147
  223. package/src/preset/generator.js.map +1 -1
  224. package/src/preset/schema.d.js +6 -0
  225. package/src/preset/schema.d.js.map +1 -0
  226. package/src/preset/schema.d.ts +5 -2
  227. package/src/preset/schema.json +11 -5
  228. package/src/py/agent/__snapshots__/generator.constructs.spec.ts.snap +320 -0
  229. package/src/py/agent/__snapshots__/generator.frameworks.spec.ts.snap +734 -0
  230. package/src/py/agent/__snapshots__/{generator.spec.ts.snap → generator.protocols.spec.ts.snap} +182 -314
  231. package/src/py/agent/a2a-connection/__snapshots__/generator.spec.ts.snap +189 -0
  232. package/src/py/agent/a2a-connection/files/agent-connection/app/__targetAgentSnakeCase___client_strands.py.template +30 -0
  233. package/src/py/agent/a2a-connection/files/langchain/agent-connection/app/__targetAgentSnakeCase___client_langchain.py.template +28 -0
  234. package/src/py/agent/a2a-connection/generator.d.ts +3 -3
  235. package/src/py/agent/a2a-connection/generator.js +113 -85
  236. package/src/py/agent/a2a-connection/generator.js.map +1 -1
  237. package/src/py/agent/a2a-connection/schema.d.js +8 -0
  238. package/src/py/agent/a2a-connection/schema.d.js.map +1 -0
  239. package/src/py/agent/a2a-connection/schema.d.ts +1 -0
  240. package/src/py/agent/a2a-connection/schema.json +5 -0
  241. package/src/py/agent/files/a2a-langchain/main.py.template +89 -0
  242. package/src/py/agent/files/ag-ui-langchain/main.py.template +83 -0
  243. package/src/py/agent/files/common/agent.py.template +2 -0
  244. package/src/py/agent/files/common-langchain/agent.py.template +30 -0
  245. package/src/py/agent/files/deploy/Dockerfile.template +1 -1
  246. package/src/py/agent/files/http/init.py.template +7 -25
  247. package/src/py/agent/files/http/main.py.template +3 -4
  248. package/src/py/agent/files/http-langchain/main.py.template +84 -0
  249. package/src/py/agent/gateway-connection/__snapshots__/generator.spec.ts.snap +184 -0
  250. package/src/py/agent/gateway-connection/files/agent-connection/app/__gatewaySnakeCase___client_strands.py.template +35 -0
  251. package/src/py/agent/gateway-connection/files/langchain/agent-connection/app/__gatewaySnakeCase___client_langchain.py.template +34 -0
  252. package/src/py/agent/gateway-connection/generator.d.ts +10 -0
  253. package/src/py/agent/gateway-connection/generator.js +119 -0
  254. package/src/py/agent/gateway-connection/generator.js.map +1 -0
  255. package/src/py/agent/gateway-connection/schema.d.js +6 -0
  256. package/src/py/agent/gateway-connection/schema.d.js.map +1 -0
  257. package/src/py/agent/gateway-connection/schema.d.ts +13 -0
  258. package/src/py/agent/gateway-connection/schema.json +31 -0
  259. package/src/py/agent/generator.d.ts +3 -3
  260. package/src/py/agent/generator.js +290 -179
  261. package/src/py/agent/generator.js.map +1 -1
  262. package/src/py/agent/mcp-connection/__snapshots__/generator.spec.ts.snap +153 -89
  263. package/src/py/agent/mcp-connection/files/agent-connection/app/__mcpServerSnakeCase___client_strands.py.template +30 -0
  264. package/src/py/agent/mcp-connection/files/langchain/agent-connection/app/__mcpServerSnakeCase___client_langchain.py.template +30 -0
  265. package/src/py/agent/mcp-connection/generator.d.ts +3 -3
  266. package/src/py/agent/mcp-connection/generator.js +65 -126
  267. package/src/py/agent/mcp-connection/generator.js.map +1 -1
  268. package/src/py/agent/mcp-connection/schema.d.js +8 -0
  269. package/src/py/agent/mcp-connection/schema.d.js.map +1 -0
  270. package/src/py/agent/mcp-connection/schema.d.ts +1 -0
  271. package/src/py/agent/mcp-connection/schema.json +5 -0
  272. package/src/py/agent/react-connection/__snapshots__/generator.spec.ts.snap +11 -19
  273. package/src/py/agent/react-connection/generator.d.ts +4 -4
  274. package/src/py/agent/react-connection/generator.js +55 -59
  275. package/src/py/agent/react-connection/generator.js.map +1 -1
  276. package/src/py/agent/react-connection/{serve-local.d.ts → local-dev.d.ts} +6 -6
  277. package/src/py/agent/react-connection/local-dev.js +36 -0
  278. package/src/py/agent/react-connection/local-dev.js.map +1 -0
  279. package/src/py/agent/react-connection/schema.d.js +8 -0
  280. package/src/py/agent/react-connection/schema.d.js.map +1 -0
  281. package/src/py/agent/react-connection/schema.d.ts +1 -0
  282. package/src/py/agent/react-connection/schema.json +5 -0
  283. package/src/py/agent/schema.d.js +6 -0
  284. package/src/py/agent/schema.d.js.map +1 -0
  285. package/src/py/agent/schema.d.ts +2 -1
  286. package/src/py/agent/schema.json +6 -1
  287. package/src/py/api/generator.d.ts +3 -3
  288. package/src/py/api/generator.js +12 -11
  289. package/src/py/api/generator.js.map +1 -1
  290. package/src/py/api/schema.d.js +6 -0
  291. package/src/py/api/schema.d.js.map +1 -0
  292. package/src/py/api/schema.d.ts +1 -0
  293. package/src/py/api/schema.json +5 -0
  294. package/src/py/dynamodb/__snapshots__/generator.spec.ts.snap +1526 -0
  295. package/src/py/dynamodb/agent-connection/__snapshots__/generator.spec.ts.snap +45 -0
  296. package/src/py/dynamodb/agent-connection/generator.d.ts +10 -0
  297. package/src/py/dynamodb/agent-connection/generator.js +39 -0
  298. package/src/py/dynamodb/agent-connection/generator.js.map +1 -0
  299. package/src/py/dynamodb/agent-connection/schema.d.js +8 -0
  300. package/src/py/dynamodb/agent-connection/schema.d.js.map +1 -0
  301. package/src/py/dynamodb/agent-connection/schema.d.ts +15 -0
  302. package/src/py/dynamodb/agent-connection/schema.json +27 -0
  303. package/src/py/dynamodb/fast-api-connection/__snapshots__/generator.spec.ts.snap +23 -0
  304. package/src/py/dynamodb/fast-api-connection/generator.d.ts +10 -0
  305. package/src/py/dynamodb/fast-api-connection/generator.js +37 -0
  306. package/src/py/dynamodb/fast-api-connection/generator.js.map +1 -0
  307. package/src/py/dynamodb/fast-api-connection/schema.d.js +8 -0
  308. package/src/py/dynamodb/fast-api-connection/schema.d.js.map +1 -0
  309. package/src/py/dynamodb/fast-api-connection/schema.d.ts +13 -0
  310. package/src/py/dynamodb/fast-api-connection/schema.json +23 -0
  311. package/src/py/dynamodb/files/__name__/__init__.py.template +6 -0
  312. package/src/py/dynamodb/files/__name__/client.py.template +39 -0
  313. package/src/py/dynamodb/files/__name__/entities/__init__.py.template +4 -0
  314. package/src/py/dynamodb/files/__name__/entities/base.py.template +63 -0
  315. package/src/py/dynamodb/files/__name__/entities/example.py.template +64 -0
  316. package/src/py/dynamodb/files/config.json.template +24 -0
  317. package/src/py/dynamodb/generator.d.ts +10 -0
  318. package/src/py/dynamodb/generator.js +110 -0
  319. package/src/py/dynamodb/generator.js.map +1 -0
  320. package/src/py/dynamodb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +45 -0
  321. package/src/py/dynamodb/mcp-server-connection/generator.d.ts +10 -0
  322. package/src/py/dynamodb/mcp-server-connection/generator.js +39 -0
  323. package/src/py/dynamodb/mcp-server-connection/generator.js.map +1 -0
  324. package/src/py/dynamodb/mcp-server-connection/schema.d.js +8 -0
  325. package/src/py/dynamodb/mcp-server-connection/schema.d.js.map +1 -0
  326. package/src/py/dynamodb/mcp-server-connection/schema.d.ts +15 -0
  327. package/src/py/dynamodb/mcp-server-connection/schema.json +27 -0
  328. package/src/py/dynamodb/schema.d.js +6 -0
  329. package/src/py/dynamodb/schema.d.js.map +1 -0
  330. package/src/py/dynamodb/schema.d.ts +16 -0
  331. package/src/py/dynamodb/schema.json +75 -0
  332. package/src/py/fast-api/__snapshots__/generator.spec.ts.snap +212 -4678
  333. package/src/py/fast-api/__snapshots__/generator.terraform.spec.ts.snap +5409 -0
  334. package/src/py/fast-api/files/app/__name__/init.py.template +5 -22
  335. package/src/py/fast-api/files/app/__name__/main.py.template +4 -1
  336. package/src/py/fast-api/generator.d.ts +3 -3
  337. package/src/py/fast-api/generator.js +90 -87
  338. package/src/py/fast-api/generator.js.map +1 -1
  339. package/src/py/fast-api/react/__snapshots__/generator.spec.ts.snap +4 -3
  340. package/src/py/fast-api/react/generator.d.ts +4 -4
  341. package/src/py/fast-api/react/generator.js +25 -25
  342. package/src/py/fast-api/react/generator.js.map +1 -1
  343. package/src/py/fast-api/react/open-api.d.ts +1 -1
  344. package/src/py/fast-api/react/open-api.js +31 -29
  345. package/src/py/fast-api/react/open-api.js.map +1 -1
  346. package/src/py/fast-api/react/schema.d.js +6 -0
  347. package/src/py/fast-api/react/schema.d.js.map +1 -0
  348. package/src/py/fast-api/react/schema.d.ts +1 -0
  349. package/src/py/fast-api/react/schema.json +5 -0
  350. package/src/py/fast-api/schema.d.js +6 -0
  351. package/src/py/fast-api/schema.d.js.map +1 -0
  352. package/src/py/fast-api/schema.d.ts +1 -0
  353. package/src/py/fast-api/schema.json +5 -0
  354. package/src/py/lambda-function/__snapshots__/generator.spec.ts.snap +4 -4
  355. package/src/py/lambda-function/generator.d.ts +3 -3
  356. package/src/py/lambda-function/generator.js +60 -59
  357. package/src/py/lambda-function/generator.js.map +1 -1
  358. package/src/py/lambda-function/schema.d.js +6 -0
  359. package/src/py/lambda-function/schema.d.js.map +1 -0
  360. package/src/py/lambda-function/schema.d.ts +1 -0
  361. package/src/py/lambda-function/schema.json +5 -0
  362. package/src/py/mcp-server/__snapshots__/generator.spec.ts.snap +208 -19
  363. package/src/py/mcp-server/files/deploy/Dockerfile.template +1 -1
  364. package/src/py/mcp-server/generator.d.ts +3 -3
  365. package/src/py/mcp-server/generator.js +162 -124
  366. package/src/py/mcp-server/generator.js.map +1 -1
  367. package/src/py/mcp-server/schema.d.js +6 -0
  368. package/src/py/mcp-server/schema.d.js.map +1 -0
  369. package/src/py/mcp-server/schema.d.ts +1 -0
  370. package/src/py/mcp-server/schema.json +5 -0
  371. package/src/py/project/generator.d.ts +17 -4
  372. package/src/py/project/generator.js +205 -127
  373. package/src/py/project/generator.js.map +1 -1
  374. package/src/py/project/schema.d.js +6 -0
  375. package/src/py/project/schema.d.js.map +1 -0
  376. package/src/py/project/schema.d.ts +1 -0
  377. package/src/py/project/schema.json +5 -0
  378. package/src/py/rdb/__snapshots__/generator.spec.ts.snap +2038 -0
  379. package/src/py/rdb/agent-connection/__snapshots__/generator.spec.ts.snap +104 -0
  380. package/src/py/rdb/agent-connection/generator.d.ts +10 -0
  381. package/src/py/rdb/agent-connection/generator.js +46 -0
  382. package/src/py/rdb/agent-connection/generator.js.map +1 -0
  383. package/src/py/rdb/agent-connection/schema.d.js +8 -0
  384. package/src/py/rdb/agent-connection/schema.d.js.map +1 -0
  385. package/src/py/rdb/agent-connection/schema.d.ts +15 -0
  386. package/src/py/rdb/agent-connection/schema.json +27 -0
  387. package/src/py/rdb/fast-api-connection/__snapshots__/generator.spec.ts.snap +44 -0
  388. package/src/py/rdb/fast-api-connection/files/__apiModuleName__/dependencies/__rdbNameSnake__.py.template +14 -0
  389. package/src/py/rdb/fast-api-connection/generator.d.ts +10 -0
  390. package/src/py/rdb/fast-api-connection/generator.js +54 -0
  391. package/src/py/rdb/fast-api-connection/generator.js.map +1 -0
  392. package/src/py/rdb/fast-api-connection/schema.d.js +8 -0
  393. package/src/py/rdb/fast-api-connection/schema.d.js.map +1 -0
  394. package/src/py/rdb/fast-api-connection/schema.d.ts +13 -0
  395. package/src/py/rdb/fast-api-connection/schema.json +23 -0
  396. package/src/py/rdb/files/Dockerfile.create-db-user.template +10 -0
  397. package/src/py/rdb/files/Dockerfile.migration.template +10 -0
  398. package/src/py/rdb/files/__name__/__init__.py.template +3 -0
  399. package/src/py/rdb/files/__name__/connection.py.template +55 -0
  400. package/src/py/rdb/files/__name__/create_db_user_handler.py.template +97 -0
  401. package/src/py/rdb/files/__name__/migration_handler.py.template +36 -0
  402. package/src/py/rdb/files/__name__/models/__init__.py.template +3 -0
  403. package/src/py/rdb/files/__name__/models/example.py.template +8 -0
  404. package/src/py/rdb/files/__name__/utils.py.template +104 -0
  405. package/src/py/rdb/files/alembic.ini.template +38 -0
  406. package/src/py/rdb/files/config.json.template +14 -0
  407. package/src/py/rdb/files/migrations/env.py.template +80 -0
  408. package/src/py/rdb/files/migrations/script.py.mako.template +28 -0
  409. package/src/py/rdb/generator.d.ts +6 -0
  410. package/src/py/rdb/generator.js +274 -0
  411. package/src/py/rdb/generator.js.map +1 -0
  412. package/src/py/rdb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +101 -0
  413. package/src/py/rdb/mcp-server-connection/generator.d.ts +10 -0
  414. package/src/py/rdb/mcp-server-connection/generator.js +46 -0
  415. package/src/py/rdb/mcp-server-connection/generator.js.map +1 -0
  416. package/src/py/rdb/mcp-server-connection/schema.d.js +8 -0
  417. package/src/py/rdb/mcp-server-connection/schema.d.js.map +1 -0
  418. package/src/py/rdb/mcp-server-connection/schema.d.ts +15 -0
  419. package/src/py/rdb/mcp-server-connection/schema.json +27 -0
  420. package/src/py/rdb/schema.d.js +6 -0
  421. package/src/py/rdb/schema.d.js.map +1 -0
  422. package/src/py/rdb/schema.d.ts +16 -0
  423. package/src/py/rdb/schema.json +77 -0
  424. package/src/py/rdb/utils.d.ts +6 -0
  425. package/src/py/rdb/utils.js +16 -0
  426. package/src/py/rdb/utils.js.map +1 -0
  427. package/src/sdk/agentcore-gateway.d.ts +6 -0
  428. package/src/sdk/agentcore-gateway.js +7 -0
  429. package/src/sdk/agentcore-gateway.js.map +1 -0
  430. package/src/sdk/connection.d.ts +6 -0
  431. package/src/sdk/connection.js +6 -0
  432. package/src/sdk/connection.js.map +1 -0
  433. package/src/sdk/license.d.ts +8 -0
  434. package/src/sdk/license.js +7 -0
  435. package/src/sdk/license.js.map +1 -0
  436. package/src/sdk/open-api.d.ts +10 -0
  437. package/src/sdk/open-api.js +8 -0
  438. package/src/sdk/open-api.js.map +1 -0
  439. package/src/sdk/py.d.ts +16 -0
  440. package/src/sdk/py.js +11 -0
  441. package/src/sdk/py.js.map +1 -0
  442. package/src/sdk/terraform.d.ts +6 -0
  443. package/src/sdk/terraform.js +7 -0
  444. package/src/sdk/terraform.js.map +1 -0
  445. package/src/sdk/ts.d.ts +33 -0
  446. package/src/sdk/ts.js +35 -0
  447. package/src/sdk/ts.js.map +1 -0
  448. package/{sdk → src/sdk}/utils/ast.d.ts +1 -2
  449. package/src/sdk/utils/ast.js +6 -0
  450. package/src/sdk/utils/ast.js.map +1 -0
  451. package/{sdk → src/sdk}/utils/format.d.ts +1 -1
  452. package/src/sdk/utils/format.js +6 -0
  453. package/src/sdk/utils/format.js.map +1 -0
  454. package/{sdk → src/sdk}/utils/test.d.ts +1 -1
  455. package/src/sdk/utils/test.js +6 -0
  456. package/src/sdk/utils/test.js.map +1 -0
  457. package/src/smithy/project/__snapshots__/generator.spec.ts.snap +19 -24
  458. package/src/smithy/project/files/build.Dockerfile.template +1 -4
  459. package/src/smithy/project/files/src/operations/echo.smithy.template +1 -0
  460. package/src/smithy/project/generator.d.ts +3 -3
  461. package/src/smithy/project/generator.js +64 -57
  462. package/src/smithy/project/generator.js.map +1 -1
  463. package/src/smithy/project/schema.d.js +6 -0
  464. package/src/smithy/project/schema.d.js.map +1 -0
  465. package/src/smithy/project/schema.d.ts +1 -0
  466. package/src/smithy/project/schema.json +5 -0
  467. package/src/smithy/react-connection/__snapshots__/generator.spec.ts.snap +1 -1
  468. package/src/smithy/react-connection/generator.d.ts +3 -3
  469. package/src/smithy/react-connection/generator.js +39 -47
  470. package/src/smithy/react-connection/generator.js.map +1 -1
  471. package/src/smithy/react-connection/schema.d.js +6 -0
  472. package/src/smithy/react-connection/schema.d.js.map +1 -0
  473. package/src/smithy/react-connection/schema.d.ts +1 -0
  474. package/src/smithy/react-connection/schema.json +5 -0
  475. package/src/smithy/ts/api/__snapshots__/generator.spec.ts.snap +824 -120
  476. package/src/smithy/ts/api/files/handler.ts.template +2 -2
  477. package/src/smithy/ts/api/files/local-server.ts.template +2 -2
  478. package/src/smithy/ts/api/files/operations/echo.ts.template +2 -2
  479. package/src/smithy/ts/api/files/service.ts.template +3 -3
  480. package/src/smithy/ts/api/generator.d.ts +3 -3
  481. package/src/smithy/ts/api/generator.js +128 -105
  482. package/src/smithy/ts/api/generator.js.map +1 -1
  483. package/src/smithy/ts/api/schema.d.js +6 -0
  484. package/src/smithy/ts/api/schema.d.js.map +1 -0
  485. package/src/smithy/ts/api/schema.d.ts +1 -0
  486. package/src/smithy/ts/api/schema.json +5 -0
  487. package/src/terraform/project/files/application/src/main.tf.template +6 -1
  488. package/src/terraform/project/files/application/src/providers.tf.template +1 -1
  489. package/src/terraform/project/generator.d.ts +3 -3
  490. package/src/terraform/project/generator.js +156 -104
  491. package/src/terraform/project/generator.js.map +1 -1
  492. package/src/terraform/project/schema.d.js +9 -0
  493. package/src/terraform/project/schema.d.js.map +1 -0
  494. package/src/terraform/project/schema.d.ts +1 -0
  495. package/src/terraform/project/schema.json +5 -0
  496. package/src/trpc/backend/__snapshots__/generator.spec.ts.snap +1099 -134
  497. package/src/trpc/backend/files/src/client/index.ts.template +1 -1
  498. package/src/trpc/backend/files/src/handler.ts.template +1 -1
  499. package/src/trpc/backend/files/src/index.ts.template +5 -5
  500. package/src/trpc/backend/files/src/init.ts.template +1 -1
  501. package/src/trpc/backend/files/src/local-server.ts.template +1 -1
  502. package/src/trpc/backend/files/src/middleware/index.ts.template +7 -7
  503. package/src/trpc/backend/files/src/procedures/echo.ts.template +3 -3
  504. package/src/trpc/backend/files/src/router.ts.template +2 -2
  505. package/src/trpc/backend/files/src/schema/echo.ts.template +2 -2
  506. package/src/trpc/backend/files/src/schema/index.ts.template +1 -1
  507. package/src/trpc/backend/generator.d.ts +4 -4
  508. package/src/trpc/backend/generator.js +98 -84
  509. package/src/trpc/backend/generator.js.map +1 -1
  510. package/src/trpc/backend/schema.d.js +6 -0
  511. package/src/trpc/backend/schema.d.js.map +1 -0
  512. package/src/trpc/backend/schema.d.ts +3 -2
  513. package/src/trpc/backend/schema.json +5 -0
  514. package/src/trpc/react/__snapshots__/generator.spec.ts.snap +4 -4
  515. package/src/trpc/react/files/src/components/__apiNameClassName__ClientProvider.tsx.template +3 -3
  516. package/src/trpc/react/generator.d.ts +4 -4
  517. package/src/trpc/react/generator.js +63 -58
  518. package/src/trpc/react/generator.js.map +1 -1
  519. package/src/trpc/react/schema.d.js +6 -0
  520. package/src/trpc/react/schema.d.js.map +1 -0
  521. package/src/trpc/react/schema.d.ts +1 -0
  522. package/src/trpc/react/schema.json +5 -0
  523. package/src/ts/agent/__snapshots__/generator.spec.ts.snap +781 -22
  524. package/src/ts/agent/a2a-connection/__snapshots__/generator.spec.ts.snap +256 -0
  525. package/src/ts/agent/a2a-connection/files/agent-connection/app/__targetAgentKebabCase__-client-strands.ts.template +23 -0
  526. package/src/ts/agent/a2a-connection/generator.d.ts +3 -3
  527. package/src/ts/agent/a2a-connection/generator.js +64 -55
  528. package/src/ts/agent/a2a-connection/generator.js.map +1 -1
  529. package/src/ts/agent/a2a-connection/schema.d.js +8 -0
  530. package/src/ts/agent/a2a-connection/schema.d.js.map +1 -0
  531. package/src/ts/agent/a2a-connection/schema.d.ts +1 -0
  532. package/src/ts/agent/a2a-connection/schema.json +5 -0
  533. package/src/ts/agent/files/a2a/index.ts.template +1 -1
  534. package/src/ts/agent/files/ag-ui/index.ts.template +1 -1
  535. package/src/ts/agent/files/common/agent.ts.template +6 -2
  536. package/src/ts/agent/files/deploy/Dockerfile.template +4 -1
  537. package/src/ts/agent/files/http/client.ts.template +2 -2
  538. package/src/ts/agent/files/http/index.ts.template +2 -2
  539. package/src/ts/agent/files/http/router.ts.template +5 -5
  540. package/src/ts/agent/gateway-connection/__snapshots__/generator.spec.ts.snap +220 -0
  541. package/src/ts/agent/gateway-connection/files/agent-connection/app/__gatewayKebabCase__-client-strands.ts.template +30 -0
  542. package/src/ts/agent/gateway-connection/generator.d.ts +10 -0
  543. package/src/ts/agent/gateway-connection/generator.js +116 -0
  544. package/src/ts/agent/gateway-connection/generator.js.map +1 -0
  545. package/src/ts/agent/gateway-connection/schema.d.js +6 -0
  546. package/src/ts/agent/gateway-connection/schema.d.js.map +1 -0
  547. package/src/ts/agent/gateway-connection/schema.d.ts +13 -0
  548. package/src/ts/agent/gateway-connection/schema.json +31 -0
  549. package/src/ts/agent/generator.d.ts +3 -3
  550. package/src/ts/agent/generator.js +203 -144
  551. package/src/ts/agent/generator.js.map +1 -1
  552. package/src/ts/agent/mcp-connection/__snapshots__/generator.spec.ts.snap +192 -111
  553. package/src/ts/agent/mcp-connection/files/agent-connection/app/__mcpServerKebabCase__-client-strands.ts.template +22 -0
  554. package/src/ts/agent/mcp-connection/generator.d.ts +3 -3
  555. package/src/ts/agent/mcp-connection/generator.js +54 -59
  556. package/src/ts/agent/mcp-connection/generator.js.map +1 -1
  557. package/src/ts/agent/mcp-connection/schema.d.js +8 -0
  558. package/src/ts/agent/mcp-connection/schema.d.js.map +1 -0
  559. package/src/ts/agent/mcp-connection/schema.d.ts +1 -0
  560. package/src/ts/agent/mcp-connection/schema.json +5 -0
  561. package/src/ts/agent/react-connection/generator.d.ts +4 -4
  562. package/src/ts/agent/react-connection/generator.js +86 -80
  563. package/src/ts/agent/react-connection/generator.js.map +1 -1
  564. package/src/ts/agent/react-connection/local-dev.d.ts +13 -0
  565. package/src/ts/agent/react-connection/local-dev.js +17 -0
  566. package/src/ts/agent/react-connection/local-dev.js.map +1 -0
  567. package/src/ts/agent/react-connection/schema.d.js +8 -0
  568. package/src/ts/agent/react-connection/schema.d.js.map +1 -0
  569. package/src/ts/agent/react-connection/schema.d.ts +1 -0
  570. package/src/ts/agent/react-connection/schema.json +5 -0
  571. package/src/ts/agent/schema.d.js +6 -0
  572. package/src/ts/agent/schema.d.js.map +1 -0
  573. package/src/ts/agent/schema.d.ts +1 -0
  574. package/src/ts/agent/schema.json +5 -0
  575. package/src/ts/api/generator.d.ts +3 -3
  576. package/src/ts/api/generator.js +16 -16
  577. package/src/ts/api/generator.js.map +1 -1
  578. package/src/ts/api/schema.d.js +6 -0
  579. package/src/ts/api/schema.d.js.map +1 -0
  580. package/src/ts/api/schema.d.ts +3 -1
  581. package/src/ts/api/schema.json +5 -0
  582. package/src/ts/astro-docs/__snapshots__/generator.spec.ts.snap +15 -16
  583. package/src/ts/astro-docs/files/translation/scripts/translate.ts.template +3 -2
  584. package/src/ts/astro-docs/generator.d.ts +3 -3
  585. package/src/ts/astro-docs/generator.js +71 -54
  586. package/src/ts/astro-docs/generator.js.map +1 -1
  587. package/src/ts/astro-docs/schema.d.js +6 -0
  588. package/src/ts/astro-docs/schema.d.js.map +1 -0
  589. package/src/ts/astro-docs/schema.d.ts +2 -2
  590. package/src/ts/astro-docs/schema.json +3 -3
  591. package/src/ts/docs/generator.d.ts +3 -3
  592. package/src/ts/docs/generator.js +10 -10
  593. package/src/ts/docs/generator.js.map +1 -1
  594. package/src/ts/docs/schema.d.js +6 -0
  595. package/src/ts/docs/schema.d.js.map +1 -0
  596. package/src/ts/docs/schema.d.ts +1 -4
  597. package/src/ts/docs/schema.json +3 -3
  598. package/src/ts/dynamodb/__snapshots__/generator.spec.ts.snap +400 -512
  599. package/src/ts/dynamodb/agent-connection/__snapshots__/generator.spec.ts.snap +5 -5
  600. package/src/ts/dynamodb/agent-connection/generator.d.ts +3 -3
  601. package/src/ts/dynamodb/agent-connection/generator.js +21 -23
  602. package/src/ts/dynamodb/agent-connection/generator.js.map +1 -1
  603. package/src/ts/dynamodb/agent-connection/schema.d.js +8 -0
  604. package/src/ts/dynamodb/agent-connection/schema.d.js.map +1 -0
  605. package/src/ts/dynamodb/agent-connection/schema.d.ts +1 -0
  606. package/src/ts/dynamodb/agent-connection/schema.json +5 -0
  607. package/src/ts/dynamodb/files/config.json.template +24 -0
  608. package/src/ts/dynamodb/files/src/client.ts.template +30 -11
  609. package/src/ts/dynamodb/files/src/entities/example.ts.template +1 -1
  610. package/src/ts/dynamodb/files/src/entities/index.ts.template +1 -1
  611. package/src/ts/dynamodb/files/src/index.ts.template +2 -11
  612. package/src/ts/dynamodb/generator.d.ts +3 -3
  613. package/src/ts/dynamodb/generator.js +73 -63
  614. package/src/ts/dynamodb/generator.js.map +1 -1
  615. package/src/ts/dynamodb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +5 -5
  616. package/src/ts/dynamodb/mcp-server-connection/generator.d.ts +3 -3
  617. package/src/ts/dynamodb/mcp-server-connection/generator.js +21 -23
  618. package/src/ts/dynamodb/mcp-server-connection/generator.js.map +1 -1
  619. package/src/ts/dynamodb/mcp-server-connection/schema.d.js +8 -0
  620. package/src/ts/dynamodb/mcp-server-connection/schema.d.js.map +1 -0
  621. package/src/ts/dynamodb/mcp-server-connection/schema.d.ts +1 -0
  622. package/src/ts/dynamodb/mcp-server-connection/schema.json +5 -0
  623. package/src/ts/dynamodb/schema.d.js +6 -0
  624. package/src/ts/dynamodb/schema.d.js.map +1 -0
  625. package/src/ts/dynamodb/schema.d.ts +2 -0
  626. package/src/ts/dynamodb/schema.json +25 -2
  627. package/src/ts/dynamodb/smithy-connection/__snapshots__/generator.spec.ts.snap +3 -3
  628. package/src/ts/dynamodb/smithy-connection/generator.d.ts +3 -3
  629. package/src/ts/dynamodb/smithy-connection/generator.js +20 -22
  630. package/src/ts/dynamodb/smithy-connection/generator.js.map +1 -1
  631. package/src/ts/dynamodb/smithy-connection/schema.d.js +8 -0
  632. package/src/ts/dynamodb/smithy-connection/schema.d.js.map +1 -0
  633. package/src/ts/dynamodb/smithy-connection/schema.d.ts +1 -0
  634. package/src/ts/dynamodb/smithy-connection/schema.json +5 -0
  635. package/src/ts/dynamodb/trpc-connection/__snapshots__/generator.spec.ts.snap +3 -3
  636. package/src/ts/dynamodb/trpc-connection/generator.d.ts +3 -3
  637. package/src/ts/dynamodb/trpc-connection/generator.js +20 -22
  638. package/src/ts/dynamodb/trpc-connection/generator.js.map +1 -1
  639. package/src/ts/dynamodb/trpc-connection/schema.d.js +8 -0
  640. package/src/ts/dynamodb/trpc-connection/schema.d.js.map +1 -0
  641. package/src/ts/dynamodb/trpc-connection/schema.d.ts +1 -0
  642. package/src/ts/dynamodb/trpc-connection/schema.json +5 -0
  643. package/src/ts/lambda-function/__snapshots__/generator.spec.ts.snap +4 -4
  644. package/src/ts/lambda-function/generator.d.ts +3 -3
  645. package/src/ts/lambda-function/generator.js +59 -56
  646. package/src/ts/lambda-function/generator.js.map +1 -1
  647. package/src/ts/lambda-function/io.js +83 -52
  648. package/src/ts/lambda-function/io.js.map +1 -1
  649. package/src/ts/lambda-function/schema.d.js +6 -0
  650. package/src/ts/lambda-function/schema.d.js.map +1 -0
  651. package/src/ts/lambda-function/schema.d.ts +1 -0
  652. package/src/ts/lambda-function/schema.json +5 -0
  653. package/src/ts/lib/__snapshots__/generator.spec.ts.snap +98 -93
  654. package/src/ts/lib/__snapshots__/vitest.spec.ts.snap +24 -0
  655. package/src/ts/lib/biome.d.ts +7 -0
  656. package/src/ts/lib/biome.js +91 -0
  657. package/src/ts/lib/biome.js.map +1 -0
  658. package/src/ts/lib/generator.d.ts +3 -3
  659. package/src/ts/lib/generator.js +107 -108
  660. package/src/ts/lib/generator.js.map +1 -1
  661. package/src/ts/lib/grit/vitest-pass-with-no-tests.grit +1 -4
  662. package/src/ts/lib/schema.d.js +6 -0
  663. package/src/ts/lib/schema.d.js.map +1 -0
  664. package/src/ts/lib/schema.d.ts +1 -1
  665. package/src/ts/lib/schema.json +5 -0
  666. package/src/ts/lib/ts-project-utils.d.ts +12 -2
  667. package/src/ts/lib/ts-project-utils.js +90 -67
  668. package/src/ts/lib/ts-project-utils.js.map +1 -1
  669. package/src/ts/lib/types.d.ts +6 -0
  670. package/src/ts/lib/types.js +5 -2
  671. package/src/ts/lib/types.js.map +1 -1
  672. package/src/ts/lib/vitest.d.ts +2 -2
  673. package/src/ts/lib/vitest.js +29 -26
  674. package/src/ts/lib/vitest.js.map +1 -1
  675. package/src/ts/mcp-server/__snapshots__/generator.spec.ts.snap +208 -42
  676. package/src/ts/mcp-server/files/Dockerfile.template +4 -1
  677. package/src/ts/mcp-server/generator.d.ts +3 -3
  678. package/src/ts/mcp-server/generator.js +181 -136
  679. package/src/ts/mcp-server/generator.js.map +1 -1
  680. package/src/ts/mcp-server/schema.d.js +6 -0
  681. package/src/ts/mcp-server/schema.d.js.map +1 -0
  682. package/src/ts/mcp-server/schema.d.ts +1 -0
  683. package/src/ts/mcp-server/schema.json +5 -0
  684. package/src/ts/nx-generator/__snapshots__/generator.spec.ts.snap +46 -26
  685. package/src/ts/nx-generator/files/common/schema.d.ts.template +1 -0
  686. package/src/ts/nx-generator/files/common/schema.json.template +5 -0
  687. package/src/ts/nx-generator/files/local/generator.ts.template +3 -3
  688. package/src/ts/nx-generator/files/nx-plugin-for-aws/generator/generator.ts.template +6 -7
  689. package/src/ts/nx-generator/generator.d.ts +2 -2
  690. package/src/ts/nx-generator/generator.js +113 -73
  691. package/src/ts/nx-generator/generator.js.map +1 -1
  692. package/src/ts/nx-generator/schema.d.js +6 -0
  693. package/src/ts/nx-generator/schema.d.js.map +1 -0
  694. package/src/ts/nx-generator/schema.d.ts +1 -0
  695. package/src/ts/nx-generator/schema.json +5 -0
  696. package/src/ts/nx-plugin/__snapshots__/generator.spec.ts.snap +30 -18
  697. package/src/ts/nx-plugin/files/mcp-server/server.ts.template +5 -5
  698. package/src/ts/nx-plugin/files/mcp-server/tools/create-workspace-command.ts.template +2 -2
  699. package/src/ts/nx-plugin/files/mcp-server/tools/general-guidance.ts.template +1 -1
  700. package/src/ts/nx-plugin/files/mcp-server/tools/generator-guide.ts.template +2 -2
  701. package/src/ts/nx-plugin/files/mcp-server/tools/list-generators.ts.template +2 -2
  702. package/src/ts/nx-plugin/files/mcp-server/utils.ts.template +3 -3
  703. package/src/ts/nx-plugin/generator.d.ts +3 -3
  704. package/src/ts/nx-plugin/generator.js +61 -50
  705. package/src/ts/nx-plugin/generator.js.map +1 -1
  706. package/src/ts/nx-plugin/schema.d.js +9 -0
  707. package/src/ts/nx-plugin/schema.d.js.map +1 -0
  708. package/src/ts/nx-plugin/schema.json +5 -0
  709. package/src/ts/nx-plugin/utils.d.ts +1 -1
  710. package/src/ts/nx-plugin/utils.js +36 -39
  711. package/src/ts/nx-plugin/utils.js.map +1 -1
  712. package/src/ts/rdb/__snapshots__/generator.spec.ts.snap +455 -646
  713. package/src/ts/rdb/agent-connection/__snapshots__/generator.spec.ts.snap +6 -6
  714. package/src/ts/rdb/agent-connection/generator.d.ts +3 -3
  715. package/src/ts/rdb/agent-connection/generator.js +38 -39
  716. package/src/ts/rdb/agent-connection/generator.js.map +1 -1
  717. package/src/ts/rdb/agent-connection/schema.d.js +8 -0
  718. package/src/ts/rdb/agent-connection/schema.d.js.map +1 -0
  719. package/src/ts/rdb/agent-connection/schema.d.ts +1 -0
  720. package/src/ts/rdb/agent-connection/schema.json +5 -0
  721. package/src/ts/rdb/files/Dockerfile.template +8 -1
  722. package/src/ts/rdb/files/config.json.template +14 -0
  723. package/src/ts/rdb/files/prisma.config.ts.template +6 -5
  724. package/src/ts/rdb/files/src/create-db-user-handler.ts.template +9 -11
  725. package/src/ts/rdb/files/src/index.ts.template +1 -2
  726. package/src/ts/rdb/files/src/migration-handler.ts.template +2 -29
  727. package/src/ts/rdb/files/src/prisma.ts.template +33 -25
  728. package/src/ts/rdb/files/src/utils.ts.template +3 -0
  729. package/src/ts/rdb/generator.d.ts +3 -7
  730. package/src/ts/rdb/generator.js +173 -131
  731. package/src/ts/rdb/generator.js.map +1 -1
  732. package/src/ts/rdb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +6 -6
  733. package/src/ts/rdb/mcp-server-connection/generator.d.ts +3 -3
  734. package/src/ts/rdb/mcp-server-connection/generator.js +36 -37
  735. package/src/ts/rdb/mcp-server-connection/generator.js.map +1 -1
  736. package/src/ts/rdb/mcp-server-connection/schema.d.js +8 -0
  737. package/src/ts/rdb/mcp-server-connection/schema.d.js.map +1 -0
  738. package/src/ts/rdb/mcp-server-connection/schema.d.ts +1 -0
  739. package/src/ts/rdb/mcp-server-connection/schema.json +5 -0
  740. package/src/ts/rdb/schema.d.js +6 -0
  741. package/src/ts/rdb/schema.d.js.map +1 -0
  742. package/src/ts/rdb/schema.d.ts +1 -0
  743. package/src/ts/rdb/schema.json +6 -1
  744. package/src/ts/rdb/smithy-connection/__snapshots__/generator.spec.ts.snap +3 -3
  745. package/src/ts/rdb/smithy-connection/generator.d.ts +3 -3
  746. package/src/ts/rdb/smithy-connection/generator.js +46 -43
  747. package/src/ts/rdb/smithy-connection/generator.js.map +1 -1
  748. package/src/ts/rdb/smithy-connection/schema.d.js +8 -0
  749. package/src/ts/rdb/smithy-connection/schema.d.js.map +1 -0
  750. package/src/ts/rdb/smithy-connection/schema.d.ts +1 -0
  751. package/src/ts/rdb/smithy-connection/schema.json +5 -0
  752. package/src/ts/rdb/trpc-connection/__snapshots__/generator.spec.ts.snap +3 -3
  753. package/src/ts/rdb/trpc-connection/generator.d.ts +3 -3
  754. package/src/ts/rdb/trpc-connection/generator.js +36 -31
  755. package/src/ts/rdb/trpc-connection/generator.js.map +1 -1
  756. package/src/ts/rdb/trpc-connection/schema.d.js +8 -0
  757. package/src/ts/rdb/trpc-connection/schema.d.js.map +1 -0
  758. package/src/ts/rdb/trpc-connection/schema.d.ts +1 -0
  759. package/src/ts/rdb/trpc-connection/schema.json +5 -0
  760. package/src/ts/rdb/utils.d.ts +1 -1
  761. package/src/ts/rdb/utils.js +9 -11
  762. package/src/ts/rdb/utils.js.map +1 -1
  763. package/src/ts/react-website/agui/files/common/src/hooks/useAgui__agentNameClassName__.tsx.template +1 -16
  764. package/src/ts/react-website/agui/generator.d.ts +1 -1
  765. package/src/ts/react-website/agui/generator.js +69 -62
  766. package/src/ts/react-website/agui/generator.js.map +1 -1
  767. package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +1190 -799
  768. package/src/ts/react-website/app/generator.d.ts +4 -4
  769. package/src/ts/react-website/app/generator.js +217 -192
  770. package/src/ts/react-website/app/generator.js.map +1 -1
  771. package/src/ts/react-website/app/schema.d.js +6 -0
  772. package/src/ts/react-website/app/schema.d.js.map +1 -0
  773. package/src/ts/react-website/app/schema.d.ts +1 -1
  774. package/src/ts/react-website/app/schema.json +11 -6
  775. package/src/ts/react-website/cognito-auth/__snapshots__/generator.spec.ts.snap +129 -18
  776. package/src/ts/react-website/cognito-auth/__snapshots__/generator.terraform.spec.ts.snap +36 -10
  777. package/src/ts/react-website/cognito-auth/__snapshots__/generator.ux-provider.spec.ts.snap +0 -20
  778. package/src/ts/react-website/cognito-auth/files/app/components/CognitoAuth/index.tsx.template +2 -2
  779. package/src/ts/react-website/cognito-auth/generator.d.ts +4 -4
  780. package/src/ts/react-website/cognito-auth/generator.js +64 -63
  781. package/src/ts/react-website/cognito-auth/generator.js.map +1 -1
  782. package/src/ts/react-website/cognito-auth/grit/cloudscape-auth-menu.grit +8 -6
  783. package/src/ts/react-website/cognito-auth/grit/cognito-auth-wrapper.grit +1 -1
  784. package/src/ts/react-website/cognito-auth/grit/none-auth-menu.grit +1 -0
  785. package/src/ts/react-website/cognito-auth/grit/shadcn-auth-menu.grit +3 -1
  786. package/src/ts/react-website/cognito-auth/grit/shadcn-state-declarations.grit +3 -1
  787. package/src/ts/react-website/cognito-auth/schema.d.js +6 -0
  788. package/src/ts/react-website/cognito-auth/schema.d.js.map +1 -0
  789. package/src/ts/react-website/cognito-auth/schema.d.ts +1 -0
  790. package/src/ts/react-website/cognito-auth/schema.json +5 -0
  791. package/src/ts/react-website/cognito-auth/utils.d.ts +1 -1
  792. package/src/ts/react-website/cognito-auth/utils.js +34 -32
  793. package/src/ts/react-website/cognito-auth/utils.js.map +1 -1
  794. package/src/ts/react-website/runtime-config/__snapshots__/generator.spec.ts.snap +2 -2
  795. package/src/ts/react-website/runtime-config/files/app/components/RuntimeConfig/index.tsx.template +2 -2
  796. package/src/ts/react-website/runtime-config/generator.d.ts +3 -3
  797. package/src/ts/react-website/runtime-config/generator.js +29 -31
  798. package/src/ts/react-website/runtime-config/generator.js.map +1 -1
  799. package/src/ts/react-website/runtime-config/schema.d.js +6 -0
  800. package/src/ts/react-website/runtime-config/schema.d.js.map +1 -0
  801. package/src/ts/react-website/runtime-config/schema.d.ts +1 -0
  802. package/src/ts/react-website/runtime-config/schema.json +5 -0
  803. package/src/ts/sync/generator.d.ts +3 -3
  804. package/src/ts/sync/generator.js +58 -59
  805. package/src/ts/sync/generator.js.map +1 -1
  806. package/src/ts/website/app/generator.d.ts +3 -3
  807. package/src/ts/website/app/generator.js +10 -10
  808. package/src/ts/website/app/generator.js.map +1 -1
  809. package/src/ts/website/app/schema.d.js +6 -0
  810. package/src/ts/website/app/schema.d.js.map +1 -0
  811. package/src/ts/website/app/schema.d.ts +1 -1
  812. package/src/ts/website/app/schema.json +11 -6
  813. package/src/ts/website/auth/generator.d.ts +4 -4
  814. package/src/ts/website/auth/generator.js +11 -10
  815. package/src/ts/website/auth/generator.js.map +1 -1
  816. package/src/ts/website/auth/schema.d.js +6 -0
  817. package/src/ts/website/auth/schema.d.js.map +1 -0
  818. package/src/ts/website/auth/schema.d.ts +1 -0
  819. package/src/ts/website/auth/schema.json +5 -0
  820. package/src/utils/agent-chat/agent-chat.d.ts +31 -0
  821. package/src/utils/agent-chat/agent-chat.js +31 -0
  822. package/src/utils/agent-chat/agent-chat.js.map +1 -0
  823. package/src/utils/agent-chat/files/a2a/chat.ts.template +33 -0
  824. package/src/utils/agent-chat/files/ag-ui/chat.ts.template +17 -0
  825. package/src/utils/agent-chat/files/common/agentcore.ts.template +81 -0
  826. package/src/utils/agent-chat/files/http-py/chat.ts.template +43 -0
  827. package/src/utils/agent-chat/files/http-ts/chat.ts.template +54 -0
  828. package/src/utils/agent-connection/agent-connection.d.ts +117 -25
  829. package/src/utils/agent-connection/agent-connection.js +414 -103
  830. package/src/utils/agent-connection/agent-connection.js.map +1 -1
  831. package/src/utils/agent-connection/files/core-a2a/agentcore-a2a-client-config.ts.template +93 -0
  832. package/src/utils/agent-connection/files/core-auth/agentcore-endpoints.ts.template +37 -0
  833. package/src/utils/agent-connection/files/core-auth/agentcore-fetch.ts.template +54 -0
  834. package/src/utils/agent-connection/files/core-gateway/agentcore-gateway-mcp-transport.ts.template +41 -0
  835. package/src/utils/agent-connection/files/core-mcp/agentcore-mcp-transport.ts.template +70 -0
  836. package/src/utils/agent-connection/files/core-runtime-config/runtime-config.ts.template +22 -32
  837. package/src/utils/agent-connection/files/core-shared/agentcore-transport.ts.template +39 -0
  838. package/src/utils/agent-connection/files/core-strands/a2a/agentcore-a2a-client-strands.ts.template +61 -0
  839. package/src/utils/agent-connection/files/core-strands/base/model-errors-strands.ts.template +36 -0
  840. package/src/utils/agent-connection/files/{core-runtime-config/with-session-id.ts.template → core-strands/base/with-session-id-strands.ts.template} +1 -1
  841. package/src/utils/agent-connection/files/core-strands/gateway/agentcore-gateway-mcp-client-strands.ts.template +26 -0
  842. package/src/utils/agent-connection/files/core-strands/mcp/agentcore-mcp-client-strands.ts.template +27 -0
  843. package/src/utils/agent-connection/files/py-core-a2a/agentcore_a2a_client_config.py.template +43 -0
  844. package/src/utils/agent-connection/files/py-core-auth/agentcore_endpoints.py.template +47 -0
  845. package/src/utils/agent-connection/files/py-core-auth/auth/session.py.template +51 -0
  846. package/src/utils/agent-connection/files/py-core-gateway/agentcore_gateway_mcp_transport.py.template +28 -0
  847. package/src/utils/agent-connection/files/py-core-langchain/a2a/agentcore_a2a_client_langchain.py.template +99 -0
  848. package/src/utils/agent-connection/files/py-core-langchain/gateway/agentcore_gateway_mcp_client_langchain.py.template +57 -0
  849. package/src/utils/agent-connection/files/py-core-langchain/mcp/agentcore_mcp_client_langchain.py.template +64 -0
  850. package/src/utils/agent-connection/files/py-core-mcp/agentcore_mcp_transport.py.template +34 -0
  851. package/src/utils/agent-connection/files/py-core-runtime-config/runtime_config.py.template +5 -18
  852. package/src/utils/agent-connection/files/py-core-shared/agentcore_transport.py.template +40 -0
  853. package/src/utils/agent-connection/files/py-core-strands/a2a/agentcore_a2a_client_strands.py.template +66 -0
  854. package/src/utils/agent-connection/files/py-core-strands/base/model_errors_strands.py.template +40 -0
  855. package/src/utils/agent-connection/files/py-core-strands/gateway/agentcore_gateway_mcp_client_strands.py.template +22 -0
  856. package/src/utils/agent-connection/files/py-core-strands/mcp/agentcore_mcp_client_strands.py.template +30 -0
  857. package/src/utils/agent-core-constructs/agent-core-constructs.d.ts +11 -3
  858. package/src/utils/agent-core-constructs/agent-core-constructs.js +93 -38
  859. package/src/utils/agent-core-constructs/agent-core-constructs.js.map +1 -1
  860. package/src/utils/agent-core-constructs/files/cdk/app/agent-core/__nameKebabCase__/__nameKebabCase__.ts.template +31 -4
  861. package/src/utils/agent-core-constructs/files/cdk/app/agentcore-gateway/__nameKebabCase__/__nameKebabCase__.ts.template +50 -0
  862. package/src/utils/agent-core-constructs/files/cdk/core/agentcore-gateway/agentcore-gateway.ts.template +487 -0
  863. package/src/utils/agent-core-constructs/files/cdk/core/agentcore-gateway/readiness-probe/index.js.template +55 -0
  864. package/src/utils/agent-core-constructs/files/terraform/app/agent-core/__nameKebabCase__/__nameKebabCase__.tf.template +32 -0
  865. package/src/utils/agent-core-constructs/files/terraform/app/agentcore-gateway/__nameKebabCase__/__nameKebabCase__.tf.template +449 -0
  866. package/src/utils/agent-core-constructs/files/terraform/app/agentcore-gateway/__nameKebabCase__/render-cedar.cjs.template +13 -0
  867. package/src/utils/agent-core-constructs/files/terraform/core/agent-core/runtime.tf.template +151 -13
  868. package/src/utils/agent-core-constructs/files/terraform/core/agentcore-gateway/gateway.tf.template +14 -0
  869. package/src/utils/api-constructs/api-constructs.d.ts +2 -2
  870. package/src/utils/api-constructs/api-constructs.js +36 -31
  871. package/src/utils/api-constructs/api-constructs.js.map +1 -1
  872. package/src/utils/api-constructs/files/cdk/app/apis/http/__apiNameKebabCase__.ts.template +8 -8
  873. package/src/utils/api-constructs/files/cdk/app/apis/rest/__apiNameKebabCase__.ts.template +11 -8
  874. package/src/utils/api-constructs/files/cdk/core/api/http/http-api.ts.template +26 -9
  875. package/src/utils/api-constructs/files/cdk/core/api/rest/api-gateway-account/index.js.template +70 -0
  876. package/src/utils/api-constructs/files/cdk/core/api/rest/api-gateway-account.ts.template +82 -0
  877. package/src/utils/api-constructs/files/cdk/core/api/rest/rest-api.ts.template +54 -18
  878. package/src/utils/api-constructs/files/cdk/core/api/trpc/trpc-utils.ts.template +1 -1
  879. package/src/utils/api-constructs/files/cdk/core/api/utils/utils.ts.template +61 -7
  880. package/src/utils/api-constructs/files/terraform/app/apis/http/__apiNameKebabCase__/__apiNameKebabCase__.tf.template +101 -12
  881. package/src/utils/api-constructs/files/terraform/app/apis/rest/__apiNameKebabCase__/__apiNameKebabCase__.tf.template +194 -8
  882. package/src/utils/api-constructs/files/terraform/core/api/http/http-api/http-api.tf.template +1 -1
  883. package/src/utils/api-constructs/files/terraform/core/api/rest/api-gateway-account/api-gateway-account.tf.template +83 -0
  884. package/src/utils/api-constructs/files/terraform/core/api/rest/rest-api/rest-api.tf.template +5 -11
  885. package/src/utils/api-constructs/open-api-metadata.d.ts +2 -2
  886. package/src/utils/api-constructs/open-api-metadata.js +22 -22
  887. package/src/utils/api-constructs/open-api-metadata.js.map +1 -1
  888. package/src/utils/ast/website.d.ts +5 -1
  889. package/src/utils/ast/website.js +18 -20
  890. package/src/utils/ast/website.js.map +1 -1
  891. package/src/utils/ast.d.ts +33 -1
  892. package/src/utils/ast.js +146 -70
  893. package/src/utils/ast.js.map +1 -1
  894. package/src/utils/base-tsconfig.d.ts +30 -0
  895. package/src/utils/base-tsconfig.js +32 -0
  896. package/src/utils/base-tsconfig.js.map +1 -0
  897. package/src/utils/bundle/bundle.d.ts +1 -1
  898. package/src/utils/bundle/bundle.js +50 -47
  899. package/src/utils/bundle/bundle.js.map +1 -1
  900. package/src/utils/commands.d.ts +10 -3
  901. package/src/utils/commands.js +60 -26
  902. package/src/utils/commands.js.map +1 -1
  903. package/src/utils/config/index.d.ts +5 -5
  904. package/src/utils/config/index.js +5 -4
  905. package/src/utils/config/index.js.map +1 -1
  906. package/src/utils/config/utils.d.ts +13 -3
  907. package/src/utils/config/utils.js +65 -43
  908. package/src/utils/config/utils.js.map +1 -1
  909. package/src/utils/connection/open-api/files/components/__apiNameClassName__Provider.tsx.template +1 -1
  910. package/src/utils/connection/open-api/react.d.ts +6 -6
  911. package/src/utils/connection/open-api/react.js +81 -77
  912. package/src/utils/connection/open-api/react.js.map +1 -1
  913. package/src/utils/containers.d.ts +1 -1
  914. package/src/utils/containers.js +22 -23
  915. package/src/utils/containers.js.map +1 -1
  916. package/src/utils/docker.d.ts +44 -0
  917. package/src/utils/docker.js +81 -0
  918. package/src/utils/docker.js.map +1 -0
  919. package/src/utils/dynamodb-constructs/dynamodb-constructs.d.ts +3 -3
  920. package/src/utils/dynamodb-constructs/dynamodb-constructs.js +39 -41
  921. package/src/utils/dynamodb-constructs/dynamodb-constructs.js.map +1 -1
  922. package/src/utils/dynamodb-constructs/files/cdk/app/dynamodb/__nameKebabCase__.ts.template +18 -5
  923. package/src/utils/dynamodb-constructs/files/cdk/core/dynamodb.ts.template +1 -1
  924. package/src/utils/dynamodb-constructs/files/terraform/app/dynamodb/__nameKebabCase__/__nameKebabCase__.tf.template +24 -17
  925. package/src/utils/dynamodb-constructs/files/terraform/core/dynamodb/dynamodb.tf.template +1 -1
  926. package/src/utils/files/common/constructs/src/core/index.ts.template +4 -4
  927. package/src/utils/files/common/constructs/src/index.ts.template +2 -2
  928. package/src/utils/files/common/infra-config/src/index.ts.template +3 -3
  929. package/src/utils/files/common/infra-config/src/resolve-stage.ts.template +2 -2
  930. package/src/utils/files/common/infra-config/src/stages.config.ts.template +1 -1
  931. package/src/{ts/dynamodb/files/scripts → utils/files/common/scripts/src/dynamodb}/create-local-table.ts.template +65 -31
  932. package/src/utils/files/common/scripts/src/dynamodb/pull-image.ts.template +13 -0
  933. package/src/utils/files/common/scripts/src/dynamodb/start-container.ts.template +106 -0
  934. package/src/utils/files/common/scripts/src/infra/infra-deploy.ts.template +2 -0
  935. package/src/utils/files/common/scripts/src/infra/infra-destroy.ts.template +2 -0
  936. package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/cdk-command.ts.template +6 -3
  937. package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/run.ts.template +3 -3
  938. package/src/utils/files/common/scripts/src/rdb/mysql/wait-for-mysql-db.ts.template +32 -0
  939. package/src/utils/files/common/scripts/src/rdb/postgres/wait-for-postgres-db.ts.template +32 -0
  940. package/src/utils/files/common/scripts/src/rdb/shared/pull-image.ts.template +16 -0
  941. package/src/utils/files/common/scripts/src/rdb/shared/start-container.ts.template +117 -0
  942. package/src/utils/files/common/shadcn/src/index.ts.template +2 -2
  943. package/src/utils/files/terraform/src/core/asset-bucket/asset-bucket.tf.template +63 -72
  944. package/src/utils/files/terraform/src/core/runtime-config/appconfig/appconfig.tf.template +1 -1
  945. package/src/utils/files/terraform/src/core/runtime-config/appconfig-deployment/appconfig-deployment.tf.template +12 -6
  946. package/src/utils/files/terraform/src/core/runtime-config/entry/entry.tf.template +1 -1
  947. package/src/utils/files/terraform/src/core/runtime-config/read/read.tf.template +9 -4
  948. package/src/utils/files/website/hooks/sigv4/useSigV4.tsx.template +1 -1
  949. package/src/utils/format.d.ts +45 -2
  950. package/src/utils/format.js +332 -81
  951. package/src/utils/format.js.map +1 -1
  952. package/src/utils/fs.d.ts +1 -1
  953. package/src/utils/fs.js +14 -13
  954. package/src/utils/fs.js.map +1 -1
  955. package/src/utils/function-constructs/files/cdk/app/lambda-functions/__nameKebabCase__.ts.template +1 -1
  956. package/src/utils/function-constructs/files/terraform/app/lambda-functions/__nameKebabCase__/__nameKebabCase__.tf.template +2 -2
  957. package/src/utils/function-constructs/function-constructs.d.ts +2 -2
  958. package/src/utils/function-constructs/function-constructs.js +22 -25
  959. package/src/utils/function-constructs/function-constructs.js.map +1 -1
  960. package/src/utils/generators.d.ts +4 -0
  961. package/src/utils/generators.js +18 -20
  962. package/src/utils/generators.js.map +1 -1
  963. package/src/utils/git.d.ts +1 -1
  964. package/src/utils/git.js +19 -34
  965. package/src/utils/git.js.map +1 -1
  966. package/src/utils/iac-providers.js +5 -5
  967. package/src/utils/iac-providers.js.map +1 -1
  968. package/src/utils/iac.d.ts +1 -1
  969. package/src/utils/iac.js +12 -14
  970. package/src/utils/iac.js.map +1 -1
  971. package/src/utils/identity-constructs/files/cdk/core/user-identity.ts.template +125 -16
  972. package/src/utils/identity-constructs/files/terraform/core/user-identity/add-callback-url/add-callback-url.tf.template +28 -9
  973. package/src/utils/identity-constructs/files/terraform/core/user-identity/identity/identity.tf.template +106 -6
  974. package/src/utils/identity-constructs/files/terraform/core/user-identity/main.tf.template +7 -0
  975. package/src/utils/identity-constructs/identity-constructs.d.ts +2 -2
  976. package/src/utils/identity-constructs/identity-constructs.js +28 -28
  977. package/src/utils/identity-constructs/identity-constructs.js.map +1 -1
  978. package/src/utils/init.d.ts +53 -0
  979. package/src/utils/init.js +252 -0
  980. package/src/utils/init.js.map +1 -0
  981. package/src/utils/install.d.ts +32 -0
  982. package/src/utils/install.js +56 -0
  983. package/src/utils/install.js.map +1 -0
  984. package/src/utils/js.d.ts +4 -0
  985. package/src/utils/js.js +27 -20
  986. package/src/utils/js.js.map +1 -1
  987. package/src/utils/mcp.d.ts +1 -1
  988. package/src/utils/mcp.js +34 -41
  989. package/src/utils/mcp.js.map +1 -1
  990. package/src/utils/metrics.d.ts +9 -3
  991. package/src/utils/metrics.js +61 -46
  992. package/src/utils/metrics.js.map +1 -1
  993. package/src/utils/mock-project-graph.js +8 -12
  994. package/src/utils/mock-project-graph.js.map +1 -1
  995. package/src/utils/module-format.d.ts +28 -0
  996. package/src/utils/module-format.js +28 -0
  997. package/src/utils/module-format.js.map +1 -0
  998. package/src/utils/names.d.ts +22 -0
  999. package/src/utils/names.js +44 -48
  1000. package/src/utils/names.js.map +1 -1
  1001. package/src/utils/npm-scope.d.ts +1 -1
  1002. package/src/utils/npm-scope.js +9 -17
  1003. package/src/utils/npm-scope.js.map +1 -1
  1004. package/src/utils/nx.d.ts +39 -4
  1005. package/src/utils/nx.js +169 -75
  1006. package/src/utils/nx.js.map +1 -1
  1007. package/src/utils/nxlv-python.d.ts +1 -1
  1008. package/src/utils/nxlv-python.js +27 -15
  1009. package/src/utils/nxlv-python.js.map +1 -1
  1010. package/src/utils/object.js +5 -11
  1011. package/src/utils/object.js.map +1 -1
  1012. package/src/utils/paths.d.ts +1 -1
  1013. package/src/utils/paths.js +11 -15
  1014. package/src/utils/paths.js.map +1 -1
  1015. package/src/utils/pkg-manager.js +4 -9
  1016. package/src/utils/pkg-manager.js.map +1 -1
  1017. package/src/utils/pnpm-workspace.d.ts +1 -1
  1018. package/src/utils/pnpm-workspace.js +22 -22
  1019. package/src/utils/pnpm-workspace.js.map +1 -1
  1020. package/src/utils/port.d.ts +29 -7
  1021. package/src/utils/port.js +67 -28
  1022. package/src/utils/port.js.map +1 -1
  1023. package/src/utils/py.d.ts +16 -3
  1024. package/src/utils/py.js +72 -47
  1025. package/src/utils/py.js.map +1 -1
  1026. package/src/utils/rdb-constructs/files/cdk/app/dbs/__nameKebabCase__.ts.template +72 -18
  1027. package/src/utils/rdb-constructs/files/cdk/core/rdb/aurora.ts.template +97 -88
  1028. package/src/utils/rdb-constructs/files/terraform/app/dbs/__nameKebabCase__/__nameKebabCase__.tf.template +127 -53
  1029. package/src/utils/rdb-constructs/files/terraform/core/rdb/aurora/aurora.tf.template +36 -48
  1030. package/src/utils/rdb-constructs/rdb-constructs.d.ts +16 -5
  1031. package/src/utils/rdb-constructs/rdb-constructs.js +38 -41
  1032. package/src/utils/rdb-constructs/rdb-constructs.js.map +1 -1
  1033. package/src/utils/shared-constructs-constants.d.ts +1 -0
  1034. package/src/utils/shared-constructs-constants.js +16 -15
  1035. package/src/utils/shared-constructs-constants.js.map +1 -1
  1036. package/src/utils/shared-constructs.d.ts +2 -2
  1037. package/src/utils/shared-constructs.js +60 -67
  1038. package/src/utils/shared-constructs.js.map +1 -1
  1039. package/src/utils/shared-dynamodb-scripts.d.ts +11 -0
  1040. package/src/utils/shared-dynamodb-scripts.js +25 -0
  1041. package/src/utils/shared-dynamodb-scripts.js.map +1 -0
  1042. package/src/utils/shared-infra-config.d.ts +1 -1
  1043. package/src/utils/shared-infra-config.js +31 -30
  1044. package/src/utils/shared-infra-config.js.map +1 -1
  1045. package/src/utils/shared-infra-scripts.d.ts +11 -0
  1046. package/src/utils/shared-infra-scripts.js +42 -0
  1047. package/src/utils/shared-infra-scripts.js.map +1 -0
  1048. package/src/utils/shared-rdb-scripts.d.ts +16 -0
  1049. package/src/utils/shared-rdb-scripts.js +32 -0
  1050. package/src/utils/shared-rdb-scripts.js.map +1 -0
  1051. package/src/utils/shared-scripts.d.ts +2 -5
  1052. package/src/utils/shared-scripts.js +12 -38
  1053. package/src/utils/shared-scripts.js.map +1 -1
  1054. package/src/utils/shared-shadcn.d.ts +1 -1
  1055. package/src/utils/shared-shadcn.js +65 -71
  1056. package/src/utils/shared-shadcn.js.map +1 -1
  1057. package/src/utils/test.d.ts +15 -1
  1058. package/src/utils/test.js +41 -23
  1059. package/src/utils/test.js.map +1 -1
  1060. package/src/utils/toml.d.ts +1 -1
  1061. package/src/utils/toml.js +10 -14
  1062. package/src/utils/toml.js.map +1 -1
  1063. package/src/utils/versions.d.ts +150 -97
  1064. package/src/utils/versions.js +157 -115
  1065. package/src/utils/versions.js.map +1 -1
  1066. package/src/utils/warm-ruff-cache.d.ts +12 -0
  1067. package/src/utils/warm-ruff-cache.js +39 -0
  1068. package/src/utils/warm-ruff-cache.js.map +1 -0
  1069. package/src/utils/website-constructs/files/cdk/app/static-websites/__websiteNameKebabCase__.ts.template +2 -2
  1070. package/src/utils/website-constructs/files/cdk/core/static-website.ts.template +200 -41
  1071. package/src/utils/website-constructs/files/terraform/app/static-websites/__websiteNameKebabCase__/__websiteNameKebabCase__.tf.template +1 -1
  1072. package/src/utils/website-constructs/files/terraform/core/static-website/static-website.tf.template +145 -93
  1073. package/src/utils/website-constructs/website-constructs.d.ts +2 -2
  1074. package/src/utils/website-constructs/website-constructs.js +38 -30
  1075. package/src/utils/website-constructs/website-constructs.js.map +1 -1
  1076. package/bin/aws-nx-mcp.js +0 -17
  1077. package/bin/aws-nx-mcp.js.map +0 -1
  1078. package/sdk/connection.d.ts +0 -6
  1079. package/sdk/connection.js +0 -10
  1080. package/sdk/connection.js.map +0 -1
  1081. package/sdk/open-api.d.ts +0 -10
  1082. package/sdk/open-api.js +0 -15
  1083. package/sdk/open-api.js.map +0 -1
  1084. package/sdk/py.d.ts +0 -14
  1085. package/sdk/py.js +0 -18
  1086. package/sdk/py.js.map +0 -1
  1087. package/sdk/terraform.d.ts +0 -6
  1088. package/sdk/terraform.js +0 -11
  1089. package/sdk/terraform.js.map +0 -1
  1090. package/sdk/ts.d.ts +0 -29
  1091. package/sdk/ts.js +0 -47
  1092. package/sdk/ts.js.map +0 -1
  1093. package/sdk/utils/ast.js +0 -12
  1094. package/sdk/utils/ast.js.map +0 -1
  1095. package/sdk/utils/format.js +0 -10
  1096. package/sdk/utils/format.js.map +0 -1
  1097. package/sdk/utils/test.js +0 -10
  1098. package/sdk/utils/test.js.map +0 -1
  1099. package/src/connection/agent-serve-local.js +0 -48
  1100. package/src/connection/agent-serve-local.js.map +0 -1
  1101. package/src/connection/serve-local.d.ts +0 -15
  1102. package/src/connection/serve-local.js +0 -41
  1103. package/src/connection/serve-local.js.map +0 -1
  1104. package/src/py/agent/a2a-connection/files/agent-connection/app/__targetAgentSnakeCase___client.py.template +0 -22
  1105. package/src/py/agent/mcp-connection/files/agent-connection/app/__mcpServerSnakeCase___client.py.template +0 -22
  1106. package/src/py/agent/react-connection/serve-local.js +0 -30
  1107. package/src/py/agent/react-connection/serve-local.js.map +0 -1
  1108. package/src/py/agent/scripts/http/chat.ts.template +0 -38
  1109. package/src/ts/agent/a2a-connection/files/agent-connection/app/__targetAgentKebabCase__-client.ts.template +0 -19
  1110. package/src/ts/agent/mcp-connection/files/agent-connection/app/__mcpServerKebabCase__-client.ts.template +0 -19
  1111. package/src/ts/agent/react-connection/serve-local.d.ts +0 -13
  1112. package/src/ts/agent/react-connection/serve-local.js +0 -19
  1113. package/src/ts/agent/react-connection/serve-local.js.map +0 -1
  1114. package/src/ts/agent/scripts/http/chat.ts.template +0 -35
  1115. package/src/ts/dynamodb/files/scripts/pull-image.ts.template +0 -15
  1116. package/src/ts/dynamodb/files/scripts/start-container.ts.template +0 -81
  1117. package/src/ts/dynamodb/files/src/constants.ts.template +0 -9
  1118. package/src/ts/dynamodb/files/src/gsi.ts.template +0 -14
  1119. package/src/ts/lib/eslint.d.ts +0 -14
  1120. package/src/ts/lib/eslint.js +0 -90
  1121. package/src/ts/lib/eslint.js.map +0 -1
  1122. package/src/ts/lib/grit/eslint-dependency-checks-warn.grit +0 -1
  1123. package/src/ts/rdb/files/scripts/docker-pull.ts.template +0 -15
  1124. package/src/ts/rdb/files/scripts/docker-start.ts.template +0 -84
  1125. package/src/ts/rdb/files/scripts/wait-for-db.ts.template +0 -55
  1126. package/src/ts/rdb/files/src/constants.ts.template +0 -8
  1127. package/src/utils/agent-connection/files/core-a2a/agentcore-a2a-client.ts.template +0 -123
  1128. package/src/utils/agent-connection/files/core-mcp/agentcore-mcp-client.ts.template +0 -128
  1129. package/src/utils/agent-connection/files/py-core-a2a/agentcore_a2a_client.py.template +0 -120
  1130. package/src/utils/agent-connection/files/py-core-mcp/agentcore_mcp_client.py.template +0 -89
  1131. package/src/utils/files/common/scripts/src/infra-deploy.ts.template +0 -2
  1132. package/src/utils/files/common/scripts/src/infra-destroy.ts.template +0 -2
  1133. package/src/utils/files/terraform/scripts/reset-runtime-config.ts.template +0 -25
  1134. /package/{bin → src/bin}/aws-nx-mcp.d.ts +0 -0
  1135. /package/src/utils/agent-connection/files/{py-core-runtime-config/with_session_id.py.template → py-core-strands/base/with_session_id_strands.py.template} +0 -0
  1136. /package/src/utils/files/common/scripts/src/{index.ts.template → infra/index.ts.template} +0 -0
  1137. /package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/credentials.ts.template +0 -0
  1138. /package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/stage-parser.ts.template +0 -0
@@ -1,35 +1,6 @@
1
1
  // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
2
 
3
- exports[`tsSmithyApiGenerator > should configure git and eslint ignores for generated code > eslint.config.mjs 1`] = `
4
- "import baseConfig from '../../eslint.config.mjs';
5
-
6
- export default [
7
- ...baseConfig,
8
- {
9
- files: ['**/*.json'],
10
- rules: {
11
- '@nx/dependency-checks': [
12
- 'warn',
13
- {
14
- ignoredFiles: [
15
- '{projectRoot}/eslint.config.{js,cjs,mjs,ts,cts,mts}',
16
- '{projectRoot}/vitest.config.{js,ts,mjs,mts}',
17
- ],
18
- },
19
- ],
20
- },
21
- languageOptions: {
22
- parser: await import('jsonc-eslint-parser'),
23
- },
24
- },
25
- {
26
- ignores: ['**/out-tsc', '**/generated'],
27
- },
28
- ];
29
- "
30
- `;
31
-
32
- exports[`tsSmithyApiGenerator > should configure git and eslint ignores for generated code > gitignore 1`] = `"src/generated"`;
3
+ exports[`tsSmithyApiGenerator > should configure git ignores for generated code > gitignore 1`] = `"src/generated"`;
33
4
 
34
5
  exports[`tsSmithyApiGenerator > should generate smithy ts api with Cognito auth > cognito-auth-infra.ts 1`] = `
35
6
  "import { Construct } from 'constructs';
@@ -156,6 +127,9 @@ export class TestApi<
156
127
  authorizer: new CognitoUserPoolsAuthorizer(scope, 'TestApiAuthorizer', {
157
128
  cognitoUserPools: [props.identity.userPool],
158
129
  }),
130
+ // Accept access tokens from both sign-in flows: 'openid' (Cognito hosted UI)
131
+ // and 'aws.cognito.signin.user.admin' (Cognito admin/SRP auth APIs).
132
+ authorizationScopes: ['openid', 'aws.cognito.signin.user.admin'],
159
133
  },
160
134
  deployOptions: {
161
135
  tracingEnabled: true,
@@ -429,11 +403,11 @@ terraform {
429
403
  required_providers {
430
404
  aws = {
431
405
  source = "hashicorp/aws"
432
- version = "~> 6.33"
406
+ version = "6.54.0"
433
407
  }
434
408
  random = {
435
409
  source = "hashicorp/random"
436
- version = "~> 3.1"
410
+ version = "3.9.0"
437
411
  }
438
412
  }
439
413
  }
@@ -503,8 +477,6 @@ data "aws_caller_identity" "current" {}
503
477
 
504
478
  # Resources
505
479
 
506
- # Note: CloudWatch logging removed due to account-level CloudWatch Logs role ARN requirement
507
-
508
480
  # REST API Gateway
509
481
  resource "aws_api_gateway_rest_api" "rest_api" {
510
482
  name = var.api_name
@@ -521,10 +493,8 @@ resource "aws_api_gateway_rest_api" "rest_api" {
521
493
  tags = var.tags
522
494
  }
523
495
 
524
- # Note: Deployment and stage are created in the consuming module (e.g., foo-api.tf)
525
- # after all methods and integrations are defined
526
-
527
- # Note: CloudWatch Log Group removed due to account-level CloudWatch Logs role ARN requirement
496
+ # Note: Deployment, stage and access logging are created in the consuming module
497
+ # (e.g., foo-api.tf) after all methods and integrations are defined
528
498
 
529
499
  # Gateway Response for CORS (4XX errors)
530
500
  resource "aws_api_gateway_gateway_response" "cors_4xx" {
@@ -682,9 +652,7 @@ output "waf_web_acl_arn" {
682
652
  value = var.enable_waf ? aws_wafv2_web_acl.api_waf[0].arn : null
683
653
  }
684
654
 
685
- # Note: Stage and deployment outputs are provided by the consuming module
686
-
687
- # Note: CloudWatch log group outputs removed due to account-level CloudWatch Logs role ARN requirement"
655
+ # Note: Stage, deployment and access log outputs are provided by the consuming module"
688
656
  `;
689
657
 
690
658
  exports[`tsSmithyApiGenerator > should generate smithy ts api with Terraform provider and None auth > none-auth-terraform.tf 1`] = `
@@ -694,7 +662,7 @@ exports[`tsSmithyApiGenerator > should generate smithy ts api with Terraform pro
694
662
  required_providers {
695
663
  aws = {
696
664
  source = "hashicorp/aws"
697
- version = "~> 6.33"
665
+ version = "6.54.0"
698
666
  }
699
667
  }
700
668
  }
@@ -716,11 +684,47 @@ variable "additional_iam_policy_statements" {
716
684
  default = []
717
685
  }
718
686
 
687
+ variable "appconfig_application_id" {
688
+ description = "ID of the shared runtime-config AppConfig application (from \`core/runtime-config/appconfig.application_id\`). When set, the Lambda functions receive \`RUNTIME_CONFIG_APP_ID\` and read access to the application."
689
+ type = string
690
+ default = null
691
+ }
692
+
693
+ variable "appconfig_application_arn" {
694
+ description = "ARN of the shared runtime-config AppConfig application (from \`core/runtime-config/appconfig.application_arn\`). Used to scope the IAM read permission granted to the Lambda functions."
695
+ type = string
696
+ default = null
697
+ }
698
+
719
699
  variable "asset_bucket_name" {
720
700
  description = "Name of the shared asset S3 bucket used to stage the Lambda deployment zip. Instantiate the \`core/asset-bucket\` module once per deployment and pass its \`bucket_name\` output here."
721
701
  type = string
722
702
  }
723
703
 
704
+ # VPC Configuration (optional)
705
+ variable "enable_vpc" {
706
+ description = "Deploy the Lambda function into a VPC. Set alongside vpc_id/subnet_ids."
707
+ type = bool
708
+ default = false
709
+ }
710
+
711
+ variable "vpc_id" {
712
+ description = "VPC ID to deploy the Lambda function into. Required when enable_vpc is true."
713
+ type = string
714
+ default = null
715
+
716
+ validation {
717
+ condition = !var.enable_vpc || (var.vpc_id != null && var.subnet_ids != null)
718
+ error_message = "vpc_id and subnet_ids must be set when enable_vpc is true."
719
+ }
720
+ }
721
+
722
+ variable "subnet_ids" {
723
+ description = "Subnet IDs to deploy the Lambda function into. Required when enable_vpc is true."
724
+ type = list(string)
725
+ default = null
726
+ }
727
+
724
728
  # CORS Configuration (passed to core module)
725
729
 
726
730
  variable "cors_allow_headers" {
@@ -783,6 +787,11 @@ resource "aws_s3_object" "lambda_zip" {
783
787
  }
784
788
 
785
789
  # Use the core REST API module
790
+ # Account-level CloudWatch role required for REST API access logging
791
+ module "account" {
792
+ source = "../../../core/api/api-gateway-account"
793
+ }
794
+
786
795
  module "rest_api" {
787
796
  source = "../../../core/api/rest-api"
788
797
 
@@ -812,9 +821,31 @@ resource "aws_wafv2_web_acl_association" "api_waf_association" {
812
821
  depends_on = [aws_api_gateway_stage.api_stage]
813
822
  }
814
823
 
824
+ # Security group for the API Lambda function, used when deployed into a VPC
825
+ resource "aws_security_group" "api_lambda" {
826
+ count = var.enable_vpc ? 1 : 0
827
+
828
+ #checkov:skip=CKV2_AWS_5:Attached to api_lambda via vpc_config block; Checkov cannot resolve this reference
829
+ name_prefix = "test-api-lambda-"
830
+ description = "Security group for the TestApi API Lambda function"
831
+ vpc_id = var.vpc_id
832
+ tags = var.tags
833
+ }
834
+
835
+ resource "aws_vpc_security_group_egress_rule" "api_lambda_https" {
836
+ count = var.enable_vpc ? 1 : 0
837
+
838
+ security_group_id = aws_security_group.api_lambda[0].id
839
+ cidr_ipv4 = "0.0.0.0/0"
840
+ from_port = 443
841
+ to_port = 443
842
+ ip_protocol = "tcp"
843
+ description = "Allow outbound HTTPS to AWS service endpoints"
844
+ }
845
+
815
846
  # Lambda function
816
847
  resource "aws_lambda_function" "api_lambda" {
817
- #checkov:skip=CKV_AWS_117:Lambda function does not need to be in VPC for this use case
848
+ #checkov:skip=CKV_AWS_117:Lambda function is optionally deployed into a VPC via vpc_id/subnet_ids; not required for this use case
818
849
  #checkov:skip=CKV_AWS_116:Dead Letter Queue not required for this simple API use case
819
850
  #checkov:skip=CKV_AWS_272:Code signing not required for this use case
820
851
  #checkov:skip=CKV_AWS_115:Concurrent execution limit not required for this use case
@@ -836,13 +867,25 @@ resource "aws_lambda_function" "api_lambda" {
836
867
  mode = "Active"
837
868
  }
838
869
 
870
+ dynamic "vpc_config" {
871
+ for_each = var.enable_vpc ? [1] : []
872
+ content {
873
+ subnet_ids = var.subnet_ids
874
+ security_group_ids = [aws_security_group.api_lambda[0].id]
875
+ }
876
+ }
877
+
839
878
 
840
879
  environment {
841
880
  variables = merge({
842
- }, var.env)
881
+ }, var.appconfig_application_id != null ? {
882
+ RUNTIME_CONFIG_APP_ID = var.appconfig_application_id
883
+ } : {}, var.env)
843
884
  }
844
885
 
845
886
  tags = var.tags
887
+
888
+ depends_on = [aws_iam_role_policy_attachment.lambda_vpc_access]
846
889
  }
847
890
 
848
891
  # IAM role for Lambda execution
@@ -877,18 +920,39 @@ resource "aws_iam_role_policy_attachment" "lambda_xray_execution" {
877
920
  role = aws_iam_role.lambda_execution_role.name
878
921
  }
879
922
 
923
+ # Attach VPC access policy to Lambda role when deployed into a VPC
924
+ resource "aws_iam_role_policy_attachment" "lambda_vpc_access" {
925
+ count = var.enable_vpc ? 1 : 0
926
+ policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
927
+ role = aws_iam_role.lambda_execution_role.name
928
+ }
929
+
880
930
  # Additional IAM policies for Lambda (if provided)
881
931
  resource "aws_iam_role_policy" "lambda_additional_policies" {
882
- count = length(var.additional_iam_policy_statements) > 0 ? 1 : 0
932
+ count = length(local.lambda_policy_statements) > 0 ? 1 : 0
883
933
  name = "TestApiHandler-additional-policies-\${random_string.suffix.result}"
884
934
  role = aws_iam_role.lambda_execution_role.id
885
935
 
886
936
  policy = jsonencode({
887
937
  Version = "2012-10-17"
888
- Statement = var.additional_iam_policy_statements
938
+ Statement = local.lambda_policy_statements
889
939
  })
890
940
  }
891
941
 
942
+ locals {
943
+ # Grant read access to the runtime-config AppConfig application when wired
944
+ lambda_policy_statements = concat(var.appconfig_application_arn != null ? [
945
+ {
946
+ Effect = "Allow"
947
+ Action = [
948
+ "appconfig:StartConfigurationSession",
949
+ "appconfig:GetLatestConfiguration"
950
+ ]
951
+ Resource = ["\${var.appconfig_application_arn}/*"]
952
+ }
953
+ ] : [], var.additional_iam_policy_statements)
954
+ }
955
+
892
956
  # CloudWatch Log Group for Lambda
893
957
  resource "aws_cloudwatch_log_group" "lambda_logs" {
894
958
  #checkov:skip=CKV_AWS_158:Using default CloudWatch log encryption
@@ -1108,11 +1172,63 @@ resource "aws_api_gateway_deployment" "api_deployment" {
1108
1172
  ]
1109
1173
  }
1110
1174
 
1175
+ # KMS key for encrypting access logs at rest
1176
+ resource "aws_kms_key" "access_logs" {
1177
+ description = "TestApi API access log encryption"
1178
+ deletion_window_in_days = 7
1179
+ enable_key_rotation = true
1180
+
1181
+ policy = jsonencode({
1182
+ Version = "2012-10-17"
1183
+ Statement = [
1184
+ {
1185
+ Sid = "Enable IAM User Permissions"
1186
+ Effect = "Allow"
1187
+ Principal = { AWS = "arn:aws:iam::\${data.aws_caller_identity.current.account_id}:root" }
1188
+ Action = "kms:*"
1189
+ Resource = "*"
1190
+ },
1191
+ {
1192
+ Sid = "Allow CloudWatch Logs"
1193
+ Effect = "Allow"
1194
+ Principal = { Service = "logs.\${data.aws_region.current.region}.amazonaws.com" }
1195
+ Action = [
1196
+ "kms:Encrypt",
1197
+ "kms:Decrypt",
1198
+ "kms:ReEncrypt*",
1199
+ "kms:GenerateDataKey*",
1200
+ "kms:DescribeKey"
1201
+ ]
1202
+ Resource = "*"
1203
+ Condition = {
1204
+ ArnEquals = {
1205
+ "kms:EncryptionContext:aws:logs:arn" = "arn:aws:logs:\${data.aws_region.current.region}:\${data.aws_caller_identity.current.account_id}:log-group:/aws/apigateway/test-api-\${random_string.suffix.result}/access"
1206
+ }
1207
+ }
1208
+ }
1209
+ ]
1210
+ })
1211
+
1212
+ tags = var.tags
1213
+ }
1214
+
1215
+ resource "aws_kms_alias" "access_logs" {
1216
+ name = "alias/test-api-\${random_string.suffix.result}-access-logs"
1217
+ target_key_id = aws_kms_key.access_logs.key_id
1218
+ }
1219
+
1220
+ # Access logs for the API Gateway stage
1221
+ resource "aws_cloudwatch_log_group" "access_logs" {
1222
+ name = "/aws/apigateway/test-api-\${random_string.suffix.result}/access"
1223
+ retention_in_days = 365
1224
+ kms_key_id = aws_kms_key.access_logs.arn
1225
+ tags = var.tags
1226
+ }
1227
+
1111
1228
  # API Gateway stage
1112
1229
  resource "aws_api_gateway_stage" "api_stage" {
1113
1230
  #checkov:skip=CKV_AWS_120:API Gateway caching not required for this use case
1114
- #checkov:skip=CKV_AWS_76:API Gateway access logging disabled due to account-level CloudWatch Logs role ARN requirement
1115
- #checkov:skip=CKV2_AWS_4:API Gateway logging level not applicable as access logging is disabled
1231
+ #checkov:skip=CKV2_AWS_4:Access logging is enabled below; verbose execution logging is intentionally not enabled
1116
1232
  #checkov:skip=CKV2_AWS_51:Client certificate authentication not required for this use case
1117
1233
  #checkov:skip=CKV2_AWS_77:WAFv2 Web ACL is attached via aws_wafv2_web_acl_association when var.enable_waf is true (default) and includes AWSManagedRulesKnownBadInputsRuleSet for Log4j protection; Checkov does not track the association across modules
1118
1234
  deployment_id = aws_api_gateway_deployment.api_deployment.id
@@ -1120,9 +1236,39 @@ resource "aws_api_gateway_stage" "api_stage" {
1120
1236
  stage_name = "prod"
1121
1237
  xray_tracing_enabled = true
1122
1238
 
1239
+ access_log_settings {
1240
+ destination_arn = aws_cloudwatch_log_group.access_logs.arn
1241
+ format = jsonencode({
1242
+ requestId = "$context.requestId"
1243
+ ip = "$context.identity.sourceIp"
1244
+ caller = "$context.identity.caller"
1245
+ user = "$context.identity.user"
1246
+ requestTime = "$context.requestTime"
1247
+ httpMethod = "$context.httpMethod"
1248
+ resourcePath = "$context.resourcePath"
1249
+ status = "$context.status"
1250
+ protocol = "$context.protocol"
1251
+ responseLength = "$context.responseLength"
1252
+ })
1253
+ }
1254
+
1123
1255
  tags = var.tags
1124
1256
 
1125
- depends_on = [aws_api_gateway_deployment.api_deployment]
1257
+ # Ensure the account-level role is configured before the stage is created
1258
+ depends_on = [aws_api_gateway_deployment.api_deployment, module.account]
1259
+ }
1260
+
1261
+ # Default throttling applied to all resource paths and methods
1262
+ resource "aws_api_gateway_method_settings" "throttling" {
1263
+ #checkov:skip=CKV_AWS_225:API Gateway caching not required for this use case
1264
+ rest_api_id = module.rest_api.api_id
1265
+ stage_name = aws_api_gateway_stage.api_stage.stage_name
1266
+ method_path = "*/*"
1267
+
1268
+ settings {
1269
+ throttling_rate_limit = 10000
1270
+ throttling_burst_limit = 5000
1271
+ }
1126
1272
  }
1127
1273
 
1128
1274
  # API Gateway Resource Policy
@@ -1261,6 +1407,11 @@ output "lambda_execution_role_name" {
1261
1407
  value = aws_iam_role.lambda_execution_role.name
1262
1408
  }
1263
1409
 
1410
+ output "security_group_id" {
1411
+ description = "Security group ID of the API Lambda function, for use in ingress rules on resources it must reach (e.g. a database). Null unless enable_vpc is true."
1412
+ value = var.enable_vpc ? aws_security_group.api_lambda[0].id : null
1413
+ }
1414
+
1264
1415
  # Integration Outputs
1265
1416
  output "integration_id" {
1266
1417
  description = "ID of the Lambda integration"
@@ -1333,42 +1484,55 @@ exports[`tsSmithyApiGenerator > should generate smithy ts api with default optio
1333
1484
  },
1334
1485
  "compile": {
1335
1486
  "executor": "nx:run-commands",
1487
+ "dependsOn": ["copy-ssdk"],
1336
1488
  "outputs": ["{workspaceRoot}/dist/{projectRoot}/tsc"],
1337
1489
  "options": {
1338
1490
  "command": "tsc --build tsconfig.lib.json",
1339
1491
  "cwd": "{projectRoot}"
1340
- },
1341
- "dependsOn": ["copy-ssdk"]
1492
+ }
1342
1493
  },
1343
- "lint": {
1344
- "executor": "@nx/eslint:lint",
1494
+ "format": {
1495
+ "executor": "nx:run-commands",
1345
1496
  "cache": true,
1346
- "inputs": ["eslint"],
1497
+ "inputs": ["biome"],
1498
+ "options": {
1499
+ "command": "biome format {projectRoot}"
1500
+ },
1347
1501
  "configurations": {
1348
1502
  "fix": {
1349
- "fix": true
1503
+ "command": "biome format --write {projectRoot}"
1350
1504
  },
1351
1505
  "skip-lint": {
1352
- "force": true
1506
+ "command": "node -e \\"\\""
1353
1507
  }
1354
1508
  }
1355
1509
  },
1356
- "test": {
1357
- "executor": "@nx/vitest:test",
1358
- "outputs": ["{options.reportsDirectory}"],
1510
+ "lint": {
1511
+ "executor": "nx:run-commands",
1512
+ "cache": true,
1513
+ "inputs": ["biome"],
1514
+ "dependsOn": ["format"],
1359
1515
  "options": {
1360
- "reportsDirectory": "{workspaceRoot}/coverage/{projectRoot}"
1516
+ "command": "biome lint {projectRoot}"
1517
+ },
1518
+ "configurations": {
1519
+ "fix": {
1520
+ "command": "biome check --write {projectRoot}"
1521
+ },
1522
+ "skip-lint": {
1523
+ "command": "node -e \\"\\""
1524
+ }
1361
1525
  }
1362
1526
  },
1363
1527
  "bundle": {
1528
+ "executor": "nx:run-commands",
1529
+ "dependsOn": ["compile"],
1364
1530
  "cache": true,
1365
1531
  "outputs": ["{workspaceRoot}/dist/{projectRoot}/bundle"],
1366
- "executor": "nx:run-commands",
1367
1532
  "options": {
1368
1533
  "command": "rolldown -c rolldown.config.ts",
1369
1534
  "cwd": "{projectRoot}"
1370
- },
1371
- "dependsOn": ["compile"]
1535
+ }
1372
1536
  },
1373
1537
  "copy-ssdk": {
1374
1538
  "cache": true,
@@ -1391,31 +1555,31 @@ exports[`tsSmithyApiGenerator > should generate smithy ts api with default optio
1391
1555
  },
1392
1556
  "watch-copy-ssdk": {
1393
1557
  "executor": "nx:run-commands",
1558
+ "continuous": true,
1394
1559
  "options": {
1395
- "command": "nx watch --projects=@proj/test-api-model --includeDependentProjects -- nx run @proj/test-api:copy-ssdk"
1396
- },
1397
- "continuous": true
1560
+ "command": "nx watch --projects=@proj/test-api-model --includeDependencies -- nx run @proj/test-api:copy-ssdk"
1561
+ }
1398
1562
  },
1399
1563
  "serve": {
1400
1564
  "executor": "nx:run-commands",
1565
+ "dependsOn": ["copy-ssdk", "watch-copy-ssdk"],
1566
+ "continuous": true,
1401
1567
  "options": {
1402
1568
  "command": "tsx --watch src/local-server.ts",
1403
1569
  "cwd": "{projectRoot}"
1404
- },
1405
- "continuous": true,
1406
- "dependsOn": ["copy-ssdk", "watch-copy-ssdk"]
1570
+ }
1407
1571
  },
1408
- "serve-local": {
1572
+ "dev": {
1409
1573
  "executor": "nx:run-commands",
1574
+ "dependsOn": ["copy-ssdk", "watch-copy-ssdk"],
1575
+ "continuous": true,
1410
1576
  "options": {
1411
1577
  "command": "tsx --watch src/local-server.ts",
1412
1578
  "cwd": "{projectRoot}",
1413
1579
  "env": {
1414
- "SERVE_LOCAL": "true"
1580
+ "LOCAL_DEV": "true"
1415
1581
  }
1416
- },
1417
- "continuous": true,
1418
- "dependsOn": ["copy-ssdk", "watch-copy-ssdk"]
1582
+ }
1419
1583
  }
1420
1584
  }
1421
1585
  }
@@ -1708,11 +1872,11 @@ terraform {
1708
1872
  required_providers {
1709
1873
  aws = {
1710
1874
  source = "hashicorp/aws"
1711
- version = "~> 6.33"
1875
+ version = "6.54.0"
1712
1876
  }
1713
1877
  random = {
1714
1878
  source = "hashicorp/random"
1715
- version = "~> 3.1"
1879
+ version = "3.9.0"
1716
1880
  }
1717
1881
  }
1718
1882
  }
@@ -1782,8 +1946,6 @@ data "aws_caller_identity" "current" {}
1782
1946
 
1783
1947
  # Resources
1784
1948
 
1785
- # Note: CloudWatch logging removed due to account-level CloudWatch Logs role ARN requirement
1786
-
1787
1949
  # REST API Gateway
1788
1950
  resource "aws_api_gateway_rest_api" "rest_api" {
1789
1951
  name = var.api_name
@@ -1800,10 +1962,8 @@ resource "aws_api_gateway_rest_api" "rest_api" {
1800
1962
  tags = var.tags
1801
1963
  }
1802
1964
 
1803
- # Note: Deployment and stage are created in the consuming module (e.g., foo-api.tf)
1804
- # after all methods and integrations are defined
1805
-
1806
- # Note: CloudWatch Log Group removed due to account-level CloudWatch Logs role ARN requirement
1965
+ # Note: Deployment, stage and access logging are created in the consuming module
1966
+ # (e.g., foo-api.tf) after all methods and integrations are defined
1807
1967
 
1808
1968
  # Gateway Response for CORS (4XX errors)
1809
1969
  resource "aws_api_gateway_gateway_response" "cors_4xx" {
@@ -1961,16 +2121,14 @@ output "waf_web_acl_arn" {
1961
2121
  value = var.enable_waf ? aws_wafv2_web_acl.api_waf[0].arn : null
1962
2122
  }
1963
2123
 
1964
- # Note: Stage and deployment outputs are provided by the consuming module
1965
-
1966
- # Note: CloudWatch log group outputs removed due to account-level CloudWatch Logs role ARN requirement",
2124
+ # Note: Stage, deployment and access log outputs are provided by the consuming module",
1967
2125
  "test-api.tf": "terraform {
1968
2126
  required_version = ">= 1.0"
1969
2127
 
1970
2128
  required_providers {
1971
2129
  aws = {
1972
2130
  source = "hashicorp/aws"
1973
- version = "~> 6.33"
2131
+ version = "6.54.0"
1974
2132
  }
1975
2133
  }
1976
2134
  }
@@ -2002,11 +2160,47 @@ variable "additional_iam_policy_statements" {
2002
2160
  default = []
2003
2161
  }
2004
2162
 
2163
+ variable "appconfig_application_id" {
2164
+ description = "ID of the shared runtime-config AppConfig application (from \`core/runtime-config/appconfig.application_id\`). When set, the Lambda functions receive \`RUNTIME_CONFIG_APP_ID\` and read access to the application."
2165
+ type = string
2166
+ default = null
2167
+ }
2168
+
2169
+ variable "appconfig_application_arn" {
2170
+ description = "ARN of the shared runtime-config AppConfig application (from \`core/runtime-config/appconfig.application_arn\`). Used to scope the IAM read permission granted to the Lambda functions."
2171
+ type = string
2172
+ default = null
2173
+ }
2174
+
2005
2175
  variable "asset_bucket_name" {
2006
2176
  description = "Name of the shared asset S3 bucket used to stage the Lambda deployment zip. Instantiate the \`core/asset-bucket\` module once per deployment and pass its \`bucket_name\` output here."
2007
2177
  type = string
2008
2178
  }
2009
2179
 
2180
+ # VPC Configuration (optional)
2181
+ variable "enable_vpc" {
2182
+ description = "Deploy the Lambda function into a VPC. Set alongside vpc_id/subnet_ids."
2183
+ type = bool
2184
+ default = false
2185
+ }
2186
+
2187
+ variable "vpc_id" {
2188
+ description = "VPC ID to deploy the Lambda function into. Required when enable_vpc is true."
2189
+ type = string
2190
+ default = null
2191
+
2192
+ validation {
2193
+ condition = !var.enable_vpc || (var.vpc_id != null && var.subnet_ids != null)
2194
+ error_message = "vpc_id and subnet_ids must be set when enable_vpc is true."
2195
+ }
2196
+ }
2197
+
2198
+ variable "subnet_ids" {
2199
+ description = "Subnet IDs to deploy the Lambda function into. Required when enable_vpc is true."
2200
+ type = list(string)
2201
+ default = null
2202
+ }
2203
+
2010
2204
  # CORS Configuration (passed to core module)
2011
2205
 
2012
2206
  variable "cors_allow_headers" {
@@ -2069,6 +2263,11 @@ resource "aws_s3_object" "lambda_zip" {
2069
2263
  }
2070
2264
 
2071
2265
  # Use the core REST API module
2266
+ # Account-level CloudWatch role required for REST API access logging
2267
+ module "account" {
2268
+ source = "../../../core/api/api-gateway-account"
2269
+ }
2270
+
2072
2271
  module "rest_api" {
2073
2272
  source = "../../../core/api/rest-api"
2074
2273
 
@@ -2098,9 +2297,31 @@ resource "aws_wafv2_web_acl_association" "api_waf_association" {
2098
2297
  depends_on = [aws_api_gateway_stage.api_stage]
2099
2298
  }
2100
2299
 
2300
+ # Security group for the API Lambda function, used when deployed into a VPC
2301
+ resource "aws_security_group" "api_lambda" {
2302
+ count = var.enable_vpc ? 1 : 0
2303
+
2304
+ #checkov:skip=CKV2_AWS_5:Attached to api_lambda via vpc_config block; Checkov cannot resolve this reference
2305
+ name_prefix = "test-api-lambda-"
2306
+ description = "Security group for the TestApi API Lambda function"
2307
+ vpc_id = var.vpc_id
2308
+ tags = var.tags
2309
+ }
2310
+
2311
+ resource "aws_vpc_security_group_egress_rule" "api_lambda_https" {
2312
+ count = var.enable_vpc ? 1 : 0
2313
+
2314
+ security_group_id = aws_security_group.api_lambda[0].id
2315
+ cidr_ipv4 = "0.0.0.0/0"
2316
+ from_port = 443
2317
+ to_port = 443
2318
+ ip_protocol = "tcp"
2319
+ description = "Allow outbound HTTPS to AWS service endpoints"
2320
+ }
2321
+
2101
2322
  # Lambda function
2102
2323
  resource "aws_lambda_function" "api_lambda" {
2103
- #checkov:skip=CKV_AWS_117:Lambda function does not need to be in VPC for this use case
2324
+ #checkov:skip=CKV_AWS_117:Lambda function is optionally deployed into a VPC via vpc_id/subnet_ids; not required for this use case
2104
2325
  #checkov:skip=CKV_AWS_116:Dead Letter Queue not required for this simple API use case
2105
2326
  #checkov:skip=CKV_AWS_272:Code signing not required for this use case
2106
2327
  #checkov:skip=CKV_AWS_115:Concurrent execution limit not required for this use case
@@ -2122,13 +2343,25 @@ resource "aws_lambda_function" "api_lambda" {
2122
2343
  mode = "Active"
2123
2344
  }
2124
2345
 
2346
+ dynamic "vpc_config" {
2347
+ for_each = var.enable_vpc ? [1] : []
2348
+ content {
2349
+ subnet_ids = var.subnet_ids
2350
+ security_group_ids = [aws_security_group.api_lambda[0].id]
2351
+ }
2352
+ }
2353
+
2125
2354
 
2126
2355
  environment {
2127
2356
  variables = merge({
2128
- }, var.env)
2357
+ }, var.appconfig_application_id != null ? {
2358
+ RUNTIME_CONFIG_APP_ID = var.appconfig_application_id
2359
+ } : {}, var.env)
2129
2360
  }
2130
2361
 
2131
2362
  tags = var.tags
2363
+
2364
+ depends_on = [aws_iam_role_policy_attachment.lambda_vpc_access]
2132
2365
  }
2133
2366
 
2134
2367
  # IAM role for Lambda execution
@@ -2163,18 +2396,39 @@ resource "aws_iam_role_policy_attachment" "lambda_xray_execution" {
2163
2396
  role = aws_iam_role.lambda_execution_role.name
2164
2397
  }
2165
2398
 
2399
+ # Attach VPC access policy to Lambda role when deployed into a VPC
2400
+ resource "aws_iam_role_policy_attachment" "lambda_vpc_access" {
2401
+ count = var.enable_vpc ? 1 : 0
2402
+ policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
2403
+ role = aws_iam_role.lambda_execution_role.name
2404
+ }
2405
+
2166
2406
  # Additional IAM policies for Lambda (if provided)
2167
2407
  resource "aws_iam_role_policy" "lambda_additional_policies" {
2168
- count = length(var.additional_iam_policy_statements) > 0 ? 1 : 0
2408
+ count = length(local.lambda_policy_statements) > 0 ? 1 : 0
2169
2409
  name = "TestApiHandler-additional-policies-\${random_string.suffix.result}"
2170
2410
  role = aws_iam_role.lambda_execution_role.id
2171
2411
 
2172
2412
  policy = jsonencode({
2173
2413
  Version = "2012-10-17"
2174
- Statement = var.additional_iam_policy_statements
2414
+ Statement = local.lambda_policy_statements
2175
2415
  })
2176
2416
  }
2177
2417
 
2418
+ locals {
2419
+ # Grant read access to the runtime-config AppConfig application when wired
2420
+ lambda_policy_statements = concat(var.appconfig_application_arn != null ? [
2421
+ {
2422
+ Effect = "Allow"
2423
+ Action = [
2424
+ "appconfig:StartConfigurationSession",
2425
+ "appconfig:GetLatestConfiguration"
2426
+ ]
2427
+ Resource = ["\${var.appconfig_application_arn}/*"]
2428
+ }
2429
+ ] : [], var.additional_iam_policy_statements)
2430
+ }
2431
+
2178
2432
  # CloudWatch Log Group for Lambda
2179
2433
  resource "aws_cloudwatch_log_group" "lambda_logs" {
2180
2434
  #checkov:skip=CKV_AWS_158:Using default CloudWatch log encryption
@@ -2223,6 +2477,9 @@ resource "aws_api_gateway_method" "proxy_method" {
2223
2477
 
2224
2478
  authorization = "COGNITO_USER_POOLS"
2225
2479
  authorizer_id = aws_api_gateway_authorizer.cognito_authorizer.id
2480
+ # Accept access tokens from both sign-in flows: 'openid' (Cognito hosted UI)
2481
+ # and 'aws.cognito.signin.user.admin' (Cognito admin/SRP auth APIs).
2482
+ authorization_scopes = ["openid", "aws.cognito.signin.user.admin"]
2226
2483
 
2227
2484
  request_parameters = {
2228
2485
  "method.request.path.proxy" = true
@@ -2309,11 +2566,63 @@ resource "aws_api_gateway_deployment" "api_deployment" {
2309
2566
  ]
2310
2567
  }
2311
2568
 
2569
+ # KMS key for encrypting access logs at rest
2570
+ resource "aws_kms_key" "access_logs" {
2571
+ description = "TestApi API access log encryption"
2572
+ deletion_window_in_days = 7
2573
+ enable_key_rotation = true
2574
+
2575
+ policy = jsonencode({
2576
+ Version = "2012-10-17"
2577
+ Statement = [
2578
+ {
2579
+ Sid = "Enable IAM User Permissions"
2580
+ Effect = "Allow"
2581
+ Principal = { AWS = "arn:aws:iam::\${data.aws_caller_identity.current.account_id}:root" }
2582
+ Action = "kms:*"
2583
+ Resource = "*"
2584
+ },
2585
+ {
2586
+ Sid = "Allow CloudWatch Logs"
2587
+ Effect = "Allow"
2588
+ Principal = { Service = "logs.\${data.aws_region.current.region}.amazonaws.com" }
2589
+ Action = [
2590
+ "kms:Encrypt",
2591
+ "kms:Decrypt",
2592
+ "kms:ReEncrypt*",
2593
+ "kms:GenerateDataKey*",
2594
+ "kms:DescribeKey"
2595
+ ]
2596
+ Resource = "*"
2597
+ Condition = {
2598
+ ArnEquals = {
2599
+ "kms:EncryptionContext:aws:logs:arn" = "arn:aws:logs:\${data.aws_region.current.region}:\${data.aws_caller_identity.current.account_id}:log-group:/aws/apigateway/test-api-\${random_string.suffix.result}/access"
2600
+ }
2601
+ }
2602
+ }
2603
+ ]
2604
+ })
2605
+
2606
+ tags = var.tags
2607
+ }
2608
+
2609
+ resource "aws_kms_alias" "access_logs" {
2610
+ name = "alias/test-api-\${random_string.suffix.result}-access-logs"
2611
+ target_key_id = aws_kms_key.access_logs.key_id
2612
+ }
2613
+
2614
+ # Access logs for the API Gateway stage
2615
+ resource "aws_cloudwatch_log_group" "access_logs" {
2616
+ name = "/aws/apigateway/test-api-\${random_string.suffix.result}/access"
2617
+ retention_in_days = 365
2618
+ kms_key_id = aws_kms_key.access_logs.arn
2619
+ tags = var.tags
2620
+ }
2621
+
2312
2622
  # API Gateway stage
2313
2623
  resource "aws_api_gateway_stage" "api_stage" {
2314
2624
  #checkov:skip=CKV_AWS_120:API Gateway caching not required for this use case
2315
- #checkov:skip=CKV_AWS_76:API Gateway access logging disabled due to account-level CloudWatch Logs role ARN requirement
2316
- #checkov:skip=CKV2_AWS_4:API Gateway logging level not applicable as access logging is disabled
2625
+ #checkov:skip=CKV2_AWS_4:Access logging is enabled below; verbose execution logging is intentionally not enabled
2317
2626
  #checkov:skip=CKV2_AWS_51:Client certificate authentication not required for this use case
2318
2627
  #checkov:skip=CKV2_AWS_77:WAFv2 Web ACL is attached via aws_wafv2_web_acl_association when var.enable_waf is true (default) and includes AWSManagedRulesKnownBadInputsRuleSet for Log4j protection; Checkov does not track the association across modules
2319
2628
  deployment_id = aws_api_gateway_deployment.api_deployment.id
@@ -2321,9 +2630,39 @@ resource "aws_api_gateway_stage" "api_stage" {
2321
2630
  stage_name = "prod"
2322
2631
  xray_tracing_enabled = true
2323
2632
 
2633
+ access_log_settings {
2634
+ destination_arn = aws_cloudwatch_log_group.access_logs.arn
2635
+ format = jsonencode({
2636
+ requestId = "$context.requestId"
2637
+ ip = "$context.identity.sourceIp"
2638
+ caller = "$context.identity.caller"
2639
+ user = "$context.identity.user"
2640
+ requestTime = "$context.requestTime"
2641
+ httpMethod = "$context.httpMethod"
2642
+ resourcePath = "$context.resourcePath"
2643
+ status = "$context.status"
2644
+ protocol = "$context.protocol"
2645
+ responseLength = "$context.responseLength"
2646
+ })
2647
+ }
2648
+
2324
2649
  tags = var.tags
2325
2650
 
2326
- depends_on = [aws_api_gateway_deployment.api_deployment]
2651
+ # Ensure the account-level role is configured before the stage is created
2652
+ depends_on = [aws_api_gateway_deployment.api_deployment, module.account]
2653
+ }
2654
+
2655
+ # Default throttling applied to all resource paths and methods
2656
+ resource "aws_api_gateway_method_settings" "throttling" {
2657
+ #checkov:skip=CKV_AWS_225:API Gateway caching not required for this use case
2658
+ rest_api_id = module.rest_api.api_id
2659
+ stage_name = aws_api_gateway_stage.api_stage.stage_name
2660
+ method_path = "*/*"
2661
+
2662
+ settings {
2663
+ throttling_rate_limit = 10000
2664
+ throttling_burst_limit = 5000
2665
+ }
2327
2666
  }
2328
2667
 
2329
2668
  # API Gateway Resource Policy
@@ -2462,6 +2801,11 @@ output "lambda_execution_role_name" {
2462
2801
  value = aws_iam_role.lambda_execution_role.name
2463
2802
  }
2464
2803
 
2804
+ output "security_group_id" {
2805
+ description = "Security group ID of the API Lambda function, for use in ingress rules on resources it must reach (e.g. a database). Null unless enable_vpc is true."
2806
+ value = var.enable_vpc ? aws_security_group.api_lambda[0].id : null
2807
+ }
2808
+
2465
2809
  # Integration Outputs
2466
2810
  output "integration_id" {
2467
2811
  description = "ID of the Lambda integration"
@@ -2503,11 +2847,11 @@ terraform {
2503
2847
  required_providers {
2504
2848
  aws = {
2505
2849
  source = "hashicorp/aws"
2506
- version = "~> 6.33"
2850
+ version = "6.54.0"
2507
2851
  }
2508
2852
  random = {
2509
2853
  source = "hashicorp/random"
2510
- version = "~> 3.1"
2854
+ version = "3.9.0"
2511
2855
  }
2512
2856
  }
2513
2857
  }
@@ -2577,8 +2921,6 @@ data "aws_caller_identity" "current" {}
2577
2921
 
2578
2922
  # Resources
2579
2923
 
2580
- # Note: CloudWatch logging removed due to account-level CloudWatch Logs role ARN requirement
2581
-
2582
2924
  # REST API Gateway
2583
2925
  resource "aws_api_gateway_rest_api" "rest_api" {
2584
2926
  name = var.api_name
@@ -2595,10 +2937,8 @@ resource "aws_api_gateway_rest_api" "rest_api" {
2595
2937
  tags = var.tags
2596
2938
  }
2597
2939
 
2598
- # Note: Deployment and stage are created in the consuming module (e.g., foo-api.tf)
2599
- # after all methods and integrations are defined
2600
-
2601
- # Note: CloudWatch Log Group removed due to account-level CloudWatch Logs role ARN requirement
2940
+ # Note: Deployment, stage and access logging are created in the consuming module
2941
+ # (e.g., foo-api.tf) after all methods and integrations are defined
2602
2942
 
2603
2943
  # Gateway Response for CORS (4XX errors)
2604
2944
  resource "aws_api_gateway_gateway_response" "cors_4xx" {
@@ -2756,16 +3096,14 @@ output "waf_web_acl_arn" {
2756
3096
  value = var.enable_waf ? aws_wafv2_web_acl.api_waf[0].arn : null
2757
3097
  }
2758
3098
 
2759
- # Note: Stage and deployment outputs are provided by the consuming module
2760
-
2761
- # Note: CloudWatch log group outputs removed due to account-level CloudWatch Logs role ARN requirement",
3099
+ # Note: Stage, deployment and access log outputs are provided by the consuming module",
2762
3100
  "test-api.tf": "terraform {
2763
3101
  required_version = ">= 1.0"
2764
3102
 
2765
3103
  required_providers {
2766
3104
  aws = {
2767
3105
  source = "hashicorp/aws"
2768
- version = "~> 6.33"
3106
+ version = "6.54.0"
2769
3107
  }
2770
3108
  }
2771
3109
  }
@@ -2787,11 +3125,47 @@ variable "additional_iam_policy_statements" {
2787
3125
  default = []
2788
3126
  }
2789
3127
 
3128
+ variable "appconfig_application_id" {
3129
+ description = "ID of the shared runtime-config AppConfig application (from \`core/runtime-config/appconfig.application_id\`). When set, the Lambda functions receive \`RUNTIME_CONFIG_APP_ID\` and read access to the application."
3130
+ type = string
3131
+ default = null
3132
+ }
3133
+
3134
+ variable "appconfig_application_arn" {
3135
+ description = "ARN of the shared runtime-config AppConfig application (from \`core/runtime-config/appconfig.application_arn\`). Used to scope the IAM read permission granted to the Lambda functions."
3136
+ type = string
3137
+ default = null
3138
+ }
3139
+
2790
3140
  variable "asset_bucket_name" {
2791
3141
  description = "Name of the shared asset S3 bucket used to stage the Lambda deployment zip. Instantiate the \`core/asset-bucket\` module once per deployment and pass its \`bucket_name\` output here."
2792
3142
  type = string
2793
3143
  }
2794
3144
 
3145
+ # VPC Configuration (optional)
3146
+ variable "enable_vpc" {
3147
+ description = "Deploy the Lambda function into a VPC. Set alongside vpc_id/subnet_ids."
3148
+ type = bool
3149
+ default = false
3150
+ }
3151
+
3152
+ variable "vpc_id" {
3153
+ description = "VPC ID to deploy the Lambda function into. Required when enable_vpc is true."
3154
+ type = string
3155
+ default = null
3156
+
3157
+ validation {
3158
+ condition = !var.enable_vpc || (var.vpc_id != null && var.subnet_ids != null)
3159
+ error_message = "vpc_id and subnet_ids must be set when enable_vpc is true."
3160
+ }
3161
+ }
3162
+
3163
+ variable "subnet_ids" {
3164
+ description = "Subnet IDs to deploy the Lambda function into. Required when enable_vpc is true."
3165
+ type = list(string)
3166
+ default = null
3167
+ }
3168
+
2795
3169
  # CORS Configuration (passed to core module)
2796
3170
 
2797
3171
  variable "cors_allow_headers" {
@@ -2854,6 +3228,11 @@ resource "aws_s3_object" "lambda_zip" {
2854
3228
  }
2855
3229
 
2856
3230
  # Use the core REST API module
3231
+ # Account-level CloudWatch role required for REST API access logging
3232
+ module "account" {
3233
+ source = "../../../core/api/api-gateway-account"
3234
+ }
3235
+
2857
3236
  module "rest_api" {
2858
3237
  source = "../../../core/api/rest-api"
2859
3238
 
@@ -2883,9 +3262,31 @@ resource "aws_wafv2_web_acl_association" "api_waf_association" {
2883
3262
  depends_on = [aws_api_gateway_stage.api_stage]
2884
3263
  }
2885
3264
 
3265
+ # Security group for the API Lambda function, used when deployed into a VPC
3266
+ resource "aws_security_group" "api_lambda" {
3267
+ count = var.enable_vpc ? 1 : 0
3268
+
3269
+ #checkov:skip=CKV2_AWS_5:Attached to api_lambda via vpc_config block; Checkov cannot resolve this reference
3270
+ name_prefix = "test-api-lambda-"
3271
+ description = "Security group for the TestApi API Lambda function"
3272
+ vpc_id = var.vpc_id
3273
+ tags = var.tags
3274
+ }
3275
+
3276
+ resource "aws_vpc_security_group_egress_rule" "api_lambda_https" {
3277
+ count = var.enable_vpc ? 1 : 0
3278
+
3279
+ security_group_id = aws_security_group.api_lambda[0].id
3280
+ cidr_ipv4 = "0.0.0.0/0"
3281
+ from_port = 443
3282
+ to_port = 443
3283
+ ip_protocol = "tcp"
3284
+ description = "Allow outbound HTTPS to AWS service endpoints"
3285
+ }
3286
+
2886
3287
  # Lambda function
2887
3288
  resource "aws_lambda_function" "api_lambda" {
2888
- #checkov:skip=CKV_AWS_117:Lambda function does not need to be in VPC for this use case
3289
+ #checkov:skip=CKV_AWS_117:Lambda function is optionally deployed into a VPC via vpc_id/subnet_ids; not required for this use case
2889
3290
  #checkov:skip=CKV_AWS_116:Dead Letter Queue not required for this simple API use case
2890
3291
  #checkov:skip=CKV_AWS_272:Code signing not required for this use case
2891
3292
  #checkov:skip=CKV_AWS_115:Concurrent execution limit not required for this use case
@@ -2907,13 +3308,25 @@ resource "aws_lambda_function" "api_lambda" {
2907
3308
  mode = "Active"
2908
3309
  }
2909
3310
 
3311
+ dynamic "vpc_config" {
3312
+ for_each = var.enable_vpc ? [1] : []
3313
+ content {
3314
+ subnet_ids = var.subnet_ids
3315
+ security_group_ids = [aws_security_group.api_lambda[0].id]
3316
+ }
3317
+ }
3318
+
2910
3319
 
2911
3320
  environment {
2912
3321
  variables = merge({
2913
- }, var.env)
3322
+ }, var.appconfig_application_id != null ? {
3323
+ RUNTIME_CONFIG_APP_ID = var.appconfig_application_id
3324
+ } : {}, var.env)
2914
3325
  }
2915
3326
 
2916
3327
  tags = var.tags
3328
+
3329
+ depends_on = [aws_iam_role_policy_attachment.lambda_vpc_access]
2917
3330
  }
2918
3331
 
2919
3332
  # IAM role for Lambda execution
@@ -2948,18 +3361,39 @@ resource "aws_iam_role_policy_attachment" "lambda_xray_execution" {
2948
3361
  role = aws_iam_role.lambda_execution_role.name
2949
3362
  }
2950
3363
 
3364
+ # Attach VPC access policy to Lambda role when deployed into a VPC
3365
+ resource "aws_iam_role_policy_attachment" "lambda_vpc_access" {
3366
+ count = var.enable_vpc ? 1 : 0
3367
+ policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
3368
+ role = aws_iam_role.lambda_execution_role.name
3369
+ }
3370
+
2951
3371
  # Additional IAM policies for Lambda (if provided)
2952
3372
  resource "aws_iam_role_policy" "lambda_additional_policies" {
2953
- count = length(var.additional_iam_policy_statements) > 0 ? 1 : 0
3373
+ count = length(local.lambda_policy_statements) > 0 ? 1 : 0
2954
3374
  name = "TestApiHandler-additional-policies-\${random_string.suffix.result}"
2955
3375
  role = aws_iam_role.lambda_execution_role.id
2956
3376
 
2957
3377
  policy = jsonencode({
2958
3378
  Version = "2012-10-17"
2959
- Statement = var.additional_iam_policy_statements
3379
+ Statement = local.lambda_policy_statements
2960
3380
  })
2961
3381
  }
2962
3382
 
3383
+ locals {
3384
+ # Grant read access to the runtime-config AppConfig application when wired
3385
+ lambda_policy_statements = concat(var.appconfig_application_arn != null ? [
3386
+ {
3387
+ Effect = "Allow"
3388
+ Action = [
3389
+ "appconfig:StartConfigurationSession",
3390
+ "appconfig:GetLatestConfiguration"
3391
+ ]
3392
+ Resource = ["\${var.appconfig_application_arn}/*"]
3393
+ }
3394
+ ] : [], var.additional_iam_policy_statements)
3395
+ }
3396
+
2963
3397
  # CloudWatch Log Group for Lambda
2964
3398
  resource "aws_cloudwatch_log_group" "lambda_logs" {
2965
3399
  #checkov:skip=CKV_AWS_158:Using default CloudWatch log encryption
@@ -3085,11 +3519,63 @@ resource "aws_api_gateway_deployment" "api_deployment" {
3085
3519
  ]
3086
3520
  }
3087
3521
 
3522
+ # KMS key for encrypting access logs at rest
3523
+ resource "aws_kms_key" "access_logs" {
3524
+ description = "TestApi API access log encryption"
3525
+ deletion_window_in_days = 7
3526
+ enable_key_rotation = true
3527
+
3528
+ policy = jsonencode({
3529
+ Version = "2012-10-17"
3530
+ Statement = [
3531
+ {
3532
+ Sid = "Enable IAM User Permissions"
3533
+ Effect = "Allow"
3534
+ Principal = { AWS = "arn:aws:iam::\${data.aws_caller_identity.current.account_id}:root" }
3535
+ Action = "kms:*"
3536
+ Resource = "*"
3537
+ },
3538
+ {
3539
+ Sid = "Allow CloudWatch Logs"
3540
+ Effect = "Allow"
3541
+ Principal = { Service = "logs.\${data.aws_region.current.region}.amazonaws.com" }
3542
+ Action = [
3543
+ "kms:Encrypt",
3544
+ "kms:Decrypt",
3545
+ "kms:ReEncrypt*",
3546
+ "kms:GenerateDataKey*",
3547
+ "kms:DescribeKey"
3548
+ ]
3549
+ Resource = "*"
3550
+ Condition = {
3551
+ ArnEquals = {
3552
+ "kms:EncryptionContext:aws:logs:arn" = "arn:aws:logs:\${data.aws_region.current.region}:\${data.aws_caller_identity.current.account_id}:log-group:/aws/apigateway/test-api-\${random_string.suffix.result}/access"
3553
+ }
3554
+ }
3555
+ }
3556
+ ]
3557
+ })
3558
+
3559
+ tags = var.tags
3560
+ }
3561
+
3562
+ resource "aws_kms_alias" "access_logs" {
3563
+ name = "alias/test-api-\${random_string.suffix.result}-access-logs"
3564
+ target_key_id = aws_kms_key.access_logs.key_id
3565
+ }
3566
+
3567
+ # Access logs for the API Gateway stage
3568
+ resource "aws_cloudwatch_log_group" "access_logs" {
3569
+ name = "/aws/apigateway/test-api-\${random_string.suffix.result}/access"
3570
+ retention_in_days = 365
3571
+ kms_key_id = aws_kms_key.access_logs.arn
3572
+ tags = var.tags
3573
+ }
3574
+
3088
3575
  # API Gateway stage
3089
3576
  resource "aws_api_gateway_stage" "api_stage" {
3090
3577
  #checkov:skip=CKV_AWS_120:API Gateway caching not required for this use case
3091
- #checkov:skip=CKV_AWS_76:API Gateway access logging disabled due to account-level CloudWatch Logs role ARN requirement
3092
- #checkov:skip=CKV2_AWS_4:API Gateway logging level not applicable as access logging is disabled
3578
+ #checkov:skip=CKV2_AWS_4:Access logging is enabled below; verbose execution logging is intentionally not enabled
3093
3579
  #checkov:skip=CKV2_AWS_51:Client certificate authentication not required for this use case
3094
3580
  #checkov:skip=CKV2_AWS_77:WAFv2 Web ACL is attached via aws_wafv2_web_acl_association when var.enable_waf is true (default) and includes AWSManagedRulesKnownBadInputsRuleSet for Log4j protection; Checkov does not track the association across modules
3095
3581
  deployment_id = aws_api_gateway_deployment.api_deployment.id
@@ -3097,9 +3583,39 @@ resource "aws_api_gateway_stage" "api_stage" {
3097
3583
  stage_name = "prod"
3098
3584
  xray_tracing_enabled = true
3099
3585
 
3586
+ access_log_settings {
3587
+ destination_arn = aws_cloudwatch_log_group.access_logs.arn
3588
+ format = jsonencode({
3589
+ requestId = "$context.requestId"
3590
+ ip = "$context.identity.sourceIp"
3591
+ caller = "$context.identity.caller"
3592
+ user = "$context.identity.user"
3593
+ requestTime = "$context.requestTime"
3594
+ httpMethod = "$context.httpMethod"
3595
+ resourcePath = "$context.resourcePath"
3596
+ status = "$context.status"
3597
+ protocol = "$context.protocol"
3598
+ responseLength = "$context.responseLength"
3599
+ })
3600
+ }
3601
+
3100
3602
  tags = var.tags
3101
3603
 
3102
- depends_on = [aws_api_gateway_deployment.api_deployment]
3604
+ # Ensure the account-level role is configured before the stage is created
3605
+ depends_on = [aws_api_gateway_deployment.api_deployment, module.account]
3606
+ }
3607
+
3608
+ # Default throttling applied to all resource paths and methods
3609
+ resource "aws_api_gateway_method_settings" "throttling" {
3610
+ #checkov:skip=CKV_AWS_225:API Gateway caching not required for this use case
3611
+ rest_api_id = module.rest_api.api_id
3612
+ stage_name = aws_api_gateway_stage.api_stage.stage_name
3613
+ method_path = "*/*"
3614
+
3615
+ settings {
3616
+ throttling_rate_limit = 10000
3617
+ throttling_burst_limit = 5000
3618
+ }
3103
3619
  }
3104
3620
 
3105
3621
  # API Gateway Resource Policy
@@ -3249,6 +3765,11 @@ output "lambda_execution_role_name" {
3249
3765
  value = aws_iam_role.lambda_execution_role.name
3250
3766
  }
3251
3767
 
3768
+ output "security_group_id" {
3769
+ description = "Security group ID of the API Lambda function, for use in ingress rules on resources it must reach (e.g. a database). Null unless enable_vpc is true."
3770
+ value = var.enable_vpc ? aws_security_group.api_lambda[0].id : null
3771
+ }
3772
+
3252
3773
  # Integration Outputs
3253
3774
  output "integration_id" {
3254
3775
  description = "ID of the Lambda integration"
@@ -3286,7 +3807,7 @@ exports[`tsSmithyApiGenerator > terraform iac > should generate terraform with c
3286
3807
  required_providers {
3287
3808
  aws = {
3288
3809
  source = "hashicorp/aws"
3289
- version = "~> 6.33"
3810
+ version = "6.54.0"
3290
3811
  }
3291
3812
  }
3292
3813
  }
@@ -3308,11 +3829,47 @@ variable "additional_iam_policy_statements" {
3308
3829
  default = []
3309
3830
  }
3310
3831
 
3832
+ variable "appconfig_application_id" {
3833
+ description = "ID of the shared runtime-config AppConfig application (from \`core/runtime-config/appconfig.application_id\`). When set, the Lambda functions receive \`RUNTIME_CONFIG_APP_ID\` and read access to the application."
3834
+ type = string
3835
+ default = null
3836
+ }
3837
+
3838
+ variable "appconfig_application_arn" {
3839
+ description = "ARN of the shared runtime-config AppConfig application (from \`core/runtime-config/appconfig.application_arn\`). Used to scope the IAM read permission granted to the Lambda functions."
3840
+ type = string
3841
+ default = null
3842
+ }
3843
+
3311
3844
  variable "asset_bucket_name" {
3312
3845
  description = "Name of the shared asset S3 bucket used to stage the Lambda deployment zip. Instantiate the \`core/asset-bucket\` module once per deployment and pass its \`bucket_name\` output here."
3313
3846
  type = string
3314
3847
  }
3315
3848
 
3849
+ # VPC Configuration (optional)
3850
+ variable "enable_vpc" {
3851
+ description = "Deploy the Lambda function into a VPC. Set alongside vpc_id/subnet_ids."
3852
+ type = bool
3853
+ default = false
3854
+ }
3855
+
3856
+ variable "vpc_id" {
3857
+ description = "VPC ID to deploy the Lambda function into. Required when enable_vpc is true."
3858
+ type = string
3859
+ default = null
3860
+
3861
+ validation {
3862
+ condition = !var.enable_vpc || (var.vpc_id != null && var.subnet_ids != null)
3863
+ error_message = "vpc_id and subnet_ids must be set when enable_vpc is true."
3864
+ }
3865
+ }
3866
+
3867
+ variable "subnet_ids" {
3868
+ description = "Subnet IDs to deploy the Lambda function into. Required when enable_vpc is true."
3869
+ type = list(string)
3870
+ default = null
3871
+ }
3872
+
3316
3873
  # CORS Configuration (passed to core module)
3317
3874
 
3318
3875
  variable "cors_allow_headers" {
@@ -3375,6 +3932,11 @@ resource "aws_s3_object" "lambda_zip" {
3375
3932
  }
3376
3933
 
3377
3934
  # Use the core REST API module
3935
+ # Account-level CloudWatch role required for REST API access logging
3936
+ module "account" {
3937
+ source = "../../../core/api/api-gateway-account"
3938
+ }
3939
+
3378
3940
  module "rest_api" {
3379
3941
  source = "../../../core/api/rest-api"
3380
3942
 
@@ -3404,9 +3966,31 @@ resource "aws_wafv2_web_acl_association" "api_waf_association" {
3404
3966
  depends_on = [aws_api_gateway_stage.api_stage]
3405
3967
  }
3406
3968
 
3969
+ # Security group for the API Lambda function, used when deployed into a VPC
3970
+ resource "aws_security_group" "api_lambda" {
3971
+ count = var.enable_vpc ? 1 : 0
3972
+
3973
+ #checkov:skip=CKV2_AWS_5:Attached to api_lambda via vpc_config block; Checkov cannot resolve this reference
3974
+ name_prefix = "custom-api-lambda-"
3975
+ description = "Security group for the CustomApi API Lambda function"
3976
+ vpc_id = var.vpc_id
3977
+ tags = var.tags
3978
+ }
3979
+
3980
+ resource "aws_vpc_security_group_egress_rule" "api_lambda_https" {
3981
+ count = var.enable_vpc ? 1 : 0
3982
+
3983
+ security_group_id = aws_security_group.api_lambda[0].id
3984
+ cidr_ipv4 = "0.0.0.0/0"
3985
+ from_port = 443
3986
+ to_port = 443
3987
+ ip_protocol = "tcp"
3988
+ description = "Allow outbound HTTPS to AWS service endpoints"
3989
+ }
3990
+
3407
3991
  # Lambda function
3408
3992
  resource "aws_lambda_function" "api_lambda" {
3409
- #checkov:skip=CKV_AWS_117:Lambda function does not need to be in VPC for this use case
3993
+ #checkov:skip=CKV_AWS_117:Lambda function is optionally deployed into a VPC via vpc_id/subnet_ids; not required for this use case
3410
3994
  #checkov:skip=CKV_AWS_116:Dead Letter Queue not required for this simple API use case
3411
3995
  #checkov:skip=CKV_AWS_272:Code signing not required for this use case
3412
3996
  #checkov:skip=CKV_AWS_115:Concurrent execution limit not required for this use case
@@ -3428,13 +4012,25 @@ resource "aws_lambda_function" "api_lambda" {
3428
4012
  mode = "Active"
3429
4013
  }
3430
4014
 
4015
+ dynamic "vpc_config" {
4016
+ for_each = var.enable_vpc ? [1] : []
4017
+ content {
4018
+ subnet_ids = var.subnet_ids
4019
+ security_group_ids = [aws_security_group.api_lambda[0].id]
4020
+ }
4021
+ }
4022
+
3431
4023
 
3432
4024
  environment {
3433
4025
  variables = merge({
3434
- }, var.env)
4026
+ }, var.appconfig_application_id != null ? {
4027
+ RUNTIME_CONFIG_APP_ID = var.appconfig_application_id
4028
+ } : {}, var.env)
3435
4029
  }
3436
4030
 
3437
4031
  tags = var.tags
4032
+
4033
+ depends_on = [aws_iam_role_policy_attachment.lambda_vpc_access]
3438
4034
  }
3439
4035
 
3440
4036
  # IAM role for Lambda execution
@@ -3469,18 +4065,39 @@ resource "aws_iam_role_policy_attachment" "lambda_xray_execution" {
3469
4065
  role = aws_iam_role.lambda_execution_role.name
3470
4066
  }
3471
4067
 
4068
+ # Attach VPC access policy to Lambda role when deployed into a VPC
4069
+ resource "aws_iam_role_policy_attachment" "lambda_vpc_access" {
4070
+ count = var.enable_vpc ? 1 : 0
4071
+ policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
4072
+ role = aws_iam_role.lambda_execution_role.name
4073
+ }
4074
+
3472
4075
  # Additional IAM policies for Lambda (if provided)
3473
4076
  resource "aws_iam_role_policy" "lambda_additional_policies" {
3474
- count = length(var.additional_iam_policy_statements) > 0 ? 1 : 0
4077
+ count = length(local.lambda_policy_statements) > 0 ? 1 : 0
3475
4078
  name = "CustomApiHandler-additional-policies-\${random_string.suffix.result}"
3476
4079
  role = aws_iam_role.lambda_execution_role.id
3477
4080
 
3478
4081
  policy = jsonencode({
3479
4082
  Version = "2012-10-17"
3480
- Statement = var.additional_iam_policy_statements
4083
+ Statement = local.lambda_policy_statements
3481
4084
  })
3482
4085
  }
3483
4086
 
4087
+ locals {
4088
+ # Grant read access to the runtime-config AppConfig application when wired
4089
+ lambda_policy_statements = concat(var.appconfig_application_arn != null ? [
4090
+ {
4091
+ Effect = "Allow"
4092
+ Action = [
4093
+ "appconfig:StartConfigurationSession",
4094
+ "appconfig:GetLatestConfiguration"
4095
+ ]
4096
+ Resource = ["\${var.appconfig_application_arn}/*"]
4097
+ }
4098
+ ] : [], var.additional_iam_policy_statements)
4099
+ }
4100
+
3484
4101
  # CloudWatch Log Group for Lambda
3485
4102
  resource "aws_cloudwatch_log_group" "lambda_logs" {
3486
4103
  #checkov:skip=CKV_AWS_158:Using default CloudWatch log encryption
@@ -3700,11 +4317,63 @@ resource "aws_api_gateway_deployment" "api_deployment" {
3700
4317
  ]
3701
4318
  }
3702
4319
 
4320
+ # KMS key for encrypting access logs at rest
4321
+ resource "aws_kms_key" "access_logs" {
4322
+ description = "CustomApi API access log encryption"
4323
+ deletion_window_in_days = 7
4324
+ enable_key_rotation = true
4325
+
4326
+ policy = jsonencode({
4327
+ Version = "2012-10-17"
4328
+ Statement = [
4329
+ {
4330
+ Sid = "Enable IAM User Permissions"
4331
+ Effect = "Allow"
4332
+ Principal = { AWS = "arn:aws:iam::\${data.aws_caller_identity.current.account_id}:root" }
4333
+ Action = "kms:*"
4334
+ Resource = "*"
4335
+ },
4336
+ {
4337
+ Sid = "Allow CloudWatch Logs"
4338
+ Effect = "Allow"
4339
+ Principal = { Service = "logs.\${data.aws_region.current.region}.amazonaws.com" }
4340
+ Action = [
4341
+ "kms:Encrypt",
4342
+ "kms:Decrypt",
4343
+ "kms:ReEncrypt*",
4344
+ "kms:GenerateDataKey*",
4345
+ "kms:DescribeKey"
4346
+ ]
4347
+ Resource = "*"
4348
+ Condition = {
4349
+ ArnEquals = {
4350
+ "kms:EncryptionContext:aws:logs:arn" = "arn:aws:logs:\${data.aws_region.current.region}:\${data.aws_caller_identity.current.account_id}:log-group:/aws/apigateway/custom-api-\${random_string.suffix.result}/access"
4351
+ }
4352
+ }
4353
+ }
4354
+ ]
4355
+ })
4356
+
4357
+ tags = var.tags
4358
+ }
4359
+
4360
+ resource "aws_kms_alias" "access_logs" {
4361
+ name = "alias/custom-api-\${random_string.suffix.result}-access-logs"
4362
+ target_key_id = aws_kms_key.access_logs.key_id
4363
+ }
4364
+
4365
+ # Access logs for the API Gateway stage
4366
+ resource "aws_cloudwatch_log_group" "access_logs" {
4367
+ name = "/aws/apigateway/custom-api-\${random_string.suffix.result}/access"
4368
+ retention_in_days = 365
4369
+ kms_key_id = aws_kms_key.access_logs.arn
4370
+ tags = var.tags
4371
+ }
4372
+
3703
4373
  # API Gateway stage
3704
4374
  resource "aws_api_gateway_stage" "api_stage" {
3705
4375
  #checkov:skip=CKV_AWS_120:API Gateway caching not required for this use case
3706
- #checkov:skip=CKV_AWS_76:API Gateway access logging disabled due to account-level CloudWatch Logs role ARN requirement
3707
- #checkov:skip=CKV2_AWS_4:API Gateway logging level not applicable as access logging is disabled
4376
+ #checkov:skip=CKV2_AWS_4:Access logging is enabled below; verbose execution logging is intentionally not enabled
3708
4377
  #checkov:skip=CKV2_AWS_51:Client certificate authentication not required for this use case
3709
4378
  #checkov:skip=CKV2_AWS_77:WAFv2 Web ACL is attached via aws_wafv2_web_acl_association when var.enable_waf is true (default) and includes AWSManagedRulesKnownBadInputsRuleSet for Log4j protection; Checkov does not track the association across modules
3710
4379
  deployment_id = aws_api_gateway_deployment.api_deployment.id
@@ -3712,9 +4381,39 @@ resource "aws_api_gateway_stage" "api_stage" {
3712
4381
  stage_name = "prod"
3713
4382
  xray_tracing_enabled = true
3714
4383
 
4384
+ access_log_settings {
4385
+ destination_arn = aws_cloudwatch_log_group.access_logs.arn
4386
+ format = jsonencode({
4387
+ requestId = "$context.requestId"
4388
+ ip = "$context.identity.sourceIp"
4389
+ caller = "$context.identity.caller"
4390
+ user = "$context.identity.user"
4391
+ requestTime = "$context.requestTime"
4392
+ httpMethod = "$context.httpMethod"
4393
+ resourcePath = "$context.resourcePath"
4394
+ status = "$context.status"
4395
+ protocol = "$context.protocol"
4396
+ responseLength = "$context.responseLength"
4397
+ })
4398
+ }
4399
+
3715
4400
  tags = var.tags
3716
4401
 
3717
- depends_on = [aws_api_gateway_deployment.api_deployment]
4402
+ # Ensure the account-level role is configured before the stage is created
4403
+ depends_on = [aws_api_gateway_deployment.api_deployment, module.account]
4404
+ }
4405
+
4406
+ # Default throttling applied to all resource paths and methods
4407
+ resource "aws_api_gateway_method_settings" "throttling" {
4408
+ #checkov:skip=CKV_AWS_225:API Gateway caching not required for this use case
4409
+ rest_api_id = module.rest_api.api_id
4410
+ stage_name = aws_api_gateway_stage.api_stage.stage_name
4411
+ method_path = "*/*"
4412
+
4413
+ settings {
4414
+ throttling_rate_limit = 10000
4415
+ throttling_burst_limit = 5000
4416
+ }
3718
4417
  }
3719
4418
 
3720
4419
  # API Gateway Resource Policy
@@ -3853,6 +4552,11 @@ output "lambda_execution_role_name" {
3853
4552
  value = aws_iam_role.lambda_execution_role.name
3854
4553
  }
3855
4554
 
4555
+ output "security_group_id" {
4556
+ description = "Security group ID of the API Lambda function, for use in ingress rules on resources it must reach (e.g. a database). Null unless enable_vpc is true."
4557
+ value = var.enable_vpc ? aws_security_group.api_lambda[0].id : null
4558
+ }
4559
+
3856
4560
  # Integration Outputs
3857
4561
  output "integration_id" {
3858
4562
  description = "ID of the Lambda integration"