@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.
- package/LICENSE-THIRD-PARTY +5449 -4980
- package/README.md +7 -7
- package/executors.json +9 -0
- package/generators.json +101 -2
- package/package.json +35 -17
- package/src/agentcore-gateway/attach-upstream.d.ts +33 -0
- package/src/agentcore-gateway/attach-upstream.js +38 -0
- package/src/agentcore-gateway/attach-upstream.js.map +1 -0
- package/src/agentcore-gateway/files/cedar/policies/README.md +52 -0
- package/src/agentcore-gateway/files/cedar/policies/permit-all.cedar +11 -0
- package/src/agentcore-gateway/files/project/local-dev.ts.template +134 -0
- package/src/agentcore-gateway/gateway-connection/generator.d.ts +21 -0
- package/src/agentcore-gateway/gateway-connection/generator.js +101 -0
- package/src/agentcore-gateway/gateway-connection/generator.js.map +1 -0
- package/src/agentcore-gateway/gateway-connection/schema.d.js +6 -0
- package/src/agentcore-gateway/gateway-connection/schema.d.js.map +1 -0
- package/src/agentcore-gateway/gateway-connection/schema.d.ts +13 -0
- package/src/agentcore-gateway/gateway-connection/schema.json +31 -0
- package/src/agentcore-gateway/generator.d.ts +25 -0
- package/src/agentcore-gateway/generator.js +149 -0
- package/src/agentcore-gateway/generator.js.map +1 -0
- package/src/agentcore-gateway/mcp-connection/generator.d.ts +19 -0
- package/src/agentcore-gateway/mcp-connection/generator.js +59 -0
- package/src/agentcore-gateway/mcp-connection/generator.js.map +1 -0
- package/src/agentcore-gateway/mcp-connection/schema.d.js +6 -0
- package/src/agentcore-gateway/mcp-connection/schema.d.js.map +1 -0
- package/src/agentcore-gateway/mcp-connection/schema.d.ts +13 -0
- package/src/agentcore-gateway/mcp-connection/schema.json +31 -0
- package/src/agentcore-gateway/schema.d.js +6 -0
- package/src/agentcore-gateway/schema.d.js.map +1 -0
- package/src/agentcore-gateway/schema.d.ts +17 -0
- package/src/agentcore-gateway/schema.json +70 -0
- package/src/bin/aws-nx-mcp.js +14 -0
- package/src/bin/aws-nx-mcp.js.map +1 -0
- package/src/connection/{agent-serve-local.d.ts → agent-local-dev.d.ts} +7 -7
- package/src/connection/agent-local-dev.js +42 -0
- package/src/connection/agent-local-dev.js.map +1 -0
- package/src/connection/agent-runtime-config.d.ts +1 -1
- package/src/connection/agent-runtime-config.js +9 -14
- package/src/connection/agent-runtime-config.js.map +1 -1
- package/src/connection/generator.d.ts +7 -14
- package/src/connection/generator.js +167 -194
- package/src/connection/generator.js.map +1 -1
- package/src/connection/local-dev.d.ts +15 -0
- package/src/connection/local-dev.js +37 -0
- package/src/connection/local-dev.js.map +1 -0
- package/src/connection/schema.d.js +6 -0
- package/src/connection/schema.d.js.map +1 -0
- package/src/connection/schema.d.ts +1 -0
- package/src/connection/schema.json +5 -0
- package/src/connection/supported-connections.d.ts +107 -0
- package/src/connection/supported-connections.js +151 -0
- package/src/connection/supported-connections.js.map +1 -0
- package/src/index.js +2 -5
- package/src/index.js.map +1 -1
- package/src/infra/app/__snapshots__/generator.spec.ts.snap +97 -85
- package/src/infra/app/files/app/src/main.ts.template +1 -1
- package/src/infra/app/files/app/src/stages/application-stage.ts.template +1 -1
- package/src/infra/app/generator.d.ts +3 -3
- package/src/infra/app/generator.js +142 -122
- package/src/infra/app/generator.js.map +1 -1
- package/src/infra/app/schema.d.js +6 -0
- package/src/infra/app/schema.d.js.map +1 -0
- package/src/infra/app/schema.d.ts +1 -1
- package/src/infra/app/schema.json +5 -0
- package/src/init/generator.d.ts +18 -0
- package/src/init/generator.js +35 -0
- package/src/init/generator.js.map +1 -0
- package/src/init/schema.d.js +6 -0
- package/src/init/schema.d.js.map +1 -0
- package/src/init/schema.d.ts +16 -0
- package/src/init/schema.json +35 -0
- package/src/license/__snapshots__/config.spec.ts.snap +23 -0
- package/src/license/config-types.d.ts +18 -1
- package/src/license/config-types.js +8 -2
- package/src/license/config-types.js.map +1 -1
- package/src/license/config.d.ts +65 -7
- package/src/license/config.js +442 -109
- package/src/license/config.js.map +1 -1
- package/src/license/dependency-check/check.d.ts +16 -0
- package/src/license/dependency-check/check.js +116 -0
- package/src/license/dependency-check/check.js.map +1 -0
- package/src/license/dependency-check/collectors/collector.d.ts +21 -0
- package/src/license/dependency-check/collectors/collector.js +46 -0
- package/src/license/dependency-check/collectors/collector.js.map +1 -0
- package/src/license/dependency-check/collectors/npm-collector.d.ts +10 -0
- package/src/license/dependency-check/collectors/npm-collector.js +68 -0
- package/src/license/dependency-check/collectors/npm-collector.js.map +1 -0
- package/src/license/dependency-check/collectors/python-collector.d.ts +23 -0
- package/src/license/dependency-check/collectors/python-collector.js +114 -0
- package/src/license/dependency-check/collectors/python-collector.js.map +1 -0
- package/src/license/dependency-check/evaluator.d.ts +9 -0
- package/src/license/dependency-check/evaluator.js +94 -0
- package/src/license/dependency-check/evaluator.js.map +1 -0
- package/src/license/dependency-check/executor-schema.json +6 -0
- package/src/license/dependency-check/executor.d.ts +9 -0
- package/src/license/dependency-check/executor.js +51 -0
- package/src/license/dependency-check/executor.js.map +1 -0
- package/src/license/dependency-check/pre-approved.d.ts +6 -0
- package/src/license/dependency-check/pre-approved.js +1893 -0
- package/src/license/dependency-check/pre-approved.js.map +1 -0
- package/src/license/dependency-check/types.d.ts +45 -0
- package/src/license/dependency-check/types.js +6 -0
- package/src/license/dependency-check/types.js.map +1 -0
- package/src/license/generator.d.ts +3 -3
- package/src/license/generator.js +126 -30
- package/src/license/generator.js.map +1 -1
- package/src/license/index.d.ts +8 -0
- package/src/license/index.js +7 -0
- package/src/license/index.js.map +1 -0
- package/src/license/known-exceptions.d.ts +7 -0
- package/src/license/known-exceptions.js +39 -0
- package/src/license/known-exceptions.js.map +1 -0
- package/src/license/schema.d.js +6 -0
- package/src/license/schema.d.js.map +1 -0
- package/src/license/schema.d.ts +7 -0
- package/src/license/schema.json +11 -0
- package/src/license/sync/generator.d.ts +2 -2
- package/src/license/sync/generator.js +100 -125
- package/src/license/sync/generator.js.map +1 -1
- package/src/license/sync/project-file-sync.d.ts +3 -3
- package/src/license/sync/project-file-sync.js +28 -35
- package/src/license/sync/project-file-sync.js.map +1 -1
- package/src/mcp-server/generator-info.d.ts +5 -1
- package/src/mcp-server/generator-info.js +149 -165
- package/src/mcp-server/generator-info.js.map +1 -1
- package/src/mcp-server/guide-pipeline.d.ts +1 -1
- package/src/mcp-server/guide-pipeline.js +199 -206
- package/src/mcp-server/guide-pipeline.js.map +1 -1
- package/src/mcp-server/guide-render.js +10 -25
- package/src/mcp-server/guide-render.js.map +1 -1
- package/src/mcp-server/index.js +6 -10
- package/src/mcp-server/index.js.map +1 -1
- package/src/mcp-server/mdx-ast.js +42 -56
- package/src/mcp-server/mdx-ast.js.map +1 -1
- package/src/mcp-server/option-filter.js +33 -47
- package/src/mcp-server/option-filter.js.map +1 -1
- package/src/mcp-server/schema-registry.d.ts +9 -3
- package/src/mcp-server/schema-registry.js +41 -38
- package/src/mcp-server/schema-registry.js.map +1 -1
- package/src/mcp-server/schema.js +9 -7
- package/src/mcp-server/schema.js.map +1 -1
- package/src/mcp-server/server.js +22 -24
- package/src/mcp-server/server.js.map +1 -1
- package/src/mcp-server/tools/add-to-existing-project.d.ts +12 -0
- package/src/mcp-server/tools/add-to-existing-project.js +36 -0
- package/src/mcp-server/tools/add-to-existing-project.js.map +1 -0
- package/src/mcp-server/tools/create-workspace-command.d.ts +1 -1
- package/src/mcp-server/tools/create-workspace-command.js +23 -24
- package/src/mcp-server/tools/create-workspace-command.js.map +1 -1
- package/src/mcp-server/tools/general-guidance.d.ts +3 -3
- package/src/mcp-server/tools/general-guidance.js +47 -25
- package/src/mcp-server/tools/general-guidance.js.map +1 -1
- package/src/mcp-server/tools/generator-guide.d.ts +2 -2
- package/src/mcp-server/tools/generator-guide.js +29 -37
- package/src/mcp-server/tools/generator-guide.js.map +1 -1
- package/src/mcp-server/tools/list-generators.d.ts +2 -2
- package/src/mcp-server/tools/list-generators.js +19 -25
- package/src/mcp-server/tools/list-generators.js.map +1 -1
- package/src/open-api/ts-client/__snapshots__/generator.additional-properties.spec.ts.snap +147 -33
- package/src/open-api/ts-client/__snapshots__/generator.arrays.spec.ts.snap +308 -75
- package/src/open-api/ts-client/__snapshots__/generator.complex-types.spec.ts.snap +298 -74
- package/src/open-api/ts-client/__snapshots__/generator.composite-types.spec.ts.snap +748 -103
- package/src/open-api/ts-client/__snapshots__/generator.content-type.spec.ts.snap +230 -37
- package/src/open-api/ts-client/__snapshots__/generator.duplicate-types.spec.ts.snap +249 -52
- package/src/open-api/ts-client/__snapshots__/generator.edge-cases.spec.ts.snap +5535 -0
- package/src/open-api/ts-client/__snapshots__/generator.fast-api-gaps.spec.ts.snap +736 -0
- package/src/open-api/ts-client/__snapshots__/generator.fast-api.spec.ts.snap +305 -71
- package/src/open-api/ts-client/__snapshots__/generator.multipart.spec.ts.snap +298 -0
- package/src/open-api/ts-client/__snapshots__/generator.primitive-types.spec.ts.snap +353 -82
- package/src/open-api/ts-client/__snapshots__/generator.request.spec.ts.snap +176 -55
- package/src/open-api/ts-client/__snapshots__/generator.reserved-keywords.spec.ts.snap +101 -25
- package/src/open-api/ts-client/__snapshots__/generator.response.spec.ts.snap +147 -33
- package/src/open-api/ts-client/__snapshots__/generator.spec-compliance.spec.ts.snap +1883 -0
- package/src/open-api/ts-client/__snapshots__/generator.streaming.spec.ts.snap +392 -88
- package/src/open-api/ts-client/__snapshots__/generator.tags.spec.ts.snap +200 -48
- package/src/open-api/ts-client/files/client.gen.ts.template +358 -24
- package/src/open-api/ts-client/files/types.gen.ts.template +6 -4
- package/src/open-api/ts-client/generator.d.ts +3 -3
- package/src/open-api/ts-client/generator.js +41 -26
- package/src/open-api/ts-client/generator.js.map +1 -1
- package/src/open-api/ts-client/schema.d.js +6 -0
- package/src/open-api/ts-client/schema.d.js.map +1 -0
- package/src/open-api/ts-hooks/files/options-proxy.gen.ts.template +7 -2
- package/src/open-api/ts-hooks/generator.d.ts +3 -3
- package/src/open-api/ts-hooks/generator.js +17 -21
- package/src/open-api/ts-hooks/generator.js.map +1 -1
- package/src/open-api/ts-hooks/generator.spec.tsx +84 -14
- package/src/open-api/ts-hooks/schema.d.js +6 -0
- package/src/open-api/ts-hooks/schema.d.js.map +1 -0
- package/src/open-api/ts-metadata/generator.d.ts +3 -3
- package/src/open-api/ts-metadata/generator.js +12 -20
- package/src/open-api/ts-metadata/generator.js.map +1 -1
- package/src/open-api/ts-metadata/schema.d.js +6 -0
- package/src/open-api/ts-metadata/schema.d.js.map +1 -0
- package/src/open-api/utils/codegen-data/languages.d.ts +3 -5
- package/src/open-api/utils/codegen-data/languages.js +59 -66
- package/src/open-api/utils/codegen-data/languages.js.map +1 -1
- package/src/open-api/utils/codegen-data/types.d.ts +255 -10
- package/src/open-api/utils/codegen-data/types.js +54 -30
- package/src/open-api/utils/codegen-data/types.js.map +1 -1
- package/src/open-api/utils/codegen-data.d.ts +8 -4
- package/src/open-api/utils/codegen-data.js +494 -674
- package/src/open-api/utils/codegen-data.js.map +1 -1
- package/src/open-api/utils/normalise.d.ts +5 -1
- package/src/open-api/utils/normalise.js +437 -246
- package/src/open-api/utils/normalise.js.map +1 -1
- package/src/open-api/utils/parse.d.ts +2 -2
- package/src/open-api/utils/parse.js +11 -13
- package/src/open-api/utils/parse.js.map +1 -1
- package/src/open-api/utils/parser.d.ts +55 -0
- package/src/open-api/utils/parser.js +787 -0
- package/src/open-api/utils/parser.js.map +1 -0
- package/src/open-api/utils/refs.d.ts +1 -1
- package/src/open-api/utils/refs.js +12 -22
- package/src/open-api/utils/refs.js.map +1 -1
- package/src/open-api/utils/types.d.ts +18 -0
- package/src/open-api/utils/types.js +5 -2
- package/src/open-api/utils/types.js.map +1 -1
- package/src/preset/__snapshots__/generator.spec.ts.snap +109 -28
- package/src/preset/generator.d.ts +4 -4
- package/src/preset/generator.js +64 -147
- package/src/preset/generator.js.map +1 -1
- package/src/preset/schema.d.js +6 -0
- package/src/preset/schema.d.js.map +1 -0
- package/src/preset/schema.d.ts +5 -2
- package/src/preset/schema.json +11 -5
- package/src/py/agent/__snapshots__/generator.constructs.spec.ts.snap +320 -0
- package/src/py/agent/__snapshots__/generator.frameworks.spec.ts.snap +734 -0
- package/src/py/agent/__snapshots__/{generator.spec.ts.snap → generator.protocols.spec.ts.snap} +182 -314
- package/src/py/agent/a2a-connection/__snapshots__/generator.spec.ts.snap +189 -0
- package/src/py/agent/a2a-connection/files/agent-connection/app/__targetAgentSnakeCase___client_strands.py.template +30 -0
- package/src/py/agent/a2a-connection/files/langchain/agent-connection/app/__targetAgentSnakeCase___client_langchain.py.template +28 -0
- package/src/py/agent/a2a-connection/generator.d.ts +3 -3
- package/src/py/agent/a2a-connection/generator.js +113 -85
- package/src/py/agent/a2a-connection/generator.js.map +1 -1
- package/src/py/agent/a2a-connection/schema.d.js +8 -0
- package/src/py/agent/a2a-connection/schema.d.js.map +1 -0
- package/src/py/agent/a2a-connection/schema.d.ts +1 -0
- package/src/py/agent/a2a-connection/schema.json +5 -0
- package/src/py/agent/files/a2a-langchain/main.py.template +89 -0
- package/src/py/agent/files/ag-ui-langchain/main.py.template +83 -0
- package/src/py/agent/files/common/agent.py.template +2 -0
- package/src/py/agent/files/common-langchain/agent.py.template +30 -0
- package/src/py/agent/files/deploy/Dockerfile.template +1 -1
- package/src/py/agent/files/http/init.py.template +7 -25
- package/src/py/agent/files/http/main.py.template +3 -4
- package/src/py/agent/files/http-langchain/main.py.template +84 -0
- package/src/py/agent/gateway-connection/__snapshots__/generator.spec.ts.snap +184 -0
- package/src/py/agent/gateway-connection/files/agent-connection/app/__gatewaySnakeCase___client_strands.py.template +35 -0
- package/src/py/agent/gateway-connection/files/langchain/agent-connection/app/__gatewaySnakeCase___client_langchain.py.template +34 -0
- package/src/py/agent/gateway-connection/generator.d.ts +10 -0
- package/src/py/agent/gateway-connection/generator.js +119 -0
- package/src/py/agent/gateway-connection/generator.js.map +1 -0
- package/src/py/agent/gateway-connection/schema.d.js +6 -0
- package/src/py/agent/gateway-connection/schema.d.js.map +1 -0
- package/src/py/agent/gateway-connection/schema.d.ts +13 -0
- package/src/py/agent/gateway-connection/schema.json +31 -0
- package/src/py/agent/generator.d.ts +3 -3
- package/src/py/agent/generator.js +290 -179
- package/src/py/agent/generator.js.map +1 -1
- package/src/py/agent/mcp-connection/__snapshots__/generator.spec.ts.snap +153 -89
- package/src/py/agent/mcp-connection/files/agent-connection/app/__mcpServerSnakeCase___client_strands.py.template +30 -0
- package/src/py/agent/mcp-connection/files/langchain/agent-connection/app/__mcpServerSnakeCase___client_langchain.py.template +30 -0
- package/src/py/agent/mcp-connection/generator.d.ts +3 -3
- package/src/py/agent/mcp-connection/generator.js +65 -126
- package/src/py/agent/mcp-connection/generator.js.map +1 -1
- package/src/py/agent/mcp-connection/schema.d.js +8 -0
- package/src/py/agent/mcp-connection/schema.d.js.map +1 -0
- package/src/py/agent/mcp-connection/schema.d.ts +1 -0
- package/src/py/agent/mcp-connection/schema.json +5 -0
- package/src/py/agent/react-connection/__snapshots__/generator.spec.ts.snap +11 -19
- package/src/py/agent/react-connection/generator.d.ts +4 -4
- package/src/py/agent/react-connection/generator.js +55 -59
- package/src/py/agent/react-connection/generator.js.map +1 -1
- package/src/py/agent/react-connection/{serve-local.d.ts → local-dev.d.ts} +6 -6
- package/src/py/agent/react-connection/local-dev.js +36 -0
- package/src/py/agent/react-connection/local-dev.js.map +1 -0
- package/src/py/agent/react-connection/schema.d.js +8 -0
- package/src/py/agent/react-connection/schema.d.js.map +1 -0
- package/src/py/agent/react-connection/schema.d.ts +1 -0
- package/src/py/agent/react-connection/schema.json +5 -0
- package/src/py/agent/schema.d.js +6 -0
- package/src/py/agent/schema.d.js.map +1 -0
- package/src/py/agent/schema.d.ts +2 -1
- package/src/py/agent/schema.json +6 -1
- package/src/py/api/generator.d.ts +3 -3
- package/src/py/api/generator.js +12 -11
- package/src/py/api/generator.js.map +1 -1
- package/src/py/api/schema.d.js +6 -0
- package/src/py/api/schema.d.js.map +1 -0
- package/src/py/api/schema.d.ts +1 -0
- package/src/py/api/schema.json +5 -0
- package/src/py/dynamodb/__snapshots__/generator.spec.ts.snap +1526 -0
- package/src/py/dynamodb/agent-connection/__snapshots__/generator.spec.ts.snap +45 -0
- package/src/py/dynamodb/agent-connection/generator.d.ts +10 -0
- package/src/py/dynamodb/agent-connection/generator.js +39 -0
- package/src/py/dynamodb/agent-connection/generator.js.map +1 -0
- package/src/py/dynamodb/agent-connection/schema.d.js +8 -0
- package/src/py/dynamodb/agent-connection/schema.d.js.map +1 -0
- package/src/py/dynamodb/agent-connection/schema.d.ts +15 -0
- package/src/py/dynamodb/agent-connection/schema.json +27 -0
- package/src/py/dynamodb/fast-api-connection/__snapshots__/generator.spec.ts.snap +23 -0
- package/src/py/dynamodb/fast-api-connection/generator.d.ts +10 -0
- package/src/py/dynamodb/fast-api-connection/generator.js +37 -0
- package/src/py/dynamodb/fast-api-connection/generator.js.map +1 -0
- package/src/py/dynamodb/fast-api-connection/schema.d.js +8 -0
- package/src/py/dynamodb/fast-api-connection/schema.d.js.map +1 -0
- package/src/py/dynamodb/fast-api-connection/schema.d.ts +13 -0
- package/src/py/dynamodb/fast-api-connection/schema.json +23 -0
- package/src/py/dynamodb/files/__name__/__init__.py.template +6 -0
- package/src/py/dynamodb/files/__name__/client.py.template +39 -0
- package/src/py/dynamodb/files/__name__/entities/__init__.py.template +4 -0
- package/src/py/dynamodb/files/__name__/entities/base.py.template +63 -0
- package/src/py/dynamodb/files/__name__/entities/example.py.template +64 -0
- package/src/py/dynamodb/files/config.json.template +24 -0
- package/src/py/dynamodb/generator.d.ts +10 -0
- package/src/py/dynamodb/generator.js +110 -0
- package/src/py/dynamodb/generator.js.map +1 -0
- package/src/py/dynamodb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +45 -0
- package/src/py/dynamodb/mcp-server-connection/generator.d.ts +10 -0
- package/src/py/dynamodb/mcp-server-connection/generator.js +39 -0
- package/src/py/dynamodb/mcp-server-connection/generator.js.map +1 -0
- package/src/py/dynamodb/mcp-server-connection/schema.d.js +8 -0
- package/src/py/dynamodb/mcp-server-connection/schema.d.js.map +1 -0
- package/src/py/dynamodb/mcp-server-connection/schema.d.ts +15 -0
- package/src/py/dynamodb/mcp-server-connection/schema.json +27 -0
- package/src/py/dynamodb/schema.d.js +6 -0
- package/src/py/dynamodb/schema.d.js.map +1 -0
- package/src/py/dynamodb/schema.d.ts +16 -0
- package/src/py/dynamodb/schema.json +75 -0
- package/src/py/fast-api/__snapshots__/generator.spec.ts.snap +212 -4678
- package/src/py/fast-api/__snapshots__/generator.terraform.spec.ts.snap +5409 -0
- package/src/py/fast-api/files/app/__name__/init.py.template +5 -22
- package/src/py/fast-api/files/app/__name__/main.py.template +4 -1
- package/src/py/fast-api/generator.d.ts +3 -3
- package/src/py/fast-api/generator.js +90 -87
- package/src/py/fast-api/generator.js.map +1 -1
- package/src/py/fast-api/react/__snapshots__/generator.spec.ts.snap +4 -3
- package/src/py/fast-api/react/generator.d.ts +4 -4
- package/src/py/fast-api/react/generator.js +25 -25
- package/src/py/fast-api/react/generator.js.map +1 -1
- package/src/py/fast-api/react/open-api.d.ts +1 -1
- package/src/py/fast-api/react/open-api.js +31 -29
- package/src/py/fast-api/react/open-api.js.map +1 -1
- package/src/py/fast-api/react/schema.d.js +6 -0
- package/src/py/fast-api/react/schema.d.js.map +1 -0
- package/src/py/fast-api/react/schema.d.ts +1 -0
- package/src/py/fast-api/react/schema.json +5 -0
- package/src/py/fast-api/schema.d.js +6 -0
- package/src/py/fast-api/schema.d.js.map +1 -0
- package/src/py/fast-api/schema.d.ts +1 -0
- package/src/py/fast-api/schema.json +5 -0
- package/src/py/lambda-function/__snapshots__/generator.spec.ts.snap +4 -4
- package/src/py/lambda-function/generator.d.ts +3 -3
- package/src/py/lambda-function/generator.js +60 -59
- package/src/py/lambda-function/generator.js.map +1 -1
- package/src/py/lambda-function/schema.d.js +6 -0
- package/src/py/lambda-function/schema.d.js.map +1 -0
- package/src/py/lambda-function/schema.d.ts +1 -0
- package/src/py/lambda-function/schema.json +5 -0
- package/src/py/mcp-server/__snapshots__/generator.spec.ts.snap +208 -19
- package/src/py/mcp-server/files/deploy/Dockerfile.template +1 -1
- package/src/py/mcp-server/generator.d.ts +3 -3
- package/src/py/mcp-server/generator.js +162 -124
- package/src/py/mcp-server/generator.js.map +1 -1
- package/src/py/mcp-server/schema.d.js +6 -0
- package/src/py/mcp-server/schema.d.js.map +1 -0
- package/src/py/mcp-server/schema.d.ts +1 -0
- package/src/py/mcp-server/schema.json +5 -0
- package/src/py/project/generator.d.ts +17 -4
- package/src/py/project/generator.js +205 -127
- package/src/py/project/generator.js.map +1 -1
- package/src/py/project/schema.d.js +6 -0
- package/src/py/project/schema.d.js.map +1 -0
- package/src/py/project/schema.d.ts +1 -0
- package/src/py/project/schema.json +5 -0
- package/src/py/rdb/__snapshots__/generator.spec.ts.snap +2038 -0
- package/src/py/rdb/agent-connection/__snapshots__/generator.spec.ts.snap +104 -0
- package/src/py/rdb/agent-connection/generator.d.ts +10 -0
- package/src/py/rdb/agent-connection/generator.js +46 -0
- package/src/py/rdb/agent-connection/generator.js.map +1 -0
- package/src/py/rdb/agent-connection/schema.d.js +8 -0
- package/src/py/rdb/agent-connection/schema.d.js.map +1 -0
- package/src/py/rdb/agent-connection/schema.d.ts +15 -0
- package/src/py/rdb/agent-connection/schema.json +27 -0
- package/src/py/rdb/fast-api-connection/__snapshots__/generator.spec.ts.snap +44 -0
- package/src/py/rdb/fast-api-connection/files/__apiModuleName__/dependencies/__rdbNameSnake__.py.template +14 -0
- package/src/py/rdb/fast-api-connection/generator.d.ts +10 -0
- package/src/py/rdb/fast-api-connection/generator.js +54 -0
- package/src/py/rdb/fast-api-connection/generator.js.map +1 -0
- package/src/py/rdb/fast-api-connection/schema.d.js +8 -0
- package/src/py/rdb/fast-api-connection/schema.d.js.map +1 -0
- package/src/py/rdb/fast-api-connection/schema.d.ts +13 -0
- package/src/py/rdb/fast-api-connection/schema.json +23 -0
- package/src/py/rdb/files/Dockerfile.create-db-user.template +10 -0
- package/src/py/rdb/files/Dockerfile.migration.template +10 -0
- package/src/py/rdb/files/__name__/__init__.py.template +3 -0
- package/src/py/rdb/files/__name__/connection.py.template +55 -0
- package/src/py/rdb/files/__name__/create_db_user_handler.py.template +97 -0
- package/src/py/rdb/files/__name__/migration_handler.py.template +36 -0
- package/src/py/rdb/files/__name__/models/__init__.py.template +3 -0
- package/src/py/rdb/files/__name__/models/example.py.template +8 -0
- package/src/py/rdb/files/__name__/utils.py.template +104 -0
- package/src/py/rdb/files/alembic.ini.template +38 -0
- package/src/py/rdb/files/config.json.template +14 -0
- package/src/py/rdb/files/migrations/env.py.template +80 -0
- package/src/py/rdb/files/migrations/script.py.mako.template +28 -0
- package/src/py/rdb/generator.d.ts +6 -0
- package/src/py/rdb/generator.js +274 -0
- package/src/py/rdb/generator.js.map +1 -0
- package/src/py/rdb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +101 -0
- package/src/py/rdb/mcp-server-connection/generator.d.ts +10 -0
- package/src/py/rdb/mcp-server-connection/generator.js +46 -0
- package/src/py/rdb/mcp-server-connection/generator.js.map +1 -0
- package/src/py/rdb/mcp-server-connection/schema.d.js +8 -0
- package/src/py/rdb/mcp-server-connection/schema.d.js.map +1 -0
- package/src/py/rdb/mcp-server-connection/schema.d.ts +15 -0
- package/src/py/rdb/mcp-server-connection/schema.json +27 -0
- package/src/py/rdb/schema.d.js +6 -0
- package/src/py/rdb/schema.d.js.map +1 -0
- package/src/py/rdb/schema.d.ts +16 -0
- package/src/py/rdb/schema.json +77 -0
- package/src/py/rdb/utils.d.ts +6 -0
- package/src/py/rdb/utils.js +16 -0
- package/src/py/rdb/utils.js.map +1 -0
- package/src/sdk/agentcore-gateway.d.ts +6 -0
- package/src/sdk/agentcore-gateway.js +7 -0
- package/src/sdk/agentcore-gateway.js.map +1 -0
- package/src/sdk/connection.d.ts +6 -0
- package/src/sdk/connection.js +6 -0
- package/src/sdk/connection.js.map +1 -0
- package/src/sdk/license.d.ts +8 -0
- package/src/sdk/license.js +7 -0
- package/src/sdk/license.js.map +1 -0
- package/src/sdk/open-api.d.ts +10 -0
- package/src/sdk/open-api.js +8 -0
- package/src/sdk/open-api.js.map +1 -0
- package/src/sdk/py.d.ts +16 -0
- package/src/sdk/py.js +11 -0
- package/src/sdk/py.js.map +1 -0
- package/src/sdk/terraform.d.ts +6 -0
- package/src/sdk/terraform.js +7 -0
- package/src/sdk/terraform.js.map +1 -0
- package/src/sdk/ts.d.ts +33 -0
- package/src/sdk/ts.js +35 -0
- package/src/sdk/ts.js.map +1 -0
- package/{sdk → src/sdk}/utils/ast.d.ts +1 -2
- package/src/sdk/utils/ast.js +6 -0
- package/src/sdk/utils/ast.js.map +1 -0
- package/{sdk → src/sdk}/utils/format.d.ts +1 -1
- package/src/sdk/utils/format.js +6 -0
- package/src/sdk/utils/format.js.map +1 -0
- package/{sdk → src/sdk}/utils/test.d.ts +1 -1
- package/src/sdk/utils/test.js +6 -0
- package/src/sdk/utils/test.js.map +1 -0
- package/src/smithy/project/__snapshots__/generator.spec.ts.snap +19 -24
- package/src/smithy/project/files/build.Dockerfile.template +1 -4
- package/src/smithy/project/files/src/operations/echo.smithy.template +1 -0
- package/src/smithy/project/generator.d.ts +3 -3
- package/src/smithy/project/generator.js +64 -57
- package/src/smithy/project/generator.js.map +1 -1
- package/src/smithy/project/schema.d.js +6 -0
- package/src/smithy/project/schema.d.js.map +1 -0
- package/src/smithy/project/schema.d.ts +1 -0
- package/src/smithy/project/schema.json +5 -0
- package/src/smithy/react-connection/__snapshots__/generator.spec.ts.snap +1 -1
- package/src/smithy/react-connection/generator.d.ts +3 -3
- package/src/smithy/react-connection/generator.js +39 -47
- package/src/smithy/react-connection/generator.js.map +1 -1
- package/src/smithy/react-connection/schema.d.js +6 -0
- package/src/smithy/react-connection/schema.d.js.map +1 -0
- package/src/smithy/react-connection/schema.d.ts +1 -0
- package/src/smithy/react-connection/schema.json +5 -0
- package/src/smithy/ts/api/__snapshots__/generator.spec.ts.snap +824 -120
- package/src/smithy/ts/api/files/handler.ts.template +2 -2
- package/src/smithy/ts/api/files/local-server.ts.template +2 -2
- package/src/smithy/ts/api/files/operations/echo.ts.template +2 -2
- package/src/smithy/ts/api/files/service.ts.template +3 -3
- package/src/smithy/ts/api/generator.d.ts +3 -3
- package/src/smithy/ts/api/generator.js +128 -105
- package/src/smithy/ts/api/generator.js.map +1 -1
- package/src/smithy/ts/api/schema.d.js +6 -0
- package/src/smithy/ts/api/schema.d.js.map +1 -0
- package/src/smithy/ts/api/schema.d.ts +1 -0
- package/src/smithy/ts/api/schema.json +5 -0
- package/src/terraform/project/files/application/src/main.tf.template +6 -1
- package/src/terraform/project/files/application/src/providers.tf.template +1 -1
- package/src/terraform/project/generator.d.ts +3 -3
- package/src/terraform/project/generator.js +156 -104
- package/src/terraform/project/generator.js.map +1 -1
- package/src/terraform/project/schema.d.js +9 -0
- package/src/terraform/project/schema.d.js.map +1 -0
- package/src/terraform/project/schema.d.ts +1 -0
- package/src/terraform/project/schema.json +5 -0
- package/src/trpc/backend/__snapshots__/generator.spec.ts.snap +1099 -134
- package/src/trpc/backend/files/src/client/index.ts.template +1 -1
- package/src/trpc/backend/files/src/handler.ts.template +1 -1
- package/src/trpc/backend/files/src/index.ts.template +5 -5
- package/src/trpc/backend/files/src/init.ts.template +1 -1
- package/src/trpc/backend/files/src/local-server.ts.template +1 -1
- package/src/trpc/backend/files/src/middleware/index.ts.template +7 -7
- package/src/trpc/backend/files/src/procedures/echo.ts.template +3 -3
- package/src/trpc/backend/files/src/router.ts.template +2 -2
- package/src/trpc/backend/files/src/schema/echo.ts.template +2 -2
- package/src/trpc/backend/files/src/schema/index.ts.template +1 -1
- package/src/trpc/backend/generator.d.ts +4 -4
- package/src/trpc/backend/generator.js +98 -84
- package/src/trpc/backend/generator.js.map +1 -1
- package/src/trpc/backend/schema.d.js +6 -0
- package/src/trpc/backend/schema.d.js.map +1 -0
- package/src/trpc/backend/schema.d.ts +3 -2
- package/src/trpc/backend/schema.json +5 -0
- package/src/trpc/react/__snapshots__/generator.spec.ts.snap +4 -4
- package/src/trpc/react/files/src/components/__apiNameClassName__ClientProvider.tsx.template +3 -3
- package/src/trpc/react/generator.d.ts +4 -4
- package/src/trpc/react/generator.js +63 -58
- package/src/trpc/react/generator.js.map +1 -1
- package/src/trpc/react/schema.d.js +6 -0
- package/src/trpc/react/schema.d.js.map +1 -0
- package/src/trpc/react/schema.d.ts +1 -0
- package/src/trpc/react/schema.json +5 -0
- package/src/ts/agent/__snapshots__/generator.spec.ts.snap +781 -22
- package/src/ts/agent/a2a-connection/__snapshots__/generator.spec.ts.snap +256 -0
- package/src/ts/agent/a2a-connection/files/agent-connection/app/__targetAgentKebabCase__-client-strands.ts.template +23 -0
- package/src/ts/agent/a2a-connection/generator.d.ts +3 -3
- package/src/ts/agent/a2a-connection/generator.js +64 -55
- package/src/ts/agent/a2a-connection/generator.js.map +1 -1
- package/src/ts/agent/a2a-connection/schema.d.js +8 -0
- package/src/ts/agent/a2a-connection/schema.d.js.map +1 -0
- package/src/ts/agent/a2a-connection/schema.d.ts +1 -0
- package/src/ts/agent/a2a-connection/schema.json +5 -0
- package/src/ts/agent/files/a2a/index.ts.template +1 -1
- package/src/ts/agent/files/ag-ui/index.ts.template +1 -1
- package/src/ts/agent/files/common/agent.ts.template +6 -2
- package/src/ts/agent/files/deploy/Dockerfile.template +4 -1
- package/src/ts/agent/files/http/client.ts.template +2 -2
- package/src/ts/agent/files/http/index.ts.template +2 -2
- package/src/ts/agent/files/http/router.ts.template +5 -5
- package/src/ts/agent/gateway-connection/__snapshots__/generator.spec.ts.snap +220 -0
- package/src/ts/agent/gateway-connection/files/agent-connection/app/__gatewayKebabCase__-client-strands.ts.template +30 -0
- package/src/ts/agent/gateway-connection/generator.d.ts +10 -0
- package/src/ts/agent/gateway-connection/generator.js +116 -0
- package/src/ts/agent/gateway-connection/generator.js.map +1 -0
- package/src/ts/agent/gateway-connection/schema.d.js +6 -0
- package/src/ts/agent/gateway-connection/schema.d.js.map +1 -0
- package/src/ts/agent/gateway-connection/schema.d.ts +13 -0
- package/src/ts/agent/gateway-connection/schema.json +31 -0
- package/src/ts/agent/generator.d.ts +3 -3
- package/src/ts/agent/generator.js +203 -144
- package/src/ts/agent/generator.js.map +1 -1
- package/src/ts/agent/mcp-connection/__snapshots__/generator.spec.ts.snap +192 -111
- package/src/ts/agent/mcp-connection/files/agent-connection/app/__mcpServerKebabCase__-client-strands.ts.template +22 -0
- package/src/ts/agent/mcp-connection/generator.d.ts +3 -3
- package/src/ts/agent/mcp-connection/generator.js +54 -59
- package/src/ts/agent/mcp-connection/generator.js.map +1 -1
- package/src/ts/agent/mcp-connection/schema.d.js +8 -0
- package/src/ts/agent/mcp-connection/schema.d.js.map +1 -0
- package/src/ts/agent/mcp-connection/schema.d.ts +1 -0
- package/src/ts/agent/mcp-connection/schema.json +5 -0
- package/src/ts/agent/react-connection/generator.d.ts +4 -4
- package/src/ts/agent/react-connection/generator.js +86 -80
- package/src/ts/agent/react-connection/generator.js.map +1 -1
- package/src/ts/agent/react-connection/local-dev.d.ts +13 -0
- package/src/ts/agent/react-connection/local-dev.js +17 -0
- package/src/ts/agent/react-connection/local-dev.js.map +1 -0
- package/src/ts/agent/react-connection/schema.d.js +8 -0
- package/src/ts/agent/react-connection/schema.d.js.map +1 -0
- package/src/ts/agent/react-connection/schema.d.ts +1 -0
- package/src/ts/agent/react-connection/schema.json +5 -0
- package/src/ts/agent/schema.d.js +6 -0
- package/src/ts/agent/schema.d.js.map +1 -0
- package/src/ts/agent/schema.d.ts +1 -0
- package/src/ts/agent/schema.json +5 -0
- package/src/ts/api/generator.d.ts +3 -3
- package/src/ts/api/generator.js +16 -16
- package/src/ts/api/generator.js.map +1 -1
- package/src/ts/api/schema.d.js +6 -0
- package/src/ts/api/schema.d.js.map +1 -0
- package/src/ts/api/schema.d.ts +3 -1
- package/src/ts/api/schema.json +5 -0
- package/src/ts/astro-docs/__snapshots__/generator.spec.ts.snap +15 -16
- package/src/ts/astro-docs/files/translation/scripts/translate.ts.template +3 -2
- package/src/ts/astro-docs/generator.d.ts +3 -3
- package/src/ts/astro-docs/generator.js +71 -54
- package/src/ts/astro-docs/generator.js.map +1 -1
- package/src/ts/astro-docs/schema.d.js +6 -0
- package/src/ts/astro-docs/schema.d.js.map +1 -0
- package/src/ts/astro-docs/schema.d.ts +2 -2
- package/src/ts/astro-docs/schema.json +3 -3
- package/src/ts/docs/generator.d.ts +3 -3
- package/src/ts/docs/generator.js +10 -10
- package/src/ts/docs/generator.js.map +1 -1
- package/src/ts/docs/schema.d.js +6 -0
- package/src/ts/docs/schema.d.js.map +1 -0
- package/src/ts/docs/schema.d.ts +1 -4
- package/src/ts/docs/schema.json +3 -3
- package/src/ts/dynamodb/__snapshots__/generator.spec.ts.snap +400 -512
- package/src/ts/dynamodb/agent-connection/__snapshots__/generator.spec.ts.snap +5 -5
- package/src/ts/dynamodb/agent-connection/generator.d.ts +3 -3
- package/src/ts/dynamodb/agent-connection/generator.js +21 -23
- package/src/ts/dynamodb/agent-connection/generator.js.map +1 -1
- package/src/ts/dynamodb/agent-connection/schema.d.js +8 -0
- package/src/ts/dynamodb/agent-connection/schema.d.js.map +1 -0
- package/src/ts/dynamodb/agent-connection/schema.d.ts +1 -0
- package/src/ts/dynamodb/agent-connection/schema.json +5 -0
- package/src/ts/dynamodb/files/config.json.template +24 -0
- package/src/ts/dynamodb/files/src/client.ts.template +30 -11
- package/src/ts/dynamodb/files/src/entities/example.ts.template +1 -1
- package/src/ts/dynamodb/files/src/entities/index.ts.template +1 -1
- package/src/ts/dynamodb/files/src/index.ts.template +2 -11
- package/src/ts/dynamodb/generator.d.ts +3 -3
- package/src/ts/dynamodb/generator.js +73 -63
- package/src/ts/dynamodb/generator.js.map +1 -1
- package/src/ts/dynamodb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +5 -5
- package/src/ts/dynamodb/mcp-server-connection/generator.d.ts +3 -3
- package/src/ts/dynamodb/mcp-server-connection/generator.js +21 -23
- package/src/ts/dynamodb/mcp-server-connection/generator.js.map +1 -1
- package/src/ts/dynamodb/mcp-server-connection/schema.d.js +8 -0
- package/src/ts/dynamodb/mcp-server-connection/schema.d.js.map +1 -0
- package/src/ts/dynamodb/mcp-server-connection/schema.d.ts +1 -0
- package/src/ts/dynamodb/mcp-server-connection/schema.json +5 -0
- package/src/ts/dynamodb/schema.d.js +6 -0
- package/src/ts/dynamodb/schema.d.js.map +1 -0
- package/src/ts/dynamodb/schema.d.ts +2 -0
- package/src/ts/dynamodb/schema.json +25 -2
- package/src/ts/dynamodb/smithy-connection/__snapshots__/generator.spec.ts.snap +3 -3
- package/src/ts/dynamodb/smithy-connection/generator.d.ts +3 -3
- package/src/ts/dynamodb/smithy-connection/generator.js +20 -22
- package/src/ts/dynamodb/smithy-connection/generator.js.map +1 -1
- package/src/ts/dynamodb/smithy-connection/schema.d.js +8 -0
- package/src/ts/dynamodb/smithy-connection/schema.d.js.map +1 -0
- package/src/ts/dynamodb/smithy-connection/schema.d.ts +1 -0
- package/src/ts/dynamodb/smithy-connection/schema.json +5 -0
- package/src/ts/dynamodb/trpc-connection/__snapshots__/generator.spec.ts.snap +3 -3
- package/src/ts/dynamodb/trpc-connection/generator.d.ts +3 -3
- package/src/ts/dynamodb/trpc-connection/generator.js +20 -22
- package/src/ts/dynamodb/trpc-connection/generator.js.map +1 -1
- package/src/ts/dynamodb/trpc-connection/schema.d.js +8 -0
- package/src/ts/dynamodb/trpc-connection/schema.d.js.map +1 -0
- package/src/ts/dynamodb/trpc-connection/schema.d.ts +1 -0
- package/src/ts/dynamodb/trpc-connection/schema.json +5 -0
- package/src/ts/lambda-function/__snapshots__/generator.spec.ts.snap +4 -4
- package/src/ts/lambda-function/generator.d.ts +3 -3
- package/src/ts/lambda-function/generator.js +59 -56
- package/src/ts/lambda-function/generator.js.map +1 -1
- package/src/ts/lambda-function/io.js +83 -52
- package/src/ts/lambda-function/io.js.map +1 -1
- package/src/ts/lambda-function/schema.d.js +6 -0
- package/src/ts/lambda-function/schema.d.js.map +1 -0
- package/src/ts/lambda-function/schema.d.ts +1 -0
- package/src/ts/lambda-function/schema.json +5 -0
- package/src/ts/lib/__snapshots__/generator.spec.ts.snap +98 -93
- package/src/ts/lib/__snapshots__/vitest.spec.ts.snap +24 -0
- package/src/ts/lib/biome.d.ts +7 -0
- package/src/ts/lib/biome.js +91 -0
- package/src/ts/lib/biome.js.map +1 -0
- package/src/ts/lib/generator.d.ts +3 -3
- package/src/ts/lib/generator.js +107 -108
- package/src/ts/lib/generator.js.map +1 -1
- package/src/ts/lib/grit/vitest-pass-with-no-tests.grit +1 -4
- package/src/ts/lib/schema.d.js +6 -0
- package/src/ts/lib/schema.d.js.map +1 -0
- package/src/ts/lib/schema.d.ts +1 -1
- package/src/ts/lib/schema.json +5 -0
- package/src/ts/lib/ts-project-utils.d.ts +12 -2
- package/src/ts/lib/ts-project-utils.js +90 -67
- package/src/ts/lib/ts-project-utils.js.map +1 -1
- package/src/ts/lib/types.d.ts +6 -0
- package/src/ts/lib/types.js +5 -2
- package/src/ts/lib/types.js.map +1 -1
- package/src/ts/lib/vitest.d.ts +2 -2
- package/src/ts/lib/vitest.js +29 -26
- package/src/ts/lib/vitest.js.map +1 -1
- package/src/ts/mcp-server/__snapshots__/generator.spec.ts.snap +208 -42
- package/src/ts/mcp-server/files/Dockerfile.template +4 -1
- package/src/ts/mcp-server/generator.d.ts +3 -3
- package/src/ts/mcp-server/generator.js +181 -136
- package/src/ts/mcp-server/generator.js.map +1 -1
- package/src/ts/mcp-server/schema.d.js +6 -0
- package/src/ts/mcp-server/schema.d.js.map +1 -0
- package/src/ts/mcp-server/schema.d.ts +1 -0
- package/src/ts/mcp-server/schema.json +5 -0
- package/src/ts/nx-generator/__snapshots__/generator.spec.ts.snap +46 -26
- package/src/ts/nx-generator/files/common/schema.d.ts.template +1 -0
- package/src/ts/nx-generator/files/common/schema.json.template +5 -0
- package/src/ts/nx-generator/files/local/generator.ts.template +3 -3
- package/src/ts/nx-generator/files/nx-plugin-for-aws/generator/generator.ts.template +6 -7
- package/src/ts/nx-generator/generator.d.ts +2 -2
- package/src/ts/nx-generator/generator.js +113 -73
- package/src/ts/nx-generator/generator.js.map +1 -1
- package/src/ts/nx-generator/schema.d.js +6 -0
- package/src/ts/nx-generator/schema.d.js.map +1 -0
- package/src/ts/nx-generator/schema.d.ts +1 -0
- package/src/ts/nx-generator/schema.json +5 -0
- package/src/ts/nx-plugin/__snapshots__/generator.spec.ts.snap +30 -18
- package/src/ts/nx-plugin/files/mcp-server/server.ts.template +5 -5
- package/src/ts/nx-plugin/files/mcp-server/tools/create-workspace-command.ts.template +2 -2
- package/src/ts/nx-plugin/files/mcp-server/tools/general-guidance.ts.template +1 -1
- package/src/ts/nx-plugin/files/mcp-server/tools/generator-guide.ts.template +2 -2
- package/src/ts/nx-plugin/files/mcp-server/tools/list-generators.ts.template +2 -2
- package/src/ts/nx-plugin/files/mcp-server/utils.ts.template +3 -3
- package/src/ts/nx-plugin/generator.d.ts +3 -3
- package/src/ts/nx-plugin/generator.js +61 -50
- package/src/ts/nx-plugin/generator.js.map +1 -1
- package/src/ts/nx-plugin/schema.d.js +9 -0
- package/src/ts/nx-plugin/schema.d.js.map +1 -0
- package/src/ts/nx-plugin/schema.json +5 -0
- package/src/ts/nx-plugin/utils.d.ts +1 -1
- package/src/ts/nx-plugin/utils.js +36 -39
- package/src/ts/nx-plugin/utils.js.map +1 -1
- package/src/ts/rdb/__snapshots__/generator.spec.ts.snap +455 -646
- package/src/ts/rdb/agent-connection/__snapshots__/generator.spec.ts.snap +6 -6
- package/src/ts/rdb/agent-connection/generator.d.ts +3 -3
- package/src/ts/rdb/agent-connection/generator.js +38 -39
- package/src/ts/rdb/agent-connection/generator.js.map +1 -1
- package/src/ts/rdb/agent-connection/schema.d.js +8 -0
- package/src/ts/rdb/agent-connection/schema.d.js.map +1 -0
- package/src/ts/rdb/agent-connection/schema.d.ts +1 -0
- package/src/ts/rdb/agent-connection/schema.json +5 -0
- package/src/ts/rdb/files/Dockerfile.template +8 -1
- package/src/ts/rdb/files/config.json.template +14 -0
- package/src/ts/rdb/files/prisma.config.ts.template +6 -5
- package/src/ts/rdb/files/src/create-db-user-handler.ts.template +9 -11
- package/src/ts/rdb/files/src/index.ts.template +1 -2
- package/src/ts/rdb/files/src/migration-handler.ts.template +2 -29
- package/src/ts/rdb/files/src/prisma.ts.template +33 -25
- package/src/ts/rdb/files/src/utils.ts.template +3 -0
- package/src/ts/rdb/generator.d.ts +3 -7
- package/src/ts/rdb/generator.js +173 -131
- package/src/ts/rdb/generator.js.map +1 -1
- package/src/ts/rdb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +6 -6
- package/src/ts/rdb/mcp-server-connection/generator.d.ts +3 -3
- package/src/ts/rdb/mcp-server-connection/generator.js +36 -37
- package/src/ts/rdb/mcp-server-connection/generator.js.map +1 -1
- package/src/ts/rdb/mcp-server-connection/schema.d.js +8 -0
- package/src/ts/rdb/mcp-server-connection/schema.d.js.map +1 -0
- package/src/ts/rdb/mcp-server-connection/schema.d.ts +1 -0
- package/src/ts/rdb/mcp-server-connection/schema.json +5 -0
- package/src/ts/rdb/schema.d.js +6 -0
- package/src/ts/rdb/schema.d.js.map +1 -0
- package/src/ts/rdb/schema.d.ts +1 -0
- package/src/ts/rdb/schema.json +6 -1
- package/src/ts/rdb/smithy-connection/__snapshots__/generator.spec.ts.snap +3 -3
- package/src/ts/rdb/smithy-connection/generator.d.ts +3 -3
- package/src/ts/rdb/smithy-connection/generator.js +46 -43
- package/src/ts/rdb/smithy-connection/generator.js.map +1 -1
- package/src/ts/rdb/smithy-connection/schema.d.js +8 -0
- package/src/ts/rdb/smithy-connection/schema.d.js.map +1 -0
- package/src/ts/rdb/smithy-connection/schema.d.ts +1 -0
- package/src/ts/rdb/smithy-connection/schema.json +5 -0
- package/src/ts/rdb/trpc-connection/__snapshots__/generator.spec.ts.snap +3 -3
- package/src/ts/rdb/trpc-connection/generator.d.ts +3 -3
- package/src/ts/rdb/trpc-connection/generator.js +36 -31
- package/src/ts/rdb/trpc-connection/generator.js.map +1 -1
- package/src/ts/rdb/trpc-connection/schema.d.js +8 -0
- package/src/ts/rdb/trpc-connection/schema.d.js.map +1 -0
- package/src/ts/rdb/trpc-connection/schema.d.ts +1 -0
- package/src/ts/rdb/trpc-connection/schema.json +5 -0
- package/src/ts/rdb/utils.d.ts +1 -1
- package/src/ts/rdb/utils.js +9 -11
- package/src/ts/rdb/utils.js.map +1 -1
- package/src/ts/react-website/agui/files/common/src/hooks/useAgui__agentNameClassName__.tsx.template +1 -16
- package/src/ts/react-website/agui/generator.d.ts +1 -1
- package/src/ts/react-website/agui/generator.js +69 -62
- package/src/ts/react-website/agui/generator.js.map +1 -1
- package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +1190 -799
- package/src/ts/react-website/app/generator.d.ts +4 -4
- package/src/ts/react-website/app/generator.js +217 -192
- package/src/ts/react-website/app/generator.js.map +1 -1
- package/src/ts/react-website/app/schema.d.js +6 -0
- package/src/ts/react-website/app/schema.d.js.map +1 -0
- package/src/ts/react-website/app/schema.d.ts +1 -1
- package/src/ts/react-website/app/schema.json +11 -6
- package/src/ts/react-website/cognito-auth/__snapshots__/generator.spec.ts.snap +129 -18
- package/src/ts/react-website/cognito-auth/__snapshots__/generator.terraform.spec.ts.snap +36 -10
- package/src/ts/react-website/cognito-auth/__snapshots__/generator.ux-provider.spec.ts.snap +0 -20
- package/src/ts/react-website/cognito-auth/files/app/components/CognitoAuth/index.tsx.template +2 -2
- package/src/ts/react-website/cognito-auth/generator.d.ts +4 -4
- package/src/ts/react-website/cognito-auth/generator.js +64 -63
- package/src/ts/react-website/cognito-auth/generator.js.map +1 -1
- package/src/ts/react-website/cognito-auth/grit/cloudscape-auth-menu.grit +8 -6
- package/src/ts/react-website/cognito-auth/grit/cognito-auth-wrapper.grit +1 -1
- package/src/ts/react-website/cognito-auth/grit/none-auth-menu.grit +1 -0
- package/src/ts/react-website/cognito-auth/grit/shadcn-auth-menu.grit +3 -1
- package/src/ts/react-website/cognito-auth/grit/shadcn-state-declarations.grit +3 -1
- package/src/ts/react-website/cognito-auth/schema.d.js +6 -0
- package/src/ts/react-website/cognito-auth/schema.d.js.map +1 -0
- package/src/ts/react-website/cognito-auth/schema.d.ts +1 -0
- package/src/ts/react-website/cognito-auth/schema.json +5 -0
- package/src/ts/react-website/cognito-auth/utils.d.ts +1 -1
- package/src/ts/react-website/cognito-auth/utils.js +34 -32
- package/src/ts/react-website/cognito-auth/utils.js.map +1 -1
- package/src/ts/react-website/runtime-config/__snapshots__/generator.spec.ts.snap +2 -2
- package/src/ts/react-website/runtime-config/files/app/components/RuntimeConfig/index.tsx.template +2 -2
- package/src/ts/react-website/runtime-config/generator.d.ts +3 -3
- package/src/ts/react-website/runtime-config/generator.js +29 -31
- package/src/ts/react-website/runtime-config/generator.js.map +1 -1
- package/src/ts/react-website/runtime-config/schema.d.js +6 -0
- package/src/ts/react-website/runtime-config/schema.d.js.map +1 -0
- package/src/ts/react-website/runtime-config/schema.d.ts +1 -0
- package/src/ts/react-website/runtime-config/schema.json +5 -0
- package/src/ts/sync/generator.d.ts +3 -3
- package/src/ts/sync/generator.js +58 -59
- package/src/ts/sync/generator.js.map +1 -1
- package/src/ts/website/app/generator.d.ts +3 -3
- package/src/ts/website/app/generator.js +10 -10
- package/src/ts/website/app/generator.js.map +1 -1
- package/src/ts/website/app/schema.d.js +6 -0
- package/src/ts/website/app/schema.d.js.map +1 -0
- package/src/ts/website/app/schema.d.ts +1 -1
- package/src/ts/website/app/schema.json +11 -6
- package/src/ts/website/auth/generator.d.ts +4 -4
- package/src/ts/website/auth/generator.js +11 -10
- package/src/ts/website/auth/generator.js.map +1 -1
- package/src/ts/website/auth/schema.d.js +6 -0
- package/src/ts/website/auth/schema.d.js.map +1 -0
- package/src/ts/website/auth/schema.d.ts +1 -0
- package/src/ts/website/auth/schema.json +5 -0
- package/src/utils/agent-chat/agent-chat.d.ts +31 -0
- package/src/utils/agent-chat/agent-chat.js +31 -0
- package/src/utils/agent-chat/agent-chat.js.map +1 -0
- package/src/utils/agent-chat/files/a2a/chat.ts.template +33 -0
- package/src/utils/agent-chat/files/ag-ui/chat.ts.template +17 -0
- package/src/utils/agent-chat/files/common/agentcore.ts.template +81 -0
- package/src/utils/agent-chat/files/http-py/chat.ts.template +43 -0
- package/src/utils/agent-chat/files/http-ts/chat.ts.template +54 -0
- package/src/utils/agent-connection/agent-connection.d.ts +117 -25
- package/src/utils/agent-connection/agent-connection.js +414 -103
- package/src/utils/agent-connection/agent-connection.js.map +1 -1
- package/src/utils/agent-connection/files/core-a2a/agentcore-a2a-client-config.ts.template +93 -0
- package/src/utils/agent-connection/files/core-auth/agentcore-endpoints.ts.template +37 -0
- package/src/utils/agent-connection/files/core-auth/agentcore-fetch.ts.template +54 -0
- package/src/utils/agent-connection/files/core-gateway/agentcore-gateway-mcp-transport.ts.template +41 -0
- package/src/utils/agent-connection/files/core-mcp/agentcore-mcp-transport.ts.template +70 -0
- package/src/utils/agent-connection/files/core-runtime-config/runtime-config.ts.template +22 -32
- package/src/utils/agent-connection/files/core-shared/agentcore-transport.ts.template +39 -0
- package/src/utils/agent-connection/files/core-strands/a2a/agentcore-a2a-client-strands.ts.template +61 -0
- package/src/utils/agent-connection/files/core-strands/base/model-errors-strands.ts.template +36 -0
- 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
- package/src/utils/agent-connection/files/core-strands/gateway/agentcore-gateway-mcp-client-strands.ts.template +26 -0
- package/src/utils/agent-connection/files/core-strands/mcp/agentcore-mcp-client-strands.ts.template +27 -0
- package/src/utils/agent-connection/files/py-core-a2a/agentcore_a2a_client_config.py.template +43 -0
- package/src/utils/agent-connection/files/py-core-auth/agentcore_endpoints.py.template +47 -0
- package/src/utils/agent-connection/files/py-core-auth/auth/session.py.template +51 -0
- package/src/utils/agent-connection/files/py-core-gateway/agentcore_gateway_mcp_transport.py.template +28 -0
- package/src/utils/agent-connection/files/py-core-langchain/a2a/agentcore_a2a_client_langchain.py.template +99 -0
- package/src/utils/agent-connection/files/py-core-langchain/gateway/agentcore_gateway_mcp_client_langchain.py.template +57 -0
- package/src/utils/agent-connection/files/py-core-langchain/mcp/agentcore_mcp_client_langchain.py.template +64 -0
- package/src/utils/agent-connection/files/py-core-mcp/agentcore_mcp_transport.py.template +34 -0
- package/src/utils/agent-connection/files/py-core-runtime-config/runtime_config.py.template +5 -18
- package/src/utils/agent-connection/files/py-core-shared/agentcore_transport.py.template +40 -0
- package/src/utils/agent-connection/files/py-core-strands/a2a/agentcore_a2a_client_strands.py.template +66 -0
- package/src/utils/agent-connection/files/py-core-strands/base/model_errors_strands.py.template +40 -0
- package/src/utils/agent-connection/files/py-core-strands/gateway/agentcore_gateway_mcp_client_strands.py.template +22 -0
- package/src/utils/agent-connection/files/py-core-strands/mcp/agentcore_mcp_client_strands.py.template +30 -0
- package/src/utils/agent-core-constructs/agent-core-constructs.d.ts +11 -3
- package/src/utils/agent-core-constructs/agent-core-constructs.js +93 -38
- package/src/utils/agent-core-constructs/agent-core-constructs.js.map +1 -1
- package/src/utils/agent-core-constructs/files/cdk/app/agent-core/__nameKebabCase__/__nameKebabCase__.ts.template +31 -4
- package/src/utils/agent-core-constructs/files/cdk/app/agentcore-gateway/__nameKebabCase__/__nameKebabCase__.ts.template +50 -0
- package/src/utils/agent-core-constructs/files/cdk/core/agentcore-gateway/agentcore-gateway.ts.template +487 -0
- package/src/utils/agent-core-constructs/files/cdk/core/agentcore-gateway/readiness-probe/index.js.template +55 -0
- package/src/utils/agent-core-constructs/files/terraform/app/agent-core/__nameKebabCase__/__nameKebabCase__.tf.template +32 -0
- package/src/utils/agent-core-constructs/files/terraform/app/agentcore-gateway/__nameKebabCase__/__nameKebabCase__.tf.template +449 -0
- package/src/utils/agent-core-constructs/files/terraform/app/agentcore-gateway/__nameKebabCase__/render-cedar.cjs.template +13 -0
- package/src/utils/agent-core-constructs/files/terraform/core/agent-core/runtime.tf.template +151 -13
- package/src/utils/agent-core-constructs/files/terraform/core/agentcore-gateway/gateway.tf.template +14 -0
- package/src/utils/api-constructs/api-constructs.d.ts +2 -2
- package/src/utils/api-constructs/api-constructs.js +36 -31
- package/src/utils/api-constructs/api-constructs.js.map +1 -1
- package/src/utils/api-constructs/files/cdk/app/apis/http/__apiNameKebabCase__.ts.template +8 -8
- package/src/utils/api-constructs/files/cdk/app/apis/rest/__apiNameKebabCase__.ts.template +11 -8
- package/src/utils/api-constructs/files/cdk/core/api/http/http-api.ts.template +26 -9
- package/src/utils/api-constructs/files/cdk/core/api/rest/api-gateway-account/index.js.template +70 -0
- package/src/utils/api-constructs/files/cdk/core/api/rest/api-gateway-account.ts.template +82 -0
- package/src/utils/api-constructs/files/cdk/core/api/rest/rest-api.ts.template +54 -18
- package/src/utils/api-constructs/files/cdk/core/api/trpc/trpc-utils.ts.template +1 -1
- package/src/utils/api-constructs/files/cdk/core/api/utils/utils.ts.template +61 -7
- package/src/utils/api-constructs/files/terraform/app/apis/http/__apiNameKebabCase__/__apiNameKebabCase__.tf.template +101 -12
- package/src/utils/api-constructs/files/terraform/app/apis/rest/__apiNameKebabCase__/__apiNameKebabCase__.tf.template +194 -8
- package/src/utils/api-constructs/files/terraform/core/api/http/http-api/http-api.tf.template +1 -1
- package/src/utils/api-constructs/files/terraform/core/api/rest/api-gateway-account/api-gateway-account.tf.template +83 -0
- package/src/utils/api-constructs/files/terraform/core/api/rest/rest-api/rest-api.tf.template +5 -11
- package/src/utils/api-constructs/open-api-metadata.d.ts +2 -2
- package/src/utils/api-constructs/open-api-metadata.js +22 -22
- package/src/utils/api-constructs/open-api-metadata.js.map +1 -1
- package/src/utils/ast/website.d.ts +5 -1
- package/src/utils/ast/website.js +18 -20
- package/src/utils/ast/website.js.map +1 -1
- package/src/utils/ast.d.ts +33 -1
- package/src/utils/ast.js +146 -70
- package/src/utils/ast.js.map +1 -1
- package/src/utils/base-tsconfig.d.ts +30 -0
- package/src/utils/base-tsconfig.js +32 -0
- package/src/utils/base-tsconfig.js.map +1 -0
- package/src/utils/bundle/bundle.d.ts +1 -1
- package/src/utils/bundle/bundle.js +50 -47
- package/src/utils/bundle/bundle.js.map +1 -1
- package/src/utils/commands.d.ts +10 -3
- package/src/utils/commands.js +60 -26
- package/src/utils/commands.js.map +1 -1
- package/src/utils/config/index.d.ts +5 -5
- package/src/utils/config/index.js +5 -4
- package/src/utils/config/index.js.map +1 -1
- package/src/utils/config/utils.d.ts +13 -3
- package/src/utils/config/utils.js +65 -43
- package/src/utils/config/utils.js.map +1 -1
- package/src/utils/connection/open-api/files/components/__apiNameClassName__Provider.tsx.template +1 -1
- package/src/utils/connection/open-api/react.d.ts +6 -6
- package/src/utils/connection/open-api/react.js +81 -77
- package/src/utils/connection/open-api/react.js.map +1 -1
- package/src/utils/containers.d.ts +1 -1
- package/src/utils/containers.js +22 -23
- package/src/utils/containers.js.map +1 -1
- package/src/utils/docker.d.ts +44 -0
- package/src/utils/docker.js +81 -0
- package/src/utils/docker.js.map +1 -0
- package/src/utils/dynamodb-constructs/dynamodb-constructs.d.ts +3 -3
- package/src/utils/dynamodb-constructs/dynamodb-constructs.js +39 -41
- package/src/utils/dynamodb-constructs/dynamodb-constructs.js.map +1 -1
- package/src/utils/dynamodb-constructs/files/cdk/app/dynamodb/__nameKebabCase__.ts.template +18 -5
- package/src/utils/dynamodb-constructs/files/cdk/core/dynamodb.ts.template +1 -1
- package/src/utils/dynamodb-constructs/files/terraform/app/dynamodb/__nameKebabCase__/__nameKebabCase__.tf.template +24 -17
- package/src/utils/dynamodb-constructs/files/terraform/core/dynamodb/dynamodb.tf.template +1 -1
- package/src/utils/files/common/constructs/src/core/index.ts.template +4 -4
- package/src/utils/files/common/constructs/src/index.ts.template +2 -2
- package/src/utils/files/common/infra-config/src/index.ts.template +3 -3
- package/src/utils/files/common/infra-config/src/resolve-stage.ts.template +2 -2
- package/src/utils/files/common/infra-config/src/stages.config.ts.template +1 -1
- package/src/{ts/dynamodb/files/scripts → utils/files/common/scripts/src/dynamodb}/create-local-table.ts.template +65 -31
- package/src/utils/files/common/scripts/src/dynamodb/pull-image.ts.template +13 -0
- package/src/utils/files/common/scripts/src/dynamodb/start-container.ts.template +106 -0
- package/src/utils/files/common/scripts/src/infra/infra-deploy.ts.template +2 -0
- package/src/utils/files/common/scripts/src/infra/infra-destroy.ts.template +2 -0
- package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/cdk-command.ts.template +6 -3
- package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/run.ts.template +3 -3
- package/src/utils/files/common/scripts/src/rdb/mysql/wait-for-mysql-db.ts.template +32 -0
- package/src/utils/files/common/scripts/src/rdb/postgres/wait-for-postgres-db.ts.template +32 -0
- package/src/utils/files/common/scripts/src/rdb/shared/pull-image.ts.template +16 -0
- package/src/utils/files/common/scripts/src/rdb/shared/start-container.ts.template +117 -0
- package/src/utils/files/common/shadcn/src/index.ts.template +2 -2
- package/src/utils/files/terraform/src/core/asset-bucket/asset-bucket.tf.template +63 -72
- package/src/utils/files/terraform/src/core/runtime-config/appconfig/appconfig.tf.template +1 -1
- package/src/utils/files/terraform/src/core/runtime-config/appconfig-deployment/appconfig-deployment.tf.template +12 -6
- package/src/utils/files/terraform/src/core/runtime-config/entry/entry.tf.template +1 -1
- package/src/utils/files/terraform/src/core/runtime-config/read/read.tf.template +9 -4
- package/src/utils/files/website/hooks/sigv4/useSigV4.tsx.template +1 -1
- package/src/utils/format.d.ts +45 -2
- package/src/utils/format.js +332 -81
- package/src/utils/format.js.map +1 -1
- package/src/utils/fs.d.ts +1 -1
- package/src/utils/fs.js +14 -13
- package/src/utils/fs.js.map +1 -1
- package/src/utils/function-constructs/files/cdk/app/lambda-functions/__nameKebabCase__.ts.template +1 -1
- package/src/utils/function-constructs/files/terraform/app/lambda-functions/__nameKebabCase__/__nameKebabCase__.tf.template +2 -2
- package/src/utils/function-constructs/function-constructs.d.ts +2 -2
- package/src/utils/function-constructs/function-constructs.js +22 -25
- package/src/utils/function-constructs/function-constructs.js.map +1 -1
- package/src/utils/generators.d.ts +4 -0
- package/src/utils/generators.js +18 -20
- package/src/utils/generators.js.map +1 -1
- package/src/utils/git.d.ts +1 -1
- package/src/utils/git.js +19 -34
- package/src/utils/git.js.map +1 -1
- package/src/utils/iac-providers.js +5 -5
- package/src/utils/iac-providers.js.map +1 -1
- package/src/utils/iac.d.ts +1 -1
- package/src/utils/iac.js +12 -14
- package/src/utils/iac.js.map +1 -1
- package/src/utils/identity-constructs/files/cdk/core/user-identity.ts.template +125 -16
- package/src/utils/identity-constructs/files/terraform/core/user-identity/add-callback-url/add-callback-url.tf.template +28 -9
- package/src/utils/identity-constructs/files/terraform/core/user-identity/identity/identity.tf.template +106 -6
- package/src/utils/identity-constructs/files/terraform/core/user-identity/main.tf.template +7 -0
- package/src/utils/identity-constructs/identity-constructs.d.ts +2 -2
- package/src/utils/identity-constructs/identity-constructs.js +28 -28
- package/src/utils/identity-constructs/identity-constructs.js.map +1 -1
- package/src/utils/init.d.ts +53 -0
- package/src/utils/init.js +252 -0
- package/src/utils/init.js.map +1 -0
- package/src/utils/install.d.ts +32 -0
- package/src/utils/install.js +56 -0
- package/src/utils/install.js.map +1 -0
- package/src/utils/js.d.ts +4 -0
- package/src/utils/js.js +27 -20
- package/src/utils/js.js.map +1 -1
- package/src/utils/mcp.d.ts +1 -1
- package/src/utils/mcp.js +34 -41
- package/src/utils/mcp.js.map +1 -1
- package/src/utils/metrics.d.ts +9 -3
- package/src/utils/metrics.js +61 -46
- package/src/utils/metrics.js.map +1 -1
- package/src/utils/mock-project-graph.js +8 -12
- package/src/utils/mock-project-graph.js.map +1 -1
- package/src/utils/module-format.d.ts +28 -0
- package/src/utils/module-format.js +28 -0
- package/src/utils/module-format.js.map +1 -0
- package/src/utils/names.d.ts +22 -0
- package/src/utils/names.js +44 -48
- package/src/utils/names.js.map +1 -1
- package/src/utils/npm-scope.d.ts +1 -1
- package/src/utils/npm-scope.js +9 -17
- package/src/utils/npm-scope.js.map +1 -1
- package/src/utils/nx.d.ts +39 -4
- package/src/utils/nx.js +169 -75
- package/src/utils/nx.js.map +1 -1
- package/src/utils/nxlv-python.d.ts +1 -1
- package/src/utils/nxlv-python.js +27 -15
- package/src/utils/nxlv-python.js.map +1 -1
- package/src/utils/object.js +5 -11
- package/src/utils/object.js.map +1 -1
- package/src/utils/paths.d.ts +1 -1
- package/src/utils/paths.js +11 -15
- package/src/utils/paths.js.map +1 -1
- package/src/utils/pkg-manager.js +4 -9
- package/src/utils/pkg-manager.js.map +1 -1
- package/src/utils/pnpm-workspace.d.ts +1 -1
- package/src/utils/pnpm-workspace.js +22 -22
- package/src/utils/pnpm-workspace.js.map +1 -1
- package/src/utils/port.d.ts +29 -7
- package/src/utils/port.js +67 -28
- package/src/utils/port.js.map +1 -1
- package/src/utils/py.d.ts +16 -3
- package/src/utils/py.js +72 -47
- package/src/utils/py.js.map +1 -1
- package/src/utils/rdb-constructs/files/cdk/app/dbs/__nameKebabCase__.ts.template +72 -18
- package/src/utils/rdb-constructs/files/cdk/core/rdb/aurora.ts.template +97 -88
- package/src/utils/rdb-constructs/files/terraform/app/dbs/__nameKebabCase__/__nameKebabCase__.tf.template +127 -53
- package/src/utils/rdb-constructs/files/terraform/core/rdb/aurora/aurora.tf.template +36 -48
- package/src/utils/rdb-constructs/rdb-constructs.d.ts +16 -5
- package/src/utils/rdb-constructs/rdb-constructs.js +38 -41
- package/src/utils/rdb-constructs/rdb-constructs.js.map +1 -1
- package/src/utils/shared-constructs-constants.d.ts +1 -0
- package/src/utils/shared-constructs-constants.js +16 -15
- package/src/utils/shared-constructs-constants.js.map +1 -1
- package/src/utils/shared-constructs.d.ts +2 -2
- package/src/utils/shared-constructs.js +60 -67
- package/src/utils/shared-constructs.js.map +1 -1
- package/src/utils/shared-dynamodb-scripts.d.ts +11 -0
- package/src/utils/shared-dynamodb-scripts.js +25 -0
- package/src/utils/shared-dynamodb-scripts.js.map +1 -0
- package/src/utils/shared-infra-config.d.ts +1 -1
- package/src/utils/shared-infra-config.js +31 -30
- package/src/utils/shared-infra-config.js.map +1 -1
- package/src/utils/shared-infra-scripts.d.ts +11 -0
- package/src/utils/shared-infra-scripts.js +42 -0
- package/src/utils/shared-infra-scripts.js.map +1 -0
- package/src/utils/shared-rdb-scripts.d.ts +16 -0
- package/src/utils/shared-rdb-scripts.js +32 -0
- package/src/utils/shared-rdb-scripts.js.map +1 -0
- package/src/utils/shared-scripts.d.ts +2 -5
- package/src/utils/shared-scripts.js +12 -38
- package/src/utils/shared-scripts.js.map +1 -1
- package/src/utils/shared-shadcn.d.ts +1 -1
- package/src/utils/shared-shadcn.js +65 -71
- package/src/utils/shared-shadcn.js.map +1 -1
- package/src/utils/test.d.ts +15 -1
- package/src/utils/test.js +41 -23
- package/src/utils/test.js.map +1 -1
- package/src/utils/toml.d.ts +1 -1
- package/src/utils/toml.js +10 -14
- package/src/utils/toml.js.map +1 -1
- package/src/utils/versions.d.ts +150 -97
- package/src/utils/versions.js +157 -115
- package/src/utils/versions.js.map +1 -1
- package/src/utils/warm-ruff-cache.d.ts +12 -0
- package/src/utils/warm-ruff-cache.js +39 -0
- package/src/utils/warm-ruff-cache.js.map +1 -0
- package/src/utils/website-constructs/files/cdk/app/static-websites/__websiteNameKebabCase__.ts.template +2 -2
- package/src/utils/website-constructs/files/cdk/core/static-website.ts.template +200 -41
- package/src/utils/website-constructs/files/terraform/app/static-websites/__websiteNameKebabCase__/__websiteNameKebabCase__.tf.template +1 -1
- package/src/utils/website-constructs/files/terraform/core/static-website/static-website.tf.template +145 -93
- package/src/utils/website-constructs/website-constructs.d.ts +2 -2
- package/src/utils/website-constructs/website-constructs.js +38 -30
- package/src/utils/website-constructs/website-constructs.js.map +1 -1
- package/bin/aws-nx-mcp.js +0 -17
- package/bin/aws-nx-mcp.js.map +0 -1
- package/sdk/connection.d.ts +0 -6
- package/sdk/connection.js +0 -10
- package/sdk/connection.js.map +0 -1
- package/sdk/open-api.d.ts +0 -10
- package/sdk/open-api.js +0 -15
- package/sdk/open-api.js.map +0 -1
- package/sdk/py.d.ts +0 -14
- package/sdk/py.js +0 -18
- package/sdk/py.js.map +0 -1
- package/sdk/terraform.d.ts +0 -6
- package/sdk/terraform.js +0 -11
- package/sdk/terraform.js.map +0 -1
- package/sdk/ts.d.ts +0 -29
- package/sdk/ts.js +0 -47
- package/sdk/ts.js.map +0 -1
- package/sdk/utils/ast.js +0 -12
- package/sdk/utils/ast.js.map +0 -1
- package/sdk/utils/format.js +0 -10
- package/sdk/utils/format.js.map +0 -1
- package/sdk/utils/test.js +0 -10
- package/sdk/utils/test.js.map +0 -1
- package/src/connection/agent-serve-local.js +0 -48
- package/src/connection/agent-serve-local.js.map +0 -1
- package/src/connection/serve-local.d.ts +0 -15
- package/src/connection/serve-local.js +0 -41
- package/src/connection/serve-local.js.map +0 -1
- package/src/py/agent/a2a-connection/files/agent-connection/app/__targetAgentSnakeCase___client.py.template +0 -22
- package/src/py/agent/mcp-connection/files/agent-connection/app/__mcpServerSnakeCase___client.py.template +0 -22
- package/src/py/agent/react-connection/serve-local.js +0 -30
- package/src/py/agent/react-connection/serve-local.js.map +0 -1
- package/src/py/agent/scripts/http/chat.ts.template +0 -38
- package/src/ts/agent/a2a-connection/files/agent-connection/app/__targetAgentKebabCase__-client.ts.template +0 -19
- package/src/ts/agent/mcp-connection/files/agent-connection/app/__mcpServerKebabCase__-client.ts.template +0 -19
- package/src/ts/agent/react-connection/serve-local.d.ts +0 -13
- package/src/ts/agent/react-connection/serve-local.js +0 -19
- package/src/ts/agent/react-connection/serve-local.js.map +0 -1
- package/src/ts/agent/scripts/http/chat.ts.template +0 -35
- package/src/ts/dynamodb/files/scripts/pull-image.ts.template +0 -15
- package/src/ts/dynamodb/files/scripts/start-container.ts.template +0 -81
- package/src/ts/dynamodb/files/src/constants.ts.template +0 -9
- package/src/ts/dynamodb/files/src/gsi.ts.template +0 -14
- package/src/ts/lib/eslint.d.ts +0 -14
- package/src/ts/lib/eslint.js +0 -90
- package/src/ts/lib/eslint.js.map +0 -1
- package/src/ts/lib/grit/eslint-dependency-checks-warn.grit +0 -1
- package/src/ts/rdb/files/scripts/docker-pull.ts.template +0 -15
- package/src/ts/rdb/files/scripts/docker-start.ts.template +0 -84
- package/src/ts/rdb/files/scripts/wait-for-db.ts.template +0 -55
- package/src/ts/rdb/files/src/constants.ts.template +0 -8
- package/src/utils/agent-connection/files/core-a2a/agentcore-a2a-client.ts.template +0 -123
- package/src/utils/agent-connection/files/core-mcp/agentcore-mcp-client.ts.template +0 -128
- package/src/utils/agent-connection/files/py-core-a2a/agentcore_a2a_client.py.template +0 -120
- package/src/utils/agent-connection/files/py-core-mcp/agentcore_mcp_client.py.template +0 -89
- package/src/utils/files/common/scripts/src/infra-deploy.ts.template +0 -2
- package/src/utils/files/common/scripts/src/infra-destroy.ts.template +0 -2
- package/src/utils/files/terraform/scripts/reset-runtime-config.ts.template +0 -25
- /package/{bin → src/bin}/aws-nx-mcp.d.ts +0 -0
- /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
- /package/src/utils/files/common/scripts/src/{index.ts.template → infra/index.ts.template} +0 -0
- /package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/credentials.ts.template +0 -0
- /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
|
|
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 = "
|
|
406
|
+
version = "6.54.0"
|
|
433
407
|
}
|
|
434
408
|
random = {
|
|
435
409
|
source = "hashicorp/random"
|
|
436
|
-
version = "
|
|
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
|
|
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
|
|
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 = "
|
|
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
|
|
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.
|
|
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(
|
|
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 =
|
|
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=
|
|
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
|
-
|
|
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
|
-
"
|
|
1344
|
-
"executor": "
|
|
1494
|
+
"format": {
|
|
1495
|
+
"executor": "nx:run-commands",
|
|
1345
1496
|
"cache": true,
|
|
1346
|
-
"inputs": ["
|
|
1497
|
+
"inputs": ["biome"],
|
|
1498
|
+
"options": {
|
|
1499
|
+
"command": "biome format {projectRoot}"
|
|
1500
|
+
},
|
|
1347
1501
|
"configurations": {
|
|
1348
1502
|
"fix": {
|
|
1349
|
-
"
|
|
1503
|
+
"command": "biome format --write {projectRoot}"
|
|
1350
1504
|
},
|
|
1351
1505
|
"skip-lint": {
|
|
1352
|
-
"
|
|
1506
|
+
"command": "node -e \\"\\""
|
|
1353
1507
|
}
|
|
1354
1508
|
}
|
|
1355
1509
|
},
|
|
1356
|
-
"
|
|
1357
|
-
"executor": "
|
|
1358
|
-
"
|
|
1510
|
+
"lint": {
|
|
1511
|
+
"executor": "nx:run-commands",
|
|
1512
|
+
"cache": true,
|
|
1513
|
+
"inputs": ["biome"],
|
|
1514
|
+
"dependsOn": ["format"],
|
|
1359
1515
|
"options": {
|
|
1360
|
-
"
|
|
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 --
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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 = "
|
|
1875
|
+
version = "6.54.0"
|
|
1712
1876
|
}
|
|
1713
1877
|
random = {
|
|
1714
1878
|
source = "hashicorp/random"
|
|
1715
|
-
version = "
|
|
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
|
|
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
|
|
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 = "
|
|
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
|
|
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.
|
|
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(
|
|
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 =
|
|
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=
|
|
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
|
-
|
|
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 = "
|
|
2850
|
+
version = "6.54.0"
|
|
2507
2851
|
}
|
|
2508
2852
|
random = {
|
|
2509
2853
|
source = "hashicorp/random"
|
|
2510
|
-
version = "
|
|
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
|
|
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
|
|
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 = "
|
|
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
|
|
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.
|
|
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(
|
|
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 =
|
|
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=
|
|
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
|
-
|
|
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 = "
|
|
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
|
|
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.
|
|
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(
|
|
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 =
|
|
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=
|
|
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
|
-
|
|
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"
|