@aws/nx-plugin 1.0.0-rc.7 → 1.0.0-rc.70
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 +7044 -6135
- package/README.md +9 -7
- package/generators.json +152 -10
- package/migrations.json +156 -0
- package/package.json +41 -22
- package/src/agentcore-gateway/__snapshots__/generator.spec.ts.snap +295 -0
- package/src/agentcore-gateway/agent-connection/generator.d.ts +19 -0
- package/src/agentcore-gateway/agent-connection/generator.js +95 -0
- package/src/agentcore-gateway/agent-connection/generator.js.map +1 -0
- package/src/agentcore-gateway/agent-connection/schema.d.js +6 -0
- package/src/agentcore-gateway/agent-connection/schema.d.js.map +1 -0
- package/src/agentcore-gateway/agent-connection/schema.d.ts +13 -0
- package/src/agentcore-gateway/agent-connection/schema.json +31 -0
- package/src/agentcore-gateway/attach-upstream.d.ts +49 -0
- package/src/agentcore-gateway/attach-upstream.js +59 -0
- package/src/agentcore-gateway/attach-upstream.js.map +1 -0
- package/src/agentcore-gateway/files/cedar/policies/README.md +61 -0
- package/src/agentcore-gateway/files/cedar/policies/permit-all.cedar +26 -0
- package/src/agentcore-gateway/files/project/http/local-dev.ts.template +77 -0
- package/src/agentcore-gateway/files/project/mcp/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 +103 -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 +89 -0
- package/src/agentcore-gateway/generator.js +212 -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 +61 -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/react-connection/__snapshots__/generator.spec.ts.snap +68 -0
- package/src/agentcore-gateway/react-connection/generator.d.ts +19 -0
- package/src/agentcore-gateway/react-connection/generator.js +119 -0
- package/src/agentcore-gateway/react-connection/generator.js.map +1 -0
- package/src/agentcore-gateway/react-connection/schema.d.js +6 -0
- package/src/agentcore-gateway/react-connection/schema.d.js.map +1 -0
- package/src/agentcore-gateway/react-connection/schema.d.ts +13 -0
- package/src/agentcore-gateway/react-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 +72 -0
- package/src/agentcore-harness/__snapshots__/generator.spec.ts.snap +238 -0
- package/src/agentcore-harness/files/project/README.md.template +83 -0
- package/src/agentcore-harness/files/project/scripts/chat.ts.template +99 -0
- package/src/agentcore-harness/files/project/src/PROMPT.md.template +16 -0
- package/src/agentcore-harness/generator.d.ts +62 -0
- package/src/agentcore-harness/generator.js +158 -0
- package/src/agentcore-harness/generator.js.map +1 -0
- package/src/agentcore-harness/schema.d.js +8 -0
- package/src/agentcore-harness/schema.d.js.map +1 -0
- package/src/agentcore-harness/schema.d.ts +17 -0
- package/src/agentcore-harness/schema.json +53 -0
- package/src/connection/agent-local-dev.d.ts +49 -0
- package/src/connection/agent-local-dev.js +84 -0
- package/src/connection/agent-local-dev.js.map +1 -0
- package/src/connection/agent-runtime-config.js +9 -14
- package/src/connection/agent-runtime-config.js.map +1 -1
- package/src/connection/gateway-runtime-config.d.ts +19 -0
- package/src/connection/gateway-runtime-config.js +47 -0
- package/src/connection/gateway-runtime-config.js.map +1 -0
- package/src/connection/generator.d.ts +3 -10
- package/src/connection/generator.js +172 -194
- package/src/connection/generator.js.map +1 -1
- package/src/connection/{serve-local.d.ts → local-dev.d.ts} +3 -3
- package/src/connection/local-dev.js +37 -0
- package/src/connection/local-dev.js.map +1 -0
- package/src/connection/scaffold-catalog.d.ts +267 -0
- package/src/connection/scaffold-catalog.js +347 -0
- package/src/connection/scaffold-catalog.js.map +1 -0
- package/src/connection/schema-resolver.d.ts +5 -0
- package/src/connection/schema-resolver.js +27 -0
- package/src/connection/schema-resolver.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 +116 -0
- package/src/connection/supported-connections.js +163 -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 +119 -72
- package/src/infra/app/files/app/README.md.template +8 -4
- package/src/infra/app/files/app/src/main.ts.template +5 -1
- package/src/infra/app/files/app/src/stages/application-stage.ts.template +1 -1
- package/src/infra/app/generator.d.ts +43 -0
- package/src/infra/app/generator.js +195 -127
- 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 +31 -0
- package/src/init/generator.js +46 -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/internal/test-matrix/generator.d.ts +29 -0
- package/src/internal/test-matrix/generator.js +698 -0
- package/src/internal/test-matrix/generator.js.map +1 -0
- package/src/internal/test-matrix/schema.d.js +6 -0
- package/src/internal/test-matrix/schema.d.js.map +1 -0
- package/src/internal/test-matrix/schema.d.ts +12 -0
- package/src/internal/test-matrix/schema.json +21 -0
- package/src/license/config-types.js +5 -3
- package/src/license/config-types.js.map +1 -1
- package/src/license/config.d.ts +1 -1
- package/src/license/config.js +267 -242
- package/src/license/config.js.map +1 -1
- package/src/license/dependency-check/check.js +51 -46
- package/src/license/dependency-check/check.js.map +1 -1
- package/src/license/dependency-check/collectors/collector.js +41 -71
- package/src/license/dependency-check/collectors/collector.js.map +1 -1
- package/src/license/dependency-check/collectors/npm-collector.js +34 -41
- package/src/license/dependency-check/collectors/npm-collector.js.map +1 -1
- package/src/license/dependency-check/collectors/python-collector.js +55 -62
- package/src/license/dependency-check/collectors/python-collector.js.map +1 -1
- package/src/license/dependency-check/evaluator.js +40 -68
- package/src/license/dependency-check/evaluator.js.map +1 -1
- package/src/license/dependency-check/executor.js +30 -22
- package/src/license/dependency-check/executor.js.map +1 -1
- package/src/license/dependency-check/pre-approved.js +949 -336
- package/src/license/dependency-check/pre-approved.js.map +1 -1
- package/src/license/dependency-check/types.js +2 -3
- package/src/license/dependency-check/types.js.map +1 -1
- package/src/license/generator.js +65 -68
- package/src/license/generator.js.map +1 -1
- package/src/license/index.js +3 -9
- package/src/license/index.js.map +1 -1
- package/src/license/known-exceptions.d.ts +1 -1
- package/src/license/known-exceptions.js +19 -13
- package/src/license/known-exceptions.js.map +1 -1
- package/src/license/schema.d.js +6 -0
- package/src/license/schema.d.js.map +1 -0
- package/src/license/schema.d.ts +2 -0
- package/src/license/schema.json +5 -0
- package/src/license/sync/generator.js +94 -119
- package/src/license/sync/generator.js.map +1 -1
- 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/dev-server.d.ts +1 -0
- package/src/mcp-server/dev-server.js +18 -0
- package/src/mcp-server/dev-server.js.map +1 -0
- 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.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 +39 -57
- 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.d.ts +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 +24 -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.js +23 -24
- package/src/mcp-server/tools/create-workspace-command.js.map +1 -1
- package/src/mcp-server/tools/general-guidance.d.ts +1 -1
- package/src/mcp-server/tools/general-guidance.js +55 -32
- package/src/mcp-server/tools/general-guidance.js.map +1 -1
- 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.js +19 -25
- package/src/mcp-server/tools/list-generators.js.map +1 -1
- package/src/mcp-server/tools/upgrade-workspace.d.ts +11 -0
- package/src/mcp-server/tools/upgrade-workspace.js +32 -0
- package/src/mcp-server/tools/upgrade-workspace.js.map +1 -0
- package/src/migrations/latest/py-agent-a2a-lifespan-construction/metadata.json +3 -0
- package/src/migrations/latest/py-agent-a2a-lifespan-construction/migration.d.ts +6 -0
- package/src/migrations/latest/py-agent-a2a-lifespan-construction/migration.js +234 -0
- package/src/migrations/latest/py-agent-a2a-lifespan-construction/migration.js.map +1 -0
- package/src/migrations/latest/smithy-server-package-rename/metadata.json +3 -0
- package/src/migrations/latest/smithy-server-package-rename/migration.d.ts +6 -0
- package/src/migrations/latest/smithy-server-package-rename/migration.js +123 -0
- package/src/migrations/latest/smithy-server-package-rename/migration.js.map +1 -0
- package/src/migrations/latest/translate-script-whole-file-writes/files/build-system-prompt.ts.fixture +23 -0
- package/src/migrations/latest/translate-script-whole-file-writes/files/build-user-prompt.ts.fixture +96 -0
- package/src/migrations/latest/translate-script-whole-file-writes/files/config-path.ts.fixture +1 -0
- package/src/migrations/latest/translate-script-whole-file-writes/files/file-to-translate.ts.fixture +10 -0
- package/src/migrations/latest/translate-script-whole-file-writes/files/get-files-to-translate.ts.fixture +96 -0
- package/src/migrations/latest/translate-script-whole-file-writes/files/header.ts.fixture +15 -0
- package/src/migrations/latest/translate-script-whole-file-writes/files/log.ts.fixture +18 -0
- package/src/migrations/latest/translate-script-whole-file-writes/files/main-call.ts.fixture +6 -0
- package/src/migrations/latest/translate-script-whole-file-writes/files/main.ts.fixture +79 -0
- package/src/migrations/latest/translate-script-whole-file-writes/files/project-root.ts.fixture +1 -0
- package/src/migrations/latest/translate-script-whole-file-writes/files/run-with-concurrency.ts.fixture +57 -0
- package/src/migrations/latest/translate-script-whole-file-writes/files/scripts-dir.ts.fixture +1 -0
- package/src/migrations/latest/translate-script-whole-file-writes/files/translate-file-for-language.ts.fixture +61 -0
- package/src/migrations/latest/translate-script-whole-file-writes/grit/already-migrated.grit +1 -0
- package/src/migrations/latest/translate-script-whole-file-writes/grit/build-system-prompt.grit +6 -0
- package/src/migrations/latest/translate-script-whole-file-writes/grit/build-user-prompt.grit +6 -0
- package/src/migrations/latest/translate-script-whole-file-writes/grit/config-path.grit +1 -0
- package/src/migrations/latest/translate-script-whole-file-writes/grit/file-to-translate.grit +11 -0
- package/src/migrations/latest/translate-script-whole-file-writes/grit/get-files-to-translate.grit +7 -0
- package/src/migrations/latest/translate-script-whole-file-writes/grit/log.grit +3 -0
- package/src/migrations/latest/translate-script-whole-file-writes/grit/main-call.grit +1 -0
- package/src/migrations/latest/translate-script-whole-file-writes/grit/main.grit +8 -0
- package/src/migrations/latest/translate-script-whole-file-writes/grit/project-root.grit +1 -0
- package/src/migrations/latest/translate-script-whole-file-writes/grit/run-with-concurrency.grit +6 -0
- package/src/migrations/latest/translate-script-whole-file-writes/grit/translate-file-for-language.grit +6 -0
- package/src/migrations/latest/translate-script-whole-file-writes/metadata.json +3 -0
- package/src/migrations/latest/translate-script-whole-file-writes/migration.d.ts +2 -0
- package/src/migrations/latest/translate-script-whole-file-writes/migration.js +103 -0
- package/src/migrations/latest/translate-script-whole-file-writes/migration.js.map +1 -0
- package/src/migrations/latest/translate-script-whole-file-writes/test-fixtures/released-script-first.ts.fixture +430 -0
- package/src/migrations/latest/translate-script-whole-file-writes/test-fixtures/released-script.ts.fixture +431 -0
- package/src/migrations/v1.0.0-rc.50/0001-modernize-function-props-cast/metadata.json +3 -0
- package/src/migrations/v1.0.0-rc.50/0001-modernize-function-props-cast/migration.d.ts +6 -0
- package/src/migrations/v1.0.0-rc.50/0001-modernize-function-props-cast/migration.js +65 -0
- package/src/migrations/v1.0.0-rc.50/0001-modernize-function-props-cast/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.50/0002-restrict-cors-to-custom-domains/metadata.json +3 -0
- package/src/migrations/v1.0.0-rc.50/0002-restrict-cors-to-custom-domains/migration.d.ts +6 -0
- package/src/migrations/v1.0.0-rc.50/0002-restrict-cors-to-custom-domains/migration.js +108 -0
- package/src/migrations/v1.0.0-rc.50/0002-restrict-cors-to-custom-domains/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.50/0003-terraform-bootstrap-adopt-existing-bucket/metadata.json +3 -0
- package/src/migrations/v1.0.0-rc.50/0003-terraform-bootstrap-adopt-existing-bucket/migration.d.ts +6 -0
- package/src/migrations/v1.0.0-rc.50/0003-terraform-bootstrap-adopt-existing-bucket/migration.js +128 -0
- package/src/migrations/v1.0.0-rc.50/0003-terraform-bootstrap-adopt-existing-bucket/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.52/0001-user-identity-waf-allow-localhost-callback/metadata.json +3 -0
- package/src/migrations/v1.0.0-rc.52/0001-user-identity-waf-allow-localhost-callback/migration.d.ts +6 -0
- package/src/migrations/v1.0.0-rc.52/0001-user-identity-waf-allow-localhost-callback/migration.js +215 -0
- package/src/migrations/v1.0.0-rc.52/0001-user-identity-waf-allow-localhost-callback/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.54/0001-order-access-log-delivery-after-bucket-policy/metadata.json +3 -0
- package/src/migrations/v1.0.0-rc.54/0001-order-access-log-delivery-after-bucket-policy/migration.d.ts +6 -0
- package/src/migrations/v1.0.0-rc.54/0001-order-access-log-delivery-after-bucket-policy/migration.js +93 -0
- package/src/migrations/v1.0.0-rc.54/0001-order-access-log-delivery-after-bucket-policy/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.55/0001-backfill-generator-metadata/metadata.json +3 -0
- package/src/migrations/v1.0.0-rc.55/0001-backfill-generator-metadata/migration.d.ts +96 -0
- package/src/migrations/v1.0.0-rc.55/0001-backfill-generator-metadata/migration.js +670 -0
- package/src/migrations/v1.0.0-rc.55/0001-backfill-generator-metadata/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.56/0001-dynamodb-local-remove-optimize-flag/metadata.json +3 -0
- package/src/migrations/v1.0.0-rc.56/0001-dynamodb-local-remove-optimize-flag/migration.d.ts +6 -0
- package/src/migrations/v1.0.0-rc.56/0001-dynamodb-local-remove-optimize-flag/migration.js +89 -0
- package/src/migrations/v1.0.0-rc.56/0001-dynamodb-local-remove-optimize-flag/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.57/0001-ts-agent-session-management-support/metadata.json +3 -0
- package/src/migrations/v1.0.0-rc.57/0001-ts-agent-session-management-support/migration.d.ts +6 -0
- package/src/migrations/v1.0.0-rc.57/0001-ts-agent-session-management-support/migration.js +449 -0
- package/src/migrations/v1.0.0-rc.57/0001-ts-agent-session-management-support/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.58/0001-smithy-ssdk-bundle-pins/metadata.json +3 -0
- package/src/migrations/v1.0.0-rc.58/0001-smithy-ssdk-bundle-pins/migration.d.ts +6 -0
- package/src/migrations/v1.0.0-rc.58/0001-smithy-ssdk-bundle-pins/migration.js +78 -0
- package/src/migrations/v1.0.0-rc.58/0001-smithy-ssdk-bundle-pins/migration.js.map +1 -0
- package/src/{smithy/project/files/build.Dockerfile.template → migrations/v1.0.0-rc.58/0001-smithy-ssdk-bundle-pins/rc57-service.Dockerfile.fixture} +1 -4
- package/src/migrations/v1.0.0-rc.59/0001-gateway-agent-targets/__snapshots__/migration.spec.ts.snap +223 -0
- package/src/migrations/v1.0.0-rc.59/0001-gateway-agent-targets/metadata.json +3 -0
- package/src/migrations/v1.0.0-rc.59/0001-gateway-agent-targets/migration.d.ts +6 -0
- package/src/migrations/v1.0.0-rc.59/0001-gateway-agent-targets/migration.js +217 -0
- package/src/migrations/v1.0.0-rc.59/0001-gateway-agent-targets/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.60/0001-gateway-cognito-passthrough/__snapshots__/migration.spec.ts.snap +149 -0
- package/src/migrations/v1.0.0-rc.60/0001-gateway-cognito-passthrough/metadata.json +3 -0
- package/src/migrations/v1.0.0-rc.60/0001-gateway-cognito-passthrough/migration.d.ts +6 -0
- package/src/migrations/v1.0.0-rc.60/0001-gateway-cognito-passthrough/migration.js +195 -0
- package/src/migrations/v1.0.0-rc.60/0001-gateway-cognito-passthrough/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.60/0002-waf-log-group-removal/__snapshots__/migration.spec.ts.snap +57 -0
- package/src/migrations/v1.0.0-rc.60/0002-waf-log-group-removal/metadata.json +3 -0
- package/src/migrations/v1.0.0-rc.60/0002-waf-log-group-removal/migration.d.ts +6 -0
- package/src/migrations/v1.0.0-rc.60/0002-waf-log-group-removal/migration.js +77 -0
- package/src/migrations/v1.0.0-rc.60/0002-waf-log-group-removal/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.60/0003-strip-pip-from-python-images/__snapshots__/migration.spec.ts.snap +48 -0
- package/src/migrations/v1.0.0-rc.60/0003-strip-pip-from-python-images/metadata.json +3 -0
- package/src/migrations/v1.0.0-rc.60/0003-strip-pip-from-python-images/migration.d.ts +6 -0
- package/src/migrations/v1.0.0-rc.60/0003-strip-pip-from-python-images/migration.js +91 -0
- package/src/migrations/v1.0.0-rc.60/0003-strip-pip-from-python-images/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.61/0001-py-agent-lifespan-construction/metadata.json +3 -0
- package/src/migrations/v1.0.0-rc.61/0001-py-agent-lifespan-construction/migration.d.ts +6 -0
- package/src/migrations/v1.0.0-rc.61/0001-py-agent-lifespan-construction/migration.js +412 -0
- package/src/migrations/v1.0.0-rc.61/0001-py-agent-lifespan-construction/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.62/0001-rename-load-runtime-config-target/metadata.json +3 -0
- package/src/migrations/v1.0.0-rc.62/0001-rename-load-runtime-config-target/migration.d.ts +6 -0
- package/src/migrations/v1.0.0-rc.62/0001-rename-load-runtime-config-target/migration.js +33 -0
- package/src/migrations/v1.0.0-rc.62/0001-rename-load-runtime-config-target/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.63/0001-add-deploy-sandbox-target/metadata.json +3 -0
- package/src/migrations/v1.0.0-rc.63/0001-add-deploy-sandbox-target/migration.d.ts +6 -0
- package/src/migrations/v1.0.0-rc.63/0001-add-deploy-sandbox-target/migration.js +83 -0
- package/src/migrations/v1.0.0-rc.63/0001-add-deploy-sandbox-target/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.64/0001-smithy-build-without-docker/legacy-service.Dockerfile.fixture +95 -0
- package/src/migrations/v1.0.0-rc.64/0001-smithy-build-without-docker/metadata.json +3 -0
- package/src/migrations/v1.0.0-rc.64/0001-smithy-build-without-docker/migration.d.ts +6 -0
- package/src/migrations/v1.0.0-rc.64/0001-smithy-build-without-docker/migration.js +154 -0
- package/src/migrations/v1.0.0-rc.64/0001-smithy-build-without-docker/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.65/0001-vite-config-import-meta-dirname/metadata.json +3 -0
- package/src/migrations/v1.0.0-rc.65/0001-vite-config-import-meta-dirname/migration.d.ts +6 -0
- package/src/migrations/v1.0.0-rc.65/0001-vite-config-import-meta-dirname/migration.js +71 -0
- package/src/migrations/v1.0.0-rc.65/0001-vite-config-import-meta-dirname/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.65/0002-rolldown-code-splitting/metadata.json +3 -0
- package/src/migrations/v1.0.0-rc.65/0002-rolldown-code-splitting/migration.d.ts +6 -0
- package/src/migrations/v1.0.0-rc.65/0002-rolldown-code-splitting/migration.js +57 -0
- package/src/migrations/v1.0.0-rc.65/0002-rolldown-code-splitting/migration.js.map +1 -0
- 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 +100 -24
- 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.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.js +17 -21
- package/src/open-api/ts-hooks/generator.js.map +1 -1
- package/src/open-api/ts-hooks/generator.spec.tsx +70 -0
- 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.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 +0 -6
- 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 +2 -2
- 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.js +437 -246
- package/src/open-api/utils/normalise.js.map +1 -1
- package/src/open-api/utils/parse.js +8 -14
- 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.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 +101 -20
- package/src/preset/generator.d.ts +14 -1
- package/src/preset/generator.js +76 -151
- 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 +4 -1
- package/src/preset/schema.json +16 -5
- package/src/py/agent/__snapshots__/generator.constructs.spec.ts.snap +326 -0
- package/src/py/agent/__snapshots__/generator.frameworks.spec.ts.snap +738 -0
- package/src/py/agent/__snapshots__/{generator.spec.ts.snap → generator.protocols.spec.ts.snap} +191 -315
- package/src/py/agent/a2a-connection/__snapshots__/generator.spec.ts.snap +190 -0
- package/src/py/agent/a2a-connection/files/agent-connection/app/__targetAgentSnakeCase___client_strands.py.template +31 -0
- package/src/py/agent/a2a-connection/files/langchain/agent-connection/app/__targetAgentSnakeCase___client_langchain.py.template +29 -0
- package/src/py/agent/a2a-connection/generator.d.ts +24 -0
- package/src/py/agent/a2a-connection/generator.js +145 -88
- 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/deploy/Dockerfile.template +8 -1
- package/src/py/agent/files/langchain/a2a/main.py.template +94 -0
- package/src/py/agent/files/langchain/ag-ui/main.py.template +87 -0
- package/src/py/agent/files/langchain/common/agent.py.template +30 -0
- package/src/py/agent/files/{http → langchain/http}/init.py.template +17 -25
- package/src/py/agent/files/langchain/http/main.py.template +81 -0
- package/src/py/agent/files/{a2a → strands/a2a}/main.py.template +33 -15
- package/src/py/agent/files/strands/ag-ui/main.py.template +89 -0
- package/src/py/agent/files/{common → strands/common}/agent.py.template +2 -0
- package/src/py/agent/files/strands/http/init.py.template +97 -0
- package/src/py/agent/files/{http → strands/http}/main.py.template +4 -13
- 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 +33 -0
- package/src/py/agent/gateway-connection/generator.js +153 -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 +154 -1
- package/src/py/agent/generator.js +396 -197
- package/src/py/agent/generator.js.map +1 -1
- package/src/py/agent/mcp-connection/__snapshots__/generator.spec.ts.snap +154 -89
- package/src/py/agent/mcp-connection/files/agent-connection/app/__mcpServerSnakeCase___client_strands.py.template +31 -0
- package/src/py/agent/mcp-connection/files/langchain/agent-connection/app/__mcpServerSnakeCase___client_langchain.py.template +31 -0
- package/src/py/agent/mcp-connection/generator.d.ts +23 -0
- package/src/py/agent/mcp-connection/generator.js +103 -130
- 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 +17 -19
- package/src/py/agent/react-connection/generator.d.ts +150 -1
- package/src/py/agent/react-connection/generator.js +105 -65
- 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} +4 -4
- 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 +5 -1
- package/src/py/agent/schema.json +15 -1
- 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 +1520 -0
- package/src/py/dynamodb/agent-connection/__snapshots__/generator.spec.ts.snap +63 -0
- package/src/py/dynamodb/agent-connection/generator.d.ts +10 -0
- package/src/py/dynamodb/agent-connection/generator.js +45 -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 +32 -0
- package/src/py/dynamodb/fast-api-connection/generator.d.ts +10 -0
- package/src/py/dynamodb/fast-api-connection/generator.js +39 -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 +39 -0
- package/src/py/dynamodb/generator.js +130 -0
- package/src/py/dynamodb/generator.js.map +1 -0
- package/src/py/dynamodb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +63 -0
- package/src/py/dynamodb/mcp-server-connection/generator.d.ts +10 -0
- package/src/py/dynamodb/mcp-server-connection/generator.js +45 -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 +76 -0
- package/src/py/fast-api/__snapshots__/generator.spec.ts.snap +240 -4693
- 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 +72 -0
- package/src/py/fast-api/generator.js +134 -95
- 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 +16 -1
- package/src/py/fast-api/react/generator.js +38 -26
- package/src/py/fast-api/react/generator.js.map +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 +6 -0
- package/src/py/lambda-function/__snapshots__/generator.spec.ts.snap +4 -4
- package/src/py/lambda-function/generator.d.ts +21 -0
- package/src/py/lambda-function/generator.js +82 -62
- 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 +221 -21
- package/src/py/mcp-server/files/deploy/Dockerfile.template +8 -1
- package/src/py/mcp-server/generator.d.ts +68 -0
- package/src/py/mcp-server/generator.js +204 -131
- 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 +6 -0
- package/src/py/project/generator.d.ts +27 -1
- package/src/py/project/generator.js +248 -130
- 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 +2070 -0
- package/src/py/rdb/agent-connection/__snapshots__/generator.spec.ts.snap +123 -0
- package/src/py/rdb/agent-connection/generator.d.ts +10 -0
- package/src/py/rdb/agent-connection/generator.js +52 -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 +51 -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 +56 -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 +14 -0
- package/src/py/rdb/files/Dockerfile.migration.template +14 -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 +103 -0
- package/src/py/rdb/generator.js +328 -0
- package/src/py/rdb/generator.js.map +1 -0
- package/src/py/rdb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +119 -0
- package/src/py/rdb/mcp-server-connection/generator.d.ts +10 -0
- package/src/py/rdb/mcp-server-connection/generator.js +52 -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 +78 -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 +18 -0
- package/src/sdk/py.js +12 -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 +39 -0
- package/src/sdk/ts.js +41 -0
- package/src/sdk/ts.js.map +1 -0
- package/{sdk/utils/format.d.ts → src/sdk/utils/ast.d.ts} +1 -1
- package/src/sdk/utils/ast.js +6 -0
- package/src/sdk/utils/ast.js.map +1 -0
- package/{sdk/utils/ast.d.ts → src/sdk/utils/format.d.ts} +1 -2
- 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 +245 -242
- package/src/smithy/project/files/{smithy-build.json.template → service/smithy-build.json.template} +5 -5
- package/src/smithy/project/files/{src → service/src}/operations/echo.smithy.template +1 -0
- package/src/smithy/project/files/shapes/smithy-build.json.template +7 -0
- package/src/smithy/project/files/shapes/src/main.smithy.template +11 -0
- package/src/smithy/project/files/ssdk-bundle/ssdk.rolldown.config.mjs.template +52 -0
- package/src/smithy/project/generator.d.ts +90 -0
- package/src/smithy/project/generator.js +223 -56
- 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 +2 -0
- package/src/smithy/project/schema.json +28 -1
- package/src/smithy/react-connection/__snapshots__/generator.spec.ts.snap +1 -1
- package/src/smithy/react-connection/generator.d.ts +15 -0
- package/src/smithy/react-connection/generator.js +54 -48
- 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 +871 -109
- package/src/smithy/ts/api/files/handler.ts.template +3 -3
- package/src/smithy/ts/api/files/local-server.ts.template +3 -3
- 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 +88 -0
- package/src/smithy/ts/api/generator.js +187 -114
- 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 +6 -0
- package/src/terraform/project/files/application/scripts/bootstrap.ts.template +40 -1
- 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 +50 -0
- package/src/terraform/project/generator.js +212 -111
- 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 +1182 -184
- 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 +90 -1
- package/src/trpc/backend/generator.js +177 -100
- 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 +1 -0
- package/src/trpc/backend/schema.json +6 -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 +38 -1
- package/src/trpc/react/generator.js +105 -63
- 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 +1452 -25
- package/src/ts/agent/a2a-connection/__snapshots__/generator.spec.ts.snap +258 -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 +46 -0
- package/src/ts/agent/a2a-connection/generator.js +110 -63
- 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 +36 -11
- package/src/ts/agent/files/common/agent.ts.template +15 -2
- package/src/ts/agent/files/common/session.ts.template +43 -0
- package/src/ts/agent/files/deploy/Dockerfile.template +13 -2
- 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 +222 -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 +47 -0
- package/src/ts/agent/gateway-connection/generator.js +144 -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 +205 -0
- package/src/ts/agent/generator.js +339 -156
- package/src/ts/agent/generator.js.map +1 -1
- package/src/ts/agent/mcp-connection/__snapshots__/generator.spec.ts.snap +194 -113
- package/src/ts/agent/mcp-connection/files/agent-connection/app/__mcpServerKebabCase__-client-strands.ts.template +23 -0
- package/src/ts/agent/mcp-connection/generator.d.ts +37 -0
- package/src/ts/agent/mcp-connection/generator.js +88 -65
- 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/__snapshots__/generator.spec.ts.snap +8 -4
- package/src/ts/agent/react-connection/files/src/components/__agentNameClassName__AgentClientProvider.tsx.template +2 -1
- package/src/ts/agent/react-connection/generator.d.ts +202 -1
- package/src/ts/agent/react-connection/generator.js +158 -99
- package/src/ts/agent/react-connection/generator.js.map +1 -1
- package/src/ts/agent/react-connection/{serve-local.d.ts → local-dev.d.ts} +2 -2
- 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 +4 -0
- package/src/ts/agent/schema.json +14 -0
- 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 +1 -0
- package/src/ts/api/schema.json +5 -0
- package/src/ts/astro-docs/__snapshots__/generator.spec.ts.snap +28 -14
- package/src/ts/astro-docs/files/base/src/content/docs/en/index.mdx.template +2 -2
- package/src/ts/astro-docs/files/base/src/content.config.ts.template +4 -4
- package/src/ts/astro-docs/files/translation/scripts/translate.ts.template +272 -150
- package/src/ts/astro-docs/generator.d.ts +38 -0
- package/src/ts/astro-docs/generator.js +126 -61
- 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/dcr-proxy/__snapshots__/generator.spec.ts.snap +982 -0
- package/src/ts/dcr-proxy/generator.d.ts +34 -0
- package/src/ts/dcr-proxy/generator.js +115 -0
- package/src/ts/dcr-proxy/generator.js.map +1 -0
- package/src/ts/dcr-proxy/schema.d.js +6 -0
- package/src/ts/dcr-proxy/schema.d.js.map +1 -0
- package/src/ts/dcr-proxy/schema.d.ts +13 -0
- package/src/ts/dcr-proxy/schema.json +44 -0
- 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 -518
- package/src/ts/dynamodb/agent-connection/__snapshots__/generator.spec.ts.snap +23 -5
- package/src/ts/dynamodb/agent-connection/generator.js +27 -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 +41 -0
- package/src/ts/dynamodb/generator.js +106 -64
- package/src/ts/dynamodb/generator.js.map +1 -1
- package/src/ts/dynamodb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +23 -5
- package/src/ts/dynamodb/mcp-server-connection/generator.js +27 -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 +26 -2
- package/src/ts/dynamodb/smithy-connection/__snapshots__/generator.spec.ts.snap +12 -3
- package/src/ts/dynamodb/smithy-connection/generator.js +22 -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 +12 -3
- package/src/ts/dynamodb/trpc-connection/generator.js +22 -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 +8 -6
- package/src/ts/lambda-function/files/handler/__lambdaFunctionKebabCase__.ts.template +2 -1
- package/src/ts/lambda-function/generator.d.ts +38 -0
- package/src/ts/lambda-function/generator.js +98 -65
- 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 +83 -45
- package/src/ts/lib/__snapshots__/vitest.spec.ts.snap +1 -1
- package/src/ts/lib/biome.js +71 -35
- package/src/ts/lib/biome.js.map +1 -1
- package/src/ts/lib/generator.d.ts +7 -0
- package/src/ts/lib/generator.js +115 -103
- 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 +13 -1
- package/src/ts/lib/ts-project-utils.js +96 -71
- 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 +10 -1
- package/src/ts/lib/vitest.js +54 -26
- package/src/ts/lib/vitest.js.map +1 -1
- package/src/ts/mcp-server/__snapshots__/generator.spec.ts.snap +221 -44
- package/src/ts/mcp-server/files/Dockerfile.template +13 -2
- package/src/ts/mcp-server/generator.d.ts +110 -0
- package/src/ts/mcp-server/generator.js +231 -148
- 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 +6 -0
- package/src/ts/nx-generator/__snapshots__/generator.spec.ts.snap +28 -13
- 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.spec.ts.template +1 -1
- 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 +3 -0
- package/src/ts/nx-generator/generator.js +124 -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-migration/files/migration.spec.ts.template +26 -0
- package/src/ts/nx-migration/files/migration.ts.template +65 -0
- package/src/ts/nx-migration/files/prompt.md.template +46 -0
- package/src/ts/nx-migration/generator.d.ts +27 -0
- package/src/ts/nx-migration/generator.js +147 -0
- package/src/ts/nx-migration/generator.js.map +1 -0
- package/src/ts/nx-migration/schema.d.js +6 -0
- package/src/ts/nx-migration/schema.d.js.map +1 -0
- package/src/ts/nx-migration/schema.d.ts +13 -0
- package/src/ts/nx-migration/schema.json +63 -0
- package/src/ts/nx-plugin/__snapshots__/generator.spec.ts.snap +36 -25
- package/src/ts/nx-plugin/files/mcp-server/resources/GENERAL_GUIDANCE.md.template +5 -6
- 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 +4 -4
- package/src/ts/nx-plugin/generator.d.ts +3 -0
- package/src/ts/nx-plugin/generator.js +67 -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 +27 -2
- package/src/ts/nx-plugin/utils.js +66 -51
- package/src/ts/nx-plugin/utils.js.map +1 -1
- package/src/ts/rdb/__snapshots__/generator.spec.ts.snap +553 -644
- package/src/ts/rdb/agent-connection/__snapshots__/generator.spec.ts.snap +16 -6
- package/src/ts/rdb/agent-connection/generator.js +44 -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 +19 -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 +5 -30
- 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 +117 -4
- package/src/ts/rdb/generator.js +257 -138
- package/src/ts/rdb/generator.js.map +1 -1
- package/src/ts/rdb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +16 -6
- package/src/ts/rdb/mcp-server-connection/generator.js +42 -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 +7 -1
- package/src/ts/rdb/smithy-connection/__snapshots__/generator.spec.ts.snap +18 -9
- package/src/ts/rdb/smithy-connection/generator.js +48 -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 +12 -3
- package/src/ts/rdb/trpc-connection/generator.js +37 -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.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 +17 -16
- package/src/ts/react-website/agui/generator.d.ts +97 -0
- package/src/ts/react-website/agui/generator.js +114 -67
- package/src/ts/react-website/agui/generator.js.map +1 -1
- package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +1391 -644
- package/src/ts/react-website/app/files/app/common/README.md.template +1 -1
- package/src/ts/react-website/app/generator.d.ts +142 -2
- package/src/ts/react-website/app/generator.js +333 -209
- 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 +12 -6
- package/src/ts/react-website/cognito-auth/__snapshots__/generator.spec.ts.snap +161 -26
- package/src/ts/react-website/cognito-auth/__snapshots__/generator.terraform.spec.ts.snap +48 -12
- 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 +25 -1
- package/src/ts/react-website/cognito-auth/generator.js +79 -64
- package/src/ts/react-website/cognito-auth/generator.js.map +1 -1
- package/src/ts/react-website/cognito-auth/grit/cloudscape-auth-menu.grit +3 -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.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.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.js +137 -60
- package/src/ts/sync/generator.js.map +1 -1
- 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 +1 -1
- 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/__snapshots__/shared-constructs.spec.ts.snap +21 -0
- package/src/utils/add-dependencies.d.ts +38 -0
- package/src/utils/add-dependencies.js +83 -0
- package/src/utils/add-dependencies.js.map +1 -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 +139 -26
- package/src/utils/agent-connection/agent-connection.js +500 -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 +33 -33
- 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 +47 -0
- package/src/utils/agent-connection/files/core-strands/base/tool-errors-strands.ts.template +29 -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 +6 -18
- package/src/utils/agent-connection/files/py-core-runtime-config/session_context.py.template +2 -2
- 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-runtime-config/with_session_id.py.template → py-core-strands/base/with_session_id_strands.py.template} +2 -2
- 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 +79 -0
- package/src/utils/agent-core-constructs/agent-core-constructs.js +212 -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 +170 -6
- package/src/utils/agent-core-constructs/files/cdk/app/agentcore-gateway/__nameKebabCase__/__nameKebabCase__.ts.template +87 -0
- package/src/utils/agent-core-constructs/files/cdk/app/agentcore-harness/__nameKebabCase__/__nameKebabCase__.ts.template +366 -0
- package/src/utils/agent-core-constructs/files/cdk/core/agentcore-gateway/agentcore-gateway.ts.template +624 -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 +212 -1
- package/src/utils/agent-core-constructs/files/terraform/app/agentcore-gateway/__nameKebabCase__/__nameKebabCase__.tf.template +521 -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/app/agentcore-harness/__nameKebabCase__/__nameKebabCase__.tf.template +282 -0
- package/src/utils/agent-core-constructs/files/terraform/core/agent-core/runtime.tf.template +159 -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 +30 -2
- package/src/utils/api-constructs/api-constructs.js +82 -32
- package/src/utils/api-constructs/api-constructs.js.map +1 -1
- package/src/utils/api-constructs/files/cdk/app/apis/http/__apiNameKebabCase__.ts.template +20 -15
- package/src/utils/api-constructs/files/cdk/app/apis/rest/__apiNameKebabCase__.ts.template +24 -16
- 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 +56 -17
- 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.js +22 -22
- package/src/utils/api-constructs/open-api-metadata.js.map +1 -1
- package/src/utils/ast/website.js +18 -20
- package/src/utils/ast/website.js.map +1 -1
- package/src/utils/ast.d.ts +9 -0
- package/src/utils/ast.js +125 -86
- 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 +6 -1
- package/src/utils/bundle/bundle.js +58 -48
- package/src/utils/bundle/bundle.js.map +1 -1
- package/src/utils/commands.d.ts +14 -3
- package/src/utils/commands.js +83 -28
- package/src/utils/commands.js.map +1 -1
- package/src/utils/config/index.d.ts +18 -2
- package/src/utils/config/index.js +5 -4
- package/src/utils/config/index.js.map +1 -1
- package/src/utils/config/utils.d.ts +8 -2
- package/src/utils/config/utils.js +56 -59
- package/src/utils/config/utils.js.map +1 -1
- package/src/utils/connection/open-api/files/components/__apiNameClassName__Provider.tsx.template +16 -3
- package/src/utils/connection/open-api/react.d.ts +31 -5
- package/src/utils/connection/open-api/react.js +106 -76
- package/src/utils/connection/open-api/react.js.map +1 -1
- package/src/utils/containers.js +22 -23
- package/src/utils/containers.js.map +1 -1
- package/src/utils/dcr-proxy-constructs/dcr-proxy-constructs.d.ts +38 -0
- package/src/utils/dcr-proxy-constructs/dcr-proxy-constructs.js +93 -0
- package/src/utils/dcr-proxy-constructs/dcr-proxy-constructs.js.map +1 -0
- package/src/utils/dcr-proxy-constructs/files/cdk/app/dcr-proxies/__nameKebabCase__/__nameKebabCase__.ts.template +227 -0
- package/src/utils/dcr-proxy-constructs/files/project/src/handlers/authorization-server-metadata.ts.template +39 -0
- package/src/utils/dcr-proxy-constructs/files/project/src/handlers/authorize.ts.template +26 -0
- package/src/utils/dcr-proxy-constructs/files/project/src/handlers/mcp-proxy.ts.template +89 -0
- package/src/utils/dcr-proxy-constructs/files/project/src/handlers/protected-resource-metadata.ts.template +13 -0
- package/src/utils/dcr-proxy-constructs/files/project/src/handlers/register.ts.template +70 -0
- package/src/utils/dcr-proxy-constructs/files/project/src/handlers/token.ts.template +75 -0
- package/src/utils/dcr-proxy-constructs/files/terraform/app/dcr-proxies/__nameKebabCase__/__nameKebabCase__.tf.template +410 -0
- package/src/utils/declared-dependencies.d.ts +140 -0
- package/src/utils/declared-dependencies.js +64 -0
- package/src/utils/declared-dependencies.js.map +1 -0
- package/src/utils/dependencies.d.ts +18 -0
- package/src/utils/dependencies.js +206 -0
- package/src/utils/dependencies.js.map +1 -0
- package/src/utils/docker.d.ts +89 -0
- package/src/utils/docker.js +125 -0
- package/src/utils/docker.js.map +1 -0
- package/src/utils/dynamodb-constructs/dynamodb-constructs.d.ts +1 -1
- 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/cloudfront.ts.template +14 -0
- package/src/utils/files/common/constructs/src/core/index.ts.template +5 -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 +103 -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 +115 -0
- package/src/utils/files/common/shadcn/readme/README.md.template +3 -3
- package/src/utils/files/common/shadcn/src/index.ts.template +2 -2
- package/src/utils/files/shadcn/components.json.template +1 -1
- 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 +39 -4
- package/src/utils/format.js +318 -198
- package/src/utils/format.js.map +1 -1
- package/src/utils/fs.d.ts +24 -5
- package/src/utils/fs.js +40 -15
- 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.js +22 -25
- package/src/utils/function-constructs/function-constructs.js.map +1 -1
- package/src/utils/generators.js +18 -20
- package/src/utils/generators.js.map +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.js +12 -14
- package/src/utils/iac.js.map +1 -1
- package/src/utils/identity-constructs/files/cdk/core/user-identity.ts.template +153 -24
- 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 +129 -12
- package/src/utils/identity-constructs/files/terraform/core/user-identity/main.tf.template +7 -0
- package/src/utils/identity-constructs/identity-constructs.d.ts +10 -0
- package/src/utils/identity-constructs/identity-constructs.js +52 -31
- package/src/utils/identity-constructs/identity-constructs.js.map +1 -1
- package/src/utils/init.d.ts +72 -0
- package/src/utils/init.js +300 -0
- package/src/utils/init.js.map +1 -0
- package/src/utils/install.d.ts +32 -0
- package/src/utils/install.js +58 -0
- package/src/utils/install.js.map +1 -0
- package/src/utils/js.js +27 -20
- package/src/utils/js.js.map +1 -1
- package/src/utils/mcp.d.ts +9 -0
- package/src/utils/mcp.js +42 -41
- package/src/utils/mcp.js.map +1 -1
- package/src/utils/metrics.d.ts +7 -1
- package/src/utils/metrics.js +61 -46
- package/src/utils/metrics.js.map +1 -1
- package/src/utils/migration-manifest.d.ts +58 -0
- package/src/utils/migration-manifest.js +76 -0
- package/src/utils/migration-manifest.js.map +1 -0
- package/src/utils/migration-versions.d.ts +145 -0
- package/src/utils/migration-versions.js +250 -0
- package/src/utils/migration-versions.js.map +1 -0
- 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 +25 -0
- package/src/utils/module-format.js +45 -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 +0 -4
- package/src/utils/npm-scope.js +7 -20
- package/src/utils/npm-scope.js.map +1 -1
- package/src/utils/nx.d.ts +74 -3
- package/src/utils/nx.js +196 -75
- package/src/utils/nx.js.map +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.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 -12
- package/src/utils/pnpm-workspace.js +16 -43
- package/src/utils/pnpm-workspace.js.map +1 -1
- package/src/utils/port.d.ts +28 -6
- package/src/utils/port.js +67 -28
- package/src/utils/port.js.map +1 -1
- package/src/utils/project-package-json.d.ts +39 -0
- package/src/utils/project-package-json.js +119 -0
- package/src/utils/project-package-json.js.map +1 -0
- package/src/utils/py.d.ts +17 -3
- package/src/utils/py.js +73 -48
- 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 +112 -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 +60 -53
- package/src/utils/rdb-constructs/rdb-constructs.d.ts +12 -1
- package/src/utils/rdb-constructs/rdb-constructs.js +38 -41
- package/src/utils/rdb-constructs/rdb-constructs.js.map +1 -1
- package/src/utils/ruff.d.ts +59 -0
- package/src/utils/ruff.js +140 -0
- package/src/utils/ruff.js.map +1 -0
- package/src/utils/shared-constructs-constants.d.ts +46 -4
- package/src/utils/shared-constructs-constants.js +50 -15
- package/src/utils/shared-constructs-constants.js.map +1 -1
- package/src/utils/shared-constructs.d.ts +4 -1
- package/src/utils/shared-constructs.js +62 -67
- package/src/utils/shared-constructs.js.map +1 -1
- package/src/utils/shared-dynamodb-scripts.d.ts +18 -0
- package/src/utils/shared-dynamodb-scripts.js +35 -0
- package/src/utils/shared-dynamodb-scripts.js.map +1 -0
- 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 +26 -0
- package/src/utils/shared-infra-scripts.js +58 -0
- package/src/utils/shared-infra-scripts.js.map +1 -0
- package/src/utils/shared-rdb-scripts.d.ts +27 -0
- package/src/utils/shared-rdb-scripts.js +59 -0
- package/src/utils/shared-rdb-scripts.js.map +1 -0
- package/src/utils/shared-scripts.d.ts +1 -4
- package/src/utils/shared-scripts.js +12 -38
- package/src/utils/shared-scripts.js.map +1 -1
- package/src/utils/shared-shadcn.d.ts +26 -1
- package/src/utils/shared-shadcn.js +93 -67
- package/src/utils/shared-shadcn.js.map +1 -1
- package/src/utils/smithy.d.ts +59 -0
- package/src/utils/smithy.js +73 -0
- package/src/utils/smithy.js.map +1 -0
- package/src/utils/test-git.d.ts +39 -0
- package/src/utils/test-git.js +117 -0
- package/src/utils/test-git.js.map +1 -0
- package/src/utils/test.d.ts +10 -0
- package/src/utils/test.js +44 -25
- package/src/utils/test.js.map +1 -1
- package/src/utils/toml.d.ts +5 -0
- package/src/utils/toml.js +17 -15
- package/src/utils/toml.js.map +1 -1
- package/src/utils/version-upgrade-migration/migration.d.ts +14 -0
- package/src/utils/version-upgrade-migration/migration.js +16 -0
- package/src/utils/version-upgrade-migration/migration.js.map +1 -0
- package/src/utils/version-upgrade-migration/nx-package-updates.d.ts +45 -0
- package/src/utils/version-upgrade-migration/nx-package-updates.js +50 -0
- package/src/utils/version-upgrade-migration/nx-package-updates.js.map +1 -0
- package/src/utils/version-upgrade-migration/owned-dependencies.d.ts +76 -0
- package/src/utils/version-upgrade-migration/owned-dependencies.js +146 -0
- package/src/utils/version-upgrade-migration/owned-dependencies.js.map +1 -0
- package/src/utils/version-upgrade-migration/register.d.ts +29 -0
- package/src/utils/version-upgrade-migration/register.js +42 -0
- package/src/utils/version-upgrade-migration/register.js.map +1 -0
- package/src/utils/version-upgrade-migration/sync-embedded-versions.d.ts +26 -0
- package/src/utils/version-upgrade-migration/sync-embedded-versions.js +352 -0
- package/src/utils/version-upgrade-migration/sync-embedded-versions.js.map +1 -0
- package/src/utils/version-upgrade-migration/sync-metrics-version.d.ts +13 -0
- package/src/utils/version-upgrade-migration/sync-metrics-version.js +33 -0
- package/src/utils/version-upgrade-migration/sync-metrics-version.js.map +1 -0
- package/src/utils/version-upgrade-migration/sync-vended-versions.d.ts +10 -0
- package/src/utils/version-upgrade-migration/sync-vended-versions.js +518 -0
- package/src/utils/version-upgrade-migration/sync-vended-versions.js.map +1 -0
- package/src/utils/version-upgrade-migration/vended-upgrade.d.ts +14 -0
- package/src/utils/version-upgrade-migration/vended-upgrade.js +40 -0
- package/src/utils/version-upgrade-migration/vended-upgrade.js.map +1 -0
- package/src/utils/versions.d.ts +240 -108
- package/src/utils/versions.js +265 -121
- package/src/utils/versions.js.map +1 -1
- 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 +207 -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 +11 -0
- package/src/utils/website-constructs/website-constructs.js +49 -30
- package/src/utils/website-constructs/website-constructs.js.map +1 -1
- package/bin/aws-nx-mcp.d.ts +0 -2
- 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/license.d.ts +0 -8
- package/sdk/license.js +0 -13
- package/sdk/license.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.d.ts +0 -33
- package/src/connection/agent-serve-local.js +0 -48
- package/src/connection/agent-serve-local.js.map +0 -1
- 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/files/ag-ui/main.py.template +0 -37
- 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.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/rdb/files/scripts/pull-image.ts.template +0 -15
- package/src/ts/rdb/files/scripts/start-container.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/src/py/agent/files/{common → strands/common}/__init__.py.template +0 -0
- /package/src/smithy/project/files/{src → service/src}/main.smithy.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
|
@@ -281,7 +281,7 @@ import { EchoInputSchema, EchoOutputSchema } from '../schema/index.js';
|
|
|
281
281
|
export const echo = publicProcedure
|
|
282
282
|
.input(EchoInputSchema)
|
|
283
283
|
.output(EchoOutputSchema)
|
|
284
|
-
.query((opts) => ({
|
|
284
|
+
.query((opts) => ({ message: opts.input.message }));
|
|
285
285
|
"
|
|
286
286
|
`;
|
|
287
287
|
|
|
@@ -303,13 +303,13 @@ exports[`trpc backend generator > should generate the project > apps/test-api/sr
|
|
|
303
303
|
"import { z } from 'zod';
|
|
304
304
|
|
|
305
305
|
export const EchoInputSchema = z.object({
|
|
306
|
-
message: z.string(),
|
|
306
|
+
message: z.string().max(1024),
|
|
307
307
|
});
|
|
308
308
|
|
|
309
309
|
export type IEchoInput = z.TypeOf<typeof EchoInputSchema>;
|
|
310
310
|
|
|
311
311
|
export const EchoOutputSchema = z.object({
|
|
312
|
-
|
|
312
|
+
message: z.string().max(1024),
|
|
313
313
|
});
|
|
314
314
|
|
|
315
315
|
export type IEchoOutput = z.TypeOf<typeof EchoOutputSchema>;
|
|
@@ -380,9 +380,10 @@ import {
|
|
|
380
380
|
IntegrationBuilder,
|
|
381
381
|
RestApiIntegration,
|
|
382
382
|
} from '../../core/api/utils.js';
|
|
383
|
+
import { findCloudFrontDomainNames } from '../../core/cloudfront.js';
|
|
383
384
|
import { AddCorsPreflightAspect, RestApi } from '../../core/api/rest-api.js';
|
|
384
385
|
import { Procedures, routerToOperations } from '../../core/api/trpc-utils.js';
|
|
385
|
-
import { AppRouter, appRouter } from '
|
|
386
|
+
import { AppRouter, appRouter } from '@proj/test-api';
|
|
386
387
|
|
|
387
388
|
// String union type for all API operation names
|
|
388
389
|
type Operations = Procedures<AppRouter>;
|
|
@@ -435,7 +436,7 @@ export class TestApi<
|
|
|
435
436
|
return IntegrationBuilder.rest({
|
|
436
437
|
pattern: 'isolated',
|
|
437
438
|
operations: routerToOperations(appRouter),
|
|
438
|
-
defaultIntegrationOptions:
|
|
439
|
+
defaultIntegrationOptions: {
|
|
439
440
|
runtime: Runtime.NODEJS_LATEST,
|
|
440
441
|
handler: 'index.handler',
|
|
441
442
|
code: Code.fromAsset(
|
|
@@ -448,7 +449,7 @@ export class TestApi<
|
|
|
448
449
|
),
|
|
449
450
|
timeout: Duration.seconds(30),
|
|
450
451
|
tracing: Tracing.ACTIVE,
|
|
451
|
-
},
|
|
452
|
+
} as FunctionProps,
|
|
452
453
|
buildDefaultIntegration: (op, props: FunctionProps) => {
|
|
453
454
|
const handler = new Function(scope, \`TestApi\${op}Handler\`, props);
|
|
454
455
|
handler.addEnvironment(
|
|
@@ -478,6 +479,9 @@ export class TestApi<
|
|
|
478
479
|
authorizer: new CognitoUserPoolsAuthorizer(scope, 'TestApiAuthorizer', {
|
|
479
480
|
cognitoUserPools: [props.identity.userPool],
|
|
480
481
|
}),
|
|
482
|
+
// Accept access tokens from both sign-in flows: 'openid' (Cognito hosted UI)
|
|
483
|
+
// and 'aws.cognito.signin.user.admin' (Cognito admin/SRP auth APIs).
|
|
484
|
+
authorizationScopes: ['openid', 'aws.cognito.signin.user.admin'],
|
|
481
485
|
},
|
|
482
486
|
deployOptions: {
|
|
483
487
|
tracingEnabled: true,
|
|
@@ -504,7 +508,9 @@ export class TestApi<
|
|
|
504
508
|
*
|
|
505
509
|
* Configures the provided CloudFront distribution domains or origin strings
|
|
506
510
|
* as the only permitted CORS origins in API Gateway preflight responses and the
|
|
507
|
-
* AWS Lambda integrations.
|
|
511
|
+
* AWS Lambda integrations. Any custom domain names (aliases) configured on a
|
|
512
|
+
* CloudFront distribution are included automatically alongside its default
|
|
513
|
+
* \`*.cloudfront.net\` domain.
|
|
508
514
|
*
|
|
509
515
|
* @param origins - The origin strings, CloudFront distributions, or objects containing a CloudFront distribution to grant CORS from
|
|
510
516
|
*/
|
|
@@ -515,12 +521,14 @@ export class TestApi<
|
|
|
515
521
|
| { cloudFrontDistribution: Distribution }
|
|
516
522
|
)[]
|
|
517
523
|
) {
|
|
518
|
-
const allowedOrigins = origins.
|
|
524
|
+
const allowedOrigins = origins.flatMap((origin) =>
|
|
519
525
|
typeof origin === 'string'
|
|
520
|
-
? origin
|
|
521
|
-
:
|
|
522
|
-
|
|
523
|
-
|
|
526
|
+
? [origin]
|
|
527
|
+
: findCloudFrontDomainNames(
|
|
528
|
+
'cloudFrontDistribution' in origin
|
|
529
|
+
? origin.cloudFrontDistribution
|
|
530
|
+
: origin,
|
|
531
|
+
).map((domain) => \`https://\${domain}\`),
|
|
524
532
|
);
|
|
525
533
|
|
|
526
534
|
this.allowedOrigins = allowedOrigins;
|
|
@@ -589,9 +597,10 @@ import {
|
|
|
589
597
|
HttpApiIntegration,
|
|
590
598
|
IntegrationBuilder,
|
|
591
599
|
} from '../../core/api/utils.js';
|
|
600
|
+
import { findCloudFrontDomainNames } from '../../core/cloudfront.js';
|
|
592
601
|
import { HttpApi } from '../../core/api/http-api.js';
|
|
593
602
|
import { Procedures, routerToOperations } from '../../core/api/trpc-utils.js';
|
|
594
|
-
import { AppRouter, appRouter } from '
|
|
603
|
+
import { AppRouter, appRouter } from '@proj/test-api';
|
|
595
604
|
|
|
596
605
|
// String union type for all API operation names
|
|
597
606
|
type Operations = Procedures<AppRouter>;
|
|
@@ -637,7 +646,7 @@ export class TestApi<
|
|
|
637
646
|
return IntegrationBuilder.http({
|
|
638
647
|
pattern: 'isolated',
|
|
639
648
|
operations: routerToOperations(appRouter),
|
|
640
|
-
defaultIntegrationOptions:
|
|
649
|
+
defaultIntegrationOptions: {
|
|
641
650
|
runtime: Runtime.NODEJS_LATEST,
|
|
642
651
|
handler: 'index.handler',
|
|
643
652
|
code: Code.fromAsset(
|
|
@@ -650,7 +659,7 @@ export class TestApi<
|
|
|
650
659
|
),
|
|
651
660
|
timeout: Duration.seconds(30),
|
|
652
661
|
tracing: Tracing.ACTIVE,
|
|
653
|
-
},
|
|
662
|
+
} as FunctionProps,
|
|
654
663
|
buildDefaultIntegration: (op, props: FunctionProps) => {
|
|
655
664
|
const handler = new Function(scope, \`TestApi\${op}Handler\`, props);
|
|
656
665
|
handler.addEnvironment(
|
|
@@ -706,6 +715,8 @@ export class TestApi<
|
|
|
706
715
|
* as the only permitted CORS origins
|
|
707
716
|
* in the API gateway. The CORS origins are not configured within the AWS Lambda
|
|
708
717
|
* integrations since the associated header is controlled by API Gateway v2.
|
|
718
|
+
* Any custom domain names (aliases) configured on a CloudFront distribution are
|
|
719
|
+
* included automatically alongside its default \`*.cloudfront.net\` domain.
|
|
709
720
|
*
|
|
710
721
|
* @param origins - The origin strings, CloudFront distributions, or objects containing a CloudFront distribution to grant CORS from
|
|
711
722
|
*/
|
|
@@ -716,12 +727,14 @@ export class TestApi<
|
|
|
716
727
|
| { cloudFrontDistribution: Distribution }
|
|
717
728
|
)[]
|
|
718
729
|
) {
|
|
719
|
-
const allowedOrigins = origins.
|
|
730
|
+
const allowedOrigins = origins.flatMap((origin) =>
|
|
720
731
|
typeof origin === 'string'
|
|
721
|
-
? origin
|
|
722
|
-
:
|
|
723
|
-
|
|
724
|
-
|
|
732
|
+
? [origin]
|
|
733
|
+
: findCloudFrontDomainNames(
|
|
734
|
+
'cloudFrontDistribution' in origin
|
|
735
|
+
? origin.cloudFrontDistribution
|
|
736
|
+
: origin,
|
|
737
|
+
).map((domain) => \`https://\${domain}\`),
|
|
725
738
|
);
|
|
726
739
|
|
|
727
740
|
const cfnApi = this.api.node.defaultChild;
|
|
@@ -801,9 +814,10 @@ import {
|
|
|
801
814
|
IntegrationBuilder,
|
|
802
815
|
RestApiIntegration,
|
|
803
816
|
} from '../../core/api/utils.js';
|
|
817
|
+
import { findCloudFrontDomainNames } from '../../core/cloudfront.js';
|
|
804
818
|
import { AddCorsPreflightAspect, RestApi } from '../../core/api/rest-api.js';
|
|
805
819
|
import { Procedures, routerToOperations } from '../../core/api/trpc-utils.js';
|
|
806
|
-
import { AppRouter, appRouter } from '
|
|
820
|
+
import { AppRouter, appRouter } from '@proj/test-api';
|
|
807
821
|
|
|
808
822
|
// String union type for all API operation names
|
|
809
823
|
type Operations = Procedures<AppRouter>;
|
|
@@ -850,7 +864,7 @@ export class TestApi<
|
|
|
850
864
|
return IntegrationBuilder.rest({
|
|
851
865
|
pattern: 'isolated',
|
|
852
866
|
operations: routerToOperations(appRouter),
|
|
853
|
-
defaultIntegrationOptions:
|
|
867
|
+
defaultIntegrationOptions: {
|
|
854
868
|
runtime: Runtime.NODEJS_LATEST,
|
|
855
869
|
handler: 'index.handler',
|
|
856
870
|
code: Code.fromAsset(
|
|
@@ -863,7 +877,7 @@ export class TestApi<
|
|
|
863
877
|
),
|
|
864
878
|
timeout: Duration.seconds(30),
|
|
865
879
|
tracing: Tracing.ACTIVE,
|
|
866
|
-
},
|
|
880
|
+
} as FunctionProps,
|
|
867
881
|
buildDefaultIntegration: (op, props: FunctionProps) => {
|
|
868
882
|
const handler = new Function(scope, \`TestApi\${op}Handler\`, props);
|
|
869
883
|
handler.addEnvironment(
|
|
@@ -938,7 +952,9 @@ export class TestApi<
|
|
|
938
952
|
*
|
|
939
953
|
* Configures the provided CloudFront distribution domains or origin strings
|
|
940
954
|
* as the only permitted CORS origins in API Gateway preflight responses and the
|
|
941
|
-
* AWS Lambda integrations.
|
|
955
|
+
* AWS Lambda integrations. Any custom domain names (aliases) configured on a
|
|
956
|
+
* CloudFront distribution are included automatically alongside its default
|
|
957
|
+
* \`*.cloudfront.net\` domain.
|
|
942
958
|
*
|
|
943
959
|
* @param origins - The origin strings, CloudFront distributions, or objects containing a CloudFront distribution to grant CORS from
|
|
944
960
|
*/
|
|
@@ -949,12 +965,14 @@ export class TestApi<
|
|
|
949
965
|
| { cloudFrontDistribution: Distribution }
|
|
950
966
|
)[]
|
|
951
967
|
) {
|
|
952
|
-
const allowedOrigins = origins.
|
|
968
|
+
const allowedOrigins = origins.flatMap((origin) =>
|
|
953
969
|
typeof origin === 'string'
|
|
954
|
-
? origin
|
|
955
|
-
:
|
|
956
|
-
|
|
957
|
-
|
|
970
|
+
? [origin]
|
|
971
|
+
: findCloudFrontDomainNames(
|
|
972
|
+
'cloudFrontDistribution' in origin
|
|
973
|
+
? origin.cloudFrontDistribution
|
|
974
|
+
: origin,
|
|
975
|
+
).map((domain) => \`https://\${domain}\`),
|
|
958
976
|
);
|
|
959
977
|
|
|
960
978
|
this.allowedOrigins = allowedOrigins;
|
|
@@ -1021,9 +1039,10 @@ import {
|
|
|
1021
1039
|
HttpApiIntegration,
|
|
1022
1040
|
IntegrationBuilder,
|
|
1023
1041
|
} from '../../core/api/utils.js';
|
|
1042
|
+
import { findCloudFrontDomainNames } from '../../core/cloudfront.js';
|
|
1024
1043
|
import { HttpApi } from '../../core/api/http-api.js';
|
|
1025
1044
|
import { Procedures, routerToOperations } from '../../core/api/trpc-utils.js';
|
|
1026
|
-
import { AppRouter, appRouter } from '
|
|
1045
|
+
import { AppRouter, appRouter } from '@proj/test-api';
|
|
1027
1046
|
|
|
1028
1047
|
// String union type for all API operation names
|
|
1029
1048
|
type Operations = Procedures<AppRouter>;
|
|
@@ -1062,7 +1081,7 @@ export class TestApi<
|
|
|
1062
1081
|
return IntegrationBuilder.http({
|
|
1063
1082
|
pattern: 'isolated',
|
|
1064
1083
|
operations: routerToOperations(appRouter),
|
|
1065
|
-
defaultIntegrationOptions:
|
|
1084
|
+
defaultIntegrationOptions: {
|
|
1066
1085
|
runtime: Runtime.NODEJS_LATEST,
|
|
1067
1086
|
handler: 'index.handler',
|
|
1068
1087
|
code: Code.fromAsset(
|
|
@@ -1075,7 +1094,7 @@ export class TestApi<
|
|
|
1075
1094
|
),
|
|
1076
1095
|
timeout: Duration.seconds(30),
|
|
1077
1096
|
tracing: Tracing.ACTIVE,
|
|
1078
|
-
},
|
|
1097
|
+
} as FunctionProps,
|
|
1079
1098
|
buildDefaultIntegration: (op, props: FunctionProps) => {
|
|
1080
1099
|
const handler = new Function(scope, \`TestApi\${op}Handler\`, props);
|
|
1081
1100
|
handler.addEnvironment(
|
|
@@ -1150,6 +1169,8 @@ export class TestApi<
|
|
|
1150
1169
|
* as the only permitted CORS origins
|
|
1151
1170
|
* in the API gateway. The CORS origins are not configured within the AWS Lambda
|
|
1152
1171
|
* integrations since the associated header is controlled by API Gateway v2.
|
|
1172
|
+
* Any custom domain names (aliases) configured on a CloudFront distribution are
|
|
1173
|
+
* included automatically alongside its default \`*.cloudfront.net\` domain.
|
|
1153
1174
|
*
|
|
1154
1175
|
* @param origins - The origin strings, CloudFront distributions, or objects containing a CloudFront distribution to grant CORS from
|
|
1155
1176
|
*/
|
|
@@ -1160,12 +1181,14 @@ export class TestApi<
|
|
|
1160
1181
|
| { cloudFrontDistribution: Distribution }
|
|
1161
1182
|
)[]
|
|
1162
1183
|
) {
|
|
1163
|
-
const allowedOrigins = origins.
|
|
1184
|
+
const allowedOrigins = origins.flatMap((origin) =>
|
|
1164
1185
|
typeof origin === 'string'
|
|
1165
|
-
? origin
|
|
1166
|
-
:
|
|
1167
|
-
|
|
1168
|
-
|
|
1186
|
+
? [origin]
|
|
1187
|
+
: findCloudFrontDomainNames(
|
|
1188
|
+
'cloudFrontDistribution' in origin
|
|
1189
|
+
? origin.cloudFrontDistribution
|
|
1190
|
+
: origin,
|
|
1191
|
+
).map((domain) => \`https://\${domain}\`),
|
|
1169
1192
|
);
|
|
1170
1193
|
|
|
1171
1194
|
const cfnApi = this.api.node.defaultChild;
|
|
@@ -1199,15 +1222,18 @@ import {
|
|
|
1199
1222
|
HttpApiIntegration,
|
|
1200
1223
|
OperationDetails,
|
|
1201
1224
|
} from './utils.js';
|
|
1202
|
-
import { CfnOutput } from 'aws-cdk-lib';
|
|
1225
|
+
import { CfnOutput, Stack } from 'aws-cdk-lib';
|
|
1203
1226
|
import {
|
|
1204
1227
|
HttpApi as _HttpApi,
|
|
1205
1228
|
HttpApiProps as _HttpApiProps,
|
|
1206
1229
|
HttpMethod,
|
|
1207
1230
|
HttpStage,
|
|
1208
1231
|
LogGroupLogDestination,
|
|
1232
|
+
ThrottleSettings,
|
|
1209
1233
|
} from 'aws-cdk-lib/aws-apigatewayv2';
|
|
1210
1234
|
import { LogGroup } from 'aws-cdk-lib/aws-logs';
|
|
1235
|
+
import { Key } from 'aws-cdk-lib/aws-kms';
|
|
1236
|
+
import { ServicePrincipal } from 'aws-cdk-lib/aws-iam';
|
|
1211
1237
|
import { suppressRules } from '../checkov.js';
|
|
1212
1238
|
|
|
1213
1239
|
/**
|
|
@@ -1232,6 +1258,12 @@ export interface HttpApiProps<
|
|
|
1232
1258
|
* Map of operation names to their API Gateway integrations
|
|
1233
1259
|
*/
|
|
1234
1260
|
readonly integrations: TIntegrations;
|
|
1261
|
+
/**
|
|
1262
|
+
* Default throttling limits applied to the API's default stage.
|
|
1263
|
+
*
|
|
1264
|
+
* @default { rateLimit: 10000, burstLimit: 5000 }
|
|
1265
|
+
*/
|
|
1266
|
+
readonly throttle?: ThrottleSettings;
|
|
1235
1267
|
}
|
|
1236
1268
|
|
|
1237
1269
|
/**
|
|
@@ -1265,6 +1297,7 @@ export class HttpApi<
|
|
|
1265
1297
|
apiName,
|
|
1266
1298
|
operations,
|
|
1267
1299
|
integrations,
|
|
1300
|
+
throttle = { rateLimit: 10000, burstLimit: 5000 },
|
|
1268
1301
|
...props
|
|
1269
1302
|
}: HttpApiProps<TIntegrations, TOperation>,
|
|
1270
1303
|
) {
|
|
@@ -1277,12 +1310,18 @@ export class HttpApi<
|
|
|
1277
1310
|
...props,
|
|
1278
1311
|
});
|
|
1279
1312
|
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1313
|
+
// Customer-managed key for access log encryption at rest
|
|
1314
|
+
const logsKey = new Key(this, 'AccessLogsKey', {
|
|
1315
|
+
enableKeyRotation: true,
|
|
1316
|
+
});
|
|
1317
|
+
const stack = Stack.of(this);
|
|
1318
|
+
logsKey.grantEncryptDecrypt(
|
|
1319
|
+
new ServicePrincipal(\`logs.\${stack.region}.amazonaws.com\`),
|
|
1285
1320
|
);
|
|
1321
|
+
|
|
1322
|
+
const accessLogGroup = new LogGroup(this, 'AccessLogs', {
|
|
1323
|
+
encryptionKey: logsKey,
|
|
1324
|
+
});
|
|
1286
1325
|
suppressRules(
|
|
1287
1326
|
accessLogGroup,
|
|
1288
1327
|
['CKV_AWS_66', 'CKV_AWS_338'],
|
|
@@ -1292,6 +1331,7 @@ export class HttpApi<
|
|
|
1292
1331
|
this.defaultStage = new HttpStage(this, 'DefaultStage', {
|
|
1293
1332
|
httpApi: this.api,
|
|
1294
1333
|
autoDeploy: true,
|
|
1334
|
+
throttle,
|
|
1295
1335
|
accessLogSettings: {
|
|
1296
1336
|
destination: new LogGroupLogDestination(accessLogGroup),
|
|
1297
1337
|
},
|
|
@@ -1371,9 +1411,10 @@ import {
|
|
|
1371
1411
|
HttpApiIntegration,
|
|
1372
1412
|
IntegrationBuilder,
|
|
1373
1413
|
} from '../../core/api/utils.js';
|
|
1414
|
+
import { findCloudFrontDomainNames } from '../../core/cloudfront.js';
|
|
1374
1415
|
import { HttpApi } from '../../core/api/http-api.js';
|
|
1375
1416
|
import { Procedures, routerToOperations } from '../../core/api/trpc-utils.js';
|
|
1376
|
-
import { AppRouter, appRouter } from '
|
|
1417
|
+
import { AppRouter, appRouter } from '@proj/test-api';
|
|
1377
1418
|
|
|
1378
1419
|
// String union type for all API operation names
|
|
1379
1420
|
type Operations = Procedures<AppRouter>;
|
|
@@ -1412,7 +1453,7 @@ export class TestApi<
|
|
|
1412
1453
|
return IntegrationBuilder.http({
|
|
1413
1454
|
pattern: 'isolated',
|
|
1414
1455
|
operations: routerToOperations(appRouter),
|
|
1415
|
-
defaultIntegrationOptions:
|
|
1456
|
+
defaultIntegrationOptions: {
|
|
1416
1457
|
runtime: Runtime.NODEJS_LATEST,
|
|
1417
1458
|
handler: 'index.handler',
|
|
1418
1459
|
code: Code.fromAsset(
|
|
@@ -1425,7 +1466,7 @@ export class TestApi<
|
|
|
1425
1466
|
),
|
|
1426
1467
|
timeout: Duration.seconds(30),
|
|
1427
1468
|
tracing: Tracing.ACTIVE,
|
|
1428
|
-
},
|
|
1469
|
+
} as FunctionProps,
|
|
1429
1470
|
buildDefaultIntegration: (op, props: FunctionProps) => {
|
|
1430
1471
|
const handler = new Function(scope, \`TestApi\${op}Handler\`, props);
|
|
1431
1472
|
handler.addEnvironment(
|
|
@@ -1475,6 +1516,8 @@ export class TestApi<
|
|
|
1475
1516
|
* as the only permitted CORS origins
|
|
1476
1517
|
* in the API gateway. The CORS origins are not configured within the AWS Lambda
|
|
1477
1518
|
* integrations since the associated header is controlled by API Gateway v2.
|
|
1519
|
+
* Any custom domain names (aliases) configured on a CloudFront distribution are
|
|
1520
|
+
* included automatically alongside its default \`*.cloudfront.net\` domain.
|
|
1478
1521
|
*
|
|
1479
1522
|
* @param origins - The origin strings, CloudFront distributions, or objects containing a CloudFront distribution to grant CORS from
|
|
1480
1523
|
*/
|
|
@@ -1485,12 +1528,14 @@ export class TestApi<
|
|
|
1485
1528
|
| { cloudFrontDistribution: Distribution }
|
|
1486
1529
|
)[]
|
|
1487
1530
|
) {
|
|
1488
|
-
const allowedOrigins = origins.
|
|
1531
|
+
const allowedOrigins = origins.flatMap((origin) =>
|
|
1489
1532
|
typeof origin === 'string'
|
|
1490
|
-
? origin
|
|
1491
|
-
:
|
|
1492
|
-
|
|
1493
|
-
|
|
1533
|
+
? [origin]
|
|
1534
|
+
: findCloudFrontDomainNames(
|
|
1535
|
+
'cloudFrontDistribution' in origin
|
|
1536
|
+
? origin.cloudFrontDistribution
|
|
1537
|
+
: origin,
|
|
1538
|
+
).map((domain) => \`https://\${domain}\`),
|
|
1494
1539
|
);
|
|
1495
1540
|
|
|
1496
1541
|
const cfnApi = this.api.node.defaultChild;
|
|
@@ -1751,6 +1796,8 @@ export type ApiIntegrations<TOperation extends string, TBaseIntegration> =
|
|
|
1751
1796
|
* @template TDefaultIntegrationProps - Type for default integration properties
|
|
1752
1797
|
* @template TDefaultIntegration - Type for default integration implementation
|
|
1753
1798
|
* @template TPattern - The integration pattern ('shared' or 'isolated')
|
|
1799
|
+
* @template TOverridden - Union of operation names that have been overridden
|
|
1800
|
+
* @template TOperationOptioned - Union of operation names with per-operation options
|
|
1754
1801
|
*/
|
|
1755
1802
|
export class IntegrationBuilder<
|
|
1756
1803
|
TOperation extends string,
|
|
@@ -1759,6 +1806,8 @@ export class IntegrationBuilder<
|
|
|
1759
1806
|
TDefaultIntegrationProps extends object,
|
|
1760
1807
|
TDefaultIntegration extends TBaseIntegration,
|
|
1761
1808
|
TPattern extends 'shared' | 'isolated',
|
|
1809
|
+
TOverridden extends string = never,
|
|
1810
|
+
TOperationOptioned extends string = never,
|
|
1762
1811
|
> {
|
|
1763
1812
|
/** Options for the integration builder */
|
|
1764
1813
|
private options: IntegrationBuilderProps<
|
|
@@ -1771,6 +1820,11 @@ export class IntegrationBuilder<
|
|
|
1771
1820
|
/** Map of operation names to their custom integrations */
|
|
1772
1821
|
private integrations: Partial<TIntegrations> = {};
|
|
1773
1822
|
|
|
1823
|
+
/** Map of default integration keys to per-operation default option overrides */
|
|
1824
|
+
private perOperationOptions: Partial<
|
|
1825
|
+
Record<string, Partial<TDefaultIntegrationProps>>
|
|
1826
|
+
> = {};
|
|
1827
|
+
|
|
1774
1828
|
/**
|
|
1775
1829
|
* Create an Integration Builder for an HTTP API with a shared pattern
|
|
1776
1830
|
*/
|
|
@@ -1925,11 +1979,16 @@ export class IntegrationBuilder<
|
|
|
1925
1979
|
/**
|
|
1926
1980
|
* Overrides default integrations with custom implementations for specific operations.
|
|
1927
1981
|
*
|
|
1982
|
+
* Operations which have per-operation options set via withOperationOptions cannot be
|
|
1983
|
+
* overridden, since these still use the default integration.
|
|
1984
|
+
*
|
|
1928
1985
|
* @param overrides - Map of operation names to their custom integration implementations
|
|
1929
1986
|
* @returns The builder instance with updated type information reflecting the overrides
|
|
1930
1987
|
*/
|
|
1931
1988
|
public withOverrides<
|
|
1932
|
-
TOverrideIntegrations extends Partial<
|
|
1989
|
+
TOverrideIntegrations extends Partial<
|
|
1990
|
+
Record<Exclude<TOperation, TOperationOptioned>, TBaseIntegration>
|
|
1991
|
+
>,
|
|
1933
1992
|
>(overrides: TOverrideIntegrations) {
|
|
1934
1993
|
this.integrations = { ...this.integrations, ...overrides };
|
|
1935
1994
|
// Re-type to include the overridden integration types.
|
|
@@ -1945,7 +2004,9 @@ export class IntegrationBuilder<
|
|
|
1945
2004
|
MergedIntegrations,
|
|
1946
2005
|
TDefaultIntegrationProps,
|
|
1947
2006
|
TDefaultIntegration,
|
|
1948
|
-
TPattern
|
|
2007
|
+
TPattern,
|
|
2008
|
+
TOverridden | Extract<keyof TOverrideIntegrations, string>,
|
|
2009
|
+
TOperationOptioned
|
|
1949
2010
|
>;
|
|
1950
2011
|
}
|
|
1951
2012
|
|
|
@@ -1964,6 +2025,43 @@ export class IntegrationBuilder<
|
|
|
1964
2025
|
return this;
|
|
1965
2026
|
}
|
|
1966
2027
|
|
|
2028
|
+
/**
|
|
2029
|
+
* Updates the default integration options for specific operations, without
|
|
2030
|
+
* affecting the others. The given options are merged with the defaults (and
|
|
2031
|
+
* any options set via withDefaultOptions) when building each default integration.
|
|
2032
|
+
*
|
|
2033
|
+
* Operations which have been replaced via withOverrides cannot be targeted, since
|
|
2034
|
+
* they no longer use the default integration.
|
|
2035
|
+
*
|
|
2036
|
+
* @param options - Map of operation names to partial default integration options
|
|
2037
|
+
* @returns The builder instance
|
|
2038
|
+
*/
|
|
2039
|
+
public withOperationOptions<
|
|
2040
|
+
TOptions extends Partial<
|
|
2041
|
+
Record<
|
|
2042
|
+
Exclude<DefaultIntegrationKeys<TPattern, TOperation>, TOverridden>,
|
|
2043
|
+
Partial<TDefaultIntegrationProps>
|
|
2044
|
+
>
|
|
2045
|
+
>,
|
|
2046
|
+
>(options: TOptions) {
|
|
2047
|
+
Object.entries(options).forEach(([op, opOptions]) => {
|
|
2048
|
+
this.perOperationOptions[op] = {
|
|
2049
|
+
...this.perOperationOptions[op],
|
|
2050
|
+
...(opOptions as Partial<TDefaultIntegrationProps>),
|
|
2051
|
+
};
|
|
2052
|
+
});
|
|
2053
|
+
return this as unknown as IntegrationBuilder<
|
|
2054
|
+
TOperation,
|
|
2055
|
+
TBaseIntegration,
|
|
2056
|
+
TIntegrations,
|
|
2057
|
+
TDefaultIntegrationProps,
|
|
2058
|
+
TDefaultIntegration,
|
|
2059
|
+
TPattern,
|
|
2060
|
+
TOverridden,
|
|
2061
|
+
TOperationOptioned | Extract<keyof TOptions, string>
|
|
2062
|
+
>;
|
|
2063
|
+
}
|
|
2064
|
+
|
|
1967
2065
|
/**
|
|
1968
2066
|
* Builds and returns the complete set of integrations.
|
|
1969
2067
|
*
|
|
@@ -1978,6 +2076,10 @@ export class IntegrationBuilder<
|
|
|
1978
2076
|
*/
|
|
1979
2077
|
public build(): TIntegrations {
|
|
1980
2078
|
const options = this.options;
|
|
2079
|
+
const buildOptionsFor = (op: string): TDefaultIntegrationProps => ({
|
|
2080
|
+
...options.defaultIntegrationOptions,
|
|
2081
|
+
...this.perOperationOptions[op],
|
|
2082
|
+
});
|
|
1981
2083
|
return {
|
|
1982
2084
|
...Object.fromEntries(
|
|
1983
2085
|
options.pattern === 'shared'
|
|
@@ -1986,7 +2088,7 @@ export class IntegrationBuilder<
|
|
|
1986
2088
|
'$router',
|
|
1987
2089
|
options.buildDefaultIntegration(
|
|
1988
2090
|
'$router',
|
|
1989
|
-
|
|
2091
|
+
buildOptionsFor('$router'),
|
|
1990
2092
|
),
|
|
1991
2093
|
],
|
|
1992
2094
|
]
|
|
@@ -1997,10 +2099,7 @@ export class IntegrationBuilder<
|
|
|
1997
2099
|
)
|
|
1998
2100
|
.map((op) => [
|
|
1999
2101
|
op,
|
|
2000
|
-
options.buildDefaultIntegration(
|
|
2001
|
-
op,
|
|
2002
|
-
options.defaultIntegrationOptions,
|
|
2003
|
-
),
|
|
2102
|
+
options.buildDefaultIntegration(op, buildOptionsFor(op)),
|
|
2004
2103
|
]),
|
|
2005
2104
|
),
|
|
2006
2105
|
...this.integrations,
|
|
@@ -2013,21 +2112,27 @@ export class IntegrationBuilder<
|
|
|
2013
2112
|
exports[`trpc backend generator > should set up shared constructs for rest > rest-api.ts 1`] = `
|
|
2014
2113
|
"import { Construct, IConstruct } from 'constructs';
|
|
2015
2114
|
import {
|
|
2115
|
+
AccessLogFormat,
|
|
2016
2116
|
Cors,
|
|
2117
|
+
LogGroupLogDestination,
|
|
2017
2118
|
Resource,
|
|
2018
2119
|
RestApi as _RestApi,
|
|
2019
2120
|
RestApiProps as _RestApiProps,
|
|
2020
2121
|
IResource,
|
|
2021
2122
|
Stage,
|
|
2123
|
+
ThrottleSettings,
|
|
2022
2124
|
} from 'aws-cdk-lib/aws-apigateway';
|
|
2023
|
-
import { IAspect, RemovalPolicy } from 'aws-cdk-lib';
|
|
2125
|
+
import { IAspect, RemovalPolicy, Stack } from 'aws-cdk-lib';
|
|
2024
2126
|
import {
|
|
2025
2127
|
CfnLoggingConfiguration,
|
|
2026
2128
|
CfnWebACL,
|
|
2027
2129
|
CfnWebACLAssociation,
|
|
2028
2130
|
} from 'aws-cdk-lib/aws-wafv2';
|
|
2029
2131
|
import { LogGroup, RetentionDays } from 'aws-cdk-lib/aws-logs';
|
|
2132
|
+
import { Key } from 'aws-cdk-lib/aws-kms';
|
|
2133
|
+
import { ServicePrincipal } from 'aws-cdk-lib/aws-iam';
|
|
2030
2134
|
import { RuntimeConfig } from '../runtime-config.js';
|
|
2135
|
+
import { ApiGatewayAccount } from './api-gateway-account.js';
|
|
2031
2136
|
import {
|
|
2032
2137
|
ApiIntegrations,
|
|
2033
2138
|
OperationDetails,
|
|
@@ -2065,6 +2170,12 @@ export interface RestApiProps<
|
|
|
2065
2170
|
* @default true
|
|
2066
2171
|
*/
|
|
2067
2172
|
readonly enableWaf?: boolean;
|
|
2173
|
+
/**
|
|
2174
|
+
* Default throttling limits applied to all methods on the API's default stage.
|
|
2175
|
+
*
|
|
2176
|
+
* @default { rateLimit: 10000, burstLimit: 5000 }
|
|
2177
|
+
*/
|
|
2178
|
+
readonly throttle?: ThrottleSettings;
|
|
2068
2179
|
}
|
|
2069
2180
|
|
|
2070
2181
|
/**
|
|
@@ -2099,14 +2210,49 @@ export class RestApi<
|
|
|
2099
2210
|
operations,
|
|
2100
2211
|
integrations,
|
|
2101
2212
|
enableWaf = true,
|
|
2213
|
+
throttle = { rateLimit: 10000, burstLimit: 5000 },
|
|
2102
2214
|
...props
|
|
2103
2215
|
}: RestApiProps<TIntegrations, TOperation>,
|
|
2104
2216
|
) {
|
|
2105
2217
|
super(scope, id);
|
|
2106
2218
|
this.integrations = integrations;
|
|
2107
2219
|
|
|
2220
|
+
// Account-level CloudWatch role required for REST API access logging
|
|
2221
|
+
const account = ApiGatewayAccount.ensure(this);
|
|
2222
|
+
|
|
2223
|
+
// KMS key for encrypting logs at rest, usable by CloudWatch Logs
|
|
2224
|
+
const logsKey = new Key(this, 'LogsKey', {
|
|
2225
|
+
enableKeyRotation: true,
|
|
2226
|
+
});
|
|
2227
|
+
logsKey.grantEncryptDecrypt(
|
|
2228
|
+
new ServicePrincipal(\`logs.\${Stack.of(this).region}.amazonaws.com\`),
|
|
2229
|
+
);
|
|
2230
|
+
|
|
2231
|
+
const accessLogs = new LogGroup(this, 'AccessLogs', {
|
|
2232
|
+
retention: RetentionDays.ONE_YEAR,
|
|
2233
|
+
encryptionKey: logsKey,
|
|
2234
|
+
});
|
|
2235
|
+
|
|
2108
2236
|
// Create the API Gateway REST API
|
|
2109
|
-
this.api = new _RestApi(this, 'Api',
|
|
2237
|
+
this.api = new _RestApi(this, 'Api', {
|
|
2238
|
+
...props,
|
|
2239
|
+
deployOptions: {
|
|
2240
|
+
accessLogDestination: new LogGroupLogDestination(accessLogs),
|
|
2241
|
+
accessLogFormat: AccessLogFormat.jsonWithStandardFields(),
|
|
2242
|
+
...props.deployOptions,
|
|
2243
|
+
methodOptions: {
|
|
2244
|
+
...props.deployOptions?.methodOptions,
|
|
2245
|
+
// Default throttling applied to all resource paths and methods
|
|
2246
|
+
'/*/*': {
|
|
2247
|
+
throttlingRateLimit: throttle.rateLimit,
|
|
2248
|
+
throttlingBurstLimit: throttle.burstLimit,
|
|
2249
|
+
...props.deployOptions?.methodOptions?.['/*/*'],
|
|
2250
|
+
},
|
|
2251
|
+
},
|
|
2252
|
+
},
|
|
2253
|
+
});
|
|
2254
|
+
// Ensure the account-level role is configured before the stage is created
|
|
2255
|
+
this.api.deploymentStage.node.addDependency(account.resource);
|
|
2110
2256
|
|
|
2111
2257
|
if (enableWaf) {
|
|
2112
2258
|
this.webAcl = new CfnWebACL(this, 'WebAcl', {
|
|
@@ -2173,14 +2319,12 @@ export class RestApi<
|
|
|
2173
2319
|
// \`aws-waf-logs-\` to satisfy the WAFv2 logging destination requirement.
|
|
2174
2320
|
const wafLogGroup = new LogGroup(this, 'WebAclLogs', {
|
|
2175
2321
|
logGroupName: \`aws-waf-logs-\${apiName}-\${this.node.addr.slice(-8)}\`,
|
|
2176
|
-
retention: RetentionDays.
|
|
2322
|
+
retention: RetentionDays.ONE_YEAR,
|
|
2323
|
+
encryptionKey: logsKey,
|
|
2324
|
+
// The log group name is deterministic, so retaining it on delete would
|
|
2325
|
+
// orphan it and block re-creation (e.g. after a rolled-back deploy).
|
|
2177
2326
|
removalPolicy: RemovalPolicy.DESTROY,
|
|
2178
2327
|
});
|
|
2179
|
-
suppressRules(
|
|
2180
|
-
wafLogGroup,
|
|
2181
|
-
['CKV_AWS_158'],
|
|
2182
|
-
'Using default CloudWatch log encryption for WAF logs',
|
|
2183
|
-
);
|
|
2184
2328
|
|
|
2185
2329
|
new CfnLoggingConfiguration(this, 'WebAclLoggingConfig', {
|
|
2186
2330
|
resourceArn: this.webAcl.attrArn,
|
|
@@ -2194,12 +2338,6 @@ export class RestApi<
|
|
|
2194
2338
|
'Caching not required for this use case',
|
|
2195
2339
|
(c) => c instanceof Stage,
|
|
2196
2340
|
);
|
|
2197
|
-
suppressRules(
|
|
2198
|
-
this.api,
|
|
2199
|
-
['CKV_AWS_76'],
|
|
2200
|
-
'API Gateway access logging disabled due to account-level CloudWatch Logs role ARN requirement',
|
|
2201
|
-
(c) => c instanceof Stage,
|
|
2202
|
-
);
|
|
2203
2341
|
|
|
2204
2342
|
// Resolve the integration for a given operation.
|
|
2205
2343
|
// If the operation has a dedicated integration, use it; otherwise fall back to $router.
|
|
@@ -2311,9 +2449,10 @@ import {
|
|
|
2311
2449
|
IntegrationBuilder,
|
|
2312
2450
|
RestApiIntegration,
|
|
2313
2451
|
} from '../../core/api/utils.js';
|
|
2452
|
+
import { findCloudFrontDomainNames } from '../../core/cloudfront.js';
|
|
2314
2453
|
import { AddCorsPreflightAspect, RestApi } from '../../core/api/rest-api.js';
|
|
2315
2454
|
import { Procedures, routerToOperations } from '../../core/api/trpc-utils.js';
|
|
2316
|
-
import { AppRouter, appRouter } from '
|
|
2455
|
+
import { AppRouter, appRouter } from '@proj/test-api';
|
|
2317
2456
|
|
|
2318
2457
|
// String union type for all API operation names
|
|
2319
2458
|
type Operations = Procedures<AppRouter>;
|
|
@@ -2360,7 +2499,7 @@ export class TestApi<
|
|
|
2360
2499
|
return IntegrationBuilder.rest({
|
|
2361
2500
|
pattern: 'isolated',
|
|
2362
2501
|
operations: routerToOperations(appRouter),
|
|
2363
|
-
defaultIntegrationOptions:
|
|
2502
|
+
defaultIntegrationOptions: {
|
|
2364
2503
|
runtime: Runtime.NODEJS_LATEST,
|
|
2365
2504
|
handler: 'index.handler',
|
|
2366
2505
|
code: Code.fromAsset(
|
|
@@ -2373,7 +2512,7 @@ export class TestApi<
|
|
|
2373
2512
|
),
|
|
2374
2513
|
timeout: Duration.seconds(30),
|
|
2375
2514
|
tracing: Tracing.ACTIVE,
|
|
2376
|
-
},
|
|
2515
|
+
} as FunctionProps,
|
|
2377
2516
|
buildDefaultIntegration: (op, props: FunctionProps) => {
|
|
2378
2517
|
const handler = new Function(scope, \`TestApi\${op}Handler\`, props);
|
|
2379
2518
|
handler.addEnvironment(
|
|
@@ -2426,7 +2565,9 @@ export class TestApi<
|
|
|
2426
2565
|
*
|
|
2427
2566
|
* Configures the provided CloudFront distribution domains or origin strings
|
|
2428
2567
|
* as the only permitted CORS origins in API Gateway preflight responses and the
|
|
2429
|
-
* AWS Lambda integrations.
|
|
2568
|
+
* AWS Lambda integrations. Any custom domain names (aliases) configured on a
|
|
2569
|
+
* CloudFront distribution are included automatically alongside its default
|
|
2570
|
+
* \`*.cloudfront.net\` domain.
|
|
2430
2571
|
*
|
|
2431
2572
|
* @param origins - The origin strings, CloudFront distributions, or objects containing a CloudFront distribution to grant CORS from
|
|
2432
2573
|
*/
|
|
@@ -2437,12 +2578,14 @@ export class TestApi<
|
|
|
2437
2578
|
| { cloudFrontDistribution: Distribution }
|
|
2438
2579
|
)[]
|
|
2439
2580
|
) {
|
|
2440
|
-
const allowedOrigins = origins.
|
|
2581
|
+
const allowedOrigins = origins.flatMap((origin) =>
|
|
2441
2582
|
typeof origin === 'string'
|
|
2442
|
-
? origin
|
|
2443
|
-
:
|
|
2444
|
-
|
|
2445
|
-
|
|
2583
|
+
? [origin]
|
|
2584
|
+
: findCloudFrontDomainNames(
|
|
2585
|
+
'cloudFrontDistribution' in origin
|
|
2586
|
+
? origin.cloudFrontDistribution
|
|
2587
|
+
: origin,
|
|
2588
|
+
).map((domain) => \`https://\${domain}\`),
|
|
2446
2589
|
);
|
|
2447
2590
|
|
|
2448
2591
|
this.allowedOrigins = allowedOrigins;
|
|
@@ -2708,6 +2851,8 @@ export type ApiIntegrations<TOperation extends string, TBaseIntegration> =
|
|
|
2708
2851
|
* @template TDefaultIntegrationProps - Type for default integration properties
|
|
2709
2852
|
* @template TDefaultIntegration - Type for default integration implementation
|
|
2710
2853
|
* @template TPattern - The integration pattern ('shared' or 'isolated')
|
|
2854
|
+
* @template TOverridden - Union of operation names that have been overridden
|
|
2855
|
+
* @template TOperationOptioned - Union of operation names with per-operation options
|
|
2711
2856
|
*/
|
|
2712
2857
|
export class IntegrationBuilder<
|
|
2713
2858
|
TOperation extends string,
|
|
@@ -2716,6 +2861,8 @@ export class IntegrationBuilder<
|
|
|
2716
2861
|
TDefaultIntegrationProps extends object,
|
|
2717
2862
|
TDefaultIntegration extends TBaseIntegration,
|
|
2718
2863
|
TPattern extends 'shared' | 'isolated',
|
|
2864
|
+
TOverridden extends string = never,
|
|
2865
|
+
TOperationOptioned extends string = never,
|
|
2719
2866
|
> {
|
|
2720
2867
|
/** Options for the integration builder */
|
|
2721
2868
|
private options: IntegrationBuilderProps<
|
|
@@ -2728,6 +2875,11 @@ export class IntegrationBuilder<
|
|
|
2728
2875
|
/** Map of operation names to their custom integrations */
|
|
2729
2876
|
private integrations: Partial<TIntegrations> = {};
|
|
2730
2877
|
|
|
2878
|
+
/** Map of default integration keys to per-operation default option overrides */
|
|
2879
|
+
private perOperationOptions: Partial<
|
|
2880
|
+
Record<string, Partial<TDefaultIntegrationProps>>
|
|
2881
|
+
> = {};
|
|
2882
|
+
|
|
2731
2883
|
/**
|
|
2732
2884
|
* Create an Integration Builder for an HTTP API with a shared pattern
|
|
2733
2885
|
*/
|
|
@@ -2882,11 +3034,16 @@ export class IntegrationBuilder<
|
|
|
2882
3034
|
/**
|
|
2883
3035
|
* Overrides default integrations with custom implementations for specific operations.
|
|
2884
3036
|
*
|
|
3037
|
+
* Operations which have per-operation options set via withOperationOptions cannot be
|
|
3038
|
+
* overridden, since these still use the default integration.
|
|
3039
|
+
*
|
|
2885
3040
|
* @param overrides - Map of operation names to their custom integration implementations
|
|
2886
3041
|
* @returns The builder instance with updated type information reflecting the overrides
|
|
2887
3042
|
*/
|
|
2888
3043
|
public withOverrides<
|
|
2889
|
-
TOverrideIntegrations extends Partial<
|
|
3044
|
+
TOverrideIntegrations extends Partial<
|
|
3045
|
+
Record<Exclude<TOperation, TOperationOptioned>, TBaseIntegration>
|
|
3046
|
+
>,
|
|
2890
3047
|
>(overrides: TOverrideIntegrations) {
|
|
2891
3048
|
this.integrations = { ...this.integrations, ...overrides };
|
|
2892
3049
|
// Re-type to include the overridden integration types.
|
|
@@ -2902,7 +3059,9 @@ export class IntegrationBuilder<
|
|
|
2902
3059
|
MergedIntegrations,
|
|
2903
3060
|
TDefaultIntegrationProps,
|
|
2904
3061
|
TDefaultIntegration,
|
|
2905
|
-
TPattern
|
|
3062
|
+
TPattern,
|
|
3063
|
+
TOverridden | Extract<keyof TOverrideIntegrations, string>,
|
|
3064
|
+
TOperationOptioned
|
|
2906
3065
|
>;
|
|
2907
3066
|
}
|
|
2908
3067
|
|
|
@@ -2921,6 +3080,43 @@ export class IntegrationBuilder<
|
|
|
2921
3080
|
return this;
|
|
2922
3081
|
}
|
|
2923
3082
|
|
|
3083
|
+
/**
|
|
3084
|
+
* Updates the default integration options for specific operations, without
|
|
3085
|
+
* affecting the others. The given options are merged with the defaults (and
|
|
3086
|
+
* any options set via withDefaultOptions) when building each default integration.
|
|
3087
|
+
*
|
|
3088
|
+
* Operations which have been replaced via withOverrides cannot be targeted, since
|
|
3089
|
+
* they no longer use the default integration.
|
|
3090
|
+
*
|
|
3091
|
+
* @param options - Map of operation names to partial default integration options
|
|
3092
|
+
* @returns The builder instance
|
|
3093
|
+
*/
|
|
3094
|
+
public withOperationOptions<
|
|
3095
|
+
TOptions extends Partial<
|
|
3096
|
+
Record<
|
|
3097
|
+
Exclude<DefaultIntegrationKeys<TPattern, TOperation>, TOverridden>,
|
|
3098
|
+
Partial<TDefaultIntegrationProps>
|
|
3099
|
+
>
|
|
3100
|
+
>,
|
|
3101
|
+
>(options: TOptions) {
|
|
3102
|
+
Object.entries(options).forEach(([op, opOptions]) => {
|
|
3103
|
+
this.perOperationOptions[op] = {
|
|
3104
|
+
...this.perOperationOptions[op],
|
|
3105
|
+
...(opOptions as Partial<TDefaultIntegrationProps>),
|
|
3106
|
+
};
|
|
3107
|
+
});
|
|
3108
|
+
return this as unknown as IntegrationBuilder<
|
|
3109
|
+
TOperation,
|
|
3110
|
+
TBaseIntegration,
|
|
3111
|
+
TIntegrations,
|
|
3112
|
+
TDefaultIntegrationProps,
|
|
3113
|
+
TDefaultIntegration,
|
|
3114
|
+
TPattern,
|
|
3115
|
+
TOverridden,
|
|
3116
|
+
TOperationOptioned | Extract<keyof TOptions, string>
|
|
3117
|
+
>;
|
|
3118
|
+
}
|
|
3119
|
+
|
|
2924
3120
|
/**
|
|
2925
3121
|
* Builds and returns the complete set of integrations.
|
|
2926
3122
|
*
|
|
@@ -2935,6 +3131,10 @@ export class IntegrationBuilder<
|
|
|
2935
3131
|
*/
|
|
2936
3132
|
public build(): TIntegrations {
|
|
2937
3133
|
const options = this.options;
|
|
3134
|
+
const buildOptionsFor = (op: string): TDefaultIntegrationProps => ({
|
|
3135
|
+
...options.defaultIntegrationOptions,
|
|
3136
|
+
...this.perOperationOptions[op],
|
|
3137
|
+
});
|
|
2938
3138
|
return {
|
|
2939
3139
|
...Object.fromEntries(
|
|
2940
3140
|
options.pattern === 'shared'
|
|
@@ -2943,7 +3143,7 @@ export class IntegrationBuilder<
|
|
|
2943
3143
|
'$router',
|
|
2944
3144
|
options.buildDefaultIntegration(
|
|
2945
3145
|
'$router',
|
|
2946
|
-
|
|
3146
|
+
buildOptionsFor('$router'),
|
|
2947
3147
|
),
|
|
2948
3148
|
],
|
|
2949
3149
|
]
|
|
@@ -2954,10 +3154,7 @@ export class IntegrationBuilder<
|
|
|
2954
3154
|
)
|
|
2955
3155
|
.map((op) => [
|
|
2956
3156
|
op,
|
|
2957
|
-
options.buildDefaultIntegration(
|
|
2958
|
-
op,
|
|
2959
|
-
options.defaultIntegrationOptions,
|
|
2960
|
-
),
|
|
3157
|
+
options.buildDefaultIntegration(op, buildOptionsFor(op)),
|
|
2961
3158
|
]),
|
|
2962
3159
|
),
|
|
2963
3160
|
...this.integrations,
|
|
@@ -2978,7 +3175,7 @@ terraform {
|
|
|
2978
3175
|
required_providers {
|
|
2979
3176
|
aws = {
|
|
2980
3177
|
source = "hashicorp/aws"
|
|
2981
|
-
version = "
|
|
3178
|
+
version = "6.58.0"
|
|
2982
3179
|
}
|
|
2983
3180
|
}
|
|
2984
3181
|
}
|
|
@@ -3225,7 +3422,7 @@ output "api_log_group_arn" {
|
|
|
3225
3422
|
required_providers {
|
|
3226
3423
|
aws = {
|
|
3227
3424
|
source = "hashicorp/aws"
|
|
3228
|
-
version = "
|
|
3425
|
+
version = "6.58.0"
|
|
3229
3426
|
}
|
|
3230
3427
|
}
|
|
3231
3428
|
}
|
|
@@ -3257,11 +3454,47 @@ variable "additional_iam_policy_statements" {
|
|
|
3257
3454
|
default = []
|
|
3258
3455
|
}
|
|
3259
3456
|
|
|
3457
|
+
variable "appconfig_application_id" {
|
|
3458
|
+
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."
|
|
3459
|
+
type = string
|
|
3460
|
+
default = null
|
|
3461
|
+
}
|
|
3462
|
+
|
|
3463
|
+
variable "appconfig_application_arn" {
|
|
3464
|
+
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."
|
|
3465
|
+
type = string
|
|
3466
|
+
default = null
|
|
3467
|
+
}
|
|
3468
|
+
|
|
3260
3469
|
variable "asset_bucket_name" {
|
|
3261
3470
|
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."
|
|
3262
3471
|
type = string
|
|
3263
3472
|
}
|
|
3264
3473
|
|
|
3474
|
+
# VPC Configuration (optional)
|
|
3475
|
+
variable "enable_vpc" {
|
|
3476
|
+
description = "Deploy the Lambda function into a VPC. Set alongside vpc_id/subnet_ids."
|
|
3477
|
+
type = bool
|
|
3478
|
+
default = false
|
|
3479
|
+
}
|
|
3480
|
+
|
|
3481
|
+
variable "vpc_id" {
|
|
3482
|
+
description = "VPC ID to deploy the Lambda function into. Required when enable_vpc is true."
|
|
3483
|
+
type = string
|
|
3484
|
+
default = null
|
|
3485
|
+
|
|
3486
|
+
validation {
|
|
3487
|
+
condition = !var.enable_vpc || (var.vpc_id != null && var.subnet_ids != null)
|
|
3488
|
+
error_message = "vpc_id and subnet_ids must be set when enable_vpc is true."
|
|
3489
|
+
}
|
|
3490
|
+
}
|
|
3491
|
+
|
|
3492
|
+
variable "subnet_ids" {
|
|
3493
|
+
description = "Subnet IDs to deploy the Lambda function into. Required when enable_vpc is true."
|
|
3494
|
+
type = list(string)
|
|
3495
|
+
default = null
|
|
3496
|
+
}
|
|
3497
|
+
|
|
3265
3498
|
# CORS Configuration (passed to core module)
|
|
3266
3499
|
variable "cors_allow_credentials" {
|
|
3267
3500
|
description = "Whether to allow credentials in CORS requests"
|
|
@@ -3293,12 +3526,6 @@ variable "cors_expose_headers" {
|
|
|
3293
3526
|
default = []
|
|
3294
3527
|
}
|
|
3295
3528
|
|
|
3296
|
-
variable "cors_max_age" {
|
|
3297
|
-
description = "Maximum age for CORS preflight requests in seconds"
|
|
3298
|
-
type = number
|
|
3299
|
-
default = 0
|
|
3300
|
-
}
|
|
3301
|
-
|
|
3302
3529
|
# Tags
|
|
3303
3530
|
variable "tags" {
|
|
3304
3531
|
description = "Tags to apply to all resources"
|
|
@@ -3349,16 +3576,37 @@ module "http_api" {
|
|
|
3349
3576
|
cors_allow_methods = var.cors_allow_methods
|
|
3350
3577
|
cors_allow_origins = var.cors_allow_origins
|
|
3351
3578
|
cors_expose_headers = var.cors_expose_headers
|
|
3352
|
-
cors_max_age = var.cors_max_age
|
|
3353
3579
|
|
|
3354
3580
|
# Tags
|
|
3355
3581
|
tags = var.tags
|
|
3356
3582
|
}
|
|
3357
3583
|
|
|
3584
|
+
# Security group for the API Lambda function, used when deployed into a VPC
|
|
3585
|
+
resource "aws_security_group" "api_lambda" {
|
|
3586
|
+
count = var.enable_vpc ? 1 : 0
|
|
3587
|
+
|
|
3588
|
+
#checkov:skip=CKV2_AWS_5:Attached to api_lambda via vpc_config block; Checkov cannot resolve this reference
|
|
3589
|
+
name_prefix = "test-api-lambda-"
|
|
3590
|
+
description = "Security group for the TestApi API Lambda function"
|
|
3591
|
+
vpc_id = var.vpc_id
|
|
3592
|
+
tags = var.tags
|
|
3593
|
+
}
|
|
3594
|
+
|
|
3595
|
+
resource "aws_vpc_security_group_egress_rule" "api_lambda_https" {
|
|
3596
|
+
count = var.enable_vpc ? 1 : 0
|
|
3597
|
+
|
|
3598
|
+
security_group_id = aws_security_group.api_lambda[0].id
|
|
3599
|
+
cidr_ipv4 = "0.0.0.0/0"
|
|
3600
|
+
from_port = 443
|
|
3601
|
+
to_port = 443
|
|
3602
|
+
ip_protocol = "tcp"
|
|
3603
|
+
description = "Allow outbound HTTPS to AWS service endpoints"
|
|
3604
|
+
}
|
|
3605
|
+
|
|
3358
3606
|
# Lambda function
|
|
3359
3607
|
# This configures a single "router" lambda to serve all requests
|
|
3360
3608
|
resource "aws_lambda_function" "api_lambda" {
|
|
3361
|
-
#checkov:skip=CKV_AWS_117:Lambda function
|
|
3609
|
+
#checkov:skip=CKV_AWS_117:Lambda function is optionally deployed into a VPC via vpc_id/subnet_ids; not required for this use case
|
|
3362
3610
|
#checkov:skip=CKV_AWS_116:Dead Letter Queue not required for this simple API use case
|
|
3363
3611
|
#checkov:skip=CKV_AWS_272:Code signing not required for this use case
|
|
3364
3612
|
#checkov:skip=CKV_AWS_115:Concurrent execution limit not required for this use case
|
|
@@ -3380,13 +3628,25 @@ resource "aws_lambda_function" "api_lambda" {
|
|
|
3380
3628
|
mode = "Active"
|
|
3381
3629
|
}
|
|
3382
3630
|
|
|
3631
|
+
dynamic "vpc_config" {
|
|
3632
|
+
for_each = var.enable_vpc ? [1] : []
|
|
3633
|
+
content {
|
|
3634
|
+
subnet_ids = var.subnet_ids
|
|
3635
|
+
security_group_ids = [aws_security_group.api_lambda[0].id]
|
|
3636
|
+
}
|
|
3637
|
+
}
|
|
3638
|
+
|
|
3383
3639
|
|
|
3384
3640
|
environment {
|
|
3385
3641
|
variables = merge({
|
|
3386
|
-
}, var.
|
|
3642
|
+
}, var.appconfig_application_id != null ? {
|
|
3643
|
+
RUNTIME_CONFIG_APP_ID = var.appconfig_application_id
|
|
3644
|
+
} : {}, var.env)
|
|
3387
3645
|
}
|
|
3388
3646
|
|
|
3389
3647
|
tags = var.tags
|
|
3648
|
+
|
|
3649
|
+
depends_on = [aws_iam_role_policy_attachment.lambda_vpc_access]
|
|
3390
3650
|
}
|
|
3391
3651
|
|
|
3392
3652
|
# IAM role for Lambda execution
|
|
@@ -3421,18 +3681,39 @@ resource "aws_iam_role_policy_attachment" "lambda_xray_execution" {
|
|
|
3421
3681
|
role = aws_iam_role.lambda_execution_role.name
|
|
3422
3682
|
}
|
|
3423
3683
|
|
|
3684
|
+
# Attach VPC access policy to Lambda role when deployed into a VPC
|
|
3685
|
+
resource "aws_iam_role_policy_attachment" "lambda_vpc_access" {
|
|
3686
|
+
count = var.enable_vpc ? 1 : 0
|
|
3687
|
+
policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
|
|
3688
|
+
role = aws_iam_role.lambda_execution_role.name
|
|
3689
|
+
}
|
|
3690
|
+
|
|
3424
3691
|
# Additional IAM policies for Lambda (if provided)
|
|
3425
3692
|
resource "aws_iam_role_policy" "lambda_additional_policies" {
|
|
3426
|
-
count = length(
|
|
3693
|
+
count = length(local.lambda_policy_statements) > 0 ? 1 : 0
|
|
3427
3694
|
name = "TestApiHandler-additional-policies-\${random_string.suffix.result}"
|
|
3428
3695
|
role = aws_iam_role.lambda_execution_role.id
|
|
3429
3696
|
|
|
3430
3697
|
policy = jsonencode({
|
|
3431
3698
|
Version = "2012-10-17"
|
|
3432
|
-
Statement =
|
|
3699
|
+
Statement = local.lambda_policy_statements
|
|
3433
3700
|
})
|
|
3434
3701
|
}
|
|
3435
3702
|
|
|
3703
|
+
locals {
|
|
3704
|
+
# Grant read access to the runtime-config AppConfig application when wired
|
|
3705
|
+
lambda_policy_statements = concat(var.appconfig_application_arn != null ? [
|
|
3706
|
+
{
|
|
3707
|
+
Effect = "Allow"
|
|
3708
|
+
Action = [
|
|
3709
|
+
"appconfig:StartConfigurationSession",
|
|
3710
|
+
"appconfig:GetLatestConfiguration"
|
|
3711
|
+
]
|
|
3712
|
+
Resource = ["\${var.appconfig_application_arn}/*"]
|
|
3713
|
+
}
|
|
3714
|
+
] : [], var.additional_iam_policy_statements)
|
|
3715
|
+
}
|
|
3716
|
+
|
|
3436
3717
|
# CloudWatch Log Group for Lambda
|
|
3437
3718
|
resource "aws_cloudwatch_log_group" "lambda_logs" {
|
|
3438
3719
|
#checkov:skip=CKV_AWS_158:Using default CloudWatch log encryption
|
|
@@ -3591,6 +3872,11 @@ output "lambda_execution_role_name" {
|
|
|
3591
3872
|
value = aws_iam_role.lambda_execution_role.name
|
|
3592
3873
|
}
|
|
3593
3874
|
|
|
3875
|
+
output "security_group_id" {
|
|
3876
|
+
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."
|
|
3877
|
+
value = var.enable_vpc ? aws_security_group.api_lambda[0].id : null
|
|
3878
|
+
}
|
|
3879
|
+
|
|
3594
3880
|
# Integration Outputs
|
|
3595
3881
|
output "integration_id" {
|
|
3596
3882
|
description = "ID of the Lambda integration"
|
|
@@ -3631,7 +3917,7 @@ terraform {
|
|
|
3631
3917
|
required_providers {
|
|
3632
3918
|
aws = {
|
|
3633
3919
|
source = "hashicorp/aws"
|
|
3634
|
-
version = "
|
|
3920
|
+
version = "6.58.0"
|
|
3635
3921
|
}
|
|
3636
3922
|
}
|
|
3637
3923
|
}
|
|
@@ -3878,7 +4164,7 @@ output "api_log_group_arn" {
|
|
|
3878
4164
|
required_providers {
|
|
3879
4165
|
aws = {
|
|
3880
4166
|
source = "hashicorp/aws"
|
|
3881
|
-
version = "
|
|
4167
|
+
version = "6.58.0"
|
|
3882
4168
|
}
|
|
3883
4169
|
}
|
|
3884
4170
|
}
|
|
@@ -3900,11 +4186,47 @@ variable "additional_iam_policy_statements" {
|
|
|
3900
4186
|
default = []
|
|
3901
4187
|
}
|
|
3902
4188
|
|
|
4189
|
+
variable "appconfig_application_id" {
|
|
4190
|
+
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."
|
|
4191
|
+
type = string
|
|
4192
|
+
default = null
|
|
4193
|
+
}
|
|
4194
|
+
|
|
4195
|
+
variable "appconfig_application_arn" {
|
|
4196
|
+
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."
|
|
4197
|
+
type = string
|
|
4198
|
+
default = null
|
|
4199
|
+
}
|
|
4200
|
+
|
|
3903
4201
|
variable "asset_bucket_name" {
|
|
3904
4202
|
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."
|
|
3905
4203
|
type = string
|
|
3906
4204
|
}
|
|
3907
4205
|
|
|
4206
|
+
# VPC Configuration (optional)
|
|
4207
|
+
variable "enable_vpc" {
|
|
4208
|
+
description = "Deploy the Lambda function into a VPC. Set alongside vpc_id/subnet_ids."
|
|
4209
|
+
type = bool
|
|
4210
|
+
default = false
|
|
4211
|
+
}
|
|
4212
|
+
|
|
4213
|
+
variable "vpc_id" {
|
|
4214
|
+
description = "VPC ID to deploy the Lambda function into. Required when enable_vpc is true."
|
|
4215
|
+
type = string
|
|
4216
|
+
default = null
|
|
4217
|
+
|
|
4218
|
+
validation {
|
|
4219
|
+
condition = !var.enable_vpc || (var.vpc_id != null && var.subnet_ids != null)
|
|
4220
|
+
error_message = "vpc_id and subnet_ids must be set when enable_vpc is true."
|
|
4221
|
+
}
|
|
4222
|
+
}
|
|
4223
|
+
|
|
4224
|
+
variable "subnet_ids" {
|
|
4225
|
+
description = "Subnet IDs to deploy the Lambda function into. Required when enable_vpc is true."
|
|
4226
|
+
type = list(string)
|
|
4227
|
+
default = null
|
|
4228
|
+
}
|
|
4229
|
+
|
|
3908
4230
|
# CORS Configuration (passed to core module)
|
|
3909
4231
|
variable "cors_allow_credentials" {
|
|
3910
4232
|
description = "Whether to allow credentials in CORS requests"
|
|
@@ -3936,12 +4258,6 @@ variable "cors_expose_headers" {
|
|
|
3936
4258
|
default = []
|
|
3937
4259
|
}
|
|
3938
4260
|
|
|
3939
|
-
variable "cors_max_age" {
|
|
3940
|
-
description = "Maximum age for CORS preflight requests in seconds"
|
|
3941
|
-
type = number
|
|
3942
|
-
default = 0
|
|
3943
|
-
}
|
|
3944
|
-
|
|
3945
4261
|
# Tags
|
|
3946
4262
|
variable "tags" {
|
|
3947
4263
|
description = "Tags to apply to all resources"
|
|
@@ -3992,16 +4308,37 @@ module "http_api" {
|
|
|
3992
4308
|
cors_allow_methods = var.cors_allow_methods
|
|
3993
4309
|
cors_allow_origins = var.cors_allow_origins
|
|
3994
4310
|
cors_expose_headers = var.cors_expose_headers
|
|
3995
|
-
cors_max_age = var.cors_max_age
|
|
3996
4311
|
|
|
3997
4312
|
# Tags
|
|
3998
4313
|
tags = var.tags
|
|
3999
4314
|
}
|
|
4000
4315
|
|
|
4316
|
+
# Security group for the API Lambda function, used when deployed into a VPC
|
|
4317
|
+
resource "aws_security_group" "api_lambda" {
|
|
4318
|
+
count = var.enable_vpc ? 1 : 0
|
|
4319
|
+
|
|
4320
|
+
#checkov:skip=CKV2_AWS_5:Attached to api_lambda via vpc_config block; Checkov cannot resolve this reference
|
|
4321
|
+
name_prefix = "test-api-lambda-"
|
|
4322
|
+
description = "Security group for the TestApi API Lambda function"
|
|
4323
|
+
vpc_id = var.vpc_id
|
|
4324
|
+
tags = var.tags
|
|
4325
|
+
}
|
|
4326
|
+
|
|
4327
|
+
resource "aws_vpc_security_group_egress_rule" "api_lambda_https" {
|
|
4328
|
+
count = var.enable_vpc ? 1 : 0
|
|
4329
|
+
|
|
4330
|
+
security_group_id = aws_security_group.api_lambda[0].id
|
|
4331
|
+
cidr_ipv4 = "0.0.0.0/0"
|
|
4332
|
+
from_port = 443
|
|
4333
|
+
to_port = 443
|
|
4334
|
+
ip_protocol = "tcp"
|
|
4335
|
+
description = "Allow outbound HTTPS to AWS service endpoints"
|
|
4336
|
+
}
|
|
4337
|
+
|
|
4001
4338
|
# Lambda function
|
|
4002
4339
|
# This configures a single "router" lambda to serve all requests
|
|
4003
4340
|
resource "aws_lambda_function" "api_lambda" {
|
|
4004
|
-
#checkov:skip=CKV_AWS_117:Lambda function
|
|
4341
|
+
#checkov:skip=CKV_AWS_117:Lambda function is optionally deployed into a VPC via vpc_id/subnet_ids; not required for this use case
|
|
4005
4342
|
#checkov:skip=CKV_AWS_116:Dead Letter Queue not required for this simple API use case
|
|
4006
4343
|
#checkov:skip=CKV_AWS_272:Code signing not required for this use case
|
|
4007
4344
|
#checkov:skip=CKV_AWS_115:Concurrent execution limit not required for this use case
|
|
@@ -4023,13 +4360,25 @@ resource "aws_lambda_function" "api_lambda" {
|
|
|
4023
4360
|
mode = "Active"
|
|
4024
4361
|
}
|
|
4025
4362
|
|
|
4363
|
+
dynamic "vpc_config" {
|
|
4364
|
+
for_each = var.enable_vpc ? [1] : []
|
|
4365
|
+
content {
|
|
4366
|
+
subnet_ids = var.subnet_ids
|
|
4367
|
+
security_group_ids = [aws_security_group.api_lambda[0].id]
|
|
4368
|
+
}
|
|
4369
|
+
}
|
|
4370
|
+
|
|
4026
4371
|
|
|
4027
4372
|
environment {
|
|
4028
4373
|
variables = merge({
|
|
4029
|
-
}, var.
|
|
4374
|
+
}, var.appconfig_application_id != null ? {
|
|
4375
|
+
RUNTIME_CONFIG_APP_ID = var.appconfig_application_id
|
|
4376
|
+
} : {}, var.env)
|
|
4030
4377
|
}
|
|
4031
4378
|
|
|
4032
4379
|
tags = var.tags
|
|
4380
|
+
|
|
4381
|
+
depends_on = [aws_iam_role_policy_attachment.lambda_vpc_access]
|
|
4033
4382
|
}
|
|
4034
4383
|
|
|
4035
4384
|
# IAM role for Lambda execution
|
|
@@ -4064,18 +4413,39 @@ resource "aws_iam_role_policy_attachment" "lambda_xray_execution" {
|
|
|
4064
4413
|
role = aws_iam_role.lambda_execution_role.name
|
|
4065
4414
|
}
|
|
4066
4415
|
|
|
4416
|
+
# Attach VPC access policy to Lambda role when deployed into a VPC
|
|
4417
|
+
resource "aws_iam_role_policy_attachment" "lambda_vpc_access" {
|
|
4418
|
+
count = var.enable_vpc ? 1 : 0
|
|
4419
|
+
policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
|
|
4420
|
+
role = aws_iam_role.lambda_execution_role.name
|
|
4421
|
+
}
|
|
4422
|
+
|
|
4067
4423
|
# Additional IAM policies for Lambda (if provided)
|
|
4068
4424
|
resource "aws_iam_role_policy" "lambda_additional_policies" {
|
|
4069
|
-
count = length(
|
|
4425
|
+
count = length(local.lambda_policy_statements) > 0 ? 1 : 0
|
|
4070
4426
|
name = "TestApiHandler-additional-policies-\${random_string.suffix.result}"
|
|
4071
4427
|
role = aws_iam_role.lambda_execution_role.id
|
|
4072
4428
|
|
|
4073
4429
|
policy = jsonencode({
|
|
4074
4430
|
Version = "2012-10-17"
|
|
4075
|
-
Statement =
|
|
4431
|
+
Statement = local.lambda_policy_statements
|
|
4076
4432
|
})
|
|
4077
4433
|
}
|
|
4078
4434
|
|
|
4435
|
+
locals {
|
|
4436
|
+
# Grant read access to the runtime-config AppConfig application when wired
|
|
4437
|
+
lambda_policy_statements = concat(var.appconfig_application_arn != null ? [
|
|
4438
|
+
{
|
|
4439
|
+
Effect = "Allow"
|
|
4440
|
+
Action = [
|
|
4441
|
+
"appconfig:StartConfigurationSession",
|
|
4442
|
+
"appconfig:GetLatestConfiguration"
|
|
4443
|
+
]
|
|
4444
|
+
Resource = ["\${var.appconfig_application_arn}/*"]
|
|
4445
|
+
}
|
|
4446
|
+
] : [], var.additional_iam_policy_statements)
|
|
4447
|
+
}
|
|
4448
|
+
|
|
4079
4449
|
# CloudWatch Log Group for Lambda
|
|
4080
4450
|
resource "aws_cloudwatch_log_group" "lambda_logs" {
|
|
4081
4451
|
#checkov:skip=CKV_AWS_158:Using default CloudWatch log encryption
|
|
@@ -4316,6 +4686,11 @@ output "lambda_execution_role_name" {
|
|
|
4316
4686
|
value = aws_iam_role.lambda_execution_role.name
|
|
4317
4687
|
}
|
|
4318
4688
|
|
|
4689
|
+
output "security_group_id" {
|
|
4690
|
+
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."
|
|
4691
|
+
value = var.enable_vpc ? aws_security_group.api_lambda[0].id : null
|
|
4692
|
+
}
|
|
4693
|
+
|
|
4319
4694
|
# Integration Outputs
|
|
4320
4695
|
output "integration_id" {
|
|
4321
4696
|
description = "ID of the Lambda integration"
|
|
@@ -4356,7 +4731,7 @@ terraform {
|
|
|
4356
4731
|
required_providers {
|
|
4357
4732
|
aws = {
|
|
4358
4733
|
source = "hashicorp/aws"
|
|
4359
|
-
version = "
|
|
4734
|
+
version = "6.58.0"
|
|
4360
4735
|
}
|
|
4361
4736
|
}
|
|
4362
4737
|
}
|
|
@@ -4603,7 +4978,7 @@ output "api_log_group_arn" {
|
|
|
4603
4978
|
required_providers {
|
|
4604
4979
|
aws = {
|
|
4605
4980
|
source = "hashicorp/aws"
|
|
4606
|
-
version = "
|
|
4981
|
+
version = "6.58.0"
|
|
4607
4982
|
}
|
|
4608
4983
|
}
|
|
4609
4984
|
}
|
|
@@ -4625,11 +5000,47 @@ variable "additional_iam_policy_statements" {
|
|
|
4625
5000
|
default = []
|
|
4626
5001
|
}
|
|
4627
5002
|
|
|
5003
|
+
variable "appconfig_application_id" {
|
|
5004
|
+
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."
|
|
5005
|
+
type = string
|
|
5006
|
+
default = null
|
|
5007
|
+
}
|
|
5008
|
+
|
|
5009
|
+
variable "appconfig_application_arn" {
|
|
5010
|
+
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."
|
|
5011
|
+
type = string
|
|
5012
|
+
default = null
|
|
5013
|
+
}
|
|
5014
|
+
|
|
4628
5015
|
variable "asset_bucket_name" {
|
|
4629
5016
|
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."
|
|
4630
5017
|
type = string
|
|
4631
5018
|
}
|
|
4632
5019
|
|
|
5020
|
+
# VPC Configuration (optional)
|
|
5021
|
+
variable "enable_vpc" {
|
|
5022
|
+
description = "Deploy the Lambda function into a VPC. Set alongside vpc_id/subnet_ids."
|
|
5023
|
+
type = bool
|
|
5024
|
+
default = false
|
|
5025
|
+
}
|
|
5026
|
+
|
|
5027
|
+
variable "vpc_id" {
|
|
5028
|
+
description = "VPC ID to deploy the Lambda function into. Required when enable_vpc is true."
|
|
5029
|
+
type = string
|
|
5030
|
+
default = null
|
|
5031
|
+
|
|
5032
|
+
validation {
|
|
5033
|
+
condition = !var.enable_vpc || (var.vpc_id != null && var.subnet_ids != null)
|
|
5034
|
+
error_message = "vpc_id and subnet_ids must be set when enable_vpc is true."
|
|
5035
|
+
}
|
|
5036
|
+
}
|
|
5037
|
+
|
|
5038
|
+
variable "subnet_ids" {
|
|
5039
|
+
description = "Subnet IDs to deploy the Lambda function into. Required when enable_vpc is true."
|
|
5040
|
+
type = list(string)
|
|
5041
|
+
default = null
|
|
5042
|
+
}
|
|
5043
|
+
|
|
4633
5044
|
# CORS Configuration (passed to core module)
|
|
4634
5045
|
variable "cors_allow_credentials" {
|
|
4635
5046
|
description = "Whether to allow credentials in CORS requests"
|
|
@@ -4661,12 +5072,6 @@ variable "cors_expose_headers" {
|
|
|
4661
5072
|
default = []
|
|
4662
5073
|
}
|
|
4663
5074
|
|
|
4664
|
-
variable "cors_max_age" {
|
|
4665
|
-
description = "Maximum age for CORS preflight requests in seconds"
|
|
4666
|
-
type = number
|
|
4667
|
-
default = 0
|
|
4668
|
-
}
|
|
4669
|
-
|
|
4670
5075
|
# Tags
|
|
4671
5076
|
variable "tags" {
|
|
4672
5077
|
description = "Tags to apply to all resources"
|
|
@@ -4717,16 +5122,37 @@ module "http_api" {
|
|
|
4717
5122
|
cors_allow_methods = var.cors_allow_methods
|
|
4718
5123
|
cors_allow_origins = var.cors_allow_origins
|
|
4719
5124
|
cors_expose_headers = var.cors_expose_headers
|
|
4720
|
-
cors_max_age = var.cors_max_age
|
|
4721
5125
|
|
|
4722
5126
|
# Tags
|
|
4723
5127
|
tags = var.tags
|
|
4724
5128
|
}
|
|
4725
5129
|
|
|
5130
|
+
# Security group for the API Lambda function, used when deployed into a VPC
|
|
5131
|
+
resource "aws_security_group" "api_lambda" {
|
|
5132
|
+
count = var.enable_vpc ? 1 : 0
|
|
5133
|
+
|
|
5134
|
+
#checkov:skip=CKV2_AWS_5:Attached to api_lambda via vpc_config block; Checkov cannot resolve this reference
|
|
5135
|
+
name_prefix = "test-api-lambda-"
|
|
5136
|
+
description = "Security group for the TestApi API Lambda function"
|
|
5137
|
+
vpc_id = var.vpc_id
|
|
5138
|
+
tags = var.tags
|
|
5139
|
+
}
|
|
5140
|
+
|
|
5141
|
+
resource "aws_vpc_security_group_egress_rule" "api_lambda_https" {
|
|
5142
|
+
count = var.enable_vpc ? 1 : 0
|
|
5143
|
+
|
|
5144
|
+
security_group_id = aws_security_group.api_lambda[0].id
|
|
5145
|
+
cidr_ipv4 = "0.0.0.0/0"
|
|
5146
|
+
from_port = 443
|
|
5147
|
+
to_port = 443
|
|
5148
|
+
ip_protocol = "tcp"
|
|
5149
|
+
description = "Allow outbound HTTPS to AWS service endpoints"
|
|
5150
|
+
}
|
|
5151
|
+
|
|
4726
5152
|
# Lambda function
|
|
4727
5153
|
# This configures a single "router" lambda to serve all requests
|
|
4728
5154
|
resource "aws_lambda_function" "api_lambda" {
|
|
4729
|
-
#checkov:skip=CKV_AWS_117:Lambda function
|
|
5155
|
+
#checkov:skip=CKV_AWS_117:Lambda function is optionally deployed into a VPC via vpc_id/subnet_ids; not required for this use case
|
|
4730
5156
|
#checkov:skip=CKV_AWS_116:Dead Letter Queue not required for this simple API use case
|
|
4731
5157
|
#checkov:skip=CKV_AWS_272:Code signing not required for this use case
|
|
4732
5158
|
#checkov:skip=CKV_AWS_115:Concurrent execution limit not required for this use case
|
|
@@ -4748,13 +5174,25 @@ resource "aws_lambda_function" "api_lambda" {
|
|
|
4748
5174
|
mode = "Active"
|
|
4749
5175
|
}
|
|
4750
5176
|
|
|
5177
|
+
dynamic "vpc_config" {
|
|
5178
|
+
for_each = var.enable_vpc ? [1] : []
|
|
5179
|
+
content {
|
|
5180
|
+
subnet_ids = var.subnet_ids
|
|
5181
|
+
security_group_ids = [aws_security_group.api_lambda[0].id]
|
|
5182
|
+
}
|
|
5183
|
+
}
|
|
5184
|
+
|
|
4751
5185
|
|
|
4752
5186
|
environment {
|
|
4753
5187
|
variables = merge({
|
|
4754
|
-
}, var.
|
|
5188
|
+
}, var.appconfig_application_id != null ? {
|
|
5189
|
+
RUNTIME_CONFIG_APP_ID = var.appconfig_application_id
|
|
5190
|
+
} : {}, var.env)
|
|
4755
5191
|
}
|
|
4756
5192
|
|
|
4757
5193
|
tags = var.tags
|
|
5194
|
+
|
|
5195
|
+
depends_on = [aws_iam_role_policy_attachment.lambda_vpc_access]
|
|
4758
5196
|
}
|
|
4759
5197
|
|
|
4760
5198
|
# IAM role for Lambda execution
|
|
@@ -4789,18 +5227,39 @@ resource "aws_iam_role_policy_attachment" "lambda_xray_execution" {
|
|
|
4789
5227
|
role = aws_iam_role.lambda_execution_role.name
|
|
4790
5228
|
}
|
|
4791
5229
|
|
|
5230
|
+
# Attach VPC access policy to Lambda role when deployed into a VPC
|
|
5231
|
+
resource "aws_iam_role_policy_attachment" "lambda_vpc_access" {
|
|
5232
|
+
count = var.enable_vpc ? 1 : 0
|
|
5233
|
+
policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
|
|
5234
|
+
role = aws_iam_role.lambda_execution_role.name
|
|
5235
|
+
}
|
|
5236
|
+
|
|
4792
5237
|
# Additional IAM policies for Lambda (if provided)
|
|
4793
5238
|
resource "aws_iam_role_policy" "lambda_additional_policies" {
|
|
4794
|
-
count = length(
|
|
5239
|
+
count = length(local.lambda_policy_statements) > 0 ? 1 : 0
|
|
4795
5240
|
name = "TestApiHandler-additional-policies-\${random_string.suffix.result}"
|
|
4796
5241
|
role = aws_iam_role.lambda_execution_role.id
|
|
4797
5242
|
|
|
4798
5243
|
policy = jsonencode({
|
|
4799
5244
|
Version = "2012-10-17"
|
|
4800
|
-
Statement =
|
|
5245
|
+
Statement = local.lambda_policy_statements
|
|
4801
5246
|
})
|
|
4802
5247
|
}
|
|
4803
5248
|
|
|
5249
|
+
locals {
|
|
5250
|
+
# Grant read access to the runtime-config AppConfig application when wired
|
|
5251
|
+
lambda_policy_statements = concat(var.appconfig_application_arn != null ? [
|
|
5252
|
+
{
|
|
5253
|
+
Effect = "Allow"
|
|
5254
|
+
Action = [
|
|
5255
|
+
"appconfig:StartConfigurationSession",
|
|
5256
|
+
"appconfig:GetLatestConfiguration"
|
|
5257
|
+
]
|
|
5258
|
+
Resource = ["\${var.appconfig_application_arn}/*"]
|
|
5259
|
+
}
|
|
5260
|
+
] : [], var.additional_iam_policy_statements)
|
|
5261
|
+
}
|
|
5262
|
+
|
|
4804
5263
|
# CloudWatch Log Group for Lambda
|
|
4805
5264
|
resource "aws_cloudwatch_log_group" "lambda_logs" {
|
|
4806
5265
|
#checkov:skip=CKV_AWS_158:Using default CloudWatch log encryption
|
|
@@ -4946,6 +5405,11 @@ output "lambda_execution_role_name" {
|
|
|
4946
5405
|
value = aws_iam_role.lambda_execution_role.name
|
|
4947
5406
|
}
|
|
4948
5407
|
|
|
5408
|
+
output "security_group_id" {
|
|
5409
|
+
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."
|
|
5410
|
+
value = var.enable_vpc ? aws_security_group.api_lambda[0].id : null
|
|
5411
|
+
}
|
|
5412
|
+
|
|
4949
5413
|
# Integration Outputs
|
|
4950
5414
|
output "integration_id" {
|
|
4951
5415
|
description = "ID of the Lambda integration"
|
|
@@ -4986,11 +5450,11 @@ terraform {
|
|
|
4986
5450
|
required_providers {
|
|
4987
5451
|
aws = {
|
|
4988
5452
|
source = "hashicorp/aws"
|
|
4989
|
-
version = "
|
|
5453
|
+
version = "6.58.0"
|
|
4990
5454
|
}
|
|
4991
5455
|
random = {
|
|
4992
5456
|
source = "hashicorp/random"
|
|
4993
|
-
version = "
|
|
5457
|
+
version = "3.9.0"
|
|
4994
5458
|
}
|
|
4995
5459
|
}
|
|
4996
5460
|
}
|
|
@@ -5060,8 +5524,6 @@ data "aws_caller_identity" "current" {}
|
|
|
5060
5524
|
|
|
5061
5525
|
# Resources
|
|
5062
5526
|
|
|
5063
|
-
# Note: CloudWatch logging removed due to account-level CloudWatch Logs role ARN requirement
|
|
5064
|
-
|
|
5065
5527
|
# REST API Gateway
|
|
5066
5528
|
resource "aws_api_gateway_rest_api" "rest_api" {
|
|
5067
5529
|
name = var.api_name
|
|
@@ -5078,10 +5540,8 @@ resource "aws_api_gateway_rest_api" "rest_api" {
|
|
|
5078
5540
|
tags = var.tags
|
|
5079
5541
|
}
|
|
5080
5542
|
|
|
5081
|
-
# Note: Deployment and
|
|
5082
|
-
# after all methods and integrations are defined
|
|
5083
|
-
|
|
5084
|
-
# Note: CloudWatch Log Group removed due to account-level CloudWatch Logs role ARN requirement
|
|
5543
|
+
# Note: Deployment, stage and access logging are created in the consuming module
|
|
5544
|
+
# (e.g., foo-api.tf) after all methods and integrations are defined
|
|
5085
5545
|
|
|
5086
5546
|
# Gateway Response for CORS (4XX errors)
|
|
5087
5547
|
resource "aws_api_gateway_gateway_response" "cors_4xx" {
|
|
@@ -5239,16 +5699,14 @@ output "waf_web_acl_arn" {
|
|
|
5239
5699
|
value = var.enable_waf ? aws_wafv2_web_acl.api_waf[0].arn : null
|
|
5240
5700
|
}
|
|
5241
5701
|
|
|
5242
|
-
# Note: Stage and
|
|
5243
|
-
|
|
5244
|
-
# Note: CloudWatch log group outputs removed due to account-level CloudWatch Logs role ARN requirement",
|
|
5702
|
+
# Note: Stage, deployment and access log outputs are provided by the consuming module",
|
|
5245
5703
|
"test-api.tf": "terraform {
|
|
5246
5704
|
required_version = ">= 1.0"
|
|
5247
5705
|
|
|
5248
5706
|
required_providers {
|
|
5249
5707
|
aws = {
|
|
5250
5708
|
source = "hashicorp/aws"
|
|
5251
|
-
version = "
|
|
5709
|
+
version = "6.58.0"
|
|
5252
5710
|
}
|
|
5253
5711
|
}
|
|
5254
5712
|
}
|
|
@@ -5280,11 +5738,47 @@ variable "additional_iam_policy_statements" {
|
|
|
5280
5738
|
default = []
|
|
5281
5739
|
}
|
|
5282
5740
|
|
|
5741
|
+
variable "appconfig_application_id" {
|
|
5742
|
+
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."
|
|
5743
|
+
type = string
|
|
5744
|
+
default = null
|
|
5745
|
+
}
|
|
5746
|
+
|
|
5747
|
+
variable "appconfig_application_arn" {
|
|
5748
|
+
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."
|
|
5749
|
+
type = string
|
|
5750
|
+
default = null
|
|
5751
|
+
}
|
|
5752
|
+
|
|
5283
5753
|
variable "asset_bucket_name" {
|
|
5284
5754
|
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."
|
|
5285
5755
|
type = string
|
|
5286
5756
|
}
|
|
5287
5757
|
|
|
5758
|
+
# VPC Configuration (optional)
|
|
5759
|
+
variable "enable_vpc" {
|
|
5760
|
+
description = "Deploy the Lambda function into a VPC. Set alongside vpc_id/subnet_ids."
|
|
5761
|
+
type = bool
|
|
5762
|
+
default = false
|
|
5763
|
+
}
|
|
5764
|
+
|
|
5765
|
+
variable "vpc_id" {
|
|
5766
|
+
description = "VPC ID to deploy the Lambda function into. Required when enable_vpc is true."
|
|
5767
|
+
type = string
|
|
5768
|
+
default = null
|
|
5769
|
+
|
|
5770
|
+
validation {
|
|
5771
|
+
condition = !var.enable_vpc || (var.vpc_id != null && var.subnet_ids != null)
|
|
5772
|
+
error_message = "vpc_id and subnet_ids must be set when enable_vpc is true."
|
|
5773
|
+
}
|
|
5774
|
+
}
|
|
5775
|
+
|
|
5776
|
+
variable "subnet_ids" {
|
|
5777
|
+
description = "Subnet IDs to deploy the Lambda function into. Required when enable_vpc is true."
|
|
5778
|
+
type = list(string)
|
|
5779
|
+
default = null
|
|
5780
|
+
}
|
|
5781
|
+
|
|
5288
5782
|
# CORS Configuration (passed to core module)
|
|
5289
5783
|
|
|
5290
5784
|
variable "cors_allow_headers" {
|
|
@@ -5347,6 +5841,11 @@ resource "aws_s3_object" "lambda_zip" {
|
|
|
5347
5841
|
}
|
|
5348
5842
|
|
|
5349
5843
|
# Use the core REST API module
|
|
5844
|
+
# Account-level CloudWatch role required for REST API access logging
|
|
5845
|
+
module "account" {
|
|
5846
|
+
source = "../../../core/api/api-gateway-account"
|
|
5847
|
+
}
|
|
5848
|
+
|
|
5350
5849
|
module "rest_api" {
|
|
5351
5850
|
source = "../../../core/api/rest-api"
|
|
5352
5851
|
|
|
@@ -5376,9 +5875,31 @@ resource "aws_wafv2_web_acl_association" "api_waf_association" {
|
|
|
5376
5875
|
depends_on = [aws_api_gateway_stage.api_stage]
|
|
5377
5876
|
}
|
|
5378
5877
|
|
|
5878
|
+
# Security group for the API Lambda function, used when deployed into a VPC
|
|
5879
|
+
resource "aws_security_group" "api_lambda" {
|
|
5880
|
+
count = var.enable_vpc ? 1 : 0
|
|
5881
|
+
|
|
5882
|
+
#checkov:skip=CKV2_AWS_5:Attached to api_lambda via vpc_config block; Checkov cannot resolve this reference
|
|
5883
|
+
name_prefix = "test-api-lambda-"
|
|
5884
|
+
description = "Security group for the TestApi API Lambda function"
|
|
5885
|
+
vpc_id = var.vpc_id
|
|
5886
|
+
tags = var.tags
|
|
5887
|
+
}
|
|
5888
|
+
|
|
5889
|
+
resource "aws_vpc_security_group_egress_rule" "api_lambda_https" {
|
|
5890
|
+
count = var.enable_vpc ? 1 : 0
|
|
5891
|
+
|
|
5892
|
+
security_group_id = aws_security_group.api_lambda[0].id
|
|
5893
|
+
cidr_ipv4 = "0.0.0.0/0"
|
|
5894
|
+
from_port = 443
|
|
5895
|
+
to_port = 443
|
|
5896
|
+
ip_protocol = "tcp"
|
|
5897
|
+
description = "Allow outbound HTTPS to AWS service endpoints"
|
|
5898
|
+
}
|
|
5899
|
+
|
|
5379
5900
|
# Lambda function
|
|
5380
5901
|
resource "aws_lambda_function" "api_lambda" {
|
|
5381
|
-
#checkov:skip=CKV_AWS_117:Lambda function
|
|
5902
|
+
#checkov:skip=CKV_AWS_117:Lambda function is optionally deployed into a VPC via vpc_id/subnet_ids; not required for this use case
|
|
5382
5903
|
#checkov:skip=CKV_AWS_116:Dead Letter Queue not required for this simple API use case
|
|
5383
5904
|
#checkov:skip=CKV_AWS_272:Code signing not required for this use case
|
|
5384
5905
|
#checkov:skip=CKV_AWS_115:Concurrent execution limit not required for this use case
|
|
@@ -5400,13 +5921,25 @@ resource "aws_lambda_function" "api_lambda" {
|
|
|
5400
5921
|
mode = "Active"
|
|
5401
5922
|
}
|
|
5402
5923
|
|
|
5924
|
+
dynamic "vpc_config" {
|
|
5925
|
+
for_each = var.enable_vpc ? [1] : []
|
|
5926
|
+
content {
|
|
5927
|
+
subnet_ids = var.subnet_ids
|
|
5928
|
+
security_group_ids = [aws_security_group.api_lambda[0].id]
|
|
5929
|
+
}
|
|
5930
|
+
}
|
|
5931
|
+
|
|
5403
5932
|
|
|
5404
5933
|
environment {
|
|
5405
5934
|
variables = merge({
|
|
5406
|
-
}, var.
|
|
5935
|
+
}, var.appconfig_application_id != null ? {
|
|
5936
|
+
RUNTIME_CONFIG_APP_ID = var.appconfig_application_id
|
|
5937
|
+
} : {}, var.env)
|
|
5407
5938
|
}
|
|
5408
5939
|
|
|
5409
5940
|
tags = var.tags
|
|
5941
|
+
|
|
5942
|
+
depends_on = [aws_iam_role_policy_attachment.lambda_vpc_access]
|
|
5410
5943
|
}
|
|
5411
5944
|
|
|
5412
5945
|
# IAM role for Lambda execution
|
|
@@ -5441,18 +5974,39 @@ resource "aws_iam_role_policy_attachment" "lambda_xray_execution" {
|
|
|
5441
5974
|
role = aws_iam_role.lambda_execution_role.name
|
|
5442
5975
|
}
|
|
5443
5976
|
|
|
5977
|
+
# Attach VPC access policy to Lambda role when deployed into a VPC
|
|
5978
|
+
resource "aws_iam_role_policy_attachment" "lambda_vpc_access" {
|
|
5979
|
+
count = var.enable_vpc ? 1 : 0
|
|
5980
|
+
policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
|
|
5981
|
+
role = aws_iam_role.lambda_execution_role.name
|
|
5982
|
+
}
|
|
5983
|
+
|
|
5444
5984
|
# Additional IAM policies for Lambda (if provided)
|
|
5445
5985
|
resource "aws_iam_role_policy" "lambda_additional_policies" {
|
|
5446
|
-
count = length(
|
|
5986
|
+
count = length(local.lambda_policy_statements) > 0 ? 1 : 0
|
|
5447
5987
|
name = "TestApiHandler-additional-policies-\${random_string.suffix.result}"
|
|
5448
5988
|
role = aws_iam_role.lambda_execution_role.id
|
|
5449
5989
|
|
|
5450
5990
|
policy = jsonencode({
|
|
5451
5991
|
Version = "2012-10-17"
|
|
5452
|
-
Statement =
|
|
5992
|
+
Statement = local.lambda_policy_statements
|
|
5453
5993
|
})
|
|
5454
5994
|
}
|
|
5455
5995
|
|
|
5996
|
+
locals {
|
|
5997
|
+
# Grant read access to the runtime-config AppConfig application when wired
|
|
5998
|
+
lambda_policy_statements = concat(var.appconfig_application_arn != null ? [
|
|
5999
|
+
{
|
|
6000
|
+
Effect = "Allow"
|
|
6001
|
+
Action = [
|
|
6002
|
+
"appconfig:StartConfigurationSession",
|
|
6003
|
+
"appconfig:GetLatestConfiguration"
|
|
6004
|
+
]
|
|
6005
|
+
Resource = ["\${var.appconfig_application_arn}/*"]
|
|
6006
|
+
}
|
|
6007
|
+
] : [], var.additional_iam_policy_statements)
|
|
6008
|
+
}
|
|
6009
|
+
|
|
5456
6010
|
# CloudWatch Log Group for Lambda
|
|
5457
6011
|
resource "aws_cloudwatch_log_group" "lambda_logs" {
|
|
5458
6012
|
#checkov:skip=CKV_AWS_158:Using default CloudWatch log encryption
|
|
@@ -5502,6 +6056,9 @@ resource "aws_api_gateway_method" "proxy_method" {
|
|
|
5502
6056
|
|
|
5503
6057
|
authorization = "COGNITO_USER_POOLS"
|
|
5504
6058
|
authorizer_id = aws_api_gateway_authorizer.cognito_authorizer.id
|
|
6059
|
+
# Accept access tokens from both sign-in flows: 'openid' (Cognito hosted UI)
|
|
6060
|
+
# and 'aws.cognito.signin.user.admin' (Cognito admin/SRP auth APIs).
|
|
6061
|
+
authorization_scopes = ["openid", "aws.cognito.signin.user.admin"]
|
|
5505
6062
|
|
|
5506
6063
|
request_parameters = {
|
|
5507
6064
|
"method.request.path.proxy" = true
|
|
@@ -5588,11 +6145,63 @@ resource "aws_api_gateway_deployment" "api_deployment" {
|
|
|
5588
6145
|
]
|
|
5589
6146
|
}
|
|
5590
6147
|
|
|
6148
|
+
# KMS key for encrypting access logs at rest
|
|
6149
|
+
resource "aws_kms_key" "access_logs" {
|
|
6150
|
+
description = "TestApi API access log encryption"
|
|
6151
|
+
deletion_window_in_days = 7
|
|
6152
|
+
enable_key_rotation = true
|
|
6153
|
+
|
|
6154
|
+
policy = jsonencode({
|
|
6155
|
+
Version = "2012-10-17"
|
|
6156
|
+
Statement = [
|
|
6157
|
+
{
|
|
6158
|
+
Sid = "Enable IAM User Permissions"
|
|
6159
|
+
Effect = "Allow"
|
|
6160
|
+
Principal = { AWS = "arn:aws:iam::\${data.aws_caller_identity.current.account_id}:root" }
|
|
6161
|
+
Action = "kms:*"
|
|
6162
|
+
Resource = "*"
|
|
6163
|
+
},
|
|
6164
|
+
{
|
|
6165
|
+
Sid = "Allow CloudWatch Logs"
|
|
6166
|
+
Effect = "Allow"
|
|
6167
|
+
Principal = { Service = "logs.\${data.aws_region.current.region}.amazonaws.com" }
|
|
6168
|
+
Action = [
|
|
6169
|
+
"kms:Encrypt",
|
|
6170
|
+
"kms:Decrypt",
|
|
6171
|
+
"kms:ReEncrypt*",
|
|
6172
|
+
"kms:GenerateDataKey*",
|
|
6173
|
+
"kms:DescribeKey"
|
|
6174
|
+
]
|
|
6175
|
+
Resource = "*"
|
|
6176
|
+
Condition = {
|
|
6177
|
+
ArnEquals = {
|
|
6178
|
+
"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"
|
|
6179
|
+
}
|
|
6180
|
+
}
|
|
6181
|
+
}
|
|
6182
|
+
]
|
|
6183
|
+
})
|
|
6184
|
+
|
|
6185
|
+
tags = var.tags
|
|
6186
|
+
}
|
|
6187
|
+
|
|
6188
|
+
resource "aws_kms_alias" "access_logs" {
|
|
6189
|
+
name = "alias/test-api-\${random_string.suffix.result}-access-logs"
|
|
6190
|
+
target_key_id = aws_kms_key.access_logs.key_id
|
|
6191
|
+
}
|
|
6192
|
+
|
|
6193
|
+
# Access logs for the API Gateway stage
|
|
6194
|
+
resource "aws_cloudwatch_log_group" "access_logs" {
|
|
6195
|
+
name = "/aws/apigateway/test-api-\${random_string.suffix.result}/access"
|
|
6196
|
+
retention_in_days = 365
|
|
6197
|
+
kms_key_id = aws_kms_key.access_logs.arn
|
|
6198
|
+
tags = var.tags
|
|
6199
|
+
}
|
|
6200
|
+
|
|
5591
6201
|
# API Gateway stage
|
|
5592
6202
|
resource "aws_api_gateway_stage" "api_stage" {
|
|
5593
6203
|
#checkov:skip=CKV_AWS_120:API Gateway caching not required for this use case
|
|
5594
|
-
#checkov:skip=
|
|
5595
|
-
#checkov:skip=CKV2_AWS_4:API Gateway logging level not applicable as access logging is disabled
|
|
6204
|
+
#checkov:skip=CKV2_AWS_4:Access logging is enabled below; verbose execution logging is intentionally not enabled
|
|
5596
6205
|
#checkov:skip=CKV2_AWS_51:Client certificate authentication not required for this use case
|
|
5597
6206
|
#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
|
|
5598
6207
|
deployment_id = aws_api_gateway_deployment.api_deployment.id
|
|
@@ -5600,9 +6209,39 @@ resource "aws_api_gateway_stage" "api_stage" {
|
|
|
5600
6209
|
stage_name = "prod"
|
|
5601
6210
|
xray_tracing_enabled = true
|
|
5602
6211
|
|
|
6212
|
+
access_log_settings {
|
|
6213
|
+
destination_arn = aws_cloudwatch_log_group.access_logs.arn
|
|
6214
|
+
format = jsonencode({
|
|
6215
|
+
requestId = "$context.requestId"
|
|
6216
|
+
ip = "$context.identity.sourceIp"
|
|
6217
|
+
caller = "$context.identity.caller"
|
|
6218
|
+
user = "$context.identity.user"
|
|
6219
|
+
requestTime = "$context.requestTime"
|
|
6220
|
+
httpMethod = "$context.httpMethod"
|
|
6221
|
+
resourcePath = "$context.resourcePath"
|
|
6222
|
+
status = "$context.status"
|
|
6223
|
+
protocol = "$context.protocol"
|
|
6224
|
+
responseLength = "$context.responseLength"
|
|
6225
|
+
})
|
|
6226
|
+
}
|
|
6227
|
+
|
|
5603
6228
|
tags = var.tags
|
|
5604
6229
|
|
|
5605
|
-
|
|
6230
|
+
# Ensure the account-level role is configured before the stage is created
|
|
6231
|
+
depends_on = [aws_api_gateway_deployment.api_deployment, module.account]
|
|
6232
|
+
}
|
|
6233
|
+
|
|
6234
|
+
# Default throttling applied to all resource paths and methods
|
|
6235
|
+
resource "aws_api_gateway_method_settings" "throttling" {
|
|
6236
|
+
#checkov:skip=CKV_AWS_225:API Gateway caching not required for this use case
|
|
6237
|
+
rest_api_id = module.rest_api.api_id
|
|
6238
|
+
stage_name = aws_api_gateway_stage.api_stage.stage_name
|
|
6239
|
+
method_path = "*/*"
|
|
6240
|
+
|
|
6241
|
+
settings {
|
|
6242
|
+
throttling_rate_limit = 10000
|
|
6243
|
+
throttling_burst_limit = 5000
|
|
6244
|
+
}
|
|
5606
6245
|
}
|
|
5607
6246
|
|
|
5608
6247
|
# API Gateway Resource Policy
|
|
@@ -5741,6 +6380,11 @@ output "lambda_execution_role_name" {
|
|
|
5741
6380
|
value = aws_iam_role.lambda_execution_role.name
|
|
5742
6381
|
}
|
|
5743
6382
|
|
|
6383
|
+
output "security_group_id" {
|
|
6384
|
+
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."
|
|
6385
|
+
value = var.enable_vpc ? aws_security_group.api_lambda[0].id : null
|
|
6386
|
+
}
|
|
6387
|
+
|
|
5744
6388
|
# Integration Outputs
|
|
5745
6389
|
output "integration_id" {
|
|
5746
6390
|
description = "ID of the Lambda integration"
|
|
@@ -5782,11 +6426,11 @@ terraform {
|
|
|
5782
6426
|
required_providers {
|
|
5783
6427
|
aws = {
|
|
5784
6428
|
source = "hashicorp/aws"
|
|
5785
|
-
version = "
|
|
6429
|
+
version = "6.58.0"
|
|
5786
6430
|
}
|
|
5787
6431
|
random = {
|
|
5788
6432
|
source = "hashicorp/random"
|
|
5789
|
-
version = "
|
|
6433
|
+
version = "3.9.0"
|
|
5790
6434
|
}
|
|
5791
6435
|
}
|
|
5792
6436
|
}
|
|
@@ -5856,8 +6500,6 @@ data "aws_caller_identity" "current" {}
|
|
|
5856
6500
|
|
|
5857
6501
|
# Resources
|
|
5858
6502
|
|
|
5859
|
-
# Note: CloudWatch logging removed due to account-level CloudWatch Logs role ARN requirement
|
|
5860
|
-
|
|
5861
6503
|
# REST API Gateway
|
|
5862
6504
|
resource "aws_api_gateway_rest_api" "rest_api" {
|
|
5863
6505
|
name = var.api_name
|
|
@@ -5874,10 +6516,8 @@ resource "aws_api_gateway_rest_api" "rest_api" {
|
|
|
5874
6516
|
tags = var.tags
|
|
5875
6517
|
}
|
|
5876
6518
|
|
|
5877
|
-
# Note: Deployment and
|
|
5878
|
-
# after all methods and integrations are defined
|
|
5879
|
-
|
|
5880
|
-
# Note: CloudWatch Log Group removed due to account-level CloudWatch Logs role ARN requirement
|
|
6519
|
+
# Note: Deployment, stage and access logging are created in the consuming module
|
|
6520
|
+
# (e.g., foo-api.tf) after all methods and integrations are defined
|
|
5881
6521
|
|
|
5882
6522
|
# Gateway Response for CORS (4XX errors)
|
|
5883
6523
|
resource "aws_api_gateway_gateway_response" "cors_4xx" {
|
|
@@ -6035,16 +6675,14 @@ output "waf_web_acl_arn" {
|
|
|
6035
6675
|
value = var.enable_waf ? aws_wafv2_web_acl.api_waf[0].arn : null
|
|
6036
6676
|
}
|
|
6037
6677
|
|
|
6038
|
-
# Note: Stage and
|
|
6039
|
-
|
|
6040
|
-
# Note: CloudWatch log group outputs removed due to account-level CloudWatch Logs role ARN requirement",
|
|
6678
|
+
# Note: Stage, deployment and access log outputs are provided by the consuming module",
|
|
6041
6679
|
"test-api.tf": "terraform {
|
|
6042
6680
|
required_version = ">= 1.0"
|
|
6043
6681
|
|
|
6044
6682
|
required_providers {
|
|
6045
6683
|
aws = {
|
|
6046
6684
|
source = "hashicorp/aws"
|
|
6047
|
-
version = "
|
|
6685
|
+
version = "6.58.0"
|
|
6048
6686
|
}
|
|
6049
6687
|
}
|
|
6050
6688
|
}
|
|
@@ -6066,11 +6704,47 @@ variable "additional_iam_policy_statements" {
|
|
|
6066
6704
|
default = []
|
|
6067
6705
|
}
|
|
6068
6706
|
|
|
6707
|
+
variable "appconfig_application_id" {
|
|
6708
|
+
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."
|
|
6709
|
+
type = string
|
|
6710
|
+
default = null
|
|
6711
|
+
}
|
|
6712
|
+
|
|
6713
|
+
variable "appconfig_application_arn" {
|
|
6714
|
+
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."
|
|
6715
|
+
type = string
|
|
6716
|
+
default = null
|
|
6717
|
+
}
|
|
6718
|
+
|
|
6069
6719
|
variable "asset_bucket_name" {
|
|
6070
6720
|
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."
|
|
6071
6721
|
type = string
|
|
6072
6722
|
}
|
|
6073
6723
|
|
|
6724
|
+
# VPC Configuration (optional)
|
|
6725
|
+
variable "enable_vpc" {
|
|
6726
|
+
description = "Deploy the Lambda function into a VPC. Set alongside vpc_id/subnet_ids."
|
|
6727
|
+
type = bool
|
|
6728
|
+
default = false
|
|
6729
|
+
}
|
|
6730
|
+
|
|
6731
|
+
variable "vpc_id" {
|
|
6732
|
+
description = "VPC ID to deploy the Lambda function into. Required when enable_vpc is true."
|
|
6733
|
+
type = string
|
|
6734
|
+
default = null
|
|
6735
|
+
|
|
6736
|
+
validation {
|
|
6737
|
+
condition = !var.enable_vpc || (var.vpc_id != null && var.subnet_ids != null)
|
|
6738
|
+
error_message = "vpc_id and subnet_ids must be set when enable_vpc is true."
|
|
6739
|
+
}
|
|
6740
|
+
}
|
|
6741
|
+
|
|
6742
|
+
variable "subnet_ids" {
|
|
6743
|
+
description = "Subnet IDs to deploy the Lambda function into. Required when enable_vpc is true."
|
|
6744
|
+
type = list(string)
|
|
6745
|
+
default = null
|
|
6746
|
+
}
|
|
6747
|
+
|
|
6074
6748
|
# CORS Configuration (passed to core module)
|
|
6075
6749
|
|
|
6076
6750
|
variable "cors_allow_headers" {
|
|
@@ -6133,6 +6807,11 @@ resource "aws_s3_object" "lambda_zip" {
|
|
|
6133
6807
|
}
|
|
6134
6808
|
|
|
6135
6809
|
# Use the core REST API module
|
|
6810
|
+
# Account-level CloudWatch role required for REST API access logging
|
|
6811
|
+
module "account" {
|
|
6812
|
+
source = "../../../core/api/api-gateway-account"
|
|
6813
|
+
}
|
|
6814
|
+
|
|
6136
6815
|
module "rest_api" {
|
|
6137
6816
|
source = "../../../core/api/rest-api"
|
|
6138
6817
|
|
|
@@ -6162,9 +6841,31 @@ resource "aws_wafv2_web_acl_association" "api_waf_association" {
|
|
|
6162
6841
|
depends_on = [aws_api_gateway_stage.api_stage]
|
|
6163
6842
|
}
|
|
6164
6843
|
|
|
6844
|
+
# Security group for the API Lambda function, used when deployed into a VPC
|
|
6845
|
+
resource "aws_security_group" "api_lambda" {
|
|
6846
|
+
count = var.enable_vpc ? 1 : 0
|
|
6847
|
+
|
|
6848
|
+
#checkov:skip=CKV2_AWS_5:Attached to api_lambda via vpc_config block; Checkov cannot resolve this reference
|
|
6849
|
+
name_prefix = "test-api-lambda-"
|
|
6850
|
+
description = "Security group for the TestApi API Lambda function"
|
|
6851
|
+
vpc_id = var.vpc_id
|
|
6852
|
+
tags = var.tags
|
|
6853
|
+
}
|
|
6854
|
+
|
|
6855
|
+
resource "aws_vpc_security_group_egress_rule" "api_lambda_https" {
|
|
6856
|
+
count = var.enable_vpc ? 1 : 0
|
|
6857
|
+
|
|
6858
|
+
security_group_id = aws_security_group.api_lambda[0].id
|
|
6859
|
+
cidr_ipv4 = "0.0.0.0/0"
|
|
6860
|
+
from_port = 443
|
|
6861
|
+
to_port = 443
|
|
6862
|
+
ip_protocol = "tcp"
|
|
6863
|
+
description = "Allow outbound HTTPS to AWS service endpoints"
|
|
6864
|
+
}
|
|
6865
|
+
|
|
6165
6866
|
# Lambda function
|
|
6166
6867
|
resource "aws_lambda_function" "api_lambda" {
|
|
6167
|
-
#checkov:skip=CKV_AWS_117:Lambda function
|
|
6868
|
+
#checkov:skip=CKV_AWS_117:Lambda function is optionally deployed into a VPC via vpc_id/subnet_ids; not required for this use case
|
|
6168
6869
|
#checkov:skip=CKV_AWS_116:Dead Letter Queue not required for this simple API use case
|
|
6169
6870
|
#checkov:skip=CKV_AWS_272:Code signing not required for this use case
|
|
6170
6871
|
#checkov:skip=CKV_AWS_115:Concurrent execution limit not required for this use case
|
|
@@ -6186,13 +6887,25 @@ resource "aws_lambda_function" "api_lambda" {
|
|
|
6186
6887
|
mode = "Active"
|
|
6187
6888
|
}
|
|
6188
6889
|
|
|
6890
|
+
dynamic "vpc_config" {
|
|
6891
|
+
for_each = var.enable_vpc ? [1] : []
|
|
6892
|
+
content {
|
|
6893
|
+
subnet_ids = var.subnet_ids
|
|
6894
|
+
security_group_ids = [aws_security_group.api_lambda[0].id]
|
|
6895
|
+
}
|
|
6896
|
+
}
|
|
6897
|
+
|
|
6189
6898
|
|
|
6190
6899
|
environment {
|
|
6191
6900
|
variables = merge({
|
|
6192
|
-
}, var.
|
|
6901
|
+
}, var.appconfig_application_id != null ? {
|
|
6902
|
+
RUNTIME_CONFIG_APP_ID = var.appconfig_application_id
|
|
6903
|
+
} : {}, var.env)
|
|
6193
6904
|
}
|
|
6194
6905
|
|
|
6195
6906
|
tags = var.tags
|
|
6907
|
+
|
|
6908
|
+
depends_on = [aws_iam_role_policy_attachment.lambda_vpc_access]
|
|
6196
6909
|
}
|
|
6197
6910
|
|
|
6198
6911
|
# IAM role for Lambda execution
|
|
@@ -6227,18 +6940,39 @@ resource "aws_iam_role_policy_attachment" "lambda_xray_execution" {
|
|
|
6227
6940
|
role = aws_iam_role.lambda_execution_role.name
|
|
6228
6941
|
}
|
|
6229
6942
|
|
|
6943
|
+
# Attach VPC access policy to Lambda role when deployed into a VPC
|
|
6944
|
+
resource "aws_iam_role_policy_attachment" "lambda_vpc_access" {
|
|
6945
|
+
count = var.enable_vpc ? 1 : 0
|
|
6946
|
+
policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
|
|
6947
|
+
role = aws_iam_role.lambda_execution_role.name
|
|
6948
|
+
}
|
|
6949
|
+
|
|
6230
6950
|
# Additional IAM policies for Lambda (if provided)
|
|
6231
6951
|
resource "aws_iam_role_policy" "lambda_additional_policies" {
|
|
6232
|
-
count = length(
|
|
6952
|
+
count = length(local.lambda_policy_statements) > 0 ? 1 : 0
|
|
6233
6953
|
name = "TestApiHandler-additional-policies-\${random_string.suffix.result}"
|
|
6234
6954
|
role = aws_iam_role.lambda_execution_role.id
|
|
6235
6955
|
|
|
6236
6956
|
policy = jsonencode({
|
|
6237
6957
|
Version = "2012-10-17"
|
|
6238
|
-
Statement =
|
|
6958
|
+
Statement = local.lambda_policy_statements
|
|
6239
6959
|
})
|
|
6240
6960
|
}
|
|
6241
6961
|
|
|
6962
|
+
locals {
|
|
6963
|
+
# Grant read access to the runtime-config AppConfig application when wired
|
|
6964
|
+
lambda_policy_statements = concat(var.appconfig_application_arn != null ? [
|
|
6965
|
+
{
|
|
6966
|
+
Effect = "Allow"
|
|
6967
|
+
Action = [
|
|
6968
|
+
"appconfig:StartConfigurationSession",
|
|
6969
|
+
"appconfig:GetLatestConfiguration"
|
|
6970
|
+
]
|
|
6971
|
+
Resource = ["\${var.appconfig_application_arn}/*"]
|
|
6972
|
+
}
|
|
6973
|
+
] : [], var.additional_iam_policy_statements)
|
|
6974
|
+
}
|
|
6975
|
+
|
|
6242
6976
|
# CloudWatch Log Group for Lambda
|
|
6243
6977
|
resource "aws_cloudwatch_log_group" "lambda_logs" {
|
|
6244
6978
|
#checkov:skip=CKV_AWS_158:Using default CloudWatch log encryption
|
|
@@ -6365,11 +7099,63 @@ resource "aws_api_gateway_deployment" "api_deployment" {
|
|
|
6365
7099
|
]
|
|
6366
7100
|
}
|
|
6367
7101
|
|
|
7102
|
+
# KMS key for encrypting access logs at rest
|
|
7103
|
+
resource "aws_kms_key" "access_logs" {
|
|
7104
|
+
description = "TestApi API access log encryption"
|
|
7105
|
+
deletion_window_in_days = 7
|
|
7106
|
+
enable_key_rotation = true
|
|
7107
|
+
|
|
7108
|
+
policy = jsonencode({
|
|
7109
|
+
Version = "2012-10-17"
|
|
7110
|
+
Statement = [
|
|
7111
|
+
{
|
|
7112
|
+
Sid = "Enable IAM User Permissions"
|
|
7113
|
+
Effect = "Allow"
|
|
7114
|
+
Principal = { AWS = "arn:aws:iam::\${data.aws_caller_identity.current.account_id}:root" }
|
|
7115
|
+
Action = "kms:*"
|
|
7116
|
+
Resource = "*"
|
|
7117
|
+
},
|
|
7118
|
+
{
|
|
7119
|
+
Sid = "Allow CloudWatch Logs"
|
|
7120
|
+
Effect = "Allow"
|
|
7121
|
+
Principal = { Service = "logs.\${data.aws_region.current.region}.amazonaws.com" }
|
|
7122
|
+
Action = [
|
|
7123
|
+
"kms:Encrypt",
|
|
7124
|
+
"kms:Decrypt",
|
|
7125
|
+
"kms:ReEncrypt*",
|
|
7126
|
+
"kms:GenerateDataKey*",
|
|
7127
|
+
"kms:DescribeKey"
|
|
7128
|
+
]
|
|
7129
|
+
Resource = "*"
|
|
7130
|
+
Condition = {
|
|
7131
|
+
ArnEquals = {
|
|
7132
|
+
"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"
|
|
7133
|
+
}
|
|
7134
|
+
}
|
|
7135
|
+
}
|
|
7136
|
+
]
|
|
7137
|
+
})
|
|
7138
|
+
|
|
7139
|
+
tags = var.tags
|
|
7140
|
+
}
|
|
7141
|
+
|
|
7142
|
+
resource "aws_kms_alias" "access_logs" {
|
|
7143
|
+
name = "alias/test-api-\${random_string.suffix.result}-access-logs"
|
|
7144
|
+
target_key_id = aws_kms_key.access_logs.key_id
|
|
7145
|
+
}
|
|
7146
|
+
|
|
7147
|
+
# Access logs for the API Gateway stage
|
|
7148
|
+
resource "aws_cloudwatch_log_group" "access_logs" {
|
|
7149
|
+
name = "/aws/apigateway/test-api-\${random_string.suffix.result}/access"
|
|
7150
|
+
retention_in_days = 365
|
|
7151
|
+
kms_key_id = aws_kms_key.access_logs.arn
|
|
7152
|
+
tags = var.tags
|
|
7153
|
+
}
|
|
7154
|
+
|
|
6368
7155
|
# API Gateway stage
|
|
6369
7156
|
resource "aws_api_gateway_stage" "api_stage" {
|
|
6370
7157
|
#checkov:skip=CKV_AWS_120:API Gateway caching not required for this use case
|
|
6371
|
-
#checkov:skip=
|
|
6372
|
-
#checkov:skip=CKV2_AWS_4:API Gateway logging level not applicable as access logging is disabled
|
|
7158
|
+
#checkov:skip=CKV2_AWS_4:Access logging is enabled below; verbose execution logging is intentionally not enabled
|
|
6373
7159
|
#checkov:skip=CKV2_AWS_51:Client certificate authentication not required for this use case
|
|
6374
7160
|
#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
|
|
6375
7161
|
deployment_id = aws_api_gateway_deployment.api_deployment.id
|
|
@@ -6377,9 +7163,39 @@ resource "aws_api_gateway_stage" "api_stage" {
|
|
|
6377
7163
|
stage_name = "prod"
|
|
6378
7164
|
xray_tracing_enabled = true
|
|
6379
7165
|
|
|
7166
|
+
access_log_settings {
|
|
7167
|
+
destination_arn = aws_cloudwatch_log_group.access_logs.arn
|
|
7168
|
+
format = jsonencode({
|
|
7169
|
+
requestId = "$context.requestId"
|
|
7170
|
+
ip = "$context.identity.sourceIp"
|
|
7171
|
+
caller = "$context.identity.caller"
|
|
7172
|
+
user = "$context.identity.user"
|
|
7173
|
+
requestTime = "$context.requestTime"
|
|
7174
|
+
httpMethod = "$context.httpMethod"
|
|
7175
|
+
resourcePath = "$context.resourcePath"
|
|
7176
|
+
status = "$context.status"
|
|
7177
|
+
protocol = "$context.protocol"
|
|
7178
|
+
responseLength = "$context.responseLength"
|
|
7179
|
+
})
|
|
7180
|
+
}
|
|
7181
|
+
|
|
6380
7182
|
tags = var.tags
|
|
6381
7183
|
|
|
6382
|
-
|
|
7184
|
+
# Ensure the account-level role is configured before the stage is created
|
|
7185
|
+
depends_on = [aws_api_gateway_deployment.api_deployment, module.account]
|
|
7186
|
+
}
|
|
7187
|
+
|
|
7188
|
+
# Default throttling applied to all resource paths and methods
|
|
7189
|
+
resource "aws_api_gateway_method_settings" "throttling" {
|
|
7190
|
+
#checkov:skip=CKV_AWS_225:API Gateway caching not required for this use case
|
|
7191
|
+
rest_api_id = module.rest_api.api_id
|
|
7192
|
+
stage_name = aws_api_gateway_stage.api_stage.stage_name
|
|
7193
|
+
method_path = "*/*"
|
|
7194
|
+
|
|
7195
|
+
settings {
|
|
7196
|
+
throttling_rate_limit = 10000
|
|
7197
|
+
throttling_burst_limit = 5000
|
|
7198
|
+
}
|
|
6383
7199
|
}
|
|
6384
7200
|
|
|
6385
7201
|
# API Gateway Resource Policy
|
|
@@ -6529,6 +7345,11 @@ output "lambda_execution_role_name" {
|
|
|
6529
7345
|
value = aws_iam_role.lambda_execution_role.name
|
|
6530
7346
|
}
|
|
6531
7347
|
|
|
7348
|
+
output "security_group_id" {
|
|
7349
|
+
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."
|
|
7350
|
+
value = var.enable_vpc ? aws_security_group.api_lambda[0].id : null
|
|
7351
|
+
}
|
|
7352
|
+
|
|
6532
7353
|
# Integration Outputs
|
|
6533
7354
|
output "integration_id" {
|
|
6534
7355
|
description = "ID of the Lambda integration"
|
|
@@ -6570,11 +7391,11 @@ terraform {
|
|
|
6570
7391
|
required_providers {
|
|
6571
7392
|
aws = {
|
|
6572
7393
|
source = "hashicorp/aws"
|
|
6573
|
-
version = "
|
|
7394
|
+
version = "6.58.0"
|
|
6574
7395
|
}
|
|
6575
7396
|
random = {
|
|
6576
7397
|
source = "hashicorp/random"
|
|
6577
|
-
version = "
|
|
7398
|
+
version = "3.9.0"
|
|
6578
7399
|
}
|
|
6579
7400
|
}
|
|
6580
7401
|
}
|
|
@@ -6644,8 +7465,6 @@ data "aws_caller_identity" "current" {}
|
|
|
6644
7465
|
|
|
6645
7466
|
# Resources
|
|
6646
7467
|
|
|
6647
|
-
# Note: CloudWatch logging removed due to account-level CloudWatch Logs role ARN requirement
|
|
6648
|
-
|
|
6649
7468
|
# REST API Gateway
|
|
6650
7469
|
resource "aws_api_gateway_rest_api" "rest_api" {
|
|
6651
7470
|
name = var.api_name
|
|
@@ -6662,10 +7481,8 @@ resource "aws_api_gateway_rest_api" "rest_api" {
|
|
|
6662
7481
|
tags = var.tags
|
|
6663
7482
|
}
|
|
6664
7483
|
|
|
6665
|
-
# Note: Deployment and
|
|
6666
|
-
# after all methods and integrations are defined
|
|
6667
|
-
|
|
6668
|
-
# Note: CloudWatch Log Group removed due to account-level CloudWatch Logs role ARN requirement
|
|
7484
|
+
# Note: Deployment, stage and access logging are created in the consuming module
|
|
7485
|
+
# (e.g., foo-api.tf) after all methods and integrations are defined
|
|
6669
7486
|
|
|
6670
7487
|
# Gateway Response for CORS (4XX errors)
|
|
6671
7488
|
resource "aws_api_gateway_gateway_response" "cors_4xx" {
|
|
@@ -6823,16 +7640,14 @@ output "waf_web_acl_arn" {
|
|
|
6823
7640
|
value = var.enable_waf ? aws_wafv2_web_acl.api_waf[0].arn : null
|
|
6824
7641
|
}
|
|
6825
7642
|
|
|
6826
|
-
# Note: Stage and
|
|
6827
|
-
|
|
6828
|
-
# Note: CloudWatch log group outputs removed due to account-level CloudWatch Logs role ARN requirement",
|
|
7643
|
+
# Note: Stage, deployment and access log outputs are provided by the consuming module",
|
|
6829
7644
|
"test-api.tf": "terraform {
|
|
6830
7645
|
required_version = ">= 1.0"
|
|
6831
7646
|
|
|
6832
7647
|
required_providers {
|
|
6833
7648
|
aws = {
|
|
6834
7649
|
source = "hashicorp/aws"
|
|
6835
|
-
version = "
|
|
7650
|
+
version = "6.58.0"
|
|
6836
7651
|
}
|
|
6837
7652
|
}
|
|
6838
7653
|
}
|
|
@@ -6854,11 +7669,47 @@ variable "additional_iam_policy_statements" {
|
|
|
6854
7669
|
default = []
|
|
6855
7670
|
}
|
|
6856
7671
|
|
|
7672
|
+
variable "appconfig_application_id" {
|
|
7673
|
+
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."
|
|
7674
|
+
type = string
|
|
7675
|
+
default = null
|
|
7676
|
+
}
|
|
7677
|
+
|
|
7678
|
+
variable "appconfig_application_arn" {
|
|
7679
|
+
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."
|
|
7680
|
+
type = string
|
|
7681
|
+
default = null
|
|
7682
|
+
}
|
|
7683
|
+
|
|
6857
7684
|
variable "asset_bucket_name" {
|
|
6858
7685
|
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."
|
|
6859
7686
|
type = string
|
|
6860
7687
|
}
|
|
6861
7688
|
|
|
7689
|
+
# VPC Configuration (optional)
|
|
7690
|
+
variable "enable_vpc" {
|
|
7691
|
+
description = "Deploy the Lambda function into a VPC. Set alongside vpc_id/subnet_ids."
|
|
7692
|
+
type = bool
|
|
7693
|
+
default = false
|
|
7694
|
+
}
|
|
7695
|
+
|
|
7696
|
+
variable "vpc_id" {
|
|
7697
|
+
description = "VPC ID to deploy the Lambda function into. Required when enable_vpc is true."
|
|
7698
|
+
type = string
|
|
7699
|
+
default = null
|
|
7700
|
+
|
|
7701
|
+
validation {
|
|
7702
|
+
condition = !var.enable_vpc || (var.vpc_id != null && var.subnet_ids != null)
|
|
7703
|
+
error_message = "vpc_id and subnet_ids must be set when enable_vpc is true."
|
|
7704
|
+
}
|
|
7705
|
+
}
|
|
7706
|
+
|
|
7707
|
+
variable "subnet_ids" {
|
|
7708
|
+
description = "Subnet IDs to deploy the Lambda function into. Required when enable_vpc is true."
|
|
7709
|
+
type = list(string)
|
|
7710
|
+
default = null
|
|
7711
|
+
}
|
|
7712
|
+
|
|
6862
7713
|
# CORS Configuration (passed to core module)
|
|
6863
7714
|
|
|
6864
7715
|
variable "cors_allow_headers" {
|
|
@@ -6921,6 +7772,11 @@ resource "aws_s3_object" "lambda_zip" {
|
|
|
6921
7772
|
}
|
|
6922
7773
|
|
|
6923
7774
|
# Use the core REST API module
|
|
7775
|
+
# Account-level CloudWatch role required for REST API access logging
|
|
7776
|
+
module "account" {
|
|
7777
|
+
source = "../../../core/api/api-gateway-account"
|
|
7778
|
+
}
|
|
7779
|
+
|
|
6924
7780
|
module "rest_api" {
|
|
6925
7781
|
source = "../../../core/api/rest-api"
|
|
6926
7782
|
|
|
@@ -6950,9 +7806,31 @@ resource "aws_wafv2_web_acl_association" "api_waf_association" {
|
|
|
6950
7806
|
depends_on = [aws_api_gateway_stage.api_stage]
|
|
6951
7807
|
}
|
|
6952
7808
|
|
|
7809
|
+
# Security group for the API Lambda function, used when deployed into a VPC
|
|
7810
|
+
resource "aws_security_group" "api_lambda" {
|
|
7811
|
+
count = var.enable_vpc ? 1 : 0
|
|
7812
|
+
|
|
7813
|
+
#checkov:skip=CKV2_AWS_5:Attached to api_lambda via vpc_config block; Checkov cannot resolve this reference
|
|
7814
|
+
name_prefix = "test-api-lambda-"
|
|
7815
|
+
description = "Security group for the TestApi API Lambda function"
|
|
7816
|
+
vpc_id = var.vpc_id
|
|
7817
|
+
tags = var.tags
|
|
7818
|
+
}
|
|
7819
|
+
|
|
7820
|
+
resource "aws_vpc_security_group_egress_rule" "api_lambda_https" {
|
|
7821
|
+
count = var.enable_vpc ? 1 : 0
|
|
7822
|
+
|
|
7823
|
+
security_group_id = aws_security_group.api_lambda[0].id
|
|
7824
|
+
cidr_ipv4 = "0.0.0.0/0"
|
|
7825
|
+
from_port = 443
|
|
7826
|
+
to_port = 443
|
|
7827
|
+
ip_protocol = "tcp"
|
|
7828
|
+
description = "Allow outbound HTTPS to AWS service endpoints"
|
|
7829
|
+
}
|
|
7830
|
+
|
|
6953
7831
|
# Lambda function
|
|
6954
7832
|
resource "aws_lambda_function" "api_lambda" {
|
|
6955
|
-
#checkov:skip=CKV_AWS_117:Lambda function
|
|
7833
|
+
#checkov:skip=CKV_AWS_117:Lambda function is optionally deployed into a VPC via vpc_id/subnet_ids; not required for this use case
|
|
6956
7834
|
#checkov:skip=CKV_AWS_116:Dead Letter Queue not required for this simple API use case
|
|
6957
7835
|
#checkov:skip=CKV_AWS_272:Code signing not required for this use case
|
|
6958
7836
|
#checkov:skip=CKV_AWS_115:Concurrent execution limit not required for this use case
|
|
@@ -6974,13 +7852,25 @@ resource "aws_lambda_function" "api_lambda" {
|
|
|
6974
7852
|
mode = "Active"
|
|
6975
7853
|
}
|
|
6976
7854
|
|
|
7855
|
+
dynamic "vpc_config" {
|
|
7856
|
+
for_each = var.enable_vpc ? [1] : []
|
|
7857
|
+
content {
|
|
7858
|
+
subnet_ids = var.subnet_ids
|
|
7859
|
+
security_group_ids = [aws_security_group.api_lambda[0].id]
|
|
7860
|
+
}
|
|
7861
|
+
}
|
|
7862
|
+
|
|
6977
7863
|
|
|
6978
7864
|
environment {
|
|
6979
7865
|
variables = merge({
|
|
6980
|
-
}, var.
|
|
7866
|
+
}, var.appconfig_application_id != null ? {
|
|
7867
|
+
RUNTIME_CONFIG_APP_ID = var.appconfig_application_id
|
|
7868
|
+
} : {}, var.env)
|
|
6981
7869
|
}
|
|
6982
7870
|
|
|
6983
7871
|
tags = var.tags
|
|
7872
|
+
|
|
7873
|
+
depends_on = [aws_iam_role_policy_attachment.lambda_vpc_access]
|
|
6984
7874
|
}
|
|
6985
7875
|
|
|
6986
7876
|
# IAM role for Lambda execution
|
|
@@ -7015,18 +7905,39 @@ resource "aws_iam_role_policy_attachment" "lambda_xray_execution" {
|
|
|
7015
7905
|
role = aws_iam_role.lambda_execution_role.name
|
|
7016
7906
|
}
|
|
7017
7907
|
|
|
7908
|
+
# Attach VPC access policy to Lambda role when deployed into a VPC
|
|
7909
|
+
resource "aws_iam_role_policy_attachment" "lambda_vpc_access" {
|
|
7910
|
+
count = var.enable_vpc ? 1 : 0
|
|
7911
|
+
policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
|
|
7912
|
+
role = aws_iam_role.lambda_execution_role.name
|
|
7913
|
+
}
|
|
7914
|
+
|
|
7018
7915
|
# Additional IAM policies for Lambda (if provided)
|
|
7019
7916
|
resource "aws_iam_role_policy" "lambda_additional_policies" {
|
|
7020
|
-
count = length(
|
|
7917
|
+
count = length(local.lambda_policy_statements) > 0 ? 1 : 0
|
|
7021
7918
|
name = "TestApiHandler-additional-policies-\${random_string.suffix.result}"
|
|
7022
7919
|
role = aws_iam_role.lambda_execution_role.id
|
|
7023
7920
|
|
|
7024
7921
|
policy = jsonencode({
|
|
7025
7922
|
Version = "2012-10-17"
|
|
7026
|
-
Statement =
|
|
7923
|
+
Statement = local.lambda_policy_statements
|
|
7027
7924
|
})
|
|
7028
7925
|
}
|
|
7029
7926
|
|
|
7927
|
+
locals {
|
|
7928
|
+
# Grant read access to the runtime-config AppConfig application when wired
|
|
7929
|
+
lambda_policy_statements = concat(var.appconfig_application_arn != null ? [
|
|
7930
|
+
{
|
|
7931
|
+
Effect = "Allow"
|
|
7932
|
+
Action = [
|
|
7933
|
+
"appconfig:StartConfigurationSession",
|
|
7934
|
+
"appconfig:GetLatestConfiguration"
|
|
7935
|
+
]
|
|
7936
|
+
Resource = ["\${var.appconfig_application_arn}/*"]
|
|
7937
|
+
}
|
|
7938
|
+
] : [], var.additional_iam_policy_statements)
|
|
7939
|
+
}
|
|
7940
|
+
|
|
7030
7941
|
# CloudWatch Log Group for Lambda
|
|
7031
7942
|
resource "aws_cloudwatch_log_group" "lambda_logs" {
|
|
7032
7943
|
#checkov:skip=CKV_AWS_158:Using default CloudWatch log encryption
|
|
@@ -7247,11 +8158,63 @@ resource "aws_api_gateway_deployment" "api_deployment" {
|
|
|
7247
8158
|
]
|
|
7248
8159
|
}
|
|
7249
8160
|
|
|
8161
|
+
# KMS key for encrypting access logs at rest
|
|
8162
|
+
resource "aws_kms_key" "access_logs" {
|
|
8163
|
+
description = "TestApi API access log encryption"
|
|
8164
|
+
deletion_window_in_days = 7
|
|
8165
|
+
enable_key_rotation = true
|
|
8166
|
+
|
|
8167
|
+
policy = jsonencode({
|
|
8168
|
+
Version = "2012-10-17"
|
|
8169
|
+
Statement = [
|
|
8170
|
+
{
|
|
8171
|
+
Sid = "Enable IAM User Permissions"
|
|
8172
|
+
Effect = "Allow"
|
|
8173
|
+
Principal = { AWS = "arn:aws:iam::\${data.aws_caller_identity.current.account_id}:root" }
|
|
8174
|
+
Action = "kms:*"
|
|
8175
|
+
Resource = "*"
|
|
8176
|
+
},
|
|
8177
|
+
{
|
|
8178
|
+
Sid = "Allow CloudWatch Logs"
|
|
8179
|
+
Effect = "Allow"
|
|
8180
|
+
Principal = { Service = "logs.\${data.aws_region.current.region}.amazonaws.com" }
|
|
8181
|
+
Action = [
|
|
8182
|
+
"kms:Encrypt",
|
|
8183
|
+
"kms:Decrypt",
|
|
8184
|
+
"kms:ReEncrypt*",
|
|
8185
|
+
"kms:GenerateDataKey*",
|
|
8186
|
+
"kms:DescribeKey"
|
|
8187
|
+
]
|
|
8188
|
+
Resource = "*"
|
|
8189
|
+
Condition = {
|
|
8190
|
+
ArnEquals = {
|
|
8191
|
+
"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"
|
|
8192
|
+
}
|
|
8193
|
+
}
|
|
8194
|
+
}
|
|
8195
|
+
]
|
|
8196
|
+
})
|
|
8197
|
+
|
|
8198
|
+
tags = var.tags
|
|
8199
|
+
}
|
|
8200
|
+
|
|
8201
|
+
resource "aws_kms_alias" "access_logs" {
|
|
8202
|
+
name = "alias/test-api-\${random_string.suffix.result}-access-logs"
|
|
8203
|
+
target_key_id = aws_kms_key.access_logs.key_id
|
|
8204
|
+
}
|
|
8205
|
+
|
|
8206
|
+
# Access logs for the API Gateway stage
|
|
8207
|
+
resource "aws_cloudwatch_log_group" "access_logs" {
|
|
8208
|
+
name = "/aws/apigateway/test-api-\${random_string.suffix.result}/access"
|
|
8209
|
+
retention_in_days = 365
|
|
8210
|
+
kms_key_id = aws_kms_key.access_logs.arn
|
|
8211
|
+
tags = var.tags
|
|
8212
|
+
}
|
|
8213
|
+
|
|
7250
8214
|
# API Gateway stage
|
|
7251
8215
|
resource "aws_api_gateway_stage" "api_stage" {
|
|
7252
8216
|
#checkov:skip=CKV_AWS_120:API Gateway caching not required for this use case
|
|
7253
|
-
#checkov:skip=
|
|
7254
|
-
#checkov:skip=CKV2_AWS_4:API Gateway logging level not applicable as access logging is disabled
|
|
8217
|
+
#checkov:skip=CKV2_AWS_4:Access logging is enabled below; verbose execution logging is intentionally not enabled
|
|
7255
8218
|
#checkov:skip=CKV2_AWS_51:Client certificate authentication not required for this use case
|
|
7256
8219
|
#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
|
|
7257
8220
|
deployment_id = aws_api_gateway_deployment.api_deployment.id
|
|
@@ -7259,9 +8222,39 @@ resource "aws_api_gateway_stage" "api_stage" {
|
|
|
7259
8222
|
stage_name = "prod"
|
|
7260
8223
|
xray_tracing_enabled = true
|
|
7261
8224
|
|
|
8225
|
+
access_log_settings {
|
|
8226
|
+
destination_arn = aws_cloudwatch_log_group.access_logs.arn
|
|
8227
|
+
format = jsonencode({
|
|
8228
|
+
requestId = "$context.requestId"
|
|
8229
|
+
ip = "$context.identity.sourceIp"
|
|
8230
|
+
caller = "$context.identity.caller"
|
|
8231
|
+
user = "$context.identity.user"
|
|
8232
|
+
requestTime = "$context.requestTime"
|
|
8233
|
+
httpMethod = "$context.httpMethod"
|
|
8234
|
+
resourcePath = "$context.resourcePath"
|
|
8235
|
+
status = "$context.status"
|
|
8236
|
+
protocol = "$context.protocol"
|
|
8237
|
+
responseLength = "$context.responseLength"
|
|
8238
|
+
})
|
|
8239
|
+
}
|
|
8240
|
+
|
|
7262
8241
|
tags = var.tags
|
|
7263
8242
|
|
|
7264
|
-
|
|
8243
|
+
# Ensure the account-level role is configured before the stage is created
|
|
8244
|
+
depends_on = [aws_api_gateway_deployment.api_deployment, module.account]
|
|
8245
|
+
}
|
|
8246
|
+
|
|
8247
|
+
# Default throttling applied to all resource paths and methods
|
|
8248
|
+
resource "aws_api_gateway_method_settings" "throttling" {
|
|
8249
|
+
#checkov:skip=CKV_AWS_225:API Gateway caching not required for this use case
|
|
8250
|
+
rest_api_id = module.rest_api.api_id
|
|
8251
|
+
stage_name = aws_api_gateway_stage.api_stage.stage_name
|
|
8252
|
+
method_path = "*/*"
|
|
8253
|
+
|
|
8254
|
+
settings {
|
|
8255
|
+
throttling_rate_limit = 10000
|
|
8256
|
+
throttling_burst_limit = 5000
|
|
8257
|
+
}
|
|
7265
8258
|
}
|
|
7266
8259
|
|
|
7267
8260
|
# API Gateway Resource Policy
|
|
@@ -7400,6 +8393,11 @@ output "lambda_execution_role_name" {
|
|
|
7400
8393
|
value = aws_iam_role.lambda_execution_role.name
|
|
7401
8394
|
}
|
|
7402
8395
|
|
|
8396
|
+
output "security_group_id" {
|
|
8397
|
+
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."
|
|
8398
|
+
value = var.enable_vpc ? aws_security_group.api_lambda[0].id : null
|
|
8399
|
+
}
|
|
8400
|
+
|
|
7403
8401
|
# Integration Outputs
|
|
7404
8402
|
output "integration_id" {
|
|
7405
8403
|
description = "ID of the Lambda integration"
|