@aws/nx-plugin 1.0.0-rc.6 → 1.0.0-rc.60
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 +7104 -6167
- package/README.md +8 -7
- package/generators.json +145 -10
- package/migrations.json +111 -0
- package/package.json +41 -22
- package/src/agentcore-gateway/__snapshots__/generator.spec.ts.snap +273 -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/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 +91 -72
- package/src/infra/app/files/app/src/main.ts.template +1 -1
- package/src/infra/app/files/app/src/stages/application-stage.ts.template +1 -1
- package/src/infra/app/generator.d.ts +43 -0
- package/src/infra/app/generator.js +179 -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 +53 -31
- 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/gateway-agent-targets/__snapshots__/migration.spec.ts.snap +223 -0
- package/src/migrations/latest/gateway-agent-targets/metadata.json +3 -0
- package/src/migrations/latest/gateway-agent-targets/migration.d.ts +6 -0
- package/src/migrations/latest/gateway-agent-targets/migration.js +217 -0
- package/src/migrations/latest/gateway-agent-targets/migration.js.map +1 -0
- package/src/migrations/latest/gateway-cognito-passthrough/__snapshots__/migration.spec.ts.snap +149 -0
- package/src/migrations/latest/gateway-cognito-passthrough/metadata.json +3 -0
- package/src/migrations/latest/gateway-cognito-passthrough/migration.d.ts +6 -0
- package/src/migrations/latest/gateway-cognito-passthrough/migration.js +195 -0
- package/src/migrations/latest/gateway-cognito-passthrough/migration.js.map +1 -0
- package/src/migrations/latest/smithy-ssdk-bundle-pins/metadata.json +3 -0
- package/src/migrations/latest/smithy-ssdk-bundle-pins/migration.d.ts +6 -0
- package/src/migrations/latest/smithy-ssdk-bundle-pins/migration.js +78 -0
- package/src/migrations/latest/smithy-ssdk-bundle-pins/migration.js.map +1 -0
- package/src/migrations/latest/strip-pip-from-python-images/__snapshots__/migration.spec.ts.snap +48 -0
- package/src/migrations/latest/strip-pip-from-python-images/metadata.json +3 -0
- package/src/migrations/latest/strip-pip-from-python-images/migration.d.ts +6 -0
- package/src/migrations/latest/strip-pip-from-python-images/migration.js +91 -0
- package/src/migrations/latest/strip-pip-from-python-images/migration.js.map +1 -0
- package/src/migrations/latest/waf-log-group-removal/__snapshots__/migration.spec.ts.snap +57 -0
- package/src/migrations/latest/waf-log-group-removal/metadata.json +3 -0
- package/src/migrations/latest/waf-log-group-removal/migration.d.ts +6 -0
- package/src/migrations/latest/waf-log-group-removal/migration.js +77 -0
- package/src/migrations/latest/waf-log-group-removal/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.50/modernize-function-props-cast/metadata.json +3 -0
- package/src/migrations/v1.0.0-rc.50/modernize-function-props-cast/migration.d.ts +6 -0
- package/src/migrations/v1.0.0-rc.50/modernize-function-props-cast/migration.js +65 -0
- package/src/migrations/v1.0.0-rc.50/modernize-function-props-cast/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.50/restrict-cors-to-custom-domains/metadata.json +3 -0
- package/src/migrations/v1.0.0-rc.50/restrict-cors-to-custom-domains/migration.d.ts +6 -0
- package/src/migrations/v1.0.0-rc.50/restrict-cors-to-custom-domains/migration.js +108 -0
- package/src/migrations/v1.0.0-rc.50/restrict-cors-to-custom-domains/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.50/terraform-bootstrap-adopt-existing-bucket/metadata.json +3 -0
- package/src/migrations/v1.0.0-rc.50/terraform-bootstrap-adopt-existing-bucket/migration.d.ts +6 -0
- package/src/migrations/v1.0.0-rc.50/terraform-bootstrap-adopt-existing-bucket/migration.js +128 -0
- package/src/migrations/v1.0.0-rc.50/terraform-bootstrap-adopt-existing-bucket/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.52/user-identity-waf-allow-localhost-callback/metadata.json +3 -0
- package/src/migrations/v1.0.0-rc.52/user-identity-waf-allow-localhost-callback/migration.d.ts +6 -0
- package/src/migrations/v1.0.0-rc.52/user-identity-waf-allow-localhost-callback/migration.js +215 -0
- package/src/migrations/v1.0.0-rc.52/user-identity-waf-allow-localhost-callback/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.54/order-access-log-delivery-after-bucket-policy/metadata.json +3 -0
- package/src/migrations/v1.0.0-rc.54/order-access-log-delivery-after-bucket-policy/migration.d.ts +6 -0
- package/src/migrations/v1.0.0-rc.54/order-access-log-delivery-after-bucket-policy/migration.js +93 -0
- package/src/migrations/v1.0.0-rc.54/order-access-log-delivery-after-bucket-policy/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.55/backfill-generator-metadata/metadata.json +3 -0
- package/src/migrations/v1.0.0-rc.55/backfill-generator-metadata/migration.d.ts +96 -0
- package/src/migrations/v1.0.0-rc.55/backfill-generator-metadata/migration.js +670 -0
- package/src/migrations/v1.0.0-rc.55/backfill-generator-metadata/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.56/dynamodb-local-remove-optimize-flag/metadata.json +3 -0
- package/src/migrations/v1.0.0-rc.56/dynamodb-local-remove-optimize-flag/migration.d.ts +6 -0
- package/src/migrations/v1.0.0-rc.56/dynamodb-local-remove-optimize-flag/migration.js +89 -0
- package/src/migrations/v1.0.0-rc.56/dynamodb-local-remove-optimize-flag/migration.js.map +1 -0
- package/src/migrations/v1.0.0-rc.57/ts-agent-session-management-support/metadata.json +3 -0
- package/src/migrations/v1.0.0-rc.57/ts-agent-session-management-support/migration.d.ts +6 -0
- package/src/migrations/v1.0.0-rc.57/ts-agent-session-management-support/migration.js +449 -0
- package/src/migrations/v1.0.0-rc.57/ts-agent-session-management-support/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 +99 -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 +334 -0
- package/src/py/agent/__snapshots__/generator.frameworks.spec.ts.snap +734 -0
- package/src/py/agent/__snapshots__/{generator.spec.ts.snap → generator.protocols.spec.ts.snap} +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/a2a-langchain/main.py.template +89 -0
- package/src/py/agent/files/ag-ui-langchain/main.py.template +83 -0
- package/src/py/agent/files/common/agent.py.template +2 -0
- package/src/py/agent/files/common-langchain/agent.py.template +30 -0
- package/src/py/agent/files/deploy/Dockerfile.template +8 -1
- package/src/py/agent/files/http/init.py.template +7 -25
- package/src/py/agent/files/http/main.py.template +3 -4
- package/src/py/agent/files/http-langchain/main.py.template +84 -0
- package/src/py/agent/gateway-connection/__snapshots__/generator.spec.ts.snap +184 -0
- package/src/py/agent/gateway-connection/files/agent-connection/app/__gatewaySnakeCase___client_strands.py.template +35 -0
- package/src/py/agent/gateway-connection/files/langchain/agent-connection/app/__gatewaySnakeCase___client_langchain.py.template +34 -0
- package/src/py/agent/gateway-connection/generator.d.ts +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 +146 -1
- package/src/py/agent/generator.js +406 -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 +68 -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 +60 -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 +95 -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 +132 -32
- package/src/smithy/project/files/{build.Dockerfile.template → service/build.Dockerfile.template} +3 -6
- package/src/smithy/project/files/{src → service/src}/operations/echo.smithy.template +1 -0
- package/src/smithy/project/files/shapes/build.Dockerfile.template +33 -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/generator.d.ts +32 -0
- package/src/smithy/project/generator.js +101 -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 +847 -104
- package/src/smithy/ts/api/files/handler.ts.template +2 -2
- package/src/smithy/ts/api/files/local-server.ts.template +2 -2
- package/src/smithy/ts/api/files/operations/echo.ts.template +2 -2
- package/src/smithy/ts/api/files/service.ts.template +3 -3
- package/src/smithy/ts/api/generator.d.ts +84 -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 +197 -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 +14 -14
- package/src/ts/astro-docs/files/translation/scripts/translate.ts.template +3 -2
- 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/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 +42 -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 +102 -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 +27 -12
- package/src/ts/nx-generator/files/common/schema.d.ts.template +1 -0
- package/src/ts/nx-generator/files/common/schema.json.template +5 -0
- package/src/ts/nx-generator/files/local/generator.ts.template +3 -3
- package/src/ts/nx-generator/files/nx-plugin-for-aws/generator/generator.ts.template +6 -7
- package/src/ts/nx-generator/generator.d.ts +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 +141 -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 +551 -642
- 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 +109 -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 +12 -3
- 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 +1381 -634
- package/src/ts/react-website/app/generator.d.ts +142 -2
- package/src/ts/react-website/app/generator.js +330 -206
- 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-shared/agentcore_transport.py.template +40 -0
- package/src/utils/agent-connection/files/py-core-strands/a2a/agentcore_a2a_client_strands.py.template +66 -0
- package/src/utils/agent-connection/files/py-core-strands/base/model_errors_strands.py.template +40 -0
- package/src/utils/agent-connection/files/py-core-strands/gateway/agentcore_gateway_mcp_client_strands.py.template +22 -0
- package/src/utils/agent-connection/files/py-core-strands/mcp/agentcore_mcp_client_strands.py.template +30 -0
- package/src/utils/agent-core-constructs/agent-core-constructs.d.ts +54 -0
- package/src/utils/agent-core-constructs/agent-core-constructs.js +153 -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/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 +505 -0
- package/src/utils/agent-core-constructs/files/terraform/app/agentcore-gateway/__nameKebabCase__/render-cedar.cjs.template +13 -0
- package/src/utils/agent-core-constructs/files/terraform/core/agent-core/runtime.tf.template +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 +57 -47
- 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 +87 -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 +327 -127
- package/src/utils/format.js.map +1 -1
- package/src/utils/fs.d.ts +16 -5
- package/src/utils/fs.js +29 -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 +116 -0
- package/src/utils/migration-versions.js +186 -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/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 +304 -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 +206 -106
- package/src/utils/versions.js +238 -119
- 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/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/smithy/project/files/{smithy-build.json.template → service/smithy-build.json.template} +0 -0
- /package/src/smithy/project/files/{src → service/src}/main.smithy.template +0 -0
- /package/src/utils/agent-connection/files/{py-core-runtime-config/with_session_id.py.template → py-core-strands/base/with_session_id_strands.py.template} +0 -0
- /package/src/utils/files/common/scripts/src/{index.ts.template → infra/index.ts.template} +0 -0
- /package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/credentials.ts.template +0 -0
- /package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/stage-parser.ts.template +0 -0
|
@@ -22,137 +22,6 @@ datasource db {
|
|
|
22
22
|
"
|
|
23
23
|
`;
|
|
24
24
|
|
|
25
|
-
exports[`ts#rdb generator > should add mysql prisma dependencies when engine is MySQL > packages/db/scripts/pull-image.ts 1`] = `
|
|
26
|
-
"import { spawnSync } from 'child_process';
|
|
27
|
-
|
|
28
|
-
const ENGINE = 'docker';
|
|
29
|
-
const image = process.argv[2];
|
|
30
|
-
|
|
31
|
-
const inspect = spawnSync(ENGINE, ['image', 'inspect', image], {
|
|
32
|
-
stdio: 'ignore',
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
if (inspect.status !== 0) {
|
|
36
|
-
const pull = spawnSync(ENGINE, ['pull', image], { stdio: 'inherit' });
|
|
37
|
-
if (pull.status !== 0) {
|
|
38
|
-
process.exit(pull.status ?? 1);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
"
|
|
42
|
-
`;
|
|
43
|
-
|
|
44
|
-
exports[`ts#rdb generator > should add mysql prisma dependencies when engine is MySQL > packages/db/scripts/start-container.ts 1`] = `
|
|
45
|
-
"import { spawn, spawnSync } from 'child_process';
|
|
46
|
-
|
|
47
|
-
const ENGINE = 'docker';
|
|
48
|
-
|
|
49
|
-
const [containerName, image, hostPort, dbName, dbPassword] =
|
|
50
|
-
process.argv.slice(2);
|
|
51
|
-
|
|
52
|
-
const containerExists = (): boolean =>
|
|
53
|
-
spawnSync(ENGINE, ['container', 'inspect', containerName], {
|
|
54
|
-
stdio: 'ignore',
|
|
55
|
-
}).status === 0;
|
|
56
|
-
|
|
57
|
-
const isRunning = (): boolean => {
|
|
58
|
-
const result = spawnSync(
|
|
59
|
-
ENGINE,
|
|
60
|
-
['container', 'inspect', '-f', '{{.State.Running}}', containerName],
|
|
61
|
-
{ encoding: 'utf-8' },
|
|
62
|
-
);
|
|
63
|
-
return result.status === 0 && result.stdout.trim() === 'true';
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
if (containerExists()) {
|
|
67
|
-
if (!isRunning()) {
|
|
68
|
-
const start = spawnSync(ENGINE, ['start', containerName], {
|
|
69
|
-
stdio: 'inherit',
|
|
70
|
-
});
|
|
71
|
-
if (start.status !== 0) process.exit(start.status ?? 1);
|
|
72
|
-
}
|
|
73
|
-
} else {
|
|
74
|
-
const runArgs = (
|
|
75
|
-
\`run --rm --name \${containerName}\` +
|
|
76
|
-
\` -e MYSQL_DATABASE=\${dbName}\` +
|
|
77
|
-
\` -e MYSQL_ROOT_PASSWORD=\${dbPassword}\` +
|
|
78
|
-
\` -p \${hostPort}:3306\` +
|
|
79
|
-
\` -v \${containerName}-data:/var/lib/mysql\` +
|
|
80
|
-
\` -d \${image}\`
|
|
81
|
-
).split(' ');
|
|
82
|
-
const create = spawnSync(ENGINE, runArgs, { stdio: 'inherit' });
|
|
83
|
-
if (create.status !== 0) process.exit(create.status ?? 1);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
const logs = spawn(ENGINE, ['logs', '-f', containerName], {
|
|
87
|
-
stdio: ['ignore', 'inherit', 'inherit'],
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
let exiting = false;
|
|
91
|
-
|
|
92
|
-
const cleanup = () => {
|
|
93
|
-
if (exiting) return;
|
|
94
|
-
exiting = true;
|
|
95
|
-
spawnSync(ENGINE, ['stop', containerName], { stdio: 'ignore' });
|
|
96
|
-
logs.kill();
|
|
97
|
-
process.exit(0);
|
|
98
|
-
};
|
|
99
|
-
|
|
100
|
-
process.on('SIGTERM', cleanup);
|
|
101
|
-
process.on('SIGINT', cleanup);
|
|
102
|
-
process.on('SIGHUP', cleanup);
|
|
103
|
-
|
|
104
|
-
logs.on('exit', (code) => {
|
|
105
|
-
if (!exiting) process.exit(code ?? 0);
|
|
106
|
-
});
|
|
107
|
-
"
|
|
108
|
-
`;
|
|
109
|
-
|
|
110
|
-
exports[`ts#rdb generator > should add mysql prisma dependencies when engine is MySQL > packages/db/scripts/wait-for-db.ts 1`] = `
|
|
111
|
-
"import { createConnection, Connection } from 'mariadb';
|
|
112
|
-
|
|
113
|
-
const noop = () => undefined;
|
|
114
|
-
|
|
115
|
-
const [portArg, dbArg, userArg, passwordArg] = process.argv.slice(2);
|
|
116
|
-
const timeoutAt = Date.now() + 60000;
|
|
117
|
-
|
|
118
|
-
while (Date.now() < timeoutAt) {
|
|
119
|
-
let conn: Connection | undefined;
|
|
120
|
-
try {
|
|
121
|
-
conn = await createConnection({
|
|
122
|
-
host: 'localhost',
|
|
123
|
-
port: parseInt(portArg),
|
|
124
|
-
user: userArg,
|
|
125
|
-
password: passwordArg,
|
|
126
|
-
database: dbArg,
|
|
127
|
-
connectTimeout: 500,
|
|
128
|
-
allowPublicKeyRetrieval: true,
|
|
129
|
-
});
|
|
130
|
-
await conn.end();
|
|
131
|
-
console.log('Database is ready.');
|
|
132
|
-
process.exit(0);
|
|
133
|
-
} catch {
|
|
134
|
-
console.log('Database is not ready.');
|
|
135
|
-
await conn?.end().catch(noop);
|
|
136
|
-
}
|
|
137
|
-
await new Promise((r) => setTimeout(r, 200));
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
throw new Error(\`Timed out waiting for mysql on port \${portArg}\`);
|
|
141
|
-
"
|
|
142
|
-
`;
|
|
143
|
-
|
|
144
|
-
exports[`ts#rdb generator > should add mysql prisma dependencies when engine is MySQL > packages/db/src/constants.ts 1`] = `
|
|
145
|
-
"export const DB_PACKAGE_NAME = 'Db';
|
|
146
|
-
|
|
147
|
-
// Local development connection details (used when SERVE_LOCAL=true, see serve-local Nx target)
|
|
148
|
-
export const LOCAL_DB_PORT = 3306;
|
|
149
|
-
export const LOCAL_DB_HOST = 'localhost';
|
|
150
|
-
export const LOCAL_DB_NAME = 'database_name';
|
|
151
|
-
export const LOCAL_DB_USER = 'root';
|
|
152
|
-
export const LOCAL_DB_PASSWORD = 'password';
|
|
153
|
-
"
|
|
154
|
-
`;
|
|
155
|
-
|
|
156
25
|
exports[`ts#rdb generator > should add mysql prisma dependencies when engine is MySQL > packages/db/src/create-db-user-handler.ts 1`] = `
|
|
157
26
|
"import type { CloudFormationCustomResourceEvent } from 'aws-lambda';
|
|
158
27
|
import { randomBytes } from 'node:crypto';
|
|
@@ -199,7 +68,7 @@ const ensureDatabaseUser = async (dbUser: string): Promise<void> => {
|
|
|
199
68
|
[
|
|
200
69
|
\`CREATE USER IF NOT EXISTS \${quotedUser}@\${quotedHost} IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS'\`,
|
|
201
70
|
\`ALTER USER \${quotedUser}@\${quotedHost} IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS' REQUIRE SSL\`,
|
|
202
|
-
\`GRANT
|
|
71
|
+
\`GRANT SELECT, INSERT, UPDATE, DELETE ON \${quotedDbName}.* TO \${quotedUser}@\${quotedHost}\`,
|
|
203
72
|
].join(';\\n'),
|
|
204
73
|
);
|
|
205
74
|
} finally {
|
|
@@ -230,13 +99,13 @@ export const handler = async (
|
|
|
230
99
|
`;
|
|
231
100
|
|
|
232
101
|
exports[`ts#rdb generator > should add mysql prisma dependencies when engine is MySQL > packages/db/src/index.ts 1`] = `
|
|
233
|
-
"export {
|
|
234
|
-
export { getPrisma } from './prisma.js';
|
|
102
|
+
"export { getPrisma } from './prisma.js';
|
|
235
103
|
"
|
|
236
104
|
`;
|
|
237
105
|
|
|
238
106
|
exports[`ts#rdb generator > should add mysql prisma dependencies when engine is MySQL > packages/db/src/migration-handler.ts 1`] = `
|
|
239
107
|
"import { execFile } from 'node:child_process';
|
|
108
|
+
import { join } from 'node:path';
|
|
240
109
|
import { promisify } from 'node:util';
|
|
241
110
|
import { getDatabaseSecret, withConnectionRetry } from './utils.js';
|
|
242
111
|
|
|
@@ -254,7 +123,8 @@ const buildDatabaseUrl = async (): Promise<string> => {
|
|
|
254
123
|
export const handler = async () => {
|
|
255
124
|
await withConnectionRetry(async () => {
|
|
256
125
|
const databaseUrl = await buildDatabaseUrl();
|
|
257
|
-
|
|
126
|
+
const prisma = join(__dirname, 'node_modules', '.bin', 'prisma');
|
|
127
|
+
await promisify(execFile)(prisma, ['migrate', 'deploy'], {
|
|
258
128
|
cwd: __dirname,
|
|
259
129
|
env: {
|
|
260
130
|
...process.env,
|
|
@@ -270,26 +140,30 @@ exports[`ts#rdb generator > should add mysql prisma dependencies when engine is
|
|
|
270
140
|
"import { PrismaMariaDb } from '@prisma/adapter-mariadb';
|
|
271
141
|
import { Signer } from '@aws-sdk/rds-signer';
|
|
272
142
|
import { Prisma, PrismaClient } from '../generated/prisma/client.js';
|
|
273
|
-
import {
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
LOCAL_DB_NAME,
|
|
277
|
-
LOCAL_DB_PASSWORD,
|
|
278
|
-
LOCAL_DB_PORT,
|
|
279
|
-
LOCAL_DB_USER,
|
|
280
|
-
} from './constants.js';
|
|
143
|
+
import { readFileSync } from 'fs';
|
|
144
|
+
import { join, dirname } from 'path';
|
|
145
|
+
import { fileURLToPath } from 'url';
|
|
281
146
|
import { getDatabaseConfig } from './utils.js';
|
|
282
147
|
|
|
148
|
+
// Generated: must match runtimeConfigKey in config.json
|
|
149
|
+
const runtimeConfigKey = 'Db';
|
|
150
|
+
|
|
151
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
152
|
+
// config.json is only present in local dev (not included in the deployed bundle); guard with LOCAL_DEV check
|
|
153
|
+
const localDev = () =>
|
|
154
|
+
JSON.parse(readFileSync(join(__dirname, '../config.json'), 'utf-8')).localDev;
|
|
155
|
+
|
|
283
156
|
export const getPrisma = async <LogOpts extends Prisma.LogLevel>(
|
|
284
157
|
log: LogOpts[] = ['warn', 'error'] as LogOpts[],
|
|
285
158
|
): Promise<PrismaClient<LogOpts>> => {
|
|
286
|
-
if (process.env.
|
|
159
|
+
if (process.env.LOCAL_DEV === 'true') {
|
|
160
|
+
const { host, port, dbName, dbUser, dbPassword } = localDev();
|
|
287
161
|
const adapter = new PrismaMariaDb({
|
|
288
|
-
host
|
|
289
|
-
port
|
|
290
|
-
database:
|
|
291
|
-
user:
|
|
292
|
-
password:
|
|
162
|
+
host,
|
|
163
|
+
port,
|
|
164
|
+
database: dbName,
|
|
165
|
+
user: dbUser,
|
|
166
|
+
password: dbPassword,
|
|
293
167
|
allowPublicKeyRetrieval: true,
|
|
294
168
|
});
|
|
295
169
|
return new PrismaClient({
|
|
@@ -299,7 +173,7 @@ export const getPrisma = async <LogOpts extends Prisma.LogLevel>(
|
|
|
299
173
|
}
|
|
300
174
|
|
|
301
175
|
const { hostname, port, database, dbUser, region } =
|
|
302
|
-
await getDatabaseConfig(
|
|
176
|
+
await getDatabaseConfig(runtimeConfigKey);
|
|
303
177
|
const iamAuthToken = await new Signer({
|
|
304
178
|
hostname,
|
|
305
179
|
port,
|
|
@@ -424,6 +298,9 @@ const transientErrorPatterns = [
|
|
|
424
298
|
'ECONNREFUSED',
|
|
425
299
|
'ENOTFOUND',
|
|
426
300
|
'P1000', // Prisma: authentication failed
|
|
301
|
+
'P1001', // Prisma: can't reach database server
|
|
302
|
+
'P1002', // Prisma: database server reached but timed out
|
|
303
|
+
'P1010', // Prisma: user denied access (IAM auth grant not yet propagated)
|
|
427
304
|
'ER_ACCESS_DENIED_ERROR', // MySQL: access denied
|
|
428
305
|
];
|
|
429
306
|
|
|
@@ -484,14 +361,10 @@ import { CustomResource } from 'aws-cdk-lib';
|
|
|
484
361
|
import { IConnectable, IVpc, Port, SubnetType } from 'aws-cdk-lib/aws-ec2';
|
|
485
362
|
import { IGrantable, Role, ServicePrincipal } from 'aws-cdk-lib/aws-iam';
|
|
486
363
|
import { Key } from 'aws-cdk-lib/aws-kms';
|
|
487
|
-
import { Platform } from 'aws-cdk-lib/aws-ecr-assets';
|
|
488
364
|
import {
|
|
489
365
|
Architecture,
|
|
490
|
-
Code,
|
|
491
|
-
DockerImageCode,
|
|
492
|
-
DockerImageFunction,
|
|
493
366
|
Function,
|
|
494
|
-
|
|
367
|
+
FunctionOptions,
|
|
495
368
|
Tracing,
|
|
496
369
|
} from 'aws-cdk-lib/aws-lambda';
|
|
497
370
|
import {
|
|
@@ -607,16 +480,6 @@ export interface AuroraDatabaseProps extends _AuroraDatabaseProps {
|
|
|
607
480
|
*/
|
|
608
481
|
readonly runtimeConfigKey: string;
|
|
609
482
|
|
|
610
|
-
/**
|
|
611
|
-
* Migration bundle used to create a migration handler Lambda.
|
|
612
|
-
*/
|
|
613
|
-
readonly migrationBundleDir: string;
|
|
614
|
-
|
|
615
|
-
/**
|
|
616
|
-
* Bundle used to create or reconcile the application database user.
|
|
617
|
-
*/
|
|
618
|
-
readonly createDbUserBundleDir: string;
|
|
619
|
-
|
|
620
483
|
/**
|
|
621
484
|
* Writer instance for the Aurora cluster.
|
|
622
485
|
*/
|
|
@@ -656,6 +519,25 @@ export interface AuroraDatabaseProps extends _AuroraDatabaseProps {
|
|
|
656
519
|
* @default true
|
|
657
520
|
*/
|
|
658
521
|
readonly enableKeyRotation?: boolean;
|
|
522
|
+
|
|
523
|
+
/**
|
|
524
|
+
* Whether to export Aurora engine logs to CloudWatch Logs.
|
|
525
|
+
* See https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_LogAccess.html
|
|
526
|
+
*
|
|
527
|
+
* PostgreSQL logs DDL statements only (log_statement=ddl); MySQL enables
|
|
528
|
+
* Advanced Auditing scoped to connections and DDL (server_audit_events=CONNECT,QUERY_DDL).
|
|
529
|
+
* Neither logs statement parameter values, to avoid leaking PII into log data.
|
|
530
|
+
*
|
|
531
|
+
* @default true
|
|
532
|
+
*/
|
|
533
|
+
readonly enableCloudwatchLogs?: boolean;
|
|
534
|
+
|
|
535
|
+
/**
|
|
536
|
+
* Whether to enable Performance Insights on the Aurora writer instance.
|
|
537
|
+
*
|
|
538
|
+
* @default true
|
|
539
|
+
*/
|
|
540
|
+
readonly enablePerformanceInsights?: boolean;
|
|
659
541
|
}
|
|
660
542
|
|
|
661
543
|
/**
|
|
@@ -676,8 +558,6 @@ export abstract class AuroraDatabase extends Construct {
|
|
|
676
558
|
adminUser,
|
|
677
559
|
databaseName,
|
|
678
560
|
runtimeConfigKey,
|
|
679
|
-
migrationBundleDir,
|
|
680
|
-
createDbUserBundleDir,
|
|
681
561
|
vpcSubnets,
|
|
682
562
|
writer,
|
|
683
563
|
enableRdsProxy = true,
|
|
@@ -685,6 +565,8 @@ export abstract class AuroraDatabase extends Construct {
|
|
|
685
565
|
deletionProtection = true,
|
|
686
566
|
removalPolicy = RemovalPolicy.RETAIN,
|
|
687
567
|
enableKeyRotation = true,
|
|
568
|
+
enableCloudwatchLogs = true,
|
|
569
|
+
enablePerformanceInsights = true,
|
|
688
570
|
engine,
|
|
689
571
|
engineVersion,
|
|
690
572
|
...clusterProps
|
|
@@ -700,12 +582,35 @@ export abstract class AuroraDatabase extends Construct {
|
|
|
700
582
|
vpc,
|
|
701
583
|
vpcSubnets,
|
|
702
584
|
engine: engine.clusterEngine(engineVersion ?? engine.defaultVersion),
|
|
703
|
-
writer:
|
|
585
|
+
writer:
|
|
586
|
+
writer ??
|
|
587
|
+
ClusterInstance.serverlessV2('writer', {
|
|
588
|
+
enablePerformanceInsights,
|
|
589
|
+
performanceInsightEncryptionKey: enablePerformanceInsights
|
|
590
|
+
? key
|
|
591
|
+
: undefined,
|
|
592
|
+
}),
|
|
704
593
|
credentials: Credentials.fromGeneratedSecret(adminUser, {
|
|
705
594
|
encryptionKey: key,
|
|
706
595
|
}),
|
|
707
596
|
iamAuthentication: true,
|
|
708
597
|
monitoringInterval: Duration.seconds(5),
|
|
598
|
+
cloudwatchLogsExports: enableCloudwatchLogs
|
|
599
|
+
? engine.type === 'mysql'
|
|
600
|
+
? ['audit', 'error']
|
|
601
|
+
: ['postgresql']
|
|
602
|
+
: undefined,
|
|
603
|
+
parameters: enableCloudwatchLogs
|
|
604
|
+
? engine.type === 'mysql'
|
|
605
|
+
? {
|
|
606
|
+
server_audit_logging: '1',
|
|
607
|
+
server_audit_events: 'CONNECT,QUERY_DDL',
|
|
608
|
+
}
|
|
609
|
+
: // Only safe statement-at-a-time; a multi-statement batch mixing
|
|
610
|
+
// DDL with DML (e.g. one \`psql -c "a;b;c"\` call) logs the whole
|
|
611
|
+
// raw text verbatim, including any literal DML values.
|
|
612
|
+
{ log_statement: 'ddl' }
|
|
613
|
+
: undefined,
|
|
709
614
|
defaultDatabaseName: databaseName,
|
|
710
615
|
storageEncrypted: true,
|
|
711
616
|
storageEncryptionKey: key,
|
|
@@ -741,23 +646,23 @@ export abstract class AuroraDatabase extends Construct {
|
|
|
741
646
|
this.proxy?.endpoint ?? this.cluster.clusterEndpoint.hostname;
|
|
742
647
|
const databasePort = this.cluster.clusterEndpoint.port;
|
|
743
648
|
|
|
744
|
-
const
|
|
745
|
-
|
|
746
|
-
handler: 'index.handler',
|
|
747
|
-
runtime: Runtime.NODEJS_LATEST,
|
|
649
|
+
const commonProps: FunctionOptions = {
|
|
650
|
+
vpc,
|
|
748
651
|
timeout: Duration.minutes(5),
|
|
749
652
|
tracing: Tracing.ACTIVE,
|
|
750
|
-
|
|
653
|
+
architecture: Architecture.ARM_64,
|
|
654
|
+
};
|
|
655
|
+
|
|
656
|
+
const createDbUserHandler = this.createDbUserHandler({
|
|
657
|
+
...commonProps,
|
|
751
658
|
vpcSubnets: {
|
|
752
659
|
subnetType: SubnetType.PRIVATE_WITH_EGRESS,
|
|
753
660
|
},
|
|
754
|
-
environment: {
|
|
755
|
-
DATABASE_SECRET_ARN: this.cluster.secret!.secretArn,
|
|
756
|
-
NODE_EXTRA_CA_CERTS: '/var/runtime/ca-cert.pem',
|
|
757
|
-
},
|
|
758
|
-
architecture: Architecture.ARM_64,
|
|
759
661
|
});
|
|
760
|
-
|
|
662
|
+
createDbUserHandler.addEnvironment(
|
|
663
|
+
'DATABASE_SECRET_ARN',
|
|
664
|
+
this.cluster.secret!.secretArn,
|
|
665
|
+
);
|
|
761
666
|
this.cluster.connections.allowDefaultPortFrom(
|
|
762
667
|
createDbUserHandler,
|
|
763
668
|
'Allow the create-db-user handler to connect to the database',
|
|
@@ -794,40 +699,21 @@ export abstract class AuroraDatabase extends Construct {
|
|
|
794
699
|
region: Stack.of(this).region,
|
|
795
700
|
});
|
|
796
701
|
|
|
797
|
-
const migrationHandler =
|
|
798
|
-
|
|
799
|
-
platform: Platform.LINUX_ARM64,
|
|
800
|
-
}),
|
|
702
|
+
const migrationHandler = this.createMigrationHandler({
|
|
703
|
+
...commonProps,
|
|
801
704
|
memorySize: 1024,
|
|
802
|
-
timeout: Duration.minutes(5),
|
|
803
|
-
tracing: Tracing.ACTIVE,
|
|
804
|
-
vpc,
|
|
805
|
-
environment:
|
|
806
|
-
engine.type === 'mysql'
|
|
807
|
-
? {
|
|
808
|
-
DATABASE_SECRET_ARN: this.cluster.secret!.secretArn,
|
|
809
|
-
}
|
|
810
|
-
: {
|
|
811
|
-
HOSTNAME: databaseHostname,
|
|
812
|
-
DATABASE: databaseName,
|
|
813
|
-
PORT: databasePort.toString(),
|
|
814
|
-
DBUSER: this.dbUser,
|
|
815
|
-
},
|
|
816
|
-
architecture: Architecture.ARM_64,
|
|
817
705
|
});
|
|
706
|
+
migrationHandler.addEnvironment(
|
|
707
|
+
'DATABASE_SECRET_ARN',
|
|
708
|
+
this.cluster.secret!.secretArn,
|
|
709
|
+
);
|
|
710
|
+
this.cluster.connections.allowDefaultPortFrom(migrationHandler);
|
|
711
|
+
this.grantSecretRead(migrationHandler);
|
|
818
712
|
|
|
819
|
-
|
|
820
|
-
this.cluster.connections.allowDefaultPortFrom(migrationHandler);
|
|
821
|
-
this.grantSecretRead(migrationHandler);
|
|
822
|
-
} else {
|
|
823
|
-
this.allowDefaultPortFrom(migrationHandler);
|
|
824
|
-
this.grantConnect(migrationHandler);
|
|
825
|
-
}
|
|
826
|
-
|
|
827
|
-
const trigger = new Trigger(this, 'MigrationTrigger', {
|
|
713
|
+
const migrationTrigger = new Trigger(this, 'MigrationTrigger', {
|
|
828
714
|
handler: migrationHandler,
|
|
829
715
|
});
|
|
830
|
-
|
|
716
|
+
migrationTrigger.node.addDependency(createDbUserResource);
|
|
831
717
|
|
|
832
718
|
new CfnOutput(this, 'ClusterEndpoint', {
|
|
833
719
|
value: this.cluster.clusterEndpoint.hostname,
|
|
@@ -840,6 +726,18 @@ export abstract class AuroraDatabase extends Construct {
|
|
|
840
726
|
}
|
|
841
727
|
}
|
|
842
728
|
|
|
729
|
+
/**
|
|
730
|
+
* Creates the Lambda handler used to create or reconcile the application database user.
|
|
731
|
+
*/
|
|
732
|
+
protected abstract createDbUserHandler(baseProps: FunctionOptions): Function;
|
|
733
|
+
|
|
734
|
+
/**
|
|
735
|
+
* Creates the Lambda handler used to run database migrations.
|
|
736
|
+
*/
|
|
737
|
+
protected abstract createMigrationHandler(
|
|
738
|
+
baseProps: FunctionOptions,
|
|
739
|
+
): Function;
|
|
740
|
+
|
|
843
741
|
public allowDefaultPortFrom(other: IConnectable, description?: string): void {
|
|
844
742
|
if (this.proxy) {
|
|
845
743
|
this.proxy.connections.allowFrom(
|
|
@@ -867,17 +765,14 @@ export abstract class AuroraDatabase extends Construct {
|
|
|
867
765
|
|
|
868
766
|
exports[`ts#rdb generator > should add mysql prisma dependencies when engine is MySQL 2`] = `
|
|
869
767
|
"import { defineConfig } from 'prisma/config';
|
|
768
|
+
import { readFileSync } from 'fs';
|
|
870
769
|
|
|
871
770
|
const getDatabaseUrl = async () => {
|
|
872
|
-
if (process.env.
|
|
873
|
-
const {
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
LOCAL_DB_PORT,
|
|
878
|
-
LOCAL_DB_USER,
|
|
879
|
-
} = await import('./src/constants.js');
|
|
880
|
-
return \`mysql://\${LOCAL_DB_USER}:\${LOCAL_DB_PASSWORD}@\${LOCAL_DB_HOST}:\${LOCAL_DB_PORT}/\${LOCAL_DB_NAME}\`;
|
|
771
|
+
if (process.env.LOCAL_DEV === 'true') {
|
|
772
|
+
const { host, port, dbName, dbUser, dbPassword } = JSON.parse(
|
|
773
|
+
readFileSync('config.json', 'utf-8'),
|
|
774
|
+
).localDev;
|
|
775
|
+
return \`mysql://\${dbUser}:\${dbPassword}@\${host}:\${port}/\${dbName}\`;
|
|
881
776
|
}
|
|
882
777
|
return process.env.DATABASE_URL;
|
|
883
778
|
};
|
|
@@ -904,15 +799,15 @@ terraform {
|
|
|
904
799
|
required_providers {
|
|
905
800
|
aws = {
|
|
906
801
|
source = "hashicorp/aws"
|
|
907
|
-
version = "
|
|
802
|
+
version = "6.57.1"
|
|
908
803
|
}
|
|
909
804
|
null = {
|
|
910
805
|
source = "hashicorp/null"
|
|
911
|
-
version = "
|
|
806
|
+
version = "3.3.0"
|
|
912
807
|
}
|
|
913
808
|
random = {
|
|
914
809
|
source = "hashicorp/random"
|
|
915
|
-
version = "
|
|
810
|
+
version = "3.9.0"
|
|
916
811
|
}
|
|
917
812
|
}
|
|
918
813
|
}
|
|
@@ -1021,9 +916,9 @@ variable "enable_credential_rotation" {
|
|
|
1021
916
|
}
|
|
1022
917
|
|
|
1023
918
|
variable "enable_cloudwatch_logs" {
|
|
1024
|
-
description = "Whether to export Aurora engine logs to CloudWatch. PostgreSQL
|
|
919
|
+
description = "Whether to export Aurora engine logs to CloudWatch. PostgreSQL logs DDL statements only (log_statement=ddl); MySQL enables Advanced Auditing scoped to connections and DDL (server_audit_events=CONNECT,QUERY_DDL). Neither logs statement parameter values, to avoid leaking PII into log data."
|
|
1025
920
|
type = bool
|
|
1026
|
-
default =
|
|
921
|
+
default = true
|
|
1027
922
|
}
|
|
1028
923
|
|
|
1029
924
|
variable "enable_performance_insights" {
|
|
@@ -1056,10 +951,19 @@ variable "tags" {
|
|
|
1056
951
|
default = {}
|
|
1057
952
|
}
|
|
1058
953
|
|
|
954
|
+
# Suffix appended to physical resource names so that multiple deployments
|
|
955
|
+
# (e.g. separate environments in the same account and region) don't collide.
|
|
956
|
+
resource "random_string" "suffix" {
|
|
957
|
+
length = 8
|
|
958
|
+
special = false
|
|
959
|
+
upper = false
|
|
960
|
+
}
|
|
961
|
+
|
|
1059
962
|
locals {
|
|
1060
963
|
default_port = var.engine == "aurora-mysql" ? 3306 : 5432
|
|
1061
964
|
default_engine_version = var.engine == "aurora-mysql" ? "8.0.mysql_aurora.3.12.0" : "17.7"
|
|
1062
965
|
parameter_group_family = var.engine == "aurora-mysql" ? "aurora-mysql8.0" : "aurora-postgresql\${split(".", coalesce(var.engine_version, local.default_engine_version))[0]}"
|
|
966
|
+
cluster_name = "\${var.name}-aurora-\${random_string.suffix.result}"
|
|
1063
967
|
}
|
|
1064
968
|
|
|
1065
969
|
resource "aws_rds_cluster_parameter_group" "database" {
|
|
@@ -1069,11 +973,30 @@ resource "aws_rds_cluster_parameter_group" "database" {
|
|
|
1069
973
|
family = local.parameter_group_family
|
|
1070
974
|
description = "Parameter group for \${var.name} Aurora cluster"
|
|
1071
975
|
|
|
976
|
+
# Only safe statement-at-a-time; a multi-statement batch mixing DDL with
|
|
977
|
+
# DML (e.g. one \`psql -c "a;b;c"\` call) logs the whole raw text verbatim,
|
|
978
|
+
# including any literal DML values.
|
|
1072
979
|
dynamic "parameter" {
|
|
1073
980
|
for_each = var.engine == "aurora-postgresql" ? [1] : []
|
|
1074
981
|
content {
|
|
1075
982
|
name = "log_statement"
|
|
1076
|
-
value = "
|
|
983
|
+
value = "ddl"
|
|
984
|
+
}
|
|
985
|
+
}
|
|
986
|
+
|
|
987
|
+
dynamic "parameter" {
|
|
988
|
+
for_each = var.engine == "aurora-mysql" ? [1] : []
|
|
989
|
+
content {
|
|
990
|
+
name = "server_audit_logging"
|
|
991
|
+
value = "1"
|
|
992
|
+
}
|
|
993
|
+
}
|
|
994
|
+
|
|
995
|
+
dynamic "parameter" {
|
|
996
|
+
for_each = var.engine == "aurora-mysql" ? [1] : []
|
|
997
|
+
content {
|
|
998
|
+
name = "server_audit_events"
|
|
999
|
+
value = "CONNECT,QUERY_DDL"
|
|
1077
1000
|
}
|
|
1078
1001
|
}
|
|
1079
1002
|
|
|
@@ -1157,7 +1080,7 @@ resource "aws_security_group" "database" {
|
|
|
1157
1080
|
}
|
|
1158
1081
|
|
|
1159
1082
|
resource "aws_db_subnet_group" "database" {
|
|
1160
|
-
name =
|
|
1083
|
+
name = local.cluster_name
|
|
1161
1084
|
subnet_ids = var.subnet_ids
|
|
1162
1085
|
|
|
1163
1086
|
tags = merge(var.tags, {
|
|
@@ -1195,9 +1118,9 @@ resource "aws_secretsmanager_secret_version" "credentials" {
|
|
|
1195
1118
|
}
|
|
1196
1119
|
|
|
1197
1120
|
resource "aws_rds_cluster" "database" {
|
|
1198
|
-
#checkov:skip=CKV2_AWS_27:Query logging
|
|
1121
|
+
#checkov:skip=CKV2_AWS_27:Query logging is enabled by default via enable_cloudwatch_logs; checkov cannot resolve the conditional count expression on aws_rds_cluster_parameter_group.database
|
|
1199
1122
|
#checkov:skip=CKV_AWS_139:Deletion protection is enabled but checkov is unable to detect it correctly
|
|
1200
|
-
cluster_identifier =
|
|
1123
|
+
cluster_identifier = local.cluster_name
|
|
1201
1124
|
engine = var.engine
|
|
1202
1125
|
engine_version = coalesce(var.engine_version, local.default_engine_version)
|
|
1203
1126
|
database_name = var.database_name
|
|
@@ -1211,12 +1134,12 @@ resource "aws_rds_cluster" "database" {
|
|
|
1211
1134
|
kms_key_id = aws_kms_key.database.arn
|
|
1212
1135
|
deletion_protection = var.deletion_protection
|
|
1213
1136
|
skip_final_snapshot = var.skip_final_snapshot
|
|
1214
|
-
final_snapshot_identifier = var.skip_final_snapshot ? null : "\${
|
|
1137
|
+
final_snapshot_identifier = var.skip_final_snapshot ? null : "\${local.cluster_name}-final-snapshot"
|
|
1215
1138
|
iam_database_authentication_enabled = true
|
|
1216
1139
|
monitoring_interval = 5
|
|
1217
1140
|
monitoring_role_arn = aws_iam_role.enhanced_monitoring.arn
|
|
1218
1141
|
copy_tags_to_snapshot = true
|
|
1219
|
-
enabled_cloudwatch_logs_exports = var.enable_cloudwatch_logs ? (var.engine == "aurora-mysql" ? ["audit", "error"
|
|
1142
|
+
enabled_cloudwatch_logs_exports = var.enable_cloudwatch_logs ? (var.engine == "aurora-mysql" ? ["audit", "error"] : ["postgresql"]) : null
|
|
1220
1143
|
|
|
1221
1144
|
serverlessv2_scaling_configuration {
|
|
1222
1145
|
min_capacity = var.serverless_min_capacity
|
|
@@ -1231,7 +1154,7 @@ resource "aws_rds_cluster" "database" {
|
|
|
1231
1154
|
resource "aws_rds_cluster_instance" "database" {
|
|
1232
1155
|
count = var.instance_count
|
|
1233
1156
|
|
|
1234
|
-
identifier = "\${
|
|
1157
|
+
identifier = "\${local.cluster_name}-\${count.index + 1}"
|
|
1235
1158
|
cluster_identifier = aws_rds_cluster.database.id
|
|
1236
1159
|
instance_class = "db.serverless"
|
|
1237
1160
|
engine = aws_rds_cluster.database.engine
|
|
@@ -1285,7 +1208,7 @@ resource "aws_vpc_security_group_ingress_rule" "rotation_to_database" {
|
|
|
1285
1208
|
resource "aws_cloudformation_stack" "credentials_rotation" {
|
|
1286
1209
|
#checkov:skip=CKV_AWS_124:SNS event notifications are not required for the credentials rotation stack
|
|
1287
1210
|
count = var.enable_credential_rotation ? 1 : 0
|
|
1288
|
-
name = "\${
|
|
1211
|
+
name = "\${local.cluster_name}-credentials-rotation"
|
|
1289
1212
|
|
|
1290
1213
|
capabilities = ["CAPABILITY_IAM", "CAPABILITY_AUTO_EXPAND"]
|
|
1291
1214
|
|
|
@@ -1299,7 +1222,7 @@ resource "aws_cloudformation_stack" "credentials_rotation" {
|
|
|
1299
1222
|
SecretId = aws_secretsmanager_secret.credentials.arn
|
|
1300
1223
|
HostedRotationLambda = {
|
|
1301
1224
|
RotationType = var.engine == "aurora-mysql" ? "MySQLSingleUser" : "PostgreSQLSingleUser"
|
|
1302
|
-
RotationLambdaName = "\${
|
|
1225
|
+
RotationLambdaName = "\${local.cluster_name}-credentials-rotation"
|
|
1303
1226
|
VpcSecurityGroupIds = aws_security_group.rotation[0].id
|
|
1304
1227
|
VpcSubnetIds = join(",", var.lambda_subnet_ids)
|
|
1305
1228
|
}
|
|
@@ -1342,27 +1265,6 @@ resource "aws_iam_role" "proxy" {
|
|
|
1342
1265
|
})
|
|
1343
1266
|
}
|
|
1344
1267
|
|
|
1345
|
-
resource "aws_iam_role_policy" "proxy_secret_access" {
|
|
1346
|
-
count = var.enable_rds_proxy ? 1 : 0
|
|
1347
|
-
role = aws_iam_role.proxy[0].name
|
|
1348
|
-
|
|
1349
|
-
policy = jsonencode({
|
|
1350
|
-
Version = "2012-10-17"
|
|
1351
|
-
Statement = [
|
|
1352
|
-
{
|
|
1353
|
-
Effect = "Allow"
|
|
1354
|
-
Action = ["secretsmanager:GetSecretValue"]
|
|
1355
|
-
Resource = [aws_secretsmanager_secret.credentials.arn]
|
|
1356
|
-
},
|
|
1357
|
-
{
|
|
1358
|
-
Effect = "Allow"
|
|
1359
|
-
Action = ["kms:Decrypt"]
|
|
1360
|
-
Resource = [aws_kms_key.database.arn]
|
|
1361
|
-
}
|
|
1362
|
-
]
|
|
1363
|
-
})
|
|
1364
|
-
}
|
|
1365
|
-
|
|
1366
1268
|
resource "aws_security_group" "proxy" {
|
|
1367
1269
|
#checkov:skip=CKV2_AWS_5:Security group is attached to aws_db_proxy.aurora; Checkov cannot resolve count-conditional cross-resource references
|
|
1368
1270
|
count = var.enable_rds_proxy ? 1 : 0
|
|
@@ -1379,24 +1281,13 @@ resource "aws_security_group" "proxy" {
|
|
|
1379
1281
|
resource "aws_db_proxy" "aurora" {
|
|
1380
1282
|
count = var.enable_rds_proxy ? 1 : 0
|
|
1381
1283
|
|
|
1382
|
-
name = "\${var.name}-proxy"
|
|
1284
|
+
name = "\${var.name}-proxy-\${random_string.suffix.result}"
|
|
1383
1285
|
default_auth_scheme = "IAM_AUTH"
|
|
1384
1286
|
engine_family = var.engine == "aurora-mysql" ? "MYSQL" : "POSTGRESQL"
|
|
1385
1287
|
role_arn = aws_iam_role.proxy[0].arn
|
|
1386
1288
|
vpc_subnet_ids = var.subnet_ids
|
|
1387
1289
|
vpc_security_group_ids = [aws_security_group.proxy[0].id]
|
|
1388
1290
|
require_tls = true
|
|
1389
|
-
|
|
1390
|
-
auth {
|
|
1391
|
-
auth_scheme = "SECRETS"
|
|
1392
|
-
iam_auth = "REQUIRED"
|
|
1393
|
-
secret_arn = aws_secretsmanager_secret.credentials.arn
|
|
1394
|
-
}
|
|
1395
|
-
|
|
1396
|
-
depends_on = [
|
|
1397
|
-
aws_iam_role_policy.proxy_secret_access,
|
|
1398
|
-
aws_secretsmanager_secret_version.credentials,
|
|
1399
|
-
]
|
|
1400
1291
|
}
|
|
1401
1292
|
|
|
1402
1293
|
resource "aws_db_proxy_default_target_group" "default" {
|
|
@@ -1428,9 +1319,9 @@ resource "null_resource" "proxy_target_ready" {
|
|
|
1428
1319
|
deadline=$((start_time + 600))
|
|
1429
1320
|
while true; do
|
|
1430
1321
|
target_state=$(aws rds describe-db-proxy-targets \\
|
|
1431
|
-
--region
|
|
1432
|
-
--db-proxy-name
|
|
1433
|
-
--target-group-name
|
|
1322
|
+
--region "$AWS_REGION" \\
|
|
1323
|
+
--db-proxy-name "$DB_PROXY_NAME" \\
|
|
1324
|
+
--target-group-name "$TARGET_GROUP_NAME" \\
|
|
1434
1325
|
--query "Targets[?Type=='RDS_INSTANCE'] | [0].TargetHealth.State" \\
|
|
1435
1326
|
--output text)
|
|
1436
1327
|
|
|
@@ -1440,13 +1331,19 @@ resource "null_resource" "proxy_target_ready" {
|
|
|
1440
1331
|
|
|
1441
1332
|
current_time=$(date +%s)
|
|
1442
1333
|
if [ "$current_time" -ge "$deadline" ]; then
|
|
1443
|
-
echo "RDS Proxy target
|
|
1334
|
+
echo "RDS Proxy target $DB_CLUSTER_IDENTIFIER did not become AVAILABLE within 10 minutes. Last state: $target_state"
|
|
1444
1335
|
exit 1
|
|
1445
1336
|
fi
|
|
1446
1337
|
|
|
1447
1338
|
sleep 10
|
|
1448
1339
|
done
|
|
1449
1340
|
EOT
|
|
1341
|
+
environment = {
|
|
1342
|
+
AWS_REGION = data.aws_region.current.region
|
|
1343
|
+
DB_PROXY_NAME = self.triggers.db_proxy_name
|
|
1344
|
+
TARGET_GROUP_NAME = self.triggers.target_group_name
|
|
1345
|
+
DB_CLUSTER_IDENTIFIER = self.triggers.db_cluster_identifier
|
|
1346
|
+
}
|
|
1450
1347
|
}
|
|
1451
1348
|
|
|
1452
1349
|
depends_on = [
|
|
@@ -1525,7 +1422,7 @@ resource "aws_iam_role_policy_attachment" "backup" {
|
|
|
1525
1422
|
resource "aws_backup_vault" "database" {
|
|
1526
1423
|
count = var.enable_backup ? 1 : 0
|
|
1527
1424
|
|
|
1528
|
-
name = "\${
|
|
1425
|
+
name = "\${local.cluster_name}-backup"
|
|
1529
1426
|
kms_key_arn = aws_kms_key.database.arn
|
|
1530
1427
|
tags = var.tags
|
|
1531
1428
|
}
|
|
@@ -1533,7 +1430,7 @@ resource "aws_backup_vault" "database" {
|
|
|
1533
1430
|
resource "aws_backup_plan" "database" {
|
|
1534
1431
|
count = var.enable_backup ? 1 : 0
|
|
1535
1432
|
|
|
1536
|
-
name = "\${
|
|
1433
|
+
name = "\${local.cluster_name}-backup"
|
|
1537
1434
|
|
|
1538
1435
|
rule {
|
|
1539
1436
|
rule_name = "daily-backup"
|
|
@@ -1573,6 +1470,11 @@ output "proxy_resource_id" {
|
|
|
1573
1470
|
value = var.enable_rds_proxy ? split(":", aws_db_proxy.aurora[0].arn)[6] : null
|
|
1574
1471
|
}
|
|
1575
1472
|
|
|
1473
|
+
output "connect_resource_id" {
|
|
1474
|
+
description = "Resource ID to use in IAM rds-db:connect policies for the application database user. Resolves to the RDS Proxy resource ID when the proxy is enabled (the default), or the Aurora cluster resource ID when it is disabled — connecting through the proxy and connecting directly to the cluster are different IAM permission boundaries."
|
|
1475
|
+
value = var.enable_rds_proxy ? split(":", aws_db_proxy.aurora[0].arn)[6] : aws_rds_cluster.database.cluster_resource_id
|
|
1476
|
+
}
|
|
1477
|
+
|
|
1576
1478
|
output "cluster_endpoint" {
|
|
1577
1479
|
description = "Writer endpoint of the Aurora cluster or proxy."
|
|
1578
1480
|
value = var.enable_rds_proxy ? aws_db_proxy.aurora[0].endpoint : aws_rds_cluster.database.endpoint
|
|
@@ -1647,19 +1549,19 @@ exports[`ts#rdb generator > should generate terraform modules when iac is Terraf
|
|
|
1647
1549
|
required_providers {
|
|
1648
1550
|
archive = {
|
|
1649
1551
|
source = "hashicorp/archive"
|
|
1650
|
-
version = "
|
|
1552
|
+
version = "2.8.0"
|
|
1651
1553
|
}
|
|
1652
1554
|
aws = {
|
|
1653
1555
|
source = "hashicorp/aws"
|
|
1654
|
-
version = "
|
|
1556
|
+
version = "6.57.1"
|
|
1655
1557
|
}
|
|
1656
1558
|
null = {
|
|
1657
1559
|
source = "hashicorp/null"
|
|
1658
|
-
version = "
|
|
1560
|
+
version = "3.3.0"
|
|
1659
1561
|
}
|
|
1660
1562
|
random = {
|
|
1661
1563
|
source = "hashicorp/random"
|
|
1662
|
-
version = "
|
|
1564
|
+
version = "3.9.0"
|
|
1663
1565
|
}
|
|
1664
1566
|
}
|
|
1665
1567
|
}
|
|
@@ -1763,12 +1665,13 @@ variable "tags" {
|
|
|
1763
1665
|
default = {}
|
|
1764
1666
|
}
|
|
1765
1667
|
|
|
1766
|
-
variable "
|
|
1668
|
+
variable "migration_docker_image_tag" {
|
|
1767
1669
|
description = "Docker image tag for the migration handler. Defaults to the tag built by the Nx docker target."
|
|
1768
1670
|
type = string
|
|
1769
1671
|
default = "proj-db-migration:latest"
|
|
1770
1672
|
}
|
|
1771
1673
|
|
|
1674
|
+
|
|
1772
1675
|
variable "asset_bucket_name" {
|
|
1773
1676
|
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."
|
|
1774
1677
|
type = string
|
|
@@ -1784,10 +1687,12 @@ resource "random_string" "suffix" {
|
|
|
1784
1687
|
}
|
|
1785
1688
|
|
|
1786
1689
|
locals {
|
|
1787
|
-
|
|
1788
|
-
|
|
1690
|
+
config = jsondecode(file("\${path.module}/../../../../../../../packages/db/config.json"))
|
|
1691
|
+
runtime_config_key = local.config.runtimeConfigKey
|
|
1692
|
+
create_db_user_bundle_path = "\${path.module}/../../../../../../../dist/packages/db/bundle/create-db-user"
|
|
1693
|
+
migration_function_name = "db-migration-\${random_string.suffix.result}"
|
|
1789
1694
|
create_db_user_function_name = "db-create-db-user-\${random_string.suffix.result}"
|
|
1790
|
-
database_runtime_user
|
|
1695
|
+
database_runtime_user = "db_\${random_string.suffix.result}"
|
|
1791
1696
|
}
|
|
1792
1697
|
|
|
1793
1698
|
module "aurora" {
|
|
@@ -1853,7 +1758,7 @@ module "add_rdb_to_runtime_config" {
|
|
|
1853
1758
|
source = "../../../core/runtime-config/entry"
|
|
1854
1759
|
|
|
1855
1760
|
namespace = "database"
|
|
1856
|
-
key =
|
|
1761
|
+
key = local.runtime_config_key
|
|
1857
1762
|
value = {
|
|
1858
1763
|
hostname = module.aurora.cluster_endpoint
|
|
1859
1764
|
port = module.aurora.cluster_port
|
|
@@ -1866,9 +1771,8 @@ module "add_rdb_to_runtime_config" {
|
|
|
1866
1771
|
|
|
1867
1772
|
resource "aws_ecr_repository" "migration_handler" {
|
|
1868
1773
|
#checkov:skip=CKV_AWS_136:AES256 encryption is sufficient for ECR repositories
|
|
1869
|
-
#checkov:skip=CKV_AWS_51:Mutable tags are intentional; the migration handler is always pushed as latest and redeployment is gated on docker_digest changes in null_resource.docker_publish
|
|
1870
1774
|
name = "db-migration-\${random_string.suffix.result}"
|
|
1871
|
-
image_tag_mutability = "
|
|
1775
|
+
image_tag_mutability = "IMMUTABLE"
|
|
1872
1776
|
force_delete = true
|
|
1873
1777
|
|
|
1874
1778
|
image_scanning_configuration {
|
|
@@ -1916,22 +1820,34 @@ resource "aws_ecr_repository_policy" "migration_handler" {
|
|
|
1916
1820
|
}
|
|
1917
1821
|
|
|
1918
1822
|
data "external" "docker_digest" {
|
|
1919
|
-
program = ["sh", "-c", "echo '{\\"digest\\":\\"'$(docker inspect \${var.
|
|
1823
|
+
program = ["sh", "-c", "echo '{\\"digest\\":\\"'$(docker inspect \${var.migration_docker_image_tag} --format '{{.Id}}')'\\"}' "]
|
|
1824
|
+
}
|
|
1825
|
+
|
|
1826
|
+
locals {
|
|
1827
|
+
# Content-based, immutable image tag derived from the local image digest
|
|
1828
|
+
image_tag = replace(data.external.docker_digest.result.digest, "sha256:", "")
|
|
1920
1829
|
}
|
|
1921
1830
|
|
|
1922
1831
|
resource "null_resource" "docker_publish" {
|
|
1923
1832
|
triggers = {
|
|
1924
1833
|
docker_digest = data.external.docker_digest.result.digest
|
|
1925
1834
|
repository_url = aws_ecr_repository.migration_handler.repository_url
|
|
1926
|
-
|
|
1835
|
+
migration_docker_image_tag = var.migration_docker_image_tag
|
|
1836
|
+
image_tag = local.image_tag
|
|
1927
1837
|
}
|
|
1928
1838
|
|
|
1929
1839
|
provisioner "local-exec" {
|
|
1930
1840
|
command = <<-EOT
|
|
1931
|
-
aws ecr get-login-password --region
|
|
1932
|
-
docker tag
|
|
1933
|
-
docker push
|
|
1841
|
+
aws ecr get-login-password --region "$AWS_REGION" | docker login --username AWS --password-stdin "$REPOSITORY_URL"
|
|
1842
|
+
docker tag "$MIGRATION_DOCKER_IMAGE_TAG" "$REPOSITORY_URL:$IMAGE_TAG"
|
|
1843
|
+
docker push "$REPOSITORY_URL:$IMAGE_TAG"
|
|
1934
1844
|
EOT
|
|
1845
|
+
environment = {
|
|
1846
|
+
AWS_REGION = data.aws_region.current.region
|
|
1847
|
+
REPOSITORY_URL = self.triggers.repository_url
|
|
1848
|
+
MIGRATION_DOCKER_IMAGE_TAG = self.triggers.migration_docker_image_tag
|
|
1849
|
+
IMAGE_TAG = self.triggers.image_tag
|
|
1850
|
+
}
|
|
1935
1851
|
}
|
|
1936
1852
|
|
|
1937
1853
|
depends_on = [aws_ecr_repository_policy.migration_handler]
|
|
@@ -1980,11 +1896,16 @@ resource "aws_iam_role_policy" "migration_handler_access" {
|
|
|
1980
1896
|
{
|
|
1981
1897
|
Effect = "Allow"
|
|
1982
1898
|
Action = [
|
|
1983
|
-
"
|
|
1899
|
+
"secretsmanager:GetSecretValue"
|
|
1984
1900
|
]
|
|
1985
|
-
Resource = [
|
|
1986
|
-
|
|
1901
|
+
Resource = [module.aurora.secret_arn]
|
|
1902
|
+
},
|
|
1903
|
+
{
|
|
1904
|
+
Effect = "Allow"
|
|
1905
|
+
Action = [
|
|
1906
|
+
"kms:Decrypt"
|
|
1987
1907
|
]
|
|
1908
|
+
Resource = [module.aurora.kms_key_arn]
|
|
1988
1909
|
}
|
|
1989
1910
|
]
|
|
1990
1911
|
})
|
|
@@ -2073,7 +1994,7 @@ resource "aws_security_group" "migration_handler" {
|
|
|
2073
1994
|
|
|
2074
1995
|
resource "aws_vpc_security_group_egress_rule" "migration_handler_to_database" {
|
|
2075
1996
|
security_group_id = aws_security_group.migration_handler.id
|
|
2076
|
-
referenced_security_group_id = module.aurora.
|
|
1997
|
+
referenced_security_group_id = module.aurora.database_security_group_id
|
|
2077
1998
|
from_port = module.aurora.cluster_port
|
|
2078
1999
|
to_port = module.aurora.cluster_port
|
|
2079
2000
|
ip_protocol = "tcp"
|
|
@@ -2115,7 +2036,7 @@ resource "aws_vpc_security_group_egress_rule" "create_db_user_https" {
|
|
|
2115
2036
|
}
|
|
2116
2037
|
|
|
2117
2038
|
resource "aws_vpc_security_group_ingress_rule" "migration_handler_to_database" {
|
|
2118
|
-
security_group_id = module.aurora.
|
|
2039
|
+
security_group_id = module.aurora.database_security_group_id
|
|
2119
2040
|
referenced_security_group_id = aws_security_group.migration_handler.id
|
|
2120
2041
|
from_port = module.aurora.cluster_port
|
|
2121
2042
|
to_port = module.aurora.cluster_port
|
|
@@ -2189,10 +2110,10 @@ resource "null_resource" "create_db_user_trigger" {
|
|
|
2189
2110
|
command = <<-EOT
|
|
2190
2111
|
output_file=$(mktemp)
|
|
2191
2112
|
response=$(aws lambda invoke \\
|
|
2192
|
-
--region
|
|
2193
|
-
--function-name
|
|
2113
|
+
--region "$AWS_REGION" \\
|
|
2114
|
+
--function-name "$FUNCTION_NAME" \\
|
|
2194
2115
|
--cli-binary-format raw-in-base64-out \\
|
|
2195
|
-
--payload
|
|
2116
|
+
--payload "{\\"RequestType\\":\\"Create\\",\\"PhysicalResourceId\\":\\"db-user:$DB_USER\\"}" \\
|
|
2196
2117
|
"$output_file")
|
|
2197
2118
|
cat "$output_file"
|
|
2198
2119
|
echo "$response"
|
|
@@ -2202,6 +2123,11 @@ resource "null_resource" "create_db_user_trigger" {
|
|
|
2202
2123
|
fi
|
|
2203
2124
|
rm -f "$output_file"
|
|
2204
2125
|
EOT
|
|
2126
|
+
environment = {
|
|
2127
|
+
AWS_REGION = data.aws_region.current.region
|
|
2128
|
+
FUNCTION_NAME = self.triggers.function_name
|
|
2129
|
+
DB_USER = self.triggers.db_user
|
|
2130
|
+
}
|
|
2205
2131
|
}
|
|
2206
2132
|
|
|
2207
2133
|
depends_on = [aws_lambda_function.create_db_user, module.aurora]
|
|
@@ -2215,7 +2141,7 @@ resource "aws_lambda_function" "migration_handler" {
|
|
|
2215
2141
|
package_type = "Image"
|
|
2216
2142
|
function_name = local.migration_function_name
|
|
2217
2143
|
role = aws_iam_role.migration_handler.arn
|
|
2218
|
-
image_uri = "\${aws_ecr_repository.migration_handler.repository_url}
|
|
2144
|
+
image_uri = "\${aws_ecr_repository.migration_handler.repository_url}:\${local.image_tag}"
|
|
2219
2145
|
memory_size = 1024
|
|
2220
2146
|
timeout = 300
|
|
2221
2147
|
architectures = ["arm64"]
|
|
@@ -2231,10 +2157,7 @@ resource "aws_lambda_function" "migration_handler" {
|
|
|
2231
2157
|
|
|
2232
2158
|
environment {
|
|
2233
2159
|
variables = {
|
|
2234
|
-
|
|
2235
|
-
DATABASE = module.aurora.database_name
|
|
2236
|
-
PORT = tostring(module.aurora.cluster_port)
|
|
2237
|
-
DBUSER = local.database_runtime_user
|
|
2160
|
+
DATABASE_SECRET_ARN = module.aurora.secret_arn
|
|
2238
2161
|
}
|
|
2239
2162
|
}
|
|
2240
2163
|
|
|
@@ -2264,8 +2187,8 @@ resource "null_resource" "migration_trigger" {
|
|
|
2264
2187
|
command = <<-EOT
|
|
2265
2188
|
output_file=$(mktemp)
|
|
2266
2189
|
response=$(aws lambda invoke \\
|
|
2267
|
-
--region
|
|
2268
|
-
--function-name
|
|
2190
|
+
--region "$AWS_REGION" \\
|
|
2191
|
+
--function-name "$FUNCTION_NAME" \\
|
|
2269
2192
|
--cli-binary-format raw-in-base64-out \\
|
|
2270
2193
|
"$output_file")
|
|
2271
2194
|
cat "$output_file"
|
|
@@ -2276,6 +2199,10 @@ resource "null_resource" "migration_trigger" {
|
|
|
2276
2199
|
fi
|
|
2277
2200
|
rm -f "$output_file"
|
|
2278
2201
|
EOT
|
|
2202
|
+
environment = {
|
|
2203
|
+
AWS_REGION = data.aws_region.current.region
|
|
2204
|
+
FUNCTION_NAME = self.triggers.function_name
|
|
2205
|
+
}
|
|
2279
2206
|
}
|
|
2280
2207
|
|
|
2281
2208
|
depends_on = [
|
|
@@ -2306,6 +2233,11 @@ output "proxy_resource_id" {
|
|
|
2306
2233
|
value = module.aurora.proxy_resource_id
|
|
2307
2234
|
}
|
|
2308
2235
|
|
|
2236
|
+
output "connect_resource_id" {
|
|
2237
|
+
description = "Resource ID to use in IAM rds-db:connect policies for the application database user. Resolves to the RDS Proxy resource ID when the proxy is enabled (the default), or the Aurora cluster resource ID when it is disabled — connecting through the proxy and connecting directly to the cluster are different IAM permission boundaries."
|
|
2238
|
+
value = module.aurora.connect_resource_id
|
|
2239
|
+
}
|
|
2240
|
+
|
|
2309
2241
|
output "kms_key_arn" {
|
|
2310
2242
|
description = "ARN of the KMS key protecting Aurora and the admin credentials secret, used to grant decrypt access alongside secret_arn."
|
|
2311
2243
|
value = module.aurora.kms_key_arn
|
|
@@ -2340,7 +2272,6 @@ output "database_runtime_user" {
|
|
|
2340
2272
|
description = "Application database user created for IAM-authenticated access."
|
|
2341
2273
|
value = local.database_runtime_user
|
|
2342
2274
|
}
|
|
2343
|
-
|
|
2344
2275
|
"
|
|
2345
2276
|
`;
|
|
2346
2277
|
|
|
@@ -2354,15 +2285,15 @@ terraform {
|
|
|
2354
2285
|
required_providers {
|
|
2355
2286
|
aws = {
|
|
2356
2287
|
source = "hashicorp/aws"
|
|
2357
|
-
version = "
|
|
2288
|
+
version = "6.57.1"
|
|
2358
2289
|
}
|
|
2359
2290
|
null = {
|
|
2360
2291
|
source = "hashicorp/null"
|
|
2361
|
-
version = "
|
|
2292
|
+
version = "3.3.0"
|
|
2362
2293
|
}
|
|
2363
2294
|
random = {
|
|
2364
2295
|
source = "hashicorp/random"
|
|
2365
|
-
version = "
|
|
2296
|
+
version = "3.9.0"
|
|
2366
2297
|
}
|
|
2367
2298
|
}
|
|
2368
2299
|
}
|
|
@@ -2471,9 +2402,9 @@ variable "enable_credential_rotation" {
|
|
|
2471
2402
|
}
|
|
2472
2403
|
|
|
2473
2404
|
variable "enable_cloudwatch_logs" {
|
|
2474
|
-
description = "Whether to export Aurora engine logs to CloudWatch. PostgreSQL
|
|
2405
|
+
description = "Whether to export Aurora engine logs to CloudWatch. PostgreSQL logs DDL statements only (log_statement=ddl); MySQL enables Advanced Auditing scoped to connections and DDL (server_audit_events=CONNECT,QUERY_DDL). Neither logs statement parameter values, to avoid leaking PII into log data."
|
|
2475
2406
|
type = bool
|
|
2476
|
-
default =
|
|
2407
|
+
default = true
|
|
2477
2408
|
}
|
|
2478
2409
|
|
|
2479
2410
|
variable "enable_performance_insights" {
|
|
@@ -2506,10 +2437,19 @@ variable "tags" {
|
|
|
2506
2437
|
default = {}
|
|
2507
2438
|
}
|
|
2508
2439
|
|
|
2440
|
+
# Suffix appended to physical resource names so that multiple deployments
|
|
2441
|
+
# (e.g. separate environments in the same account and region) don't collide.
|
|
2442
|
+
resource "random_string" "suffix" {
|
|
2443
|
+
length = 8
|
|
2444
|
+
special = false
|
|
2445
|
+
upper = false
|
|
2446
|
+
}
|
|
2447
|
+
|
|
2509
2448
|
locals {
|
|
2510
2449
|
default_port = var.engine == "aurora-mysql" ? 3306 : 5432
|
|
2511
2450
|
default_engine_version = var.engine == "aurora-mysql" ? "8.0.mysql_aurora.3.12.0" : "17.7"
|
|
2512
2451
|
parameter_group_family = var.engine == "aurora-mysql" ? "aurora-mysql8.0" : "aurora-postgresql\${split(".", coalesce(var.engine_version, local.default_engine_version))[0]}"
|
|
2452
|
+
cluster_name = "\${var.name}-aurora-\${random_string.suffix.result}"
|
|
2513
2453
|
}
|
|
2514
2454
|
|
|
2515
2455
|
resource "aws_rds_cluster_parameter_group" "database" {
|
|
@@ -2519,11 +2459,30 @@ resource "aws_rds_cluster_parameter_group" "database" {
|
|
|
2519
2459
|
family = local.parameter_group_family
|
|
2520
2460
|
description = "Parameter group for \${var.name} Aurora cluster"
|
|
2521
2461
|
|
|
2462
|
+
# Only safe statement-at-a-time; a multi-statement batch mixing DDL with
|
|
2463
|
+
# DML (e.g. one \`psql -c "a;b;c"\` call) logs the whole raw text verbatim,
|
|
2464
|
+
# including any literal DML values.
|
|
2522
2465
|
dynamic "parameter" {
|
|
2523
2466
|
for_each = var.engine == "aurora-postgresql" ? [1] : []
|
|
2524
2467
|
content {
|
|
2525
2468
|
name = "log_statement"
|
|
2526
|
-
value = "
|
|
2469
|
+
value = "ddl"
|
|
2470
|
+
}
|
|
2471
|
+
}
|
|
2472
|
+
|
|
2473
|
+
dynamic "parameter" {
|
|
2474
|
+
for_each = var.engine == "aurora-mysql" ? [1] : []
|
|
2475
|
+
content {
|
|
2476
|
+
name = "server_audit_logging"
|
|
2477
|
+
value = "1"
|
|
2478
|
+
}
|
|
2479
|
+
}
|
|
2480
|
+
|
|
2481
|
+
dynamic "parameter" {
|
|
2482
|
+
for_each = var.engine == "aurora-mysql" ? [1] : []
|
|
2483
|
+
content {
|
|
2484
|
+
name = "server_audit_events"
|
|
2485
|
+
value = "CONNECT,QUERY_DDL"
|
|
2527
2486
|
}
|
|
2528
2487
|
}
|
|
2529
2488
|
|
|
@@ -2607,7 +2566,7 @@ resource "aws_security_group" "database" {
|
|
|
2607
2566
|
}
|
|
2608
2567
|
|
|
2609
2568
|
resource "aws_db_subnet_group" "database" {
|
|
2610
|
-
name =
|
|
2569
|
+
name = local.cluster_name
|
|
2611
2570
|
subnet_ids = var.subnet_ids
|
|
2612
2571
|
|
|
2613
2572
|
tags = merge(var.tags, {
|
|
@@ -2645,9 +2604,9 @@ resource "aws_secretsmanager_secret_version" "credentials" {
|
|
|
2645
2604
|
}
|
|
2646
2605
|
|
|
2647
2606
|
resource "aws_rds_cluster" "database" {
|
|
2648
|
-
#checkov:skip=CKV2_AWS_27:Query logging
|
|
2607
|
+
#checkov:skip=CKV2_AWS_27:Query logging is enabled by default via enable_cloudwatch_logs; checkov cannot resolve the conditional count expression on aws_rds_cluster_parameter_group.database
|
|
2649
2608
|
#checkov:skip=CKV_AWS_139:Deletion protection is enabled but checkov is unable to detect it correctly
|
|
2650
|
-
cluster_identifier =
|
|
2609
|
+
cluster_identifier = local.cluster_name
|
|
2651
2610
|
engine = var.engine
|
|
2652
2611
|
engine_version = coalesce(var.engine_version, local.default_engine_version)
|
|
2653
2612
|
database_name = var.database_name
|
|
@@ -2661,12 +2620,12 @@ resource "aws_rds_cluster" "database" {
|
|
|
2661
2620
|
kms_key_id = aws_kms_key.database.arn
|
|
2662
2621
|
deletion_protection = var.deletion_protection
|
|
2663
2622
|
skip_final_snapshot = var.skip_final_snapshot
|
|
2664
|
-
final_snapshot_identifier = var.skip_final_snapshot ? null : "\${
|
|
2623
|
+
final_snapshot_identifier = var.skip_final_snapshot ? null : "\${local.cluster_name}-final-snapshot"
|
|
2665
2624
|
iam_database_authentication_enabled = true
|
|
2666
2625
|
monitoring_interval = 5
|
|
2667
2626
|
monitoring_role_arn = aws_iam_role.enhanced_monitoring.arn
|
|
2668
2627
|
copy_tags_to_snapshot = true
|
|
2669
|
-
enabled_cloudwatch_logs_exports = var.enable_cloudwatch_logs ? (var.engine == "aurora-mysql" ? ["audit", "error"
|
|
2628
|
+
enabled_cloudwatch_logs_exports = var.enable_cloudwatch_logs ? (var.engine == "aurora-mysql" ? ["audit", "error"] : ["postgresql"]) : null
|
|
2670
2629
|
|
|
2671
2630
|
serverlessv2_scaling_configuration {
|
|
2672
2631
|
min_capacity = var.serverless_min_capacity
|
|
@@ -2681,7 +2640,7 @@ resource "aws_rds_cluster" "database" {
|
|
|
2681
2640
|
resource "aws_rds_cluster_instance" "database" {
|
|
2682
2641
|
count = var.instance_count
|
|
2683
2642
|
|
|
2684
|
-
identifier = "\${
|
|
2643
|
+
identifier = "\${local.cluster_name}-\${count.index + 1}"
|
|
2685
2644
|
cluster_identifier = aws_rds_cluster.database.id
|
|
2686
2645
|
instance_class = "db.serverless"
|
|
2687
2646
|
engine = aws_rds_cluster.database.engine
|
|
@@ -2735,7 +2694,7 @@ resource "aws_vpc_security_group_ingress_rule" "rotation_to_database" {
|
|
|
2735
2694
|
resource "aws_cloudformation_stack" "credentials_rotation" {
|
|
2736
2695
|
#checkov:skip=CKV_AWS_124:SNS event notifications are not required for the credentials rotation stack
|
|
2737
2696
|
count = var.enable_credential_rotation ? 1 : 0
|
|
2738
|
-
name = "\${
|
|
2697
|
+
name = "\${local.cluster_name}-credentials-rotation"
|
|
2739
2698
|
|
|
2740
2699
|
capabilities = ["CAPABILITY_IAM", "CAPABILITY_AUTO_EXPAND"]
|
|
2741
2700
|
|
|
@@ -2749,7 +2708,7 @@ resource "aws_cloudformation_stack" "credentials_rotation" {
|
|
|
2749
2708
|
SecretId = aws_secretsmanager_secret.credentials.arn
|
|
2750
2709
|
HostedRotationLambda = {
|
|
2751
2710
|
RotationType = var.engine == "aurora-mysql" ? "MySQLSingleUser" : "PostgreSQLSingleUser"
|
|
2752
|
-
RotationLambdaName = "\${
|
|
2711
|
+
RotationLambdaName = "\${local.cluster_name}-credentials-rotation"
|
|
2753
2712
|
VpcSecurityGroupIds = aws_security_group.rotation[0].id
|
|
2754
2713
|
VpcSubnetIds = join(",", var.lambda_subnet_ids)
|
|
2755
2714
|
}
|
|
@@ -2792,27 +2751,6 @@ resource "aws_iam_role" "proxy" {
|
|
|
2792
2751
|
})
|
|
2793
2752
|
}
|
|
2794
2753
|
|
|
2795
|
-
resource "aws_iam_role_policy" "proxy_secret_access" {
|
|
2796
|
-
count = var.enable_rds_proxy ? 1 : 0
|
|
2797
|
-
role = aws_iam_role.proxy[0].name
|
|
2798
|
-
|
|
2799
|
-
policy = jsonencode({
|
|
2800
|
-
Version = "2012-10-17"
|
|
2801
|
-
Statement = [
|
|
2802
|
-
{
|
|
2803
|
-
Effect = "Allow"
|
|
2804
|
-
Action = ["secretsmanager:GetSecretValue"]
|
|
2805
|
-
Resource = [aws_secretsmanager_secret.credentials.arn]
|
|
2806
|
-
},
|
|
2807
|
-
{
|
|
2808
|
-
Effect = "Allow"
|
|
2809
|
-
Action = ["kms:Decrypt"]
|
|
2810
|
-
Resource = [aws_kms_key.database.arn]
|
|
2811
|
-
}
|
|
2812
|
-
]
|
|
2813
|
-
})
|
|
2814
|
-
}
|
|
2815
|
-
|
|
2816
2754
|
resource "aws_security_group" "proxy" {
|
|
2817
2755
|
#checkov:skip=CKV2_AWS_5:Security group is attached to aws_db_proxy.aurora; Checkov cannot resolve count-conditional cross-resource references
|
|
2818
2756
|
count = var.enable_rds_proxy ? 1 : 0
|
|
@@ -2829,24 +2767,13 @@ resource "aws_security_group" "proxy" {
|
|
|
2829
2767
|
resource "aws_db_proxy" "aurora" {
|
|
2830
2768
|
count = var.enable_rds_proxy ? 1 : 0
|
|
2831
2769
|
|
|
2832
|
-
name = "\${var.name}-proxy"
|
|
2770
|
+
name = "\${var.name}-proxy-\${random_string.suffix.result}"
|
|
2833
2771
|
default_auth_scheme = "IAM_AUTH"
|
|
2834
2772
|
engine_family = var.engine == "aurora-mysql" ? "MYSQL" : "POSTGRESQL"
|
|
2835
2773
|
role_arn = aws_iam_role.proxy[0].arn
|
|
2836
2774
|
vpc_subnet_ids = var.subnet_ids
|
|
2837
2775
|
vpc_security_group_ids = [aws_security_group.proxy[0].id]
|
|
2838
2776
|
require_tls = true
|
|
2839
|
-
|
|
2840
|
-
auth {
|
|
2841
|
-
auth_scheme = "SECRETS"
|
|
2842
|
-
iam_auth = "REQUIRED"
|
|
2843
|
-
secret_arn = aws_secretsmanager_secret.credentials.arn
|
|
2844
|
-
}
|
|
2845
|
-
|
|
2846
|
-
depends_on = [
|
|
2847
|
-
aws_iam_role_policy.proxy_secret_access,
|
|
2848
|
-
aws_secretsmanager_secret_version.credentials,
|
|
2849
|
-
]
|
|
2850
2777
|
}
|
|
2851
2778
|
|
|
2852
2779
|
resource "aws_db_proxy_default_target_group" "default" {
|
|
@@ -2878,9 +2805,9 @@ resource "null_resource" "proxy_target_ready" {
|
|
|
2878
2805
|
deadline=$((start_time + 600))
|
|
2879
2806
|
while true; do
|
|
2880
2807
|
target_state=$(aws rds describe-db-proxy-targets \\
|
|
2881
|
-
--region
|
|
2882
|
-
--db-proxy-name
|
|
2883
|
-
--target-group-name
|
|
2808
|
+
--region "$AWS_REGION" \\
|
|
2809
|
+
--db-proxy-name "$DB_PROXY_NAME" \\
|
|
2810
|
+
--target-group-name "$TARGET_GROUP_NAME" \\
|
|
2884
2811
|
--query "Targets[?Type=='RDS_INSTANCE'] | [0].TargetHealth.State" \\
|
|
2885
2812
|
--output text)
|
|
2886
2813
|
|
|
@@ -2890,13 +2817,19 @@ resource "null_resource" "proxy_target_ready" {
|
|
|
2890
2817
|
|
|
2891
2818
|
current_time=$(date +%s)
|
|
2892
2819
|
if [ "$current_time" -ge "$deadline" ]; then
|
|
2893
|
-
echo "RDS Proxy target
|
|
2820
|
+
echo "RDS Proxy target $DB_CLUSTER_IDENTIFIER did not become AVAILABLE within 10 minutes. Last state: $target_state"
|
|
2894
2821
|
exit 1
|
|
2895
2822
|
fi
|
|
2896
2823
|
|
|
2897
2824
|
sleep 10
|
|
2898
2825
|
done
|
|
2899
2826
|
EOT
|
|
2827
|
+
environment = {
|
|
2828
|
+
AWS_REGION = data.aws_region.current.region
|
|
2829
|
+
DB_PROXY_NAME = self.triggers.db_proxy_name
|
|
2830
|
+
TARGET_GROUP_NAME = self.triggers.target_group_name
|
|
2831
|
+
DB_CLUSTER_IDENTIFIER = self.triggers.db_cluster_identifier
|
|
2832
|
+
}
|
|
2900
2833
|
}
|
|
2901
2834
|
|
|
2902
2835
|
depends_on = [
|
|
@@ -2975,7 +2908,7 @@ resource "aws_iam_role_policy_attachment" "backup" {
|
|
|
2975
2908
|
resource "aws_backup_vault" "database" {
|
|
2976
2909
|
count = var.enable_backup ? 1 : 0
|
|
2977
2910
|
|
|
2978
|
-
name = "\${
|
|
2911
|
+
name = "\${local.cluster_name}-backup"
|
|
2979
2912
|
kms_key_arn = aws_kms_key.database.arn
|
|
2980
2913
|
tags = var.tags
|
|
2981
2914
|
}
|
|
@@ -2983,7 +2916,7 @@ resource "aws_backup_vault" "database" {
|
|
|
2983
2916
|
resource "aws_backup_plan" "database" {
|
|
2984
2917
|
count = var.enable_backup ? 1 : 0
|
|
2985
2918
|
|
|
2986
|
-
name = "\${
|
|
2919
|
+
name = "\${local.cluster_name}-backup"
|
|
2987
2920
|
|
|
2988
2921
|
rule {
|
|
2989
2922
|
rule_name = "daily-backup"
|
|
@@ -3023,6 +2956,11 @@ output "proxy_resource_id" {
|
|
|
3023
2956
|
value = var.enable_rds_proxy ? split(":", aws_db_proxy.aurora[0].arn)[6] : null
|
|
3024
2957
|
}
|
|
3025
2958
|
|
|
2959
|
+
output "connect_resource_id" {
|
|
2960
|
+
description = "Resource ID to use in IAM rds-db:connect policies for the application database user. Resolves to the RDS Proxy resource ID when the proxy is enabled (the default), or the Aurora cluster resource ID when it is disabled — connecting through the proxy and connecting directly to the cluster are different IAM permission boundaries."
|
|
2961
|
+
value = var.enable_rds_proxy ? split(":", aws_db_proxy.aurora[0].arn)[6] : aws_rds_cluster.database.cluster_resource_id
|
|
2962
|
+
}
|
|
2963
|
+
|
|
3026
2964
|
output "cluster_endpoint" {
|
|
3027
2965
|
description = "Writer endpoint of the Aurora cluster or proxy."
|
|
3028
2966
|
value = var.enable_rds_proxy ? aws_db_proxy.aurora[0].endpoint : aws_rds_cluster.database.endpoint
|
|
@@ -3097,19 +3035,19 @@ exports[`ts#rdb generator > should generate terraform modules with MySQL engine
|
|
|
3097
3035
|
required_providers {
|
|
3098
3036
|
archive = {
|
|
3099
3037
|
source = "hashicorp/archive"
|
|
3100
|
-
version = "
|
|
3038
|
+
version = "2.8.0"
|
|
3101
3039
|
}
|
|
3102
3040
|
aws = {
|
|
3103
3041
|
source = "hashicorp/aws"
|
|
3104
|
-
version = "
|
|
3042
|
+
version = "6.57.1"
|
|
3105
3043
|
}
|
|
3106
3044
|
null = {
|
|
3107
3045
|
source = "hashicorp/null"
|
|
3108
|
-
version = "
|
|
3046
|
+
version = "3.3.0"
|
|
3109
3047
|
}
|
|
3110
3048
|
random = {
|
|
3111
3049
|
source = "hashicorp/random"
|
|
3112
|
-
version = "
|
|
3050
|
+
version = "3.9.0"
|
|
3113
3051
|
}
|
|
3114
3052
|
}
|
|
3115
3053
|
}
|
|
@@ -3213,12 +3151,13 @@ variable "tags" {
|
|
|
3213
3151
|
default = {}
|
|
3214
3152
|
}
|
|
3215
3153
|
|
|
3216
|
-
variable "
|
|
3154
|
+
variable "migration_docker_image_tag" {
|
|
3217
3155
|
description = "Docker image tag for the migration handler. Defaults to the tag built by the Nx docker target."
|
|
3218
3156
|
type = string
|
|
3219
3157
|
default = "proj-db-migration:latest"
|
|
3220
3158
|
}
|
|
3221
3159
|
|
|
3160
|
+
|
|
3222
3161
|
variable "asset_bucket_name" {
|
|
3223
3162
|
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."
|
|
3224
3163
|
type = string
|
|
@@ -3234,10 +3173,12 @@ resource "random_string" "suffix" {
|
|
|
3234
3173
|
}
|
|
3235
3174
|
|
|
3236
3175
|
locals {
|
|
3237
|
-
|
|
3238
|
-
|
|
3176
|
+
config = jsondecode(file("\${path.module}/../../../../../../../packages/db/config.json"))
|
|
3177
|
+
runtime_config_key = local.config.runtimeConfigKey
|
|
3178
|
+
create_db_user_bundle_path = "\${path.module}/../../../../../../../dist/packages/db/bundle/create-db-user"
|
|
3179
|
+
migration_function_name = "db-migration-\${random_string.suffix.result}"
|
|
3239
3180
|
create_db_user_function_name = "db-create-db-user-\${random_string.suffix.result}"
|
|
3240
|
-
database_runtime_user
|
|
3181
|
+
database_runtime_user = "db_\${random_string.suffix.result}"
|
|
3241
3182
|
}
|
|
3242
3183
|
|
|
3243
3184
|
module "aurora" {
|
|
@@ -3276,10 +3217,17 @@ resource "aws_iam_role_policy" "proxy_db_user_connect" {
|
|
|
3276
3217
|
Statement = [
|
|
3277
3218
|
{
|
|
3278
3219
|
Effect = "Allow"
|
|
3279
|
-
Action = [
|
|
3280
|
-
|
|
3281
|
-
|
|
3220
|
+
Action = [
|
|
3221
|
+
"secretsmanager:GetSecretValue"
|
|
3222
|
+
]
|
|
3223
|
+
Resource = [module.aurora.secret_arn]
|
|
3224
|
+
},
|
|
3225
|
+
{
|
|
3226
|
+
Effect = "Allow"
|
|
3227
|
+
Action = [
|
|
3228
|
+
"kms:Decrypt"
|
|
3282
3229
|
]
|
|
3230
|
+
Resource = [module.aurora.kms_key_arn]
|
|
3283
3231
|
}
|
|
3284
3232
|
]
|
|
3285
3233
|
})
|
|
@@ -3303,7 +3251,7 @@ module "add_rdb_to_runtime_config" {
|
|
|
3303
3251
|
source = "../../../core/runtime-config/entry"
|
|
3304
3252
|
|
|
3305
3253
|
namespace = "database"
|
|
3306
|
-
key =
|
|
3254
|
+
key = local.runtime_config_key
|
|
3307
3255
|
value = {
|
|
3308
3256
|
hostname = module.aurora.cluster_endpoint
|
|
3309
3257
|
port = module.aurora.cluster_port
|
|
@@ -3316,9 +3264,8 @@ module "add_rdb_to_runtime_config" {
|
|
|
3316
3264
|
|
|
3317
3265
|
resource "aws_ecr_repository" "migration_handler" {
|
|
3318
3266
|
#checkov:skip=CKV_AWS_136:AES256 encryption is sufficient for ECR repositories
|
|
3319
|
-
#checkov:skip=CKV_AWS_51:Mutable tags are intentional; the migration handler is always pushed as latest and redeployment is gated on docker_digest changes in null_resource.docker_publish
|
|
3320
3267
|
name = "db-migration-\${random_string.suffix.result}"
|
|
3321
|
-
image_tag_mutability = "
|
|
3268
|
+
image_tag_mutability = "IMMUTABLE"
|
|
3322
3269
|
force_delete = true
|
|
3323
3270
|
|
|
3324
3271
|
image_scanning_configuration {
|
|
@@ -3366,22 +3313,34 @@ resource "aws_ecr_repository_policy" "migration_handler" {
|
|
|
3366
3313
|
}
|
|
3367
3314
|
|
|
3368
3315
|
data "external" "docker_digest" {
|
|
3369
|
-
program = ["sh", "-c", "echo '{\\"digest\\":\\"'$(docker inspect \${var.
|
|
3316
|
+
program = ["sh", "-c", "echo '{\\"digest\\":\\"'$(docker inspect \${var.migration_docker_image_tag} --format '{{.Id}}')'\\"}' "]
|
|
3317
|
+
}
|
|
3318
|
+
|
|
3319
|
+
locals {
|
|
3320
|
+
# Content-based, immutable image tag derived from the local image digest
|
|
3321
|
+
image_tag = replace(data.external.docker_digest.result.digest, "sha256:", "")
|
|
3370
3322
|
}
|
|
3371
3323
|
|
|
3372
3324
|
resource "null_resource" "docker_publish" {
|
|
3373
3325
|
triggers = {
|
|
3374
3326
|
docker_digest = data.external.docker_digest.result.digest
|
|
3375
3327
|
repository_url = aws_ecr_repository.migration_handler.repository_url
|
|
3376
|
-
|
|
3328
|
+
migration_docker_image_tag = var.migration_docker_image_tag
|
|
3329
|
+
image_tag = local.image_tag
|
|
3377
3330
|
}
|
|
3378
3331
|
|
|
3379
3332
|
provisioner "local-exec" {
|
|
3380
3333
|
command = <<-EOT
|
|
3381
|
-
aws ecr get-login-password --region
|
|
3382
|
-
docker tag
|
|
3383
|
-
docker push
|
|
3334
|
+
aws ecr get-login-password --region "$AWS_REGION" | docker login --username AWS --password-stdin "$REPOSITORY_URL"
|
|
3335
|
+
docker tag "$MIGRATION_DOCKER_IMAGE_TAG" "$REPOSITORY_URL:$IMAGE_TAG"
|
|
3336
|
+
docker push "$REPOSITORY_URL:$IMAGE_TAG"
|
|
3384
3337
|
EOT
|
|
3338
|
+
environment = {
|
|
3339
|
+
AWS_REGION = data.aws_region.current.region
|
|
3340
|
+
REPOSITORY_URL = self.triggers.repository_url
|
|
3341
|
+
MIGRATION_DOCKER_IMAGE_TAG = self.triggers.migration_docker_image_tag
|
|
3342
|
+
IMAGE_TAG = self.triggers.image_tag
|
|
3343
|
+
}
|
|
3385
3344
|
}
|
|
3386
3345
|
|
|
3387
3346
|
depends_on = [aws_ecr_repository_policy.migration_handler]
|
|
@@ -3644,10 +3603,10 @@ resource "null_resource" "create_db_user_trigger" {
|
|
|
3644
3603
|
command = <<-EOT
|
|
3645
3604
|
output_file=$(mktemp)
|
|
3646
3605
|
response=$(aws lambda invoke \\
|
|
3647
|
-
--region
|
|
3648
|
-
--function-name
|
|
3606
|
+
--region "$AWS_REGION" \\
|
|
3607
|
+
--function-name "$FUNCTION_NAME" \\
|
|
3649
3608
|
--cli-binary-format raw-in-base64-out \\
|
|
3650
|
-
--payload
|
|
3609
|
+
--payload "{\\"RequestType\\":\\"Create\\",\\"PhysicalResourceId\\":\\"db-user:$DB_USER\\"}" \\
|
|
3651
3610
|
"$output_file")
|
|
3652
3611
|
cat "$output_file"
|
|
3653
3612
|
echo "$response"
|
|
@@ -3657,6 +3616,11 @@ resource "null_resource" "create_db_user_trigger" {
|
|
|
3657
3616
|
fi
|
|
3658
3617
|
rm -f "$output_file"
|
|
3659
3618
|
EOT
|
|
3619
|
+
environment = {
|
|
3620
|
+
AWS_REGION = data.aws_region.current.region
|
|
3621
|
+
FUNCTION_NAME = self.triggers.function_name
|
|
3622
|
+
DB_USER = self.triggers.db_user
|
|
3623
|
+
}
|
|
3660
3624
|
}
|
|
3661
3625
|
|
|
3662
3626
|
depends_on = [aws_lambda_function.create_db_user, module.aurora]
|
|
@@ -3670,7 +3634,7 @@ resource "aws_lambda_function" "migration_handler" {
|
|
|
3670
3634
|
package_type = "Image"
|
|
3671
3635
|
function_name = local.migration_function_name
|
|
3672
3636
|
role = aws_iam_role.migration_handler.arn
|
|
3673
|
-
image_uri = "\${aws_ecr_repository.migration_handler.repository_url}
|
|
3637
|
+
image_uri = "\${aws_ecr_repository.migration_handler.repository_url}:\${local.image_tag}"
|
|
3674
3638
|
memory_size = 1024
|
|
3675
3639
|
timeout = 300
|
|
3676
3640
|
architectures = ["arm64"]
|
|
@@ -3715,8 +3679,8 @@ resource "null_resource" "migration_trigger" {
|
|
|
3715
3679
|
command = <<-EOT
|
|
3716
3680
|
output_file=$(mktemp)
|
|
3717
3681
|
response=$(aws lambda invoke \\
|
|
3718
|
-
--region
|
|
3719
|
-
--function-name
|
|
3682
|
+
--region "$AWS_REGION" \\
|
|
3683
|
+
--function-name "$FUNCTION_NAME" \\
|
|
3720
3684
|
--cli-binary-format raw-in-base64-out \\
|
|
3721
3685
|
"$output_file")
|
|
3722
3686
|
cat "$output_file"
|
|
@@ -3727,6 +3691,10 @@ resource "null_resource" "migration_trigger" {
|
|
|
3727
3691
|
fi
|
|
3728
3692
|
rm -f "$output_file"
|
|
3729
3693
|
EOT
|
|
3694
|
+
environment = {
|
|
3695
|
+
AWS_REGION = data.aws_region.current.region
|
|
3696
|
+
FUNCTION_NAME = self.triggers.function_name
|
|
3697
|
+
}
|
|
3730
3698
|
}
|
|
3731
3699
|
|
|
3732
3700
|
depends_on = [
|
|
@@ -3757,6 +3725,11 @@ output "proxy_resource_id" {
|
|
|
3757
3725
|
value = module.aurora.proxy_resource_id
|
|
3758
3726
|
}
|
|
3759
3727
|
|
|
3728
|
+
output "connect_resource_id" {
|
|
3729
|
+
description = "Resource ID to use in IAM rds-db:connect policies for the application database user. Resolves to the RDS Proxy resource ID when the proxy is enabled (the default), or the Aurora cluster resource ID when it is disabled — connecting through the proxy and connecting directly to the cluster are different IAM permission boundaries."
|
|
3730
|
+
value = module.aurora.connect_resource_id
|
|
3731
|
+
}
|
|
3732
|
+
|
|
3760
3733
|
output "kms_key_arn" {
|
|
3761
3734
|
description = "ARN of the KMS key protecting Aurora and the admin credentials secret, used to grant decrypt access alongside secret_arn."
|
|
3762
3735
|
value = module.aurora.kms_key_arn
|
|
@@ -3791,7 +3764,6 @@ output "database_runtime_user" {
|
|
|
3791
3764
|
description = "Application database user created for IAM-authenticated access."
|
|
3792
3765
|
value = local.database_runtime_user
|
|
3793
3766
|
}
|
|
3794
|
-
|
|
3795
3767
|
"
|
|
3796
3768
|
`;
|
|
3797
3769
|
|
|
@@ -3817,139 +3789,6 @@ datasource db {
|
|
|
3817
3789
|
"
|
|
3818
3790
|
`;
|
|
3819
3791
|
|
|
3820
|
-
exports[`ts#rdb generator > should generate the aurora shared construct > packages/db/scripts/pull-image.ts 1`] = `
|
|
3821
|
-
"import { spawnSync } from 'child_process';
|
|
3822
|
-
|
|
3823
|
-
const ENGINE = 'docker';
|
|
3824
|
-
const image = process.argv[2];
|
|
3825
|
-
|
|
3826
|
-
const inspect = spawnSync(ENGINE, ['image', 'inspect', image], {
|
|
3827
|
-
stdio: 'ignore',
|
|
3828
|
-
});
|
|
3829
|
-
|
|
3830
|
-
if (inspect.status !== 0) {
|
|
3831
|
-
const pull = spawnSync(ENGINE, ['pull', image], { stdio: 'inherit' });
|
|
3832
|
-
if (pull.status !== 0) {
|
|
3833
|
-
process.exit(pull.status ?? 1);
|
|
3834
|
-
}
|
|
3835
|
-
}
|
|
3836
|
-
"
|
|
3837
|
-
`;
|
|
3838
|
-
|
|
3839
|
-
exports[`ts#rdb generator > should generate the aurora shared construct > packages/db/scripts/start-container.ts 1`] = `
|
|
3840
|
-
"import { spawn, spawnSync } from 'child_process';
|
|
3841
|
-
|
|
3842
|
-
const ENGINE = 'docker';
|
|
3843
|
-
|
|
3844
|
-
const [containerName, image, hostPort, dbName, dbUser, dbPassword] =
|
|
3845
|
-
process.argv.slice(2);
|
|
3846
|
-
|
|
3847
|
-
const containerExists = (): boolean =>
|
|
3848
|
-
spawnSync(ENGINE, ['container', 'inspect', containerName], {
|
|
3849
|
-
stdio: 'ignore',
|
|
3850
|
-
}).status === 0;
|
|
3851
|
-
|
|
3852
|
-
const isRunning = (): boolean => {
|
|
3853
|
-
const result = spawnSync(
|
|
3854
|
-
ENGINE,
|
|
3855
|
-
['container', 'inspect', '-f', '{{.State.Running}}', containerName],
|
|
3856
|
-
{ encoding: 'utf-8' },
|
|
3857
|
-
);
|
|
3858
|
-
return result.status === 0 && result.stdout.trim() === 'true';
|
|
3859
|
-
};
|
|
3860
|
-
|
|
3861
|
-
if (containerExists()) {
|
|
3862
|
-
if (!isRunning()) {
|
|
3863
|
-
const start = spawnSync(ENGINE, ['start', containerName], {
|
|
3864
|
-
stdio: 'inherit',
|
|
3865
|
-
});
|
|
3866
|
-
if (start.status !== 0) process.exit(start.status ?? 1);
|
|
3867
|
-
}
|
|
3868
|
-
} else {
|
|
3869
|
-
const runArgs = (
|
|
3870
|
-
\`run --rm --name \${containerName}\` +
|
|
3871
|
-
\` -e POSTGRES_DB=\${dbName}\` +
|
|
3872
|
-
\` -e POSTGRES_USER=\${dbUser}\` +
|
|
3873
|
-
\` -e POSTGRES_PASSWORD=\${dbPassword}\` +
|
|
3874
|
-
\` -e PGDATA=/var/lib/postgresql/17/docker\` +
|
|
3875
|
-
\` -p \${hostPort}:5432\` +
|
|
3876
|
-
\` -v \${containerName}-data:/var/lib/postgresql\` +
|
|
3877
|
-
\` -d \${image}\`
|
|
3878
|
-
).split(' ');
|
|
3879
|
-
const create = spawnSync(ENGINE, runArgs, { stdio: 'inherit' });
|
|
3880
|
-
if (create.status !== 0) process.exit(create.status ?? 1);
|
|
3881
|
-
}
|
|
3882
|
-
|
|
3883
|
-
const logs = spawn(ENGINE, ['logs', '-f', containerName], {
|
|
3884
|
-
stdio: ['ignore', 'inherit', 'inherit'],
|
|
3885
|
-
});
|
|
3886
|
-
|
|
3887
|
-
let exiting = false;
|
|
3888
|
-
|
|
3889
|
-
const cleanup = () => {
|
|
3890
|
-
if (exiting) return;
|
|
3891
|
-
exiting = true;
|
|
3892
|
-
spawnSync(ENGINE, ['stop', containerName], { stdio: 'ignore' });
|
|
3893
|
-
logs.kill();
|
|
3894
|
-
process.exit(0);
|
|
3895
|
-
};
|
|
3896
|
-
|
|
3897
|
-
process.on('SIGTERM', cleanup);
|
|
3898
|
-
process.on('SIGINT', cleanup);
|
|
3899
|
-
process.on('SIGHUP', cleanup);
|
|
3900
|
-
|
|
3901
|
-
logs.on('exit', (code) => {
|
|
3902
|
-
if (!exiting) process.exit(code ?? 0);
|
|
3903
|
-
});
|
|
3904
|
-
"
|
|
3905
|
-
`;
|
|
3906
|
-
|
|
3907
|
-
exports[`ts#rdb generator > should generate the aurora shared construct > packages/db/scripts/wait-for-db.ts 1`] = `
|
|
3908
|
-
"import { Client } from 'pg';
|
|
3909
|
-
|
|
3910
|
-
const noop = () => undefined;
|
|
3911
|
-
|
|
3912
|
-
const [portArg, dbArg, userArg, passwordArg] = process.argv.slice(2);
|
|
3913
|
-
const timeoutAt = Date.now() + 60000;
|
|
3914
|
-
|
|
3915
|
-
while (Date.now() < timeoutAt) {
|
|
3916
|
-
const client = new Client({
|
|
3917
|
-
host: 'localhost',
|
|
3918
|
-
port: parseInt(portArg),
|
|
3919
|
-
user: userArg,
|
|
3920
|
-
password: passwordArg,
|
|
3921
|
-
database: dbArg,
|
|
3922
|
-
connectionTimeoutMillis: 500,
|
|
3923
|
-
});
|
|
3924
|
-
client.on('error', noop);
|
|
3925
|
-
try {
|
|
3926
|
-
await client.connect();
|
|
3927
|
-
await client.end();
|
|
3928
|
-
console.log('Database is ready.');
|
|
3929
|
-
process.exit(0);
|
|
3930
|
-
} catch {
|
|
3931
|
-
console.log('Database is not ready.');
|
|
3932
|
-
await client.end().catch(noop);
|
|
3933
|
-
}
|
|
3934
|
-
await new Promise((r) => setTimeout(r, 200));
|
|
3935
|
-
}
|
|
3936
|
-
|
|
3937
|
-
throw new Error(\`Timed out waiting for postgres on port \${portArg}\`);
|
|
3938
|
-
"
|
|
3939
|
-
`;
|
|
3940
|
-
|
|
3941
|
-
exports[`ts#rdb generator > should generate the aurora shared construct > packages/db/src/constants.ts 1`] = `
|
|
3942
|
-
"export const DB_PACKAGE_NAME = 'Db';
|
|
3943
|
-
|
|
3944
|
-
// Local development connection details (used when SERVE_LOCAL=true, see serve-local Nx target)
|
|
3945
|
-
export const LOCAL_DB_PORT = 5432;
|
|
3946
|
-
export const LOCAL_DB_HOST = 'localhost';
|
|
3947
|
-
export const LOCAL_DB_NAME = 'database_name';
|
|
3948
|
-
export const LOCAL_DB_USER = 'dbadmin';
|
|
3949
|
-
export const LOCAL_DB_PASSWORD = 'password';
|
|
3950
|
-
"
|
|
3951
|
-
`;
|
|
3952
|
-
|
|
3953
3792
|
exports[`ts#rdb generator > should generate the aurora shared construct > packages/db/src/create-db-user-handler.ts 1`] = `
|
|
3954
3793
|
"import type { CloudFormationCustomResourceEvent } from 'aws-lambda';
|
|
3955
3794
|
import { randomBytes } from 'node:crypto';
|
|
@@ -3999,14 +3838,12 @@ const ensureDatabaseUser = async (dbUser: string): Promise<void> => {
|
|
|
3999
3838
|
|
|
4000
3839
|
await client.query(
|
|
4001
3840
|
\`ALTER ROLE \${quotedDbUser} WITH LOGIN;
|
|
4002
|
-
GRANT
|
|
4003
|
-
GRANT USAGE
|
|
4004
|
-
GRANT
|
|
4005
|
-
GRANT
|
|
4006
|
-
|
|
4007
|
-
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT
|
|
4008
|
-
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL PRIVILEGES ON SEQUENCES TO \${quotedDbUser};
|
|
4009
|
-
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL PRIVILEGES ON FUNCTIONS TO \${quotedDbUser};
|
|
3841
|
+
GRANT CONNECT ON DATABASE \${quotedDbName} TO \${quotedDbUser};
|
|
3842
|
+
GRANT USAGE ON SCHEMA public TO \${quotedDbUser};
|
|
3843
|
+
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO \${quotedDbUser};
|
|
3844
|
+
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO \${quotedDbUser};
|
|
3845
|
+
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO \${quotedDbUser};
|
|
3846
|
+
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT USAGE, SELECT ON SEQUENCES TO \${quotedDbUser};
|
|
4010
3847
|
GRANT rds_iam TO \${quotedDbUser};\`,
|
|
4011
3848
|
);
|
|
4012
3849
|
|
|
@@ -4041,43 +3878,32 @@ export const handler = async (
|
|
|
4041
3878
|
`;
|
|
4042
3879
|
|
|
4043
3880
|
exports[`ts#rdb generator > should generate the aurora shared construct > packages/db/src/index.ts 1`] = `
|
|
4044
|
-
"export {
|
|
4045
|
-
export { getPrisma } from './prisma.js';
|
|
3881
|
+
"export { getPrisma } from './prisma.js';
|
|
4046
3882
|
"
|
|
4047
3883
|
`;
|
|
4048
3884
|
|
|
4049
3885
|
exports[`ts#rdb generator > should generate the aurora shared construct > packages/db/src/migration-handler.ts 1`] = `
|
|
4050
3886
|
"import { execFile } from 'node:child_process';
|
|
3887
|
+
import { join } from 'node:path';
|
|
4051
3888
|
import { promisify } from 'node:util';
|
|
4052
|
-
import {
|
|
4053
|
-
import { withConnectionRetry } from './utils.js';
|
|
3889
|
+
import { getDatabaseSecret, withConnectionRetry } from './utils.js';
|
|
4054
3890
|
|
|
4055
3891
|
const buildDatabaseUrl = async (): Promise<string> => {
|
|
4056
|
-
const
|
|
4057
|
-
const port = process.env.PORT!;
|
|
4058
|
-
const database = process.env.DATABASE!;
|
|
4059
|
-
const dbUser = process.env.DBUSER!;
|
|
4060
|
-
const region = process.env.AWS_REGION!;
|
|
4061
|
-
|
|
4062
|
-
const iamAuthToken = await new Signer({
|
|
4063
|
-
hostname,
|
|
4064
|
-
port: Number(port),
|
|
4065
|
-
region,
|
|
4066
|
-
username: dbUser,
|
|
4067
|
-
}).getAuthToken();
|
|
3892
|
+
const { host, port, dbname, username, password } = await getDatabaseSecret();
|
|
4068
3893
|
|
|
4069
3894
|
return (
|
|
4070
|
-
\`postgresql://\${encodeURIComponent(
|
|
4071
|
-
\`:\${encodeURIComponent(
|
|
4072
|
-
\`@\${
|
|
4073
|
-
\`?sslaccept=strict\`
|
|
3895
|
+
\`postgresql://\${encodeURIComponent(username)}\` +
|
|
3896
|
+
\`:\${encodeURIComponent(password)}\` +
|
|
3897
|
+
\`@\${host}:\${port}/\${dbname}\` +
|
|
3898
|
+
\`?sslaccept=strict\`
|
|
4074
3899
|
);
|
|
4075
3900
|
};
|
|
4076
3901
|
|
|
4077
3902
|
export const handler = async () => {
|
|
4078
3903
|
await withConnectionRetry(async () => {
|
|
4079
3904
|
const databaseUrl = await buildDatabaseUrl();
|
|
4080
|
-
|
|
3905
|
+
const prisma = join(__dirname, 'node_modules', '.bin', 'prisma');
|
|
3906
|
+
await promisify(execFile)(prisma, ['migrate', 'deploy'], {
|
|
4081
3907
|
cwd: __dirname,
|
|
4082
3908
|
env: {
|
|
4083
3909
|
...process.env,
|
|
@@ -4094,16 +3920,19 @@ exports[`ts#rdb generator > should generate the aurora shared construct > packag
|
|
|
4094
3920
|
import { Signer } from '@aws-sdk/rds-signer';
|
|
4095
3921
|
import { Prisma, PrismaClient } from '../generated/prisma/client.js';
|
|
4096
3922
|
import { Pool } from 'pg';
|
|
4097
|
-
import {
|
|
4098
|
-
|
|
4099
|
-
|
|
4100
|
-
LOCAL_DB_NAME,
|
|
4101
|
-
LOCAL_DB_PASSWORD,
|
|
4102
|
-
LOCAL_DB_PORT,
|
|
4103
|
-
LOCAL_DB_USER,
|
|
4104
|
-
} from './constants.js';
|
|
3923
|
+
import { readFileSync } from 'fs';
|
|
3924
|
+
import { join, dirname } from 'path';
|
|
3925
|
+
import { fileURLToPath } from 'url';
|
|
4105
3926
|
import { getDatabaseConfig } from './utils.js';
|
|
4106
3927
|
|
|
3928
|
+
// Generated: must match runtimeConfigKey in config.json
|
|
3929
|
+
const runtimeConfigKey = 'Db';
|
|
3930
|
+
|
|
3931
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
3932
|
+
// config.json is only present in local dev (not included in the deployed bundle); guard with LOCAL_DEV check
|
|
3933
|
+
const localDev = () =>
|
|
3934
|
+
JSON.parse(readFileSync(join(__dirname, '../config.json'), 'utf-8')).localDev;
|
|
3935
|
+
|
|
4107
3936
|
let prismaClient: PrismaClient<Prisma.LogLevel> | undefined;
|
|
4108
3937
|
|
|
4109
3938
|
export const getPrisma = async <LogOpts extends Prisma.LogLevel>(
|
|
@@ -4111,14 +3940,15 @@ export const getPrisma = async <LogOpts extends Prisma.LogLevel>(
|
|
|
4111
3940
|
): Promise<PrismaClient<LogOpts>> => {
|
|
4112
3941
|
if (prismaClient) return prismaClient;
|
|
4113
3942
|
|
|
4114
|
-
if (process.env.
|
|
3943
|
+
if (process.env.LOCAL_DEV === 'true') {
|
|
3944
|
+
const { host, port, dbName, dbUser, dbPassword } = localDev();
|
|
4115
3945
|
const adapter = new PrismaPg(
|
|
4116
3946
|
new Pool({
|
|
4117
|
-
host
|
|
4118
|
-
port
|
|
4119
|
-
database:
|
|
4120
|
-
user:
|
|
4121
|
-
password:
|
|
3947
|
+
host,
|
|
3948
|
+
port,
|
|
3949
|
+
database: dbName,
|
|
3950
|
+
user: dbUser,
|
|
3951
|
+
password: dbPassword,
|
|
4122
3952
|
allowExitOnIdle: true,
|
|
4123
3953
|
}),
|
|
4124
3954
|
);
|
|
@@ -4130,7 +3960,7 @@ export const getPrisma = async <LogOpts extends Prisma.LogLevel>(
|
|
|
4130
3960
|
}
|
|
4131
3961
|
|
|
4132
3962
|
const { hostname, port, database, dbUser, region } =
|
|
4133
|
-
await getDatabaseConfig(
|
|
3963
|
+
await getDatabaseConfig(runtimeConfigKey);
|
|
4134
3964
|
const adapter = new PrismaPg(
|
|
4135
3965
|
new Pool({
|
|
4136
3966
|
host: hostname,
|
|
@@ -4260,6 +4090,9 @@ const transientErrorPatterns = [
|
|
|
4260
4090
|
'ECONNREFUSED',
|
|
4261
4091
|
'ENOTFOUND',
|
|
4262
4092
|
'P1000', // Prisma: authentication failed
|
|
4093
|
+
'P1001', // Prisma: can't reach database server
|
|
4094
|
+
'P1002', // Prisma: database server reached but timed out
|
|
4095
|
+
'P1010', // Prisma: user denied access (IAM auth grant not yet propagated)
|
|
4263
4096
|
'ER_ACCESS_DENIED_ERROR', // MySQL: access denied
|
|
4264
4097
|
];
|
|
4265
4098
|
|
|
@@ -4320,14 +4153,10 @@ import { CustomResource } from 'aws-cdk-lib';
|
|
|
4320
4153
|
import { IConnectable, IVpc, Port, SubnetType } from 'aws-cdk-lib/aws-ec2';
|
|
4321
4154
|
import { IGrantable, Role, ServicePrincipal } from 'aws-cdk-lib/aws-iam';
|
|
4322
4155
|
import { Key } from 'aws-cdk-lib/aws-kms';
|
|
4323
|
-
import { Platform } from 'aws-cdk-lib/aws-ecr-assets';
|
|
4324
4156
|
import {
|
|
4325
4157
|
Architecture,
|
|
4326
|
-
Code,
|
|
4327
|
-
DockerImageCode,
|
|
4328
|
-
DockerImageFunction,
|
|
4329
4158
|
Function,
|
|
4330
|
-
|
|
4159
|
+
FunctionOptions,
|
|
4331
4160
|
Tracing,
|
|
4332
4161
|
} from 'aws-cdk-lib/aws-lambda';
|
|
4333
4162
|
import {
|
|
@@ -4443,16 +4272,6 @@ export interface AuroraDatabaseProps extends _AuroraDatabaseProps {
|
|
|
4443
4272
|
*/
|
|
4444
4273
|
readonly runtimeConfigKey: string;
|
|
4445
4274
|
|
|
4446
|
-
/**
|
|
4447
|
-
* Migration bundle used to create a migration handler Lambda.
|
|
4448
|
-
*/
|
|
4449
|
-
readonly migrationBundleDir: string;
|
|
4450
|
-
|
|
4451
|
-
/**
|
|
4452
|
-
* Bundle used to create or reconcile the application database user.
|
|
4453
|
-
*/
|
|
4454
|
-
readonly createDbUserBundleDir: string;
|
|
4455
|
-
|
|
4456
4275
|
/**
|
|
4457
4276
|
* Writer instance for the Aurora cluster.
|
|
4458
4277
|
*/
|
|
@@ -4492,6 +4311,25 @@ export interface AuroraDatabaseProps extends _AuroraDatabaseProps {
|
|
|
4492
4311
|
* @default true
|
|
4493
4312
|
*/
|
|
4494
4313
|
readonly enableKeyRotation?: boolean;
|
|
4314
|
+
|
|
4315
|
+
/**
|
|
4316
|
+
* Whether to export Aurora engine logs to CloudWatch Logs.
|
|
4317
|
+
* See https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_LogAccess.html
|
|
4318
|
+
*
|
|
4319
|
+
* PostgreSQL logs DDL statements only (log_statement=ddl); MySQL enables
|
|
4320
|
+
* Advanced Auditing scoped to connections and DDL (server_audit_events=CONNECT,QUERY_DDL).
|
|
4321
|
+
* Neither logs statement parameter values, to avoid leaking PII into log data.
|
|
4322
|
+
*
|
|
4323
|
+
* @default true
|
|
4324
|
+
*/
|
|
4325
|
+
readonly enableCloudwatchLogs?: boolean;
|
|
4326
|
+
|
|
4327
|
+
/**
|
|
4328
|
+
* Whether to enable Performance Insights on the Aurora writer instance.
|
|
4329
|
+
*
|
|
4330
|
+
* @default true
|
|
4331
|
+
*/
|
|
4332
|
+
readonly enablePerformanceInsights?: boolean;
|
|
4495
4333
|
}
|
|
4496
4334
|
|
|
4497
4335
|
/**
|
|
@@ -4512,8 +4350,6 @@ export abstract class AuroraDatabase extends Construct {
|
|
|
4512
4350
|
adminUser,
|
|
4513
4351
|
databaseName,
|
|
4514
4352
|
runtimeConfigKey,
|
|
4515
|
-
migrationBundleDir,
|
|
4516
|
-
createDbUserBundleDir,
|
|
4517
4353
|
vpcSubnets,
|
|
4518
4354
|
writer,
|
|
4519
4355
|
enableRdsProxy = true,
|
|
@@ -4521,6 +4357,8 @@ export abstract class AuroraDatabase extends Construct {
|
|
|
4521
4357
|
deletionProtection = true,
|
|
4522
4358
|
removalPolicy = RemovalPolicy.RETAIN,
|
|
4523
4359
|
enableKeyRotation = true,
|
|
4360
|
+
enableCloudwatchLogs = true,
|
|
4361
|
+
enablePerformanceInsights = true,
|
|
4524
4362
|
engine,
|
|
4525
4363
|
engineVersion,
|
|
4526
4364
|
...clusterProps
|
|
@@ -4536,12 +4374,35 @@ export abstract class AuroraDatabase extends Construct {
|
|
|
4536
4374
|
vpc,
|
|
4537
4375
|
vpcSubnets,
|
|
4538
4376
|
engine: engine.clusterEngine(engineVersion ?? engine.defaultVersion),
|
|
4539
|
-
writer:
|
|
4377
|
+
writer:
|
|
4378
|
+
writer ??
|
|
4379
|
+
ClusterInstance.serverlessV2('writer', {
|
|
4380
|
+
enablePerformanceInsights,
|
|
4381
|
+
performanceInsightEncryptionKey: enablePerformanceInsights
|
|
4382
|
+
? key
|
|
4383
|
+
: undefined,
|
|
4384
|
+
}),
|
|
4540
4385
|
credentials: Credentials.fromGeneratedSecret(adminUser, {
|
|
4541
4386
|
encryptionKey: key,
|
|
4542
4387
|
}),
|
|
4543
4388
|
iamAuthentication: true,
|
|
4544
4389
|
monitoringInterval: Duration.seconds(5),
|
|
4390
|
+
cloudwatchLogsExports: enableCloudwatchLogs
|
|
4391
|
+
? engine.type === 'mysql'
|
|
4392
|
+
? ['audit', 'error']
|
|
4393
|
+
: ['postgresql']
|
|
4394
|
+
: undefined,
|
|
4395
|
+
parameters: enableCloudwatchLogs
|
|
4396
|
+
? engine.type === 'mysql'
|
|
4397
|
+
? {
|
|
4398
|
+
server_audit_logging: '1',
|
|
4399
|
+
server_audit_events: 'CONNECT,QUERY_DDL',
|
|
4400
|
+
}
|
|
4401
|
+
: // Only safe statement-at-a-time; a multi-statement batch mixing
|
|
4402
|
+
// DDL with DML (e.g. one \`psql -c "a;b;c"\` call) logs the whole
|
|
4403
|
+
// raw text verbatim, including any literal DML values.
|
|
4404
|
+
{ log_statement: 'ddl' }
|
|
4405
|
+
: undefined,
|
|
4545
4406
|
defaultDatabaseName: databaseName,
|
|
4546
4407
|
storageEncrypted: true,
|
|
4547
4408
|
storageEncryptionKey: key,
|
|
@@ -4577,23 +4438,23 @@ export abstract class AuroraDatabase extends Construct {
|
|
|
4577
4438
|
this.proxy?.endpoint ?? this.cluster.clusterEndpoint.hostname;
|
|
4578
4439
|
const databasePort = this.cluster.clusterEndpoint.port;
|
|
4579
4440
|
|
|
4580
|
-
const
|
|
4581
|
-
|
|
4582
|
-
handler: 'index.handler',
|
|
4583
|
-
runtime: Runtime.NODEJS_LATEST,
|
|
4441
|
+
const commonProps: FunctionOptions = {
|
|
4442
|
+
vpc,
|
|
4584
4443
|
timeout: Duration.minutes(5),
|
|
4585
4444
|
tracing: Tracing.ACTIVE,
|
|
4586
|
-
|
|
4445
|
+
architecture: Architecture.ARM_64,
|
|
4446
|
+
};
|
|
4447
|
+
|
|
4448
|
+
const createDbUserHandler = this.createDbUserHandler({
|
|
4449
|
+
...commonProps,
|
|
4587
4450
|
vpcSubnets: {
|
|
4588
4451
|
subnetType: SubnetType.PRIVATE_WITH_EGRESS,
|
|
4589
4452
|
},
|
|
4590
|
-
environment: {
|
|
4591
|
-
DATABASE_SECRET_ARN: this.cluster.secret!.secretArn,
|
|
4592
|
-
NODE_EXTRA_CA_CERTS: '/var/runtime/ca-cert.pem',
|
|
4593
|
-
},
|
|
4594
|
-
architecture: Architecture.ARM_64,
|
|
4595
4453
|
});
|
|
4596
|
-
|
|
4454
|
+
createDbUserHandler.addEnvironment(
|
|
4455
|
+
'DATABASE_SECRET_ARN',
|
|
4456
|
+
this.cluster.secret!.secretArn,
|
|
4457
|
+
);
|
|
4597
4458
|
this.cluster.connections.allowDefaultPortFrom(
|
|
4598
4459
|
createDbUserHandler,
|
|
4599
4460
|
'Allow the create-db-user handler to connect to the database',
|
|
@@ -4630,40 +4491,21 @@ export abstract class AuroraDatabase extends Construct {
|
|
|
4630
4491
|
region: Stack.of(this).region,
|
|
4631
4492
|
});
|
|
4632
4493
|
|
|
4633
|
-
const migrationHandler =
|
|
4634
|
-
|
|
4635
|
-
platform: Platform.LINUX_ARM64,
|
|
4636
|
-
}),
|
|
4494
|
+
const migrationHandler = this.createMigrationHandler({
|
|
4495
|
+
...commonProps,
|
|
4637
4496
|
memorySize: 1024,
|
|
4638
|
-
timeout: Duration.minutes(5),
|
|
4639
|
-
tracing: Tracing.ACTIVE,
|
|
4640
|
-
vpc,
|
|
4641
|
-
environment:
|
|
4642
|
-
engine.type === 'mysql'
|
|
4643
|
-
? {
|
|
4644
|
-
DATABASE_SECRET_ARN: this.cluster.secret!.secretArn,
|
|
4645
|
-
}
|
|
4646
|
-
: {
|
|
4647
|
-
HOSTNAME: databaseHostname,
|
|
4648
|
-
DATABASE: databaseName,
|
|
4649
|
-
PORT: databasePort.toString(),
|
|
4650
|
-
DBUSER: this.dbUser,
|
|
4651
|
-
},
|
|
4652
|
-
architecture: Architecture.ARM_64,
|
|
4653
4497
|
});
|
|
4498
|
+
migrationHandler.addEnvironment(
|
|
4499
|
+
'DATABASE_SECRET_ARN',
|
|
4500
|
+
this.cluster.secret!.secretArn,
|
|
4501
|
+
);
|
|
4502
|
+
this.cluster.connections.allowDefaultPortFrom(migrationHandler);
|
|
4503
|
+
this.grantSecretRead(migrationHandler);
|
|
4654
4504
|
|
|
4655
|
-
|
|
4656
|
-
this.cluster.connections.allowDefaultPortFrom(migrationHandler);
|
|
4657
|
-
this.grantSecretRead(migrationHandler);
|
|
4658
|
-
} else {
|
|
4659
|
-
this.allowDefaultPortFrom(migrationHandler);
|
|
4660
|
-
this.grantConnect(migrationHandler);
|
|
4661
|
-
}
|
|
4662
|
-
|
|
4663
|
-
const trigger = new Trigger(this, 'MigrationTrigger', {
|
|
4505
|
+
const migrationTrigger = new Trigger(this, 'MigrationTrigger', {
|
|
4664
4506
|
handler: migrationHandler,
|
|
4665
4507
|
});
|
|
4666
|
-
|
|
4508
|
+
migrationTrigger.node.addDependency(createDbUserResource);
|
|
4667
4509
|
|
|
4668
4510
|
new CfnOutput(this, 'ClusterEndpoint', {
|
|
4669
4511
|
value: this.cluster.clusterEndpoint.hostname,
|
|
@@ -4676,6 +4518,18 @@ export abstract class AuroraDatabase extends Construct {
|
|
|
4676
4518
|
}
|
|
4677
4519
|
}
|
|
4678
4520
|
|
|
4521
|
+
/**
|
|
4522
|
+
* Creates the Lambda handler used to create or reconcile the application database user.
|
|
4523
|
+
*/
|
|
4524
|
+
protected abstract createDbUserHandler(baseProps: FunctionOptions): Function;
|
|
4525
|
+
|
|
4526
|
+
/**
|
|
4527
|
+
* Creates the Lambda handler used to run database migrations.
|
|
4528
|
+
*/
|
|
4529
|
+
protected abstract createMigrationHandler(
|
|
4530
|
+
baseProps: FunctionOptions,
|
|
4531
|
+
): Function;
|
|
4532
|
+
|
|
4679
4533
|
public allowDefaultPortFrom(other: IConnectable, description?: string): void {
|
|
4680
4534
|
if (this.proxy) {
|
|
4681
4535
|
this.proxy.connections.allowFrom(
|
|
@@ -4704,8 +4558,17 @@ export abstract class AuroraDatabase extends Construct {
|
|
|
4704
4558
|
exports[`ts#rdb generator > should generate the aurora shared construct 2`] = `
|
|
4705
4559
|
"import * as path from 'path';
|
|
4706
4560
|
import * as url from 'url';
|
|
4561
|
+
import { readFileSync } from 'fs';
|
|
4707
4562
|
import { Construct } from 'constructs';
|
|
4708
|
-
import {
|
|
4563
|
+
import { Platform } from 'aws-cdk-lib/aws-ecr-assets';
|
|
4564
|
+
import {
|
|
4565
|
+
Code,
|
|
4566
|
+
DockerImageCode,
|
|
4567
|
+
DockerImageFunction,
|
|
4568
|
+
Function,
|
|
4569
|
+
FunctionOptions,
|
|
4570
|
+
Runtime,
|
|
4571
|
+
} from 'aws-cdk-lib/aws-lambda';
|
|
4709
4572
|
import {
|
|
4710
4573
|
AuroraDatabase,
|
|
4711
4574
|
AuroraDatabaseEngines,
|
|
@@ -4713,14 +4576,29 @@ import {
|
|
|
4713
4576
|
} from '../../core/rdb/aurora.js';
|
|
4714
4577
|
import { findWorkspaceRoot } from '../../core/workspace.js';
|
|
4715
4578
|
|
|
4579
|
+
const { runtimeConfigKey } = JSON.parse(
|
|
4580
|
+
readFileSync(
|
|
4581
|
+
path.join(
|
|
4582
|
+
findWorkspaceRoot(url.fileURLToPath(new URL(import.meta.url))),
|
|
4583
|
+
'packages/db/config.json',
|
|
4584
|
+
),
|
|
4585
|
+
'utf-8',
|
|
4586
|
+
),
|
|
4587
|
+
) as { runtimeConfigKey: string };
|
|
4588
|
+
|
|
4589
|
+
const migrationBundleDir = path.join(
|
|
4590
|
+
findWorkspaceRoot(url.fileURLToPath(new URL(import.meta.url))),
|
|
4591
|
+
'dist/packages/db/bundle/migration',
|
|
4592
|
+
);
|
|
4593
|
+
|
|
4594
|
+
const createDbUserBundleDir = path.join(
|
|
4595
|
+
findWorkspaceRoot(url.fileURLToPath(new URL(import.meta.url))),
|
|
4596
|
+
'dist/packages/db/bundle/create-db-user',
|
|
4597
|
+
);
|
|
4598
|
+
|
|
4716
4599
|
export type DbProps = Omit<
|
|
4717
4600
|
AuroraDatabaseProps,
|
|
4718
|
-
| '
|
|
4719
|
-
| 'adminUser'
|
|
4720
|
-
| 'createDbUserBundleDir'
|
|
4721
|
-
| 'engine'
|
|
4722
|
-
| 'runtimeConfigKey'
|
|
4723
|
-
| 'migrationBundleDir'
|
|
4601
|
+
'databaseName' | 'adminUser' | 'runtimeConfigKey' | 'engine'
|
|
4724
4602
|
>;
|
|
4725
4603
|
|
|
4726
4604
|
/**
|
|
@@ -4732,35 +4610,47 @@ export class Db extends AuroraDatabase {
|
|
|
4732
4610
|
...props,
|
|
4733
4611
|
databaseName: 'database_name',
|
|
4734
4612
|
adminUser: 'databaseUser',
|
|
4735
|
-
runtimeConfigKey
|
|
4736
|
-
migrationBundleDir: path.join(
|
|
4737
|
-
findWorkspaceRoot(url.fileURLToPath(new URL(import.meta.url))),
|
|
4738
|
-
'dist/packages/db/bundle/migration',
|
|
4739
|
-
),
|
|
4740
|
-
createDbUserBundleDir: path.join(
|
|
4741
|
-
findWorkspaceRoot(url.fileURLToPath(new URL(import.meta.url))),
|
|
4742
|
-
'dist/packages/db/bundle/create-db-user',
|
|
4743
|
-
),
|
|
4613
|
+
runtimeConfigKey,
|
|
4744
4614
|
engine: AuroraDatabaseEngines.postgres({}),
|
|
4745
4615
|
});
|
|
4746
4616
|
}
|
|
4617
|
+
|
|
4618
|
+
protected override createDbUserHandler(baseProps: FunctionOptions): Function {
|
|
4619
|
+
return new Function(this, 'CreateDbUserHandler', {
|
|
4620
|
+
...baseProps,
|
|
4621
|
+
code: Code.fromAsset(createDbUserBundleDir),
|
|
4622
|
+
handler: 'index.handler',
|
|
4623
|
+
runtime: Runtime.NODEJS_LATEST,
|
|
4624
|
+
environment: {
|
|
4625
|
+
NODE_EXTRA_CA_CERTS: '/var/runtime/ca-cert.pem',
|
|
4626
|
+
},
|
|
4627
|
+
});
|
|
4628
|
+
}
|
|
4629
|
+
|
|
4630
|
+
protected override createMigrationHandler(
|
|
4631
|
+
baseProps: FunctionOptions,
|
|
4632
|
+
): Function {
|
|
4633
|
+
return new DockerImageFunction(this, 'MigrationHandler', {
|
|
4634
|
+
...baseProps,
|
|
4635
|
+
code: DockerImageCode.fromImageAsset(migrationBundleDir, {
|
|
4636
|
+
platform: Platform.LINUX_ARM64,
|
|
4637
|
+
}),
|
|
4638
|
+
});
|
|
4639
|
+
}
|
|
4747
4640
|
}
|
|
4748
4641
|
"
|
|
4749
4642
|
`;
|
|
4750
4643
|
|
|
4751
4644
|
exports[`ts#rdb generator > should generate the aurora shared construct 3`] = `
|
|
4752
4645
|
"import { defineConfig } from 'prisma/config';
|
|
4646
|
+
import { readFileSync } from 'fs';
|
|
4753
4647
|
|
|
4754
4648
|
const getDatabaseUrl = async () => {
|
|
4755
|
-
if (process.env.
|
|
4756
|
-
const {
|
|
4757
|
-
|
|
4758
|
-
|
|
4759
|
-
|
|
4760
|
-
LOCAL_DB_PORT,
|
|
4761
|
-
LOCAL_DB_USER,
|
|
4762
|
-
} = await import('./src/constants.js');
|
|
4763
|
-
return \`postgresql://\${LOCAL_DB_USER}:\${LOCAL_DB_PASSWORD}@\${LOCAL_DB_HOST}:\${LOCAL_DB_PORT}/\${LOCAL_DB_NAME}\`;
|
|
4649
|
+
if (process.env.LOCAL_DEV === 'true') {
|
|
4650
|
+
const { host, port, dbName, dbUser, dbPassword } = JSON.parse(
|
|
4651
|
+
readFileSync('config.json', 'utf-8'),
|
|
4652
|
+
).localDev;
|
|
4653
|
+
return \`postgresql://\${dbUser}:\${dbPassword}@\${host}:\${port}/\${dbName}\`;
|
|
4764
4654
|
}
|
|
4765
4655
|
return process.env.DATABASE_URL;
|
|
4766
4656
|
};
|
|
@@ -4780,9 +4670,27 @@ export default defineConfig({
|
|
|
4780
4670
|
exports[`ts#rdb generator > should generate the aurora shared construct 4`] = `
|
|
4781
4671
|
"FROM public.ecr.aws/lambda/nodejs:24
|
|
4782
4672
|
|
|
4673
|
+
# Upgrade npm to a version free of known HIGH/CRITICAL vulnerabilities
|
|
4674
|
+
RUN npm install -g npm@12.0.2
|
|
4675
|
+
|
|
4676
|
+
# Patch OS packages beyond the base image's pinned release, and drop the
|
|
4677
|
+
# runtime's convenience copy of the AWS SDK (the handler bundle inlines its
|
|
4678
|
+
# own dependencies), keeping the image free of known HIGH/CRITICAL
|
|
4679
|
+
# vulnerabilities
|
|
4680
|
+
RUN microdnf upgrade -y --releasever latest && microdnf clean all \\
|
|
4681
|
+
&& rm -rf /var/runtime/node_modules/@aws-sdk
|
|
4682
|
+
|
|
4783
4683
|
WORKDIR \${LAMBDA_TASK_ROOT}
|
|
4784
4684
|
|
|
4785
|
-
|
|
4685
|
+
# npm blocks dependency install scripts by default; allow prisma's so its
|
|
4686
|
+
# postinstall downloads the schema-engine binary needed to run migrations.
|
|
4687
|
+
# npm is removed once prisma is installed — the handler runs prisma's own
|
|
4688
|
+
# binary directly, and npm's bundled dependencies would otherwise carry known
|
|
4689
|
+
# HIGH/CRITICAL vulnerabilities into the image.
|
|
4690
|
+
RUN printf 'allow-scripts[]=prisma\\nallow-scripts[]=@prisma/engines\\n' > .npmrc \\
|
|
4691
|
+
&& npm install prisma@7.9.1 \\
|
|
4692
|
+
&& rm .npmrc \\
|
|
4693
|
+
&& npm uninstall -g npm
|
|
4786
4694
|
|
|
4787
4695
|
COPY index.js ./index.js
|
|
4788
4696
|
COPY prisma ./prisma
|
|
@@ -4828,6 +4736,7 @@ exports[`ts#rdb generator > should generate the aurora shared construct 6`] = `
|
|
|
4828
4736
|
"export * from './rdb/aurora.js';
|
|
4829
4737
|
export * from './app.js';
|
|
4830
4738
|
export * from './checkov.js';
|
|
4739
|
+
export * from './cloudfront.js';
|
|
4831
4740
|
export * from './runtime-config.js';
|
|
4832
4741
|
export * from './workspace.js';
|
|
4833
4742
|
"
|