@aws/nx-plugin 1.0.0-rc.2 → 1.0.0-rc.21
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 +3552 -4179
- package/README.md +8 -8
- package/executors.json +9 -0
- package/generators.json +100 -1
- package/package.json +16 -12
- package/sdk/agentcore-gateway.d.ts +6 -0
- package/sdk/agentcore-gateway.js +11 -0
- package/sdk/agentcore-gateway.js.map +1 -0
- package/sdk/license.d.ts +8 -0
- package/sdk/license.js +14 -0
- package/sdk/license.js.map +1 -0
- package/sdk/py.d.ts +6 -6
- package/sdk/py.js +7 -7
- package/sdk/py.js.map +1 -1
- package/sdk/ts.d.ts +18 -14
- package/sdk/ts.js +38 -32
- package/sdk/ts.js.map +1 -1
- package/src/agentcore-gateway/attach-upstream.d.ts +33 -0
- package/src/agentcore-gateway/attach-upstream.js +41 -0
- package/src/agentcore-gateway/attach-upstream.js.map +1 -0
- package/src/agentcore-gateway/files/cedar/policies/README.md +52 -0
- package/src/agentcore-gateway/files/cedar/policies/permit-all.cedar +11 -0
- package/src/agentcore-gateway/files/project/serve-local.ts.template +134 -0
- package/src/agentcore-gateway/gateway-connection/generator.d.ts +21 -0
- package/src/agentcore-gateway/gateway-connection/generator.js +102 -0
- package/src/agentcore-gateway/gateway-connection/generator.js.map +1 -0
- package/src/agentcore-gateway/gateway-connection/schema.d.ts +12 -0
- package/src/agentcore-gateway/gateway-connection/schema.json +26 -0
- package/src/agentcore-gateway/generator.d.ts +25 -0
- package/src/agentcore-gateway/generator.js +129 -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 +63 -0
- package/src/agentcore-gateway/mcp-connection/generator.js.map +1 -0
- package/src/agentcore-gateway/mcp-connection/schema.d.ts +12 -0
- package/src/agentcore-gateway/mcp-connection/schema.json +26 -0
- package/src/agentcore-gateway/schema.d.ts +16 -0
- package/src/agentcore-gateway/schema.json +65 -0
- package/src/connection/agent-runtime-config.d.ts +1 -1
- package/src/connection/agent-runtime-config.js.map +1 -1
- package/src/connection/agent-serve-local.d.ts +2 -2
- package/src/connection/agent-serve-local.js +1 -1
- package/src/connection/agent-serve-local.js.map +1 -1
- package/src/connection/generator.d.ts +5 -5
- package/src/connection/generator.js +93 -37
- package/src/connection/generator.js.map +1 -1
- package/src/connection/serve-local.d.ts +1 -1
- package/src/connection/serve-local.js +1 -1
- package/src/connection/serve-local.js.map +1 -1
- package/src/infra/app/__snapshots__/generator.spec.ts.snap +47 -58
- package/src/infra/app/generator.d.ts +3 -3
- package/src/infra/app/generator.js +19 -17
- package/src/infra/app/generator.js.map +1 -1
- package/src/license/__snapshots__/config.spec.ts.snap +23 -0
- package/src/license/config-types.d.ts +18 -1
- package/src/license/config-types.js +4 -0
- package/src/license/config-types.js.map +1 -1
- package/src/license/config.d.ts +65 -7
- package/src/license/config.js +315 -7
- package/src/license/config.js.map +1 -1
- package/src/license/dependency-check/check.d.ts +16 -0
- package/src/license/dependency-check/check.js +111 -0
- package/src/license/dependency-check/check.js.map +1 -0
- package/src/license/dependency-check/collectors/collector.d.ts +21 -0
- package/src/license/dependency-check/collectors/collector.js +76 -0
- package/src/license/dependency-check/collectors/collector.js.map +1 -0
- package/src/license/dependency-check/collectors/npm-collector.d.ts +10 -0
- package/src/license/dependency-check/collectors/npm-collector.js +75 -0
- package/src/license/dependency-check/collectors/npm-collector.js.map +1 -0
- package/src/license/dependency-check/collectors/python-collector.d.ts +23 -0
- package/src/license/dependency-check/collectors/python-collector.js +121 -0
- package/src/license/dependency-check/collectors/python-collector.js.map +1 -0
- package/src/license/dependency-check/evaluator.d.ts +9 -0
- package/src/license/dependency-check/evaluator.js +122 -0
- package/src/license/dependency-check/evaluator.js.map +1 -0
- package/src/license/dependency-check/executor-schema.json +6 -0
- package/src/license/dependency-check/executor.d.ts +9 -0
- package/src/license/dependency-check/executor.js +43 -0
- package/src/license/dependency-check/executor.js.map +1 -0
- package/src/license/dependency-check/pre-approved.d.ts +6 -0
- package/src/license/dependency-check/pre-approved.js +1280 -0
- package/src/license/dependency-check/pre-approved.js.map +1 -0
- package/src/license/dependency-check/types.d.ts +45 -0
- package/src/license/dependency-check/types.js +7 -0
- package/src/license/dependency-check/types.js.map +1 -0
- package/src/license/generator.d.ts +3 -3
- package/src/license/generator.js +102 -14
- package/src/license/generator.js.map +1 -1
- package/src/license/index.d.ts +8 -0
- package/src/license/index.js +13 -0
- package/src/license/index.js.map +1 -0
- package/src/license/known-exceptions.d.ts +6 -0
- package/src/license/known-exceptions.js +26 -0
- package/src/license/known-exceptions.js.map +1 -0
- package/src/license/schema.d.ts +5 -0
- package/src/license/schema.json +6 -0
- package/src/license/sync/generator.d.ts +2 -2
- package/src/license/sync/generator.js +15 -15
- package/src/license/sync/generator.js.map +1 -1
- package/src/license/sync/project-file-sync.d.ts +3 -3
- package/src/license/sync/project-file-sync.js.map +1 -1
- package/src/mcp-server/generator-info.d.ts +5 -1
- package/src/mcp-server/generator-info.js +7 -7
- package/src/mcp-server/generator-info.js.map +1 -1
- package/src/mcp-server/guide-pipeline.d.ts +1 -1
- package/src/mcp-server/guide-pipeline.js +2 -2
- package/src/mcp-server/guide-pipeline.js.map +1 -1
- package/src/mcp-server/mdx-ast.js +4 -0
- package/src/mcp-server/mdx-ast.js.map +1 -1
- package/src/mcp-server/schema-registry.d.ts +9 -3
- package/src/mcp-server/schema-registry.js +22 -6
- package/src/mcp-server/schema-registry.js.map +1 -1
- package/src/mcp-server/server.js +3 -3
- package/src/mcp-server/server.js.map +1 -1
- package/src/mcp-server/tools/create-workspace-command.d.ts +1 -1
- package/src/mcp-server/tools/create-workspace-command.js +4 -4
- package/src/mcp-server/tools/create-workspace-command.js.map +1 -1
- package/src/mcp-server/tools/general-guidance.d.ts +2 -2
- package/src/mcp-server/tools/general-guidance.js +2 -2
- package/src/mcp-server/tools/general-guidance.js.map +1 -1
- package/src/mcp-server/tools/generator-guide.d.ts +2 -2
- package/src/mcp-server/tools/generator-guide.js.map +1 -1
- package/src/mcp-server/tools/list-generators.d.ts +2 -2
- package/src/mcp-server/tools/list-generators.js +1 -1
- package/src/mcp-server/tools/list-generators.js.map +1 -1
- package/src/open-api/ts-client/__snapshots__/generator.reserved-keywords.spec.ts.snap +1 -1
- package/src/open-api/ts-client/generator.d.ts +3 -3
- package/src/open-api/ts-client/generator.js +2 -2
- package/src/open-api/ts-client/generator.js.map +1 -1
- package/src/open-api/ts-hooks/generator.d.ts +3 -3
- package/src/open-api/ts-hooks/generator.js +2 -2
- package/src/open-api/ts-hooks/generator.js.map +1 -1
- package/src/open-api/ts-hooks/generator.spec.tsx +14 -14
- package/src/open-api/ts-metadata/generator.d.ts +3 -3
- package/src/open-api/ts-metadata/generator.js +1 -1
- package/src/open-api/ts-metadata/generator.js.map +1 -1
- package/src/open-api/utils/codegen-data/languages.d.ts +5 -1
- package/src/open-api/utils/codegen-data/languages.js +4 -4
- package/src/open-api/utils/codegen-data/languages.js.map +1 -1
- package/src/open-api/utils/codegen-data.d.ts +6 -2
- package/src/open-api/utils/codegen-data.js +6 -6
- package/src/open-api/utils/codegen-data.js.map +1 -1
- package/src/open-api/utils/normalise.d.ts +5 -1
- package/src/open-api/utils/normalise.js +5 -5
- package/src/open-api/utils/normalise.js.map +1 -1
- package/src/open-api/utils/parse.d.ts +2 -2
- package/src/open-api/utils/parse.js +4 -0
- package/src/open-api/utils/parse.js.map +1 -1
- package/src/open-api/utils/refs.d.ts +1 -1
- package/src/preset/__snapshots__/generator.spec.ts.snap +131 -13
- package/src/preset/generator.d.ts +4 -4
- package/src/preset/generator.js +21 -14
- package/src/preset/generator.js.map +1 -1
- package/src/preset/schema.d.ts +3 -1
- package/src/preset/schema.json +5 -0
- package/src/py/agent/__snapshots__/generator.spec.ts.snap +659 -21
- package/src/py/agent/a2a-connection/__snapshots__/generator.spec.ts.snap +201 -0
- package/src/py/agent/a2a-connection/files/agent-connection/app/__targetAgentSnakeCase___client_strands.py.template +30 -0
- package/src/py/agent/a2a-connection/generator.d.ts +3 -3
- package/src/py/agent/a2a-connection/generator.js +11 -10
- package/src/py/agent/a2a-connection/generator.js.map +1 -1
- package/src/py/agent/files/common/agent.py.template +2 -0
- package/src/py/agent/files/http/init.py.template +7 -25
- package/src/py/agent/files/http/main.py.template +2 -3
- package/src/py/agent/gateway-connection/__snapshots__/generator.spec.ts.snap +197 -0
- package/src/py/agent/gateway-connection/files/agent-connection/app/__gatewaySnakeCase___client_strands.py.template +35 -0
- package/src/py/agent/gateway-connection/generator.d.ts +10 -0
- package/src/py/agent/gateway-connection/generator.js +106 -0
- package/src/py/agent/gateway-connection/generator.js.map +1 -0
- package/src/py/agent/gateway-connection/schema.d.ts +12 -0
- package/src/py/agent/gateway-connection/schema.json +26 -0
- package/src/py/agent/generator.d.ts +3 -3
- package/src/py/agent/generator.js +47 -38
- package/src/py/agent/generator.js.map +1 -1
- package/src/py/agent/mcp-connection/__snapshots__/generator.spec.ts.snap +167 -81
- package/src/py/agent/mcp-connection/files/agent-connection/app/__mcpServerSnakeCase___client_strands.py.template +30 -0
- package/src/py/agent/mcp-connection/generator.d.ts +3 -3
- package/src/py/agent/mcp-connection/generator.js +11 -81
- package/src/py/agent/mcp-connection/generator.js.map +1 -1
- package/src/py/agent/react-connection/__snapshots__/generator.spec.ts.snap +8 -17
- package/src/py/agent/react-connection/generator.d.ts +3 -3
- package/src/py/agent/react-connection/generator.js +4 -4
- package/src/py/agent/react-connection/generator.js.map +1 -1
- package/src/py/agent/react-connection/serve-local.d.ts +2 -2
- package/src/py/agent/react-connection/serve-local.js.map +1 -1
- package/src/py/api/generator.d.ts +3 -3
- package/src/py/api/generator.js.map +1 -1
- package/src/py/dynamodb/__snapshots__/generator.spec.ts.snap +1486 -0
- package/src/py/dynamodb/agent-connection/__snapshots__/generator.spec.ts.snap +45 -0
- package/src/py/dynamodb/agent-connection/generator.d.ts +10 -0
- package/src/py/dynamodb/agent-connection/generator.js +39 -0
- package/src/py/dynamodb/agent-connection/generator.js.map +1 -0
- package/src/py/dynamodb/agent-connection/schema.d.ts +14 -0
- package/src/py/dynamodb/agent-connection/schema.json +22 -0
- package/src/py/dynamodb/fast-api-connection/__snapshots__/generator.spec.ts.snap +23 -0
- package/src/py/dynamodb/fast-api-connection/generator.d.ts +10 -0
- package/src/py/dynamodb/fast-api-connection/generator.js +37 -0
- package/src/py/dynamodb/fast-api-connection/generator.js.map +1 -0
- package/src/py/dynamodb/fast-api-connection/schema.d.ts +12 -0
- package/src/py/dynamodb/fast-api-connection/schema.json +18 -0
- package/src/py/dynamodb/files/__name__/__init__.py.template +6 -0
- package/src/py/dynamodb/files/__name__/client.py.template +39 -0
- package/src/py/dynamodb/files/__name__/entities/__init__.py.template +4 -0
- package/src/py/dynamodb/files/__name__/entities/base.py.template +63 -0
- package/src/py/dynamodb/files/__name__/entities/example.py.template +64 -0
- package/src/py/dynamodb/files/config.json.template +24 -0
- package/src/py/dynamodb/generator.d.ts +10 -0
- package/src/py/dynamodb/generator.js +106 -0
- package/src/py/dynamodb/generator.js.map +1 -0
- package/src/py/dynamodb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +45 -0
- package/src/py/dynamodb/mcp-server-connection/generator.d.ts +10 -0
- package/src/py/dynamodb/mcp-server-connection/generator.js +39 -0
- package/src/py/dynamodb/mcp-server-connection/generator.js.map +1 -0
- package/src/py/dynamodb/mcp-server-connection/schema.d.ts +14 -0
- package/src/py/dynamodb/mcp-server-connection/schema.json +22 -0
- package/src/py/dynamodb/schema.d.ts +15 -0
- package/src/py/dynamodb/schema.json +70 -0
- package/src/py/fast-api/__snapshots__/generator.spec.ts.snap +167 -39
- package/src/py/fast-api/files/app/__name__/init.py.template +5 -22
- package/src/py/fast-api/files/app/__name__/main.py.template +4 -1
- package/src/py/fast-api/generator.d.ts +3 -3
- package/src/py/fast-api/generator.js +23 -17
- package/src/py/fast-api/generator.js.map +1 -1
- package/src/py/fast-api/react/__snapshots__/generator.spec.ts.snap +1 -1
- package/src/py/fast-api/react/generator.d.ts +3 -3
- package/src/py/fast-api/react/generator.js +2 -2
- package/src/py/fast-api/react/generator.js.map +1 -1
- package/src/py/fast-api/react/open-api.d.ts +1 -1
- package/src/py/fast-api/react/open-api.js +5 -2
- package/src/py/fast-api/react/open-api.js.map +1 -1
- package/src/py/lambda-function/generator.d.ts +3 -3
- package/src/py/lambda-function/generator.js +11 -11
- package/src/py/lambda-function/generator.js.map +1 -1
- package/src/py/mcp-server/__snapshots__/generator.spec.ts.snap +83 -13
- package/src/py/mcp-server/generator.d.ts +3 -3
- package/src/py/mcp-server/generator.js +33 -26
- package/src/py/mcp-server/generator.js.map +1 -1
- package/src/py/project/generator.d.ts +3 -3
- package/src/py/project/generator.js +96 -70
- package/src/py/project/generator.js.map +1 -1
- package/src/smithy/project/__snapshots__/generator.spec.ts.snap +19 -16
- package/src/smithy/project/files/build.Dockerfile.template +1 -0
- package/src/smithy/project/files/src/operations/echo.smithy.template +1 -0
- package/src/smithy/project/generator.d.ts +3 -3
- package/src/smithy/project/generator.js +30 -28
- package/src/smithy/project/generator.js.map +1 -1
- package/src/smithy/react-connection/__snapshots__/generator.spec.ts.snap +1 -1
- package/src/smithy/react-connection/generator.d.ts +3 -3
- package/src/smithy/react-connection/generator.js +3 -3
- package/src/smithy/react-connection/generator.js.map +1 -1
- package/src/smithy/ts/api/__snapshots__/generator.spec.ts.snap +14 -34
- package/src/smithy/ts/api/generator.d.ts +3 -3
- package/src/smithy/ts/api/generator.js +18 -12
- package/src/smithy/ts/api/generator.js.map +1 -1
- package/src/terraform/project/files/application/src/main.tf.template +6 -1
- package/src/terraform/project/generator.d.ts +3 -3
- package/src/terraform/project/generator.js +13 -8
- package/src/terraform/project/generator.js.map +1 -1
- package/src/trpc/backend/__snapshots__/generator.spec.ts.snap +163 -18
- package/src/trpc/backend/files/src/procedures/echo.ts.template +1 -1
- package/src/trpc/backend/files/src/schema/echo.ts.template +2 -2
- package/src/trpc/backend/generator.d.ts +3 -3
- package/src/trpc/backend/generator.js +11 -10
- package/src/trpc/backend/generator.js.map +1 -1
- package/src/trpc/backend/schema.d.ts +2 -2
- package/src/trpc/react/__snapshots__/generator.spec.ts.snap +3 -3
- package/src/trpc/react/files/src/components/__apiNameClassName__ClientProvider.tsx.template +3 -3
- package/src/trpc/react/generator.d.ts +3 -3
- package/src/trpc/react/generator.js +5 -5
- package/src/trpc/react/generator.js.map +1 -1
- package/src/ts/agent/__snapshots__/generator.spec.ts.snap +652 -14
- package/src/ts/agent/a2a-connection/__snapshots__/generator.spec.ts.snap +256 -0
- package/src/ts/agent/a2a-connection/files/agent-connection/app/__targetAgentKebabCase__-client-strands.ts.template +23 -0
- package/src/ts/agent/a2a-connection/generator.d.ts +3 -3
- package/src/ts/agent/a2a-connection/generator.js +8 -8
- package/src/ts/agent/a2a-connection/generator.js.map +1 -1
- package/src/ts/agent/files/common/agent.ts.template +6 -2
- package/src/ts/agent/files/http/router.ts.template +1 -1
- package/src/ts/agent/gateway-connection/__snapshots__/generator.spec.ts.snap +220 -0
- package/src/ts/agent/gateway-connection/files/agent-connection/app/__gatewayKebabCase__-client-strands.ts.template +30 -0
- package/src/ts/agent/gateway-connection/generator.d.ts +10 -0
- package/src/ts/agent/gateway-connection/generator.js +106 -0
- package/src/ts/agent/gateway-connection/generator.js.map +1 -0
- package/src/ts/agent/gateway-connection/schema.d.ts +12 -0
- package/src/ts/agent/gateway-connection/schema.json +26 -0
- package/src/ts/agent/generator.d.ts +3 -3
- package/src/ts/agent/generator.js +44 -32
- package/src/ts/agent/generator.js.map +1 -1
- package/src/ts/agent/mcp-connection/__snapshots__/generator.spec.ts.snap +191 -110
- package/src/ts/agent/mcp-connection/files/agent-connection/app/__mcpServerKebabCase__-client-strands.ts.template +22 -0
- package/src/ts/agent/mcp-connection/generator.d.ts +3 -3
- package/src/ts/agent/mcp-connection/generator.js +9 -21
- package/src/ts/agent/mcp-connection/generator.js.map +1 -1
- package/src/ts/agent/react-connection/generator.d.ts +3 -3
- package/src/ts/agent/react-connection/generator.js +9 -9
- package/src/ts/agent/react-connection/generator.js.map +1 -1
- package/src/ts/agent/react-connection/serve-local.d.ts +2 -2
- package/src/ts/api/generator.d.ts +3 -3
- package/src/ts/api/generator.js +4 -4
- package/src/ts/api/generator.js.map +1 -1
- package/src/ts/api/schema.d.ts +2 -1
- package/src/ts/astro-docs/__snapshots__/generator.spec.ts.snap +7 -8
- package/src/ts/astro-docs/generator.d.ts +3 -3
- package/src/ts/astro-docs/generator.js +14 -11
- package/src/ts/astro-docs/generator.js.map +1 -1
- package/src/ts/docs/generator.d.ts +3 -3
- package/src/ts/docs/generator.js.map +1 -1
- package/src/ts/dynamodb/__snapshots__/generator.spec.ts.snap +1352 -0
- package/src/ts/dynamodb/agent-connection/__snapshots__/generator.spec.ts.snap +45 -0
- package/src/ts/dynamodb/agent-connection/generator.d.ts +10 -0
- package/src/ts/dynamodb/agent-connection/generator.js +32 -0
- package/src/ts/dynamodb/agent-connection/generator.js.map +1 -0
- package/src/ts/dynamodb/agent-connection/schema.d.ts +14 -0
- package/src/ts/dynamodb/agent-connection/schema.json +22 -0
- package/src/ts/dynamodb/files/config.json.template +24 -0
- package/src/ts/dynamodb/files/src/client.ts.template +61 -0
- package/src/ts/dynamodb/files/src/entities/example.ts.template +47 -0
- package/src/ts/dynamodb/files/src/entities/index.ts.template +1 -0
- package/src/ts/dynamodb/files/src/index.ts.template +2 -0
- package/src/ts/dynamodb/generator.d.ts +10 -0
- package/src/ts/dynamodb/generator.js +111 -0
- package/src/ts/dynamodb/generator.js.map +1 -0
- package/src/ts/dynamodb/mcp-server-connection/__snapshots__/generator.spec.ts.snap +45 -0
- package/src/ts/dynamodb/mcp-server-connection/generator.d.ts +10 -0
- package/src/ts/dynamodb/mcp-server-connection/generator.js +32 -0
- package/src/ts/dynamodb/mcp-server-connection/generator.js.map +1 -0
- package/src/ts/dynamodb/mcp-server-connection/schema.d.ts +14 -0
- package/src/ts/dynamodb/mcp-server-connection/schema.json +22 -0
- package/src/ts/dynamodb/schema.d.ts +15 -0
- package/src/ts/dynamodb/schema.json +70 -0
- package/src/ts/dynamodb/smithy-connection/__snapshots__/generator.spec.ts.snap +23 -0
- package/src/ts/dynamodb/smithy-connection/generator.d.ts +10 -0
- package/src/ts/dynamodb/smithy-connection/generator.js +30 -0
- package/src/ts/dynamodb/smithy-connection/generator.js.map +1 -0
- package/src/ts/dynamodb/smithy-connection/schema.d.ts +12 -0
- package/src/ts/dynamodb/smithy-connection/schema.json +18 -0
- package/src/ts/dynamodb/trpc-connection/__snapshots__/generator.spec.ts.snap +23 -0
- package/src/ts/dynamodb/trpc-connection/generator.d.ts +10 -0
- package/src/ts/dynamodb/trpc-connection/generator.js +30 -0
- package/src/ts/dynamodb/trpc-connection/generator.js.map +1 -0
- package/src/ts/dynamodb/trpc-connection/schema.d.ts +12 -0
- package/src/ts/dynamodb/trpc-connection/schema.json +18 -0
- package/src/ts/lambda-function/generator.d.ts +3 -3
- package/src/ts/lambda-function/generator.js +8 -8
- package/src/ts/lambda-function/generator.js.map +1 -1
- package/src/ts/lib/__snapshots__/generator.spec.ts.snap +32 -65
- package/src/ts/lib/__snapshots__/vitest.spec.ts.snap +24 -0
- package/src/ts/lib/biome.d.ts +7 -0
- package/src/ts/lib/biome.js +58 -0
- package/src/ts/lib/biome.js.map +1 -0
- package/src/ts/lib/generator.d.ts +3 -3
- package/src/ts/lib/generator.js +27 -29
- 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/ts-project-utils.d.ts +12 -2
- package/src/ts/lib/ts-project-utils.js +30 -10
- package/src/ts/lib/ts-project-utils.js.map +1 -1
- package/src/ts/lib/vitest.d.ts +2 -2
- package/src/ts/lib/vitest.js +1 -1
- package/src/ts/lib/vitest.js.map +1 -1
- package/src/ts/mcp-server/__snapshots__/generator.spec.ts.snap +82 -12
- package/src/ts/mcp-server/generator.d.ts +3 -3
- package/src/ts/mcp-server/generator.js +34 -12
- package/src/ts/mcp-server/generator.js.map +1 -1
- package/src/ts/nx-generator/__snapshots__/generator.spec.ts.snap +19 -14
- package/src/ts/nx-generator/generator.d.ts +2 -2
- package/src/ts/nx-generator/generator.js +52 -19
- package/src/ts/nx-generator/generator.js.map +1 -1
- package/src/ts/nx-plugin/generator.d.ts +3 -3
- package/src/ts/nx-plugin/generator.js +10 -9
- package/src/ts/nx-plugin/generator.js.map +1 -1
- package/src/ts/nx-plugin/utils.d.ts +1 -1
- package/src/ts/nx-plugin/utils.js +10 -4
- package/src/ts/nx-plugin/utils.js.map +1 -1
- package/src/ts/rdb/__snapshots__/generator.spec.ts.snap +252 -388
- package/src/ts/rdb/agent-connection/generator.d.ts +3 -3
- package/src/ts/rdb/agent-connection/generator.js +4 -4
- package/src/ts/rdb/agent-connection/generator.js.map +1 -1
- package/src/ts/rdb/files/config.json.template +14 -0
- package/src/ts/rdb/files/prisma.config.ts.template +5 -4
- package/src/ts/rdb/files/src/index.ts.template +0 -1
- package/src/ts/rdb/files/src/prisma.ts.template +26 -21
- package/src/ts/rdb/generator.d.ts +3 -7
- package/src/ts/rdb/generator.js +52 -41
- package/src/ts/rdb/generator.js.map +1 -1
- package/src/ts/rdb/mcp-server-connection/generator.d.ts +3 -3
- package/src/ts/rdb/mcp-server-connection/generator.js +4 -4
- package/src/ts/rdb/mcp-server-connection/generator.js.map +1 -1
- package/src/ts/rdb/smithy-connection/generator.d.ts +3 -3
- package/src/ts/rdb/smithy-connection/generator.js +4 -4
- package/src/ts/rdb/smithy-connection/generator.js.map +1 -1
- package/src/ts/rdb/trpc-connection/generator.d.ts +3 -3
- package/src/ts/rdb/trpc-connection/generator.js +3 -3
- package/src/ts/rdb/trpc-connection/generator.js.map +1 -1
- package/src/ts/rdb/utils.d.ts +1 -1
- package/src/ts/react-website/agui/files/common/src/hooks/useAgui__agentNameClassName__.tsx.template +1 -16
- package/src/ts/react-website/agui/generator.d.ts +1 -1
- package/src/ts/react-website/agui/generator.js +4 -5
- package/src/ts/react-website/agui/generator.js.map +1 -1
- package/src/ts/react-website/app/__snapshots__/generator.spec.ts.snap +530 -367
- package/src/ts/react-website/app/generator.d.ts +3 -3
- package/src/ts/react-website/app/generator.js +21 -17
- package/src/ts/react-website/app/generator.js.map +1 -1
- package/src/ts/react-website/cognito-auth/__snapshots__/generator.spec.ts.snap +1 -7
- package/src/ts/react-website/cognito-auth/__snapshots__/generator.terraform.spec.ts.snap +9 -3
- package/src/ts/react-website/cognito-auth/__snapshots__/generator.ux-provider.spec.ts.snap +0 -20
- package/src/ts/react-website/cognito-auth/generator.d.ts +3 -3
- package/src/ts/react-website/cognito-auth/generator.js +10 -13
- package/src/ts/react-website/cognito-auth/generator.js.map +1 -1
- package/src/ts/react-website/cognito-auth/grit/cloudscape-auth-menu.grit +8 -6
- package/src/ts/react-website/cognito-auth/grit/cognito-auth-wrapper.grit +1 -1
- package/src/ts/react-website/cognito-auth/grit/none-auth-menu.grit +1 -0
- package/src/ts/react-website/cognito-auth/grit/shadcn-auth-menu.grit +3 -1
- package/src/ts/react-website/cognito-auth/grit/shadcn-state-declarations.grit +3 -1
- package/src/ts/react-website/cognito-auth/utils.d.ts +1 -1
- package/src/ts/react-website/cognito-auth/utils.js +1 -1
- package/src/ts/react-website/cognito-auth/utils.js.map +1 -1
- package/src/ts/react-website/runtime-config/generator.d.ts +3 -3
- package/src/ts/react-website/runtime-config/generator.js +4 -4
- package/src/ts/react-website/runtime-config/generator.js.map +1 -1
- package/src/ts/sync/generator.d.ts +3 -3
- package/src/ts/sync/generator.js +2 -2
- package/src/ts/sync/generator.js.map +1 -1
- package/src/ts/website/app/generator.d.ts +3 -3
- package/src/ts/website/app/generator.js +1 -1
- package/src/ts/website/app/generator.js.map +1 -1
- package/src/ts/website/auth/generator.d.ts +3 -3
- package/src/ts/website/auth/generator.js +1 -1
- package/src/ts/website/auth/generator.js.map +1 -1
- package/src/utils/agent-chat/agent-chat.d.ts +31 -0
- package/src/utils/agent-chat/agent-chat.js +30 -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 +67 -24
- package/src/utils/agent-connection/agent-connection.js +236 -44
- package/src/utils/agent-connection/agent-connection.js.map +1 -1
- package/src/utils/agent-connection/files/core-a2a/agentcore-a2a-client-config.ts.template +93 -0
- package/src/utils/agent-connection/files/core-auth/agentcore-endpoints.ts.template +37 -0
- package/src/utils/agent-connection/files/core-auth/agentcore-fetch.ts.template +54 -0
- package/src/utils/agent-connection/files/core-gateway/agentcore-gateway-mcp-transport.ts.template +41 -0
- package/src/utils/agent-connection/files/core-mcp/agentcore-mcp-transport.ts.template +70 -0
- package/src/utils/agent-connection/files/core-runtime-config/runtime-config.ts.template +22 -32
- package/src/utils/agent-connection/files/core-shared/agentcore-transport.ts.template +39 -0
- package/src/utils/agent-connection/files/core-strands/a2a/agentcore-a2a-client-strands.ts.template +61 -0
- package/src/utils/agent-connection/files/core-strands/base/model-errors-strands.ts.template +36 -0
- package/src/utils/agent-connection/files/core-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-mcp/agentcore_mcp_transport.py.template +34 -0
- package/src/utils/agent-connection/files/py-core-runtime-config/runtime_config.py.template +5 -18
- package/src/utils/agent-connection/files/py-core-shared/agentcore_transport.py.template +40 -0
- package/src/utils/agent-connection/files/py-core-strands/a2a/agentcore_a2a_client_strands.py.template +66 -0
- package/src/utils/agent-connection/files/py-core-strands/base/model_errors_strands.py.template +40 -0
- package/src/utils/agent-connection/files/py-core-strands/gateway/agentcore_gateway_mcp_client_strands.py.template +22 -0
- package/src/utils/agent-connection/files/py-core-strands/mcp/agentcore_mcp_client_strands.py.template +30 -0
- package/src/utils/agent-core-constructs/agent-core-constructs.d.ts +11 -3
- package/src/utils/agent-core-constructs/agent-core-constructs.js +57 -12
- 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 +4 -0
- package/src/utils/agent-core-constructs/files/cdk/app/agentcore-gateway/__nameKebabCase__/__nameKebabCase__.ts.template +40 -0
- package/src/utils/agent-core-constructs/files/cdk/core/agentcore-gateway/agentcore-gateway.ts.template +375 -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/agentcore-gateway/__nameKebabCase__/__nameKebabCase__.tf.template +335 -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 +77 -9
- package/src/utils/agent-core-constructs/files/terraform/core/agentcore-gateway/gateway.tf.template +14 -0
- package/src/utils/api-constructs/api-constructs.d.ts +2 -2
- package/src/utils/api-constructs/api-constructs.js +1 -1
- package/src/utils/api-constructs/api-constructs.js.map +1 -1
- package/src/utils/api-constructs/files/cdk/app/apis/rest/__apiNameKebabCase__.ts.template +3 -0
- package/src/utils/api-constructs/files/cdk/core/api/http/http-api.ts.template +9 -0
- package/src/utils/api-constructs/files/cdk/core/api/rest/rest-api.ts.template +23 -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/rest/__apiNameKebabCase__/__apiNameKebabCase__.tf.template +3 -0
- package/src/utils/api-constructs/open-api-metadata.d.ts +2 -2
- package/src/utils/api-constructs/open-api-metadata.js.map +1 -1
- package/src/utils/ast/website.d.ts +5 -1
- package/src/utils/ast/website.js +3 -3
- package/src/utils/ast/website.js.map +1 -1
- package/src/utils/ast.d.ts +33 -1
- package/src/utils/ast.js +89 -4
- package/src/utils/ast.js.map +1 -1
- package/src/utils/bundle/bundle.d.ts +1 -1
- package/src/utils/bundle/bundle.js +2 -2
- package/src/utils/bundle/bundle.js.map +1 -1
- package/src/utils/config/index.d.ts +5 -5
- package/src/utils/config/utils.d.ts +13 -3
- package/src/utils/config/utils.js +37 -5
- package/src/utils/config/utils.js.map +1 -1
- package/src/utils/connection/open-api/files/components/__apiNameClassName__Provider.tsx.template +1 -1
- package/src/utils/connection/open-api/react.d.ts +1 -1
- package/src/utils/connection/open-api/react.js +4 -4
- package/src/utils/connection/open-api/react.js.map +1 -1
- package/src/utils/containers.d.ts +1 -1
- package/src/utils/dynamodb-constructs/dynamodb-constructs.d.ts +18 -0
- package/src/utils/dynamodb-constructs/dynamodb-constructs.js +49 -0
- package/src/utils/dynamodb-constructs/dynamodb-constructs.js.map +1 -0
- package/src/utils/dynamodb-constructs/files/cdk/app/dynamodb/__nameKebabCase__.ts.template +43 -0
- package/src/utils/dynamodb-constructs/files/cdk/core/dynamodb.ts.template +105 -0
- package/src/utils/dynamodb-constructs/files/terraform/app/dynamodb/__nameKebabCase__/__nameKebabCase__.tf.template +62 -0
- package/src/utils/dynamodb-constructs/files/terraform/core/dynamodb/dynamodb.tf.template +155 -0
- package/src/utils/files/common/scripts/src/dynamodb/create-local-table.ts.template +195 -0
- 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 +91 -0
- package/src/utils/files/common/scripts/src/rdb/pull-image.ts.template +16 -0
- package/src/utils/files/common/scripts/src/rdb/start-container.ts.template +102 -0
- package/src/utils/files/common/scripts/src/rdb/wait-for-db.ts.template +59 -0
- package/src/utils/files/terraform/src/core/runtime-config/appconfig-deployment/appconfig-deployment.tf.template +9 -3
- package/src/utils/files/terraform/src/core/runtime-config/read/read.tf.template +7 -2
- package/src/utils/format.d.ts +45 -2
- package/src/utils/format.js +167 -46
- package/src/utils/format.js.map +1 -1
- package/src/utils/fs.d.ts +1 -1
- package/src/utils/fs.js.map +1 -1
- package/src/utils/function-constructs/function-constructs.d.ts +2 -2
- package/src/utils/function-constructs/function-constructs.js +1 -1
- package/src/utils/function-constructs/function-constructs.js.map +1 -1
- package/src/utils/generators.d.ts +4 -0
- package/src/utils/generators.js +4 -4
- package/src/utils/generators.js.map +1 -1
- package/src/utils/git.d.ts +1 -1
- package/src/utils/git.js.map +1 -1
- package/src/utils/iac.d.ts +1 -1
- package/src/utils/iac.js.map +1 -1
- package/src/utils/identity-constructs/files/cdk/core/user-identity.ts.template +1 -5
- package/src/utils/identity-constructs/files/terraform/core/user-identity/add-callback-url/add-callback-url.tf.template +9 -3
- package/src/utils/identity-constructs/files/terraform/core/user-identity/identity/identity.tf.template +2 -4
- package/src/utils/identity-constructs/identity-constructs.d.ts +2 -2
- package/src/utils/identity-constructs/identity-constructs.js +1 -1
- package/src/utils/identity-constructs/identity-constructs.js.map +1 -1
- package/src/utils/js.d.ts +4 -0
- package/src/utils/js.js +4 -4
- package/src/utils/js.js.map +1 -1
- package/src/utils/mcp.d.ts +25 -0
- package/src/utils/mcp.js +81 -0
- package/src/utils/mcp.js.map +1 -0
- package/src/utils/metrics.d.ts +9 -3
- package/src/utils/metrics.js +58 -28
- package/src/utils/metrics.js.map +1 -1
- package/src/utils/npm-scope.d.ts +1 -1
- package/src/utils/npm-scope.js.map +1 -1
- package/src/utils/nx.d.ts +7 -2
- package/src/utils/nx.js +46 -14
- package/src/utils/nx.js.map +1 -1
- package/src/utils/nxlv-python.d.ts +1 -1
- package/src/utils/paths.d.ts +1 -1
- package/src/utils/pnpm-workspace.d.ts +1 -1
- package/src/utils/pnpm-workspace.js.map +1 -1
- package/src/utils/port.d.ts +31 -3
- package/src/utils/port.js +74 -4
- package/src/utils/port.js.map +1 -1
- package/src/utils/py.d.ts +2 -2
- package/src/utils/py.js +13 -6
- package/src/utils/py.js.map +1 -1
- package/src/utils/rdb-constructs/files/cdk/app/dbs/__nameKebabCase__.ts.template +12 -2
- package/src/utils/rdb-constructs/files/cdk/core/rdb/aurora.ts.template +30 -1
- package/src/utils/rdb-constructs/files/terraform/app/dbs/__nameKebabCase__/__nameKebabCase__.tf.template +38 -16
- package/src/utils/rdb-constructs/files/terraform/core/rdb/aurora/aurora.tf.template +28 -13
- package/src/utils/rdb-constructs/rdb-constructs.d.ts +5 -4
- package/src/utils/rdb-constructs/rdb-constructs.js +3 -11
- package/src/utils/rdb-constructs/rdb-constructs.js.map +1 -1
- package/src/utils/shared-constructs-constants.d.ts +1 -0
- package/src/utils/shared-constructs-constants.js +2 -1
- package/src/utils/shared-constructs-constants.js.map +1 -1
- package/src/utils/shared-constructs.d.ts +2 -2
- package/src/utils/shared-constructs.js +7 -7
- package/src/utils/shared-constructs.js.map +1 -1
- package/src/utils/shared-dynamodb-scripts.d.ts +11 -0
- package/src/utils/shared-dynamodb-scripts.js +23 -0
- package/src/utils/shared-dynamodb-scripts.js.map +1 -0
- package/src/utils/shared-infra-config.d.ts +1 -1
- package/src/utils/shared-infra-config.js +1 -1
- package/src/utils/shared-infra-config.js.map +1 -1
- package/src/utils/shared-infra-scripts.d.ts +11 -0
- package/src/utils/shared-infra-scripts.js +35 -0
- package/src/utils/shared-infra-scripts.js.map +1 -0
- package/src/utils/shared-rdb-scripts.d.ts +11 -0
- package/src/utils/shared-rdb-scripts.js +20 -0
- package/src/utils/shared-rdb-scripts.js.map +1 -0
- package/src/utils/shared-scripts.d.ts +2 -5
- package/src/utils/shared-scripts.js +2 -23
- package/src/utils/shared-scripts.js.map +1 -1
- package/src/utils/shared-shadcn.d.ts +1 -1
- package/src/utils/shared-shadcn.js +1 -13
- package/src/utils/shared-shadcn.js.map +1 -1
- package/src/utils/test.d.ts +5 -1
- package/src/utils/test.js +9 -5
- package/src/utils/test.js.map +1 -1
- package/src/utils/toml.d.ts +1 -1
- package/src/utils/toml.js +4 -0
- package/src/utils/toml.js.map +1 -1
- package/src/utils/versions.d.ts +82 -83
- package/src/utils/versions.js +81 -82
- package/src/utils/versions.js.map +1 -1
- package/src/utils/website-constructs/files/cdk/core/static-website.ts.template +72 -5
- package/src/utils/website-constructs/files/terraform/core/static-website/static-website.tf.template +63 -15
- package/src/utils/website-constructs/website-constructs.d.ts +2 -2
- package/src/utils/website-constructs/website-constructs.js +1 -1
- package/src/utils/website-constructs/website-constructs.js.map +1 -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/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/scripts/http/chat.ts.template +0 -35
- package/src/ts/lib/eslint.d.ts +0 -14
- package/src/ts/lib/eslint.js +0 -90
- package/src/ts/lib/eslint.js.map +0 -1
- package/src/ts/lib/grit/eslint-dependency-checks-warn.grit +0 -1
- package/src/ts/rdb/files/scripts/docker-pull.ts.template +0 -15
- package/src/ts/rdb/files/scripts/docker-start.ts.template +0 -84
- package/src/ts/rdb/files/scripts/wait-for-db.ts.template +0 -55
- package/src/ts/rdb/files/src/constants.ts.template +0 -8
- package/src/utils/agent-connection/files/core-a2a/agentcore-a2a-client.ts.template +0 -123
- package/src/utils/agent-connection/files/core-mcp/agentcore-mcp-client.ts.template +0 -128
- package/src/utils/agent-connection/files/py-core-a2a/agentcore_a2a_client.py.template +0 -120
- package/src/utils/agent-connection/files/py-core-mcp/agentcore_mcp_client.py.template +0 -89
- /package/src/utils/agent-connection/files/{core-runtime-config/with-session-id.ts.template → core-strands/base/with-session-id-strands.ts.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/{infra-deploy.ts.template → infra/infra-deploy.ts.template} +0 -0
- /package/src/utils/files/common/scripts/src/{infra-destroy.ts.template → infra/infra-destroy.ts.template} +0 -0
- /package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/cdk-command.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}/run.ts.template +0 -0
- /package/src/utils/files/common/scripts/src/{stage-credentials → infra/stage-credentials}/stage-parser.ts.template +0 -0
|
@@ -22,144 +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/docker-pull.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/docker-start.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',
|
|
76
|
-
'--name',
|
|
77
|
-
containerName,
|
|
78
|
-
'-e',
|
|
79
|
-
\`MYSQL_DATABASE=\${dbName}\`,
|
|
80
|
-
'-e',
|
|
81
|
-
\`MYSQL_ROOT_PASSWORD=\${dbPassword}\`,
|
|
82
|
-
'-p',
|
|
83
|
-
\`\${hostPort}:3306\`,
|
|
84
|
-
'-v',
|
|
85
|
-
\`\${containerName}-data:/var/lib/mysql\`,
|
|
86
|
-
'-d',
|
|
87
|
-
image,
|
|
88
|
-
];
|
|
89
|
-
const create = spawnSync(ENGINE, runArgs, { stdio: 'inherit' });
|
|
90
|
-
if (create.status !== 0) process.exit(create.status ?? 1);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
const logs = spawn(ENGINE, ['logs', '-f', containerName], {
|
|
94
|
-
stdio: ['ignore', 'inherit', 'inherit'],
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
let exiting = false;
|
|
98
|
-
|
|
99
|
-
const cleanup = () => {
|
|
100
|
-
if (exiting) return;
|
|
101
|
-
exiting = true;
|
|
102
|
-
spawnSync(ENGINE, ['stop', containerName], { stdio: 'ignore' });
|
|
103
|
-
logs.kill();
|
|
104
|
-
process.exit(0);
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
process.on('SIGTERM', cleanup);
|
|
108
|
-
process.on('SIGINT', cleanup);
|
|
109
|
-
process.on('SIGHUP', cleanup);
|
|
110
|
-
|
|
111
|
-
logs.on('exit', (code) => {
|
|
112
|
-
if (!exiting) process.exit(code ?? 0);
|
|
113
|
-
});
|
|
114
|
-
"
|
|
115
|
-
`;
|
|
116
|
-
|
|
117
|
-
exports[`ts#rdb generator > should add mysql prisma dependencies when engine is MySQL > packages/db/scripts/wait-for-db.ts 1`] = `
|
|
118
|
-
"import { createConnection, Connection } from 'mariadb';
|
|
119
|
-
|
|
120
|
-
const noop = () => undefined;
|
|
121
|
-
|
|
122
|
-
const [portArg, dbArg, userArg, passwordArg] = process.argv.slice(2);
|
|
123
|
-
const timeoutAt = Date.now() + 60000;
|
|
124
|
-
|
|
125
|
-
while (Date.now() < timeoutAt) {
|
|
126
|
-
let conn: Connection | undefined;
|
|
127
|
-
try {
|
|
128
|
-
conn = await createConnection({
|
|
129
|
-
host: 'localhost',
|
|
130
|
-
port: parseInt(portArg),
|
|
131
|
-
user: userArg,
|
|
132
|
-
password: passwordArg,
|
|
133
|
-
database: dbArg,
|
|
134
|
-
connectTimeout: 500,
|
|
135
|
-
allowPublicKeyRetrieval: true,
|
|
136
|
-
});
|
|
137
|
-
await conn.end();
|
|
138
|
-
console.log('Database is ready.');
|
|
139
|
-
process.exit(0);
|
|
140
|
-
} catch {
|
|
141
|
-
console.log('Database is not ready.');
|
|
142
|
-
await conn?.end().catch(noop);
|
|
143
|
-
}
|
|
144
|
-
await new Promise((r) => setTimeout(r, 200));
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
throw new Error(\`Timed out waiting for mysql on port \${portArg}\`);
|
|
148
|
-
"
|
|
149
|
-
`;
|
|
150
|
-
|
|
151
|
-
exports[`ts#rdb generator > should add mysql prisma dependencies when engine is MySQL > packages/db/src/constants.ts 1`] = `
|
|
152
|
-
"export const DB_PACKAGE_NAME = 'Db';
|
|
153
|
-
|
|
154
|
-
// Local development connection details (used when SERVE_LOCAL=true, see serve-local Nx target)
|
|
155
|
-
export const LOCAL_DB_PORT = 3306;
|
|
156
|
-
export const LOCAL_DB_HOST = 'localhost';
|
|
157
|
-
export const LOCAL_DB_NAME = 'database_name';
|
|
158
|
-
export const LOCAL_DB_USER = 'root';
|
|
159
|
-
export const LOCAL_DB_PASSWORD = 'password';
|
|
160
|
-
"
|
|
161
|
-
`;
|
|
162
|
-
|
|
163
25
|
exports[`ts#rdb generator > should add mysql prisma dependencies when engine is MySQL > packages/db/src/create-db-user-handler.ts 1`] = `
|
|
164
26
|
"import type { CloudFormationCustomResourceEvent } from 'aws-lambda';
|
|
165
27
|
import { randomBytes } from 'node:crypto';
|
|
@@ -237,8 +99,7 @@ export const handler = async (
|
|
|
237
99
|
`;
|
|
238
100
|
|
|
239
101
|
exports[`ts#rdb generator > should add mysql prisma dependencies when engine is MySQL > packages/db/src/index.ts 1`] = `
|
|
240
|
-
"export {
|
|
241
|
-
export { getPrisma } from './prisma.js';
|
|
102
|
+
"export { getPrisma } from './prisma.js';
|
|
242
103
|
"
|
|
243
104
|
`;
|
|
244
105
|
|
|
@@ -277,26 +138,31 @@ exports[`ts#rdb generator > should add mysql prisma dependencies when engine is
|
|
|
277
138
|
"import { PrismaMariaDb } from '@prisma/adapter-mariadb';
|
|
278
139
|
import { Signer } from '@aws-sdk/rds-signer';
|
|
279
140
|
import { Prisma, PrismaClient } from '../generated/prisma/client.js';
|
|
280
|
-
import {
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
LOCAL_DB_NAME,
|
|
284
|
-
LOCAL_DB_PASSWORD,
|
|
285
|
-
LOCAL_DB_PORT,
|
|
286
|
-
LOCAL_DB_USER,
|
|
287
|
-
} from './constants.js';
|
|
141
|
+
import { readFileSync } from 'fs';
|
|
142
|
+
import { join, dirname } from 'path';
|
|
143
|
+
import { fileURLToPath } from 'url';
|
|
288
144
|
import { getDatabaseConfig } from './utils.js';
|
|
289
145
|
|
|
146
|
+
// Generated: must match runtimeConfigKey in config.json
|
|
147
|
+
const runtimeConfigKey = 'Db';
|
|
148
|
+
|
|
149
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
150
|
+
// config.json is only present in local dev (not included in the deployed bundle); guard with SERVE_LOCAL check
|
|
151
|
+
const serveLocal = () =>
|
|
152
|
+
JSON.parse(readFileSync(join(__dirname, '../config.json'), 'utf-8'))
|
|
153
|
+
.serveLocal;
|
|
154
|
+
|
|
290
155
|
export const getPrisma = async <LogOpts extends Prisma.LogLevel>(
|
|
291
156
|
log: LogOpts[] = ['warn', 'error'] as LogOpts[],
|
|
292
157
|
): Promise<PrismaClient<LogOpts>> => {
|
|
293
158
|
if (process.env.SERVE_LOCAL === 'true') {
|
|
159
|
+
const { host, port, dbName, dbUser, dbPassword } = serveLocal();
|
|
294
160
|
const adapter = new PrismaMariaDb({
|
|
295
|
-
host
|
|
296
|
-
port
|
|
297
|
-
database:
|
|
298
|
-
user:
|
|
299
|
-
password:
|
|
161
|
+
host,
|
|
162
|
+
port,
|
|
163
|
+
database: dbName,
|
|
164
|
+
user: dbUser,
|
|
165
|
+
password: dbPassword,
|
|
300
166
|
allowPublicKeyRetrieval: true,
|
|
301
167
|
});
|
|
302
168
|
return new PrismaClient({
|
|
@@ -306,7 +172,7 @@ export const getPrisma = async <LogOpts extends Prisma.LogLevel>(
|
|
|
306
172
|
}
|
|
307
173
|
|
|
308
174
|
const { hostname, port, database, dbUser, region } =
|
|
309
|
-
await getDatabaseConfig(
|
|
175
|
+
await getDatabaseConfig(runtimeConfigKey);
|
|
310
176
|
const iamAuthToken = await new Signer({
|
|
311
177
|
hostname,
|
|
312
178
|
port,
|
|
@@ -663,6 +529,21 @@ export interface AuroraDatabaseProps extends _AuroraDatabaseProps {
|
|
|
663
529
|
* @default true
|
|
664
530
|
*/
|
|
665
531
|
readonly enableKeyRotation?: boolean;
|
|
532
|
+
|
|
533
|
+
/**
|
|
534
|
+
* Whether to export Aurora engine logs to CloudWatch Logs.
|
|
535
|
+
* See https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_LogAccess.html
|
|
536
|
+
*
|
|
537
|
+
* @default false
|
|
538
|
+
*/
|
|
539
|
+
readonly enableCloudwatchLogs?: boolean;
|
|
540
|
+
|
|
541
|
+
/**
|
|
542
|
+
* Whether to enable Performance Insights on the Aurora writer instance.
|
|
543
|
+
*
|
|
544
|
+
* @default true
|
|
545
|
+
*/
|
|
546
|
+
readonly enablePerformanceInsights?: boolean;
|
|
666
547
|
}
|
|
667
548
|
|
|
668
549
|
/**
|
|
@@ -692,6 +573,8 @@ export abstract class AuroraDatabase extends Construct {
|
|
|
692
573
|
deletionProtection = true,
|
|
693
574
|
removalPolicy = RemovalPolicy.RETAIN,
|
|
694
575
|
enableKeyRotation = true,
|
|
576
|
+
enableCloudwatchLogs = false,
|
|
577
|
+
enablePerformanceInsights = true,
|
|
695
578
|
engine,
|
|
696
579
|
engineVersion,
|
|
697
580
|
...clusterProps
|
|
@@ -707,12 +590,24 @@ export abstract class AuroraDatabase extends Construct {
|
|
|
707
590
|
vpc,
|
|
708
591
|
vpcSubnets,
|
|
709
592
|
engine: engine.clusterEngine(engineVersion ?? engine.defaultVersion),
|
|
710
|
-
writer:
|
|
593
|
+
writer:
|
|
594
|
+
writer ??
|
|
595
|
+
ClusterInstance.serverlessV2('writer', {
|
|
596
|
+
enablePerformanceInsights,
|
|
597
|
+
performanceInsightEncryptionKey: enablePerformanceInsights
|
|
598
|
+
? key
|
|
599
|
+
: undefined,
|
|
600
|
+
}),
|
|
711
601
|
credentials: Credentials.fromGeneratedSecret(adminUser, {
|
|
712
602
|
encryptionKey: key,
|
|
713
603
|
}),
|
|
714
604
|
iamAuthentication: true,
|
|
715
605
|
monitoringInterval: Duration.seconds(5),
|
|
606
|
+
cloudwatchLogsExports: enableCloudwatchLogs
|
|
607
|
+
? engine.type === 'mysql'
|
|
608
|
+
? ['audit', 'error', 'general', 'slowquery']
|
|
609
|
+
: ['postgresql']
|
|
610
|
+
: undefined,
|
|
716
611
|
defaultDatabaseName: databaseName,
|
|
717
612
|
storageEncrypted: true,
|
|
718
613
|
storageEncryptionKey: key,
|
|
@@ -874,17 +769,14 @@ export abstract class AuroraDatabase extends Construct {
|
|
|
874
769
|
|
|
875
770
|
exports[`ts#rdb generator > should add mysql prisma dependencies when engine is MySQL 2`] = `
|
|
876
771
|
"import { defineConfig } from 'prisma/config';
|
|
772
|
+
import { readFileSync } from 'fs';
|
|
877
773
|
|
|
878
774
|
const getDatabaseUrl = async () => {
|
|
879
775
|
if (process.env.SERVE_LOCAL === 'true') {
|
|
880
|
-
const {
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
LOCAL_DB_PORT,
|
|
885
|
-
LOCAL_DB_USER,
|
|
886
|
-
} = await import('./src/constants.js');
|
|
887
|
-
return \`mysql://\${LOCAL_DB_USER}:\${LOCAL_DB_PASSWORD}@\${LOCAL_DB_HOST}:\${LOCAL_DB_PORT}/\${LOCAL_DB_NAME}\`;
|
|
776
|
+
const { host, port, dbName, dbUser, dbPassword } = JSON.parse(
|
|
777
|
+
readFileSync('config.json', 'utf-8'),
|
|
778
|
+
).serveLocal;
|
|
779
|
+
return \`mysql://\${dbUser}:\${dbPassword}@\${host}:\${port}/\${dbName}\`;
|
|
888
780
|
}
|
|
889
781
|
return process.env.DATABASE_URL;
|
|
890
782
|
};
|
|
@@ -1063,10 +955,19 @@ variable "tags" {
|
|
|
1063
955
|
default = {}
|
|
1064
956
|
}
|
|
1065
957
|
|
|
958
|
+
# Suffix appended to physical resource names so that multiple deployments
|
|
959
|
+
# (e.g. separate environments in the same account and region) don't collide.
|
|
960
|
+
resource "random_string" "suffix" {
|
|
961
|
+
length = 8
|
|
962
|
+
special = false
|
|
963
|
+
upper = false
|
|
964
|
+
}
|
|
965
|
+
|
|
1066
966
|
locals {
|
|
1067
967
|
default_port = var.engine == "aurora-mysql" ? 3306 : 5432
|
|
1068
968
|
default_engine_version = var.engine == "aurora-mysql" ? "8.0.mysql_aurora.3.12.0" : "17.7"
|
|
1069
969
|
parameter_group_family = var.engine == "aurora-mysql" ? "aurora-mysql8.0" : "aurora-postgresql\${split(".", coalesce(var.engine_version, local.default_engine_version))[0]}"
|
|
970
|
+
cluster_name = "\${var.name}-aurora-\${random_string.suffix.result}"
|
|
1070
971
|
}
|
|
1071
972
|
|
|
1072
973
|
resource "aws_rds_cluster_parameter_group" "database" {
|
|
@@ -1164,7 +1065,7 @@ resource "aws_security_group" "database" {
|
|
|
1164
1065
|
}
|
|
1165
1066
|
|
|
1166
1067
|
resource "aws_db_subnet_group" "database" {
|
|
1167
|
-
name =
|
|
1068
|
+
name = local.cluster_name
|
|
1168
1069
|
subnet_ids = var.subnet_ids
|
|
1169
1070
|
|
|
1170
1071
|
tags = merge(var.tags, {
|
|
@@ -1204,7 +1105,7 @@ resource "aws_secretsmanager_secret_version" "credentials" {
|
|
|
1204
1105
|
resource "aws_rds_cluster" "database" {
|
|
1205
1106
|
#checkov:skip=CKV2_AWS_27:Query logging can be enabled with enable_cloudwatch_logs; this module defaults to CDK-equivalent behavior unless logging is requested
|
|
1206
1107
|
#checkov:skip=CKV_AWS_139:Deletion protection is enabled but checkov is unable to detect it correctly
|
|
1207
|
-
cluster_identifier =
|
|
1108
|
+
cluster_identifier = local.cluster_name
|
|
1208
1109
|
engine = var.engine
|
|
1209
1110
|
engine_version = coalesce(var.engine_version, local.default_engine_version)
|
|
1210
1111
|
database_name = var.database_name
|
|
@@ -1218,7 +1119,7 @@ resource "aws_rds_cluster" "database" {
|
|
|
1218
1119
|
kms_key_id = aws_kms_key.database.arn
|
|
1219
1120
|
deletion_protection = var.deletion_protection
|
|
1220
1121
|
skip_final_snapshot = var.skip_final_snapshot
|
|
1221
|
-
final_snapshot_identifier = var.skip_final_snapshot ? null : "\${
|
|
1122
|
+
final_snapshot_identifier = var.skip_final_snapshot ? null : "\${local.cluster_name}-final-snapshot"
|
|
1222
1123
|
iam_database_authentication_enabled = true
|
|
1223
1124
|
monitoring_interval = 5
|
|
1224
1125
|
monitoring_role_arn = aws_iam_role.enhanced_monitoring.arn
|
|
@@ -1238,7 +1139,7 @@ resource "aws_rds_cluster" "database" {
|
|
|
1238
1139
|
resource "aws_rds_cluster_instance" "database" {
|
|
1239
1140
|
count = var.instance_count
|
|
1240
1141
|
|
|
1241
|
-
identifier = "\${
|
|
1142
|
+
identifier = "\${local.cluster_name}-\${count.index + 1}"
|
|
1242
1143
|
cluster_identifier = aws_rds_cluster.database.id
|
|
1243
1144
|
instance_class = "db.serverless"
|
|
1244
1145
|
engine = aws_rds_cluster.database.engine
|
|
@@ -1292,7 +1193,7 @@ resource "aws_vpc_security_group_ingress_rule" "rotation_to_database" {
|
|
|
1292
1193
|
resource "aws_cloudformation_stack" "credentials_rotation" {
|
|
1293
1194
|
#checkov:skip=CKV_AWS_124:SNS event notifications are not required for the credentials rotation stack
|
|
1294
1195
|
count = var.enable_credential_rotation ? 1 : 0
|
|
1295
|
-
name = "\${
|
|
1196
|
+
name = "\${local.cluster_name}-credentials-rotation"
|
|
1296
1197
|
|
|
1297
1198
|
capabilities = ["CAPABILITY_IAM", "CAPABILITY_AUTO_EXPAND"]
|
|
1298
1199
|
|
|
@@ -1306,7 +1207,7 @@ resource "aws_cloudformation_stack" "credentials_rotation" {
|
|
|
1306
1207
|
SecretId = aws_secretsmanager_secret.credentials.arn
|
|
1307
1208
|
HostedRotationLambda = {
|
|
1308
1209
|
RotationType = var.engine == "aurora-mysql" ? "MySQLSingleUser" : "PostgreSQLSingleUser"
|
|
1309
|
-
RotationLambdaName = "\${
|
|
1210
|
+
RotationLambdaName = "\${local.cluster_name}-credentials-rotation"
|
|
1310
1211
|
VpcSecurityGroupIds = aws_security_group.rotation[0].id
|
|
1311
1212
|
VpcSubnetIds = join(",", var.lambda_subnet_ids)
|
|
1312
1213
|
}
|
|
@@ -1386,7 +1287,7 @@ resource "aws_security_group" "proxy" {
|
|
|
1386
1287
|
resource "aws_db_proxy" "aurora" {
|
|
1387
1288
|
count = var.enable_rds_proxy ? 1 : 0
|
|
1388
1289
|
|
|
1389
|
-
name = "\${var.name}-proxy"
|
|
1290
|
+
name = "\${var.name}-proxy-\${random_string.suffix.result}"
|
|
1390
1291
|
default_auth_scheme = "IAM_AUTH"
|
|
1391
1292
|
engine_family = var.engine == "aurora-mysql" ? "MYSQL" : "POSTGRESQL"
|
|
1392
1293
|
role_arn = aws_iam_role.proxy[0].arn
|
|
@@ -1435,9 +1336,9 @@ resource "null_resource" "proxy_target_ready" {
|
|
|
1435
1336
|
deadline=$((start_time + 600))
|
|
1436
1337
|
while true; do
|
|
1437
1338
|
target_state=$(aws rds describe-db-proxy-targets \\
|
|
1438
|
-
--region
|
|
1439
|
-
--db-proxy-name
|
|
1440
|
-
--target-group-name
|
|
1339
|
+
--region "$AWS_REGION" \\
|
|
1340
|
+
--db-proxy-name "$DB_PROXY_NAME" \\
|
|
1341
|
+
--target-group-name "$TARGET_GROUP_NAME" \\
|
|
1441
1342
|
--query "Targets[?Type=='RDS_INSTANCE'] | [0].TargetHealth.State" \\
|
|
1442
1343
|
--output text)
|
|
1443
1344
|
|
|
@@ -1447,13 +1348,19 @@ resource "null_resource" "proxy_target_ready" {
|
|
|
1447
1348
|
|
|
1448
1349
|
current_time=$(date +%s)
|
|
1449
1350
|
if [ "$current_time" -ge "$deadline" ]; then
|
|
1450
|
-
echo "RDS Proxy target
|
|
1351
|
+
echo "RDS Proxy target $DB_CLUSTER_IDENTIFIER did not become AVAILABLE within 10 minutes. Last state: $target_state"
|
|
1451
1352
|
exit 1
|
|
1452
1353
|
fi
|
|
1453
1354
|
|
|
1454
1355
|
sleep 10
|
|
1455
1356
|
done
|
|
1456
1357
|
EOT
|
|
1358
|
+
environment = {
|
|
1359
|
+
AWS_REGION = data.aws_region.current.region
|
|
1360
|
+
DB_PROXY_NAME = self.triggers.db_proxy_name
|
|
1361
|
+
TARGET_GROUP_NAME = self.triggers.target_group_name
|
|
1362
|
+
DB_CLUSTER_IDENTIFIER = self.triggers.db_cluster_identifier
|
|
1363
|
+
}
|
|
1457
1364
|
}
|
|
1458
1365
|
|
|
1459
1366
|
depends_on = [
|
|
@@ -1532,7 +1439,7 @@ resource "aws_iam_role_policy_attachment" "backup" {
|
|
|
1532
1439
|
resource "aws_backup_vault" "database" {
|
|
1533
1440
|
count = var.enable_backup ? 1 : 0
|
|
1534
1441
|
|
|
1535
|
-
name = "\${
|
|
1442
|
+
name = "\${local.cluster_name}-backup"
|
|
1536
1443
|
kms_key_arn = aws_kms_key.database.arn
|
|
1537
1444
|
tags = var.tags
|
|
1538
1445
|
}
|
|
@@ -1540,7 +1447,7 @@ resource "aws_backup_vault" "database" {
|
|
|
1540
1447
|
resource "aws_backup_plan" "database" {
|
|
1541
1448
|
count = var.enable_backup ? 1 : 0
|
|
1542
1449
|
|
|
1543
|
-
name = "\${
|
|
1450
|
+
name = "\${local.cluster_name}-backup"
|
|
1544
1451
|
|
|
1545
1452
|
rule {
|
|
1546
1453
|
rule_name = "daily-backup"
|
|
@@ -1791,10 +1698,12 @@ resource "random_string" "suffix" {
|
|
|
1791
1698
|
}
|
|
1792
1699
|
|
|
1793
1700
|
locals {
|
|
1794
|
-
|
|
1795
|
-
|
|
1701
|
+
config = jsondecode(file("\${path.module}/../../../../../../../packages/db/config.json"))
|
|
1702
|
+
runtime_config_key = local.config.runtimeConfigKey
|
|
1703
|
+
create_db_user_bundle_path = "\${path.module}/../../../../../../../dist/packages/db/bundle/create-db-user"
|
|
1704
|
+
migration_function_name = "db-migration-\${random_string.suffix.result}"
|
|
1796
1705
|
create_db_user_function_name = "db-create-db-user-\${random_string.suffix.result}"
|
|
1797
|
-
database_runtime_user
|
|
1706
|
+
database_runtime_user = "db_\${random_string.suffix.result}"
|
|
1798
1707
|
}
|
|
1799
1708
|
|
|
1800
1709
|
module "aurora" {
|
|
@@ -1860,7 +1769,7 @@ module "add_rdb_to_runtime_config" {
|
|
|
1860
1769
|
source = "../../../core/runtime-config/entry"
|
|
1861
1770
|
|
|
1862
1771
|
namespace = "database"
|
|
1863
|
-
key =
|
|
1772
|
+
key = local.runtime_config_key
|
|
1864
1773
|
value = {
|
|
1865
1774
|
hostname = module.aurora.cluster_endpoint
|
|
1866
1775
|
port = module.aurora.cluster_port
|
|
@@ -1873,9 +1782,8 @@ module "add_rdb_to_runtime_config" {
|
|
|
1873
1782
|
|
|
1874
1783
|
resource "aws_ecr_repository" "migration_handler" {
|
|
1875
1784
|
#checkov:skip=CKV_AWS_136:AES256 encryption is sufficient for ECR repositories
|
|
1876
|
-
#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
|
|
1877
1785
|
name = "db-migration-\${random_string.suffix.result}"
|
|
1878
|
-
image_tag_mutability = "
|
|
1786
|
+
image_tag_mutability = "IMMUTABLE"
|
|
1879
1787
|
force_delete = true
|
|
1880
1788
|
|
|
1881
1789
|
image_scanning_configuration {
|
|
@@ -1926,19 +1834,31 @@ data "external" "docker_digest" {
|
|
|
1926
1834
|
program = ["sh", "-c", "echo '{\\"digest\\":\\"'$(docker inspect \${var.docker_image_tag} --format '{{.Id}}')'\\"}' "]
|
|
1927
1835
|
}
|
|
1928
1836
|
|
|
1837
|
+
locals {
|
|
1838
|
+
# Content-based, immutable image tag derived from the local image digest
|
|
1839
|
+
image_tag = replace(data.external.docker_digest.result.digest, "sha256:", "")
|
|
1840
|
+
}
|
|
1841
|
+
|
|
1929
1842
|
resource "null_resource" "docker_publish" {
|
|
1930
1843
|
triggers = {
|
|
1931
1844
|
docker_digest = data.external.docker_digest.result.digest
|
|
1932
1845
|
repository_url = aws_ecr_repository.migration_handler.repository_url
|
|
1933
1846
|
docker_image_tag = var.docker_image_tag
|
|
1847
|
+
image_tag = local.image_tag
|
|
1934
1848
|
}
|
|
1935
1849
|
|
|
1936
1850
|
provisioner "local-exec" {
|
|
1937
1851
|
command = <<-EOT
|
|
1938
|
-
aws ecr get-login-password --region
|
|
1939
|
-
docker tag
|
|
1940
|
-
docker push
|
|
1852
|
+
aws ecr get-login-password --region "$AWS_REGION" | docker login --username AWS --password-stdin "$REPOSITORY_URL"
|
|
1853
|
+
docker tag "$DOCKER_IMAGE_TAG" "$REPOSITORY_URL:$IMAGE_TAG"
|
|
1854
|
+
docker push "$REPOSITORY_URL:$IMAGE_TAG"
|
|
1941
1855
|
EOT
|
|
1856
|
+
environment = {
|
|
1857
|
+
AWS_REGION = data.aws_region.current.region
|
|
1858
|
+
REPOSITORY_URL = self.triggers.repository_url
|
|
1859
|
+
DOCKER_IMAGE_TAG = self.triggers.docker_image_tag
|
|
1860
|
+
IMAGE_TAG = self.triggers.image_tag
|
|
1861
|
+
}
|
|
1942
1862
|
}
|
|
1943
1863
|
|
|
1944
1864
|
depends_on = [aws_ecr_repository_policy.migration_handler]
|
|
@@ -2196,10 +2116,10 @@ resource "null_resource" "create_db_user_trigger" {
|
|
|
2196
2116
|
command = <<-EOT
|
|
2197
2117
|
output_file=$(mktemp)
|
|
2198
2118
|
response=$(aws lambda invoke \\
|
|
2199
|
-
--region
|
|
2200
|
-
--function-name
|
|
2119
|
+
--region "$AWS_REGION" \\
|
|
2120
|
+
--function-name "$FUNCTION_NAME" \\
|
|
2201
2121
|
--cli-binary-format raw-in-base64-out \\
|
|
2202
|
-
--payload
|
|
2122
|
+
--payload "{\\"RequestType\\":\\"Create\\",\\"PhysicalResourceId\\":\\"db-user:$DB_USER\\"}" \\
|
|
2203
2123
|
"$output_file")
|
|
2204
2124
|
cat "$output_file"
|
|
2205
2125
|
echo "$response"
|
|
@@ -2209,6 +2129,11 @@ resource "null_resource" "create_db_user_trigger" {
|
|
|
2209
2129
|
fi
|
|
2210
2130
|
rm -f "$output_file"
|
|
2211
2131
|
EOT
|
|
2132
|
+
environment = {
|
|
2133
|
+
AWS_REGION = data.aws_region.current.region
|
|
2134
|
+
FUNCTION_NAME = self.triggers.function_name
|
|
2135
|
+
DB_USER = self.triggers.db_user
|
|
2136
|
+
}
|
|
2212
2137
|
}
|
|
2213
2138
|
|
|
2214
2139
|
depends_on = [aws_lambda_function.create_db_user, module.aurora]
|
|
@@ -2222,7 +2147,7 @@ resource "aws_lambda_function" "migration_handler" {
|
|
|
2222
2147
|
package_type = "Image"
|
|
2223
2148
|
function_name = local.migration_function_name
|
|
2224
2149
|
role = aws_iam_role.migration_handler.arn
|
|
2225
|
-
image_uri = "\${aws_ecr_repository.migration_handler.repository_url}
|
|
2150
|
+
image_uri = "\${aws_ecr_repository.migration_handler.repository_url}:\${local.image_tag}"
|
|
2226
2151
|
memory_size = 1024
|
|
2227
2152
|
timeout = 300
|
|
2228
2153
|
architectures = ["arm64"]
|
|
@@ -2271,8 +2196,8 @@ resource "null_resource" "migration_trigger" {
|
|
|
2271
2196
|
command = <<-EOT
|
|
2272
2197
|
output_file=$(mktemp)
|
|
2273
2198
|
response=$(aws lambda invoke \\
|
|
2274
|
-
--region
|
|
2275
|
-
--function-name
|
|
2199
|
+
--region "$AWS_REGION" \\
|
|
2200
|
+
--function-name "$FUNCTION_NAME" \\
|
|
2276
2201
|
--cli-binary-format raw-in-base64-out \\
|
|
2277
2202
|
"$output_file")
|
|
2278
2203
|
cat "$output_file"
|
|
@@ -2283,6 +2208,10 @@ resource "null_resource" "migration_trigger" {
|
|
|
2283
2208
|
fi
|
|
2284
2209
|
rm -f "$output_file"
|
|
2285
2210
|
EOT
|
|
2211
|
+
environment = {
|
|
2212
|
+
AWS_REGION = data.aws_region.current.region
|
|
2213
|
+
FUNCTION_NAME = self.triggers.function_name
|
|
2214
|
+
}
|
|
2286
2215
|
}
|
|
2287
2216
|
|
|
2288
2217
|
depends_on = [
|
|
@@ -2513,10 +2442,19 @@ variable "tags" {
|
|
|
2513
2442
|
default = {}
|
|
2514
2443
|
}
|
|
2515
2444
|
|
|
2445
|
+
# Suffix appended to physical resource names so that multiple deployments
|
|
2446
|
+
# (e.g. separate environments in the same account and region) don't collide.
|
|
2447
|
+
resource "random_string" "suffix" {
|
|
2448
|
+
length = 8
|
|
2449
|
+
special = false
|
|
2450
|
+
upper = false
|
|
2451
|
+
}
|
|
2452
|
+
|
|
2516
2453
|
locals {
|
|
2517
2454
|
default_port = var.engine == "aurora-mysql" ? 3306 : 5432
|
|
2518
2455
|
default_engine_version = var.engine == "aurora-mysql" ? "8.0.mysql_aurora.3.12.0" : "17.7"
|
|
2519
2456
|
parameter_group_family = var.engine == "aurora-mysql" ? "aurora-mysql8.0" : "aurora-postgresql\${split(".", coalesce(var.engine_version, local.default_engine_version))[0]}"
|
|
2457
|
+
cluster_name = "\${var.name}-aurora-\${random_string.suffix.result}"
|
|
2520
2458
|
}
|
|
2521
2459
|
|
|
2522
2460
|
resource "aws_rds_cluster_parameter_group" "database" {
|
|
@@ -2614,7 +2552,7 @@ resource "aws_security_group" "database" {
|
|
|
2614
2552
|
}
|
|
2615
2553
|
|
|
2616
2554
|
resource "aws_db_subnet_group" "database" {
|
|
2617
|
-
name =
|
|
2555
|
+
name = local.cluster_name
|
|
2618
2556
|
subnet_ids = var.subnet_ids
|
|
2619
2557
|
|
|
2620
2558
|
tags = merge(var.tags, {
|
|
@@ -2654,7 +2592,7 @@ resource "aws_secretsmanager_secret_version" "credentials" {
|
|
|
2654
2592
|
resource "aws_rds_cluster" "database" {
|
|
2655
2593
|
#checkov:skip=CKV2_AWS_27:Query logging can be enabled with enable_cloudwatch_logs; this module defaults to CDK-equivalent behavior unless logging is requested
|
|
2656
2594
|
#checkov:skip=CKV_AWS_139:Deletion protection is enabled but checkov is unable to detect it correctly
|
|
2657
|
-
cluster_identifier =
|
|
2595
|
+
cluster_identifier = local.cluster_name
|
|
2658
2596
|
engine = var.engine
|
|
2659
2597
|
engine_version = coalesce(var.engine_version, local.default_engine_version)
|
|
2660
2598
|
database_name = var.database_name
|
|
@@ -2668,7 +2606,7 @@ resource "aws_rds_cluster" "database" {
|
|
|
2668
2606
|
kms_key_id = aws_kms_key.database.arn
|
|
2669
2607
|
deletion_protection = var.deletion_protection
|
|
2670
2608
|
skip_final_snapshot = var.skip_final_snapshot
|
|
2671
|
-
final_snapshot_identifier = var.skip_final_snapshot ? null : "\${
|
|
2609
|
+
final_snapshot_identifier = var.skip_final_snapshot ? null : "\${local.cluster_name}-final-snapshot"
|
|
2672
2610
|
iam_database_authentication_enabled = true
|
|
2673
2611
|
monitoring_interval = 5
|
|
2674
2612
|
monitoring_role_arn = aws_iam_role.enhanced_monitoring.arn
|
|
@@ -2688,7 +2626,7 @@ resource "aws_rds_cluster" "database" {
|
|
|
2688
2626
|
resource "aws_rds_cluster_instance" "database" {
|
|
2689
2627
|
count = var.instance_count
|
|
2690
2628
|
|
|
2691
|
-
identifier = "\${
|
|
2629
|
+
identifier = "\${local.cluster_name}-\${count.index + 1}"
|
|
2692
2630
|
cluster_identifier = aws_rds_cluster.database.id
|
|
2693
2631
|
instance_class = "db.serverless"
|
|
2694
2632
|
engine = aws_rds_cluster.database.engine
|
|
@@ -2742,7 +2680,7 @@ resource "aws_vpc_security_group_ingress_rule" "rotation_to_database" {
|
|
|
2742
2680
|
resource "aws_cloudformation_stack" "credentials_rotation" {
|
|
2743
2681
|
#checkov:skip=CKV_AWS_124:SNS event notifications are not required for the credentials rotation stack
|
|
2744
2682
|
count = var.enable_credential_rotation ? 1 : 0
|
|
2745
|
-
name = "\${
|
|
2683
|
+
name = "\${local.cluster_name}-credentials-rotation"
|
|
2746
2684
|
|
|
2747
2685
|
capabilities = ["CAPABILITY_IAM", "CAPABILITY_AUTO_EXPAND"]
|
|
2748
2686
|
|
|
@@ -2756,7 +2694,7 @@ resource "aws_cloudformation_stack" "credentials_rotation" {
|
|
|
2756
2694
|
SecretId = aws_secretsmanager_secret.credentials.arn
|
|
2757
2695
|
HostedRotationLambda = {
|
|
2758
2696
|
RotationType = var.engine == "aurora-mysql" ? "MySQLSingleUser" : "PostgreSQLSingleUser"
|
|
2759
|
-
RotationLambdaName = "\${
|
|
2697
|
+
RotationLambdaName = "\${local.cluster_name}-credentials-rotation"
|
|
2760
2698
|
VpcSecurityGroupIds = aws_security_group.rotation[0].id
|
|
2761
2699
|
VpcSubnetIds = join(",", var.lambda_subnet_ids)
|
|
2762
2700
|
}
|
|
@@ -2836,7 +2774,7 @@ resource "aws_security_group" "proxy" {
|
|
|
2836
2774
|
resource "aws_db_proxy" "aurora" {
|
|
2837
2775
|
count = var.enable_rds_proxy ? 1 : 0
|
|
2838
2776
|
|
|
2839
|
-
name = "\${var.name}-proxy"
|
|
2777
|
+
name = "\${var.name}-proxy-\${random_string.suffix.result}"
|
|
2840
2778
|
default_auth_scheme = "IAM_AUTH"
|
|
2841
2779
|
engine_family = var.engine == "aurora-mysql" ? "MYSQL" : "POSTGRESQL"
|
|
2842
2780
|
role_arn = aws_iam_role.proxy[0].arn
|
|
@@ -2885,9 +2823,9 @@ resource "null_resource" "proxy_target_ready" {
|
|
|
2885
2823
|
deadline=$((start_time + 600))
|
|
2886
2824
|
while true; do
|
|
2887
2825
|
target_state=$(aws rds describe-db-proxy-targets \\
|
|
2888
|
-
--region
|
|
2889
|
-
--db-proxy-name
|
|
2890
|
-
--target-group-name
|
|
2826
|
+
--region "$AWS_REGION" \\
|
|
2827
|
+
--db-proxy-name "$DB_PROXY_NAME" \\
|
|
2828
|
+
--target-group-name "$TARGET_GROUP_NAME" \\
|
|
2891
2829
|
--query "Targets[?Type=='RDS_INSTANCE'] | [0].TargetHealth.State" \\
|
|
2892
2830
|
--output text)
|
|
2893
2831
|
|
|
@@ -2897,13 +2835,19 @@ resource "null_resource" "proxy_target_ready" {
|
|
|
2897
2835
|
|
|
2898
2836
|
current_time=$(date +%s)
|
|
2899
2837
|
if [ "$current_time" -ge "$deadline" ]; then
|
|
2900
|
-
echo "RDS Proxy target
|
|
2838
|
+
echo "RDS Proxy target $DB_CLUSTER_IDENTIFIER did not become AVAILABLE within 10 minutes. Last state: $target_state"
|
|
2901
2839
|
exit 1
|
|
2902
2840
|
fi
|
|
2903
2841
|
|
|
2904
2842
|
sleep 10
|
|
2905
2843
|
done
|
|
2906
2844
|
EOT
|
|
2845
|
+
environment = {
|
|
2846
|
+
AWS_REGION = data.aws_region.current.region
|
|
2847
|
+
DB_PROXY_NAME = self.triggers.db_proxy_name
|
|
2848
|
+
TARGET_GROUP_NAME = self.triggers.target_group_name
|
|
2849
|
+
DB_CLUSTER_IDENTIFIER = self.triggers.db_cluster_identifier
|
|
2850
|
+
}
|
|
2907
2851
|
}
|
|
2908
2852
|
|
|
2909
2853
|
depends_on = [
|
|
@@ -2982,7 +2926,7 @@ resource "aws_iam_role_policy_attachment" "backup" {
|
|
|
2982
2926
|
resource "aws_backup_vault" "database" {
|
|
2983
2927
|
count = var.enable_backup ? 1 : 0
|
|
2984
2928
|
|
|
2985
|
-
name = "\${
|
|
2929
|
+
name = "\${local.cluster_name}-backup"
|
|
2986
2930
|
kms_key_arn = aws_kms_key.database.arn
|
|
2987
2931
|
tags = var.tags
|
|
2988
2932
|
}
|
|
@@ -2990,7 +2934,7 @@ resource "aws_backup_vault" "database" {
|
|
|
2990
2934
|
resource "aws_backup_plan" "database" {
|
|
2991
2935
|
count = var.enable_backup ? 1 : 0
|
|
2992
2936
|
|
|
2993
|
-
name = "\${
|
|
2937
|
+
name = "\${local.cluster_name}-backup"
|
|
2994
2938
|
|
|
2995
2939
|
rule {
|
|
2996
2940
|
rule_name = "daily-backup"
|
|
@@ -3241,10 +3185,12 @@ resource "random_string" "suffix" {
|
|
|
3241
3185
|
}
|
|
3242
3186
|
|
|
3243
3187
|
locals {
|
|
3244
|
-
|
|
3245
|
-
|
|
3188
|
+
config = jsondecode(file("\${path.module}/../../../../../../../packages/db/config.json"))
|
|
3189
|
+
runtime_config_key = local.config.runtimeConfigKey
|
|
3190
|
+
create_db_user_bundle_path = "\${path.module}/../../../../../../../dist/packages/db/bundle/create-db-user"
|
|
3191
|
+
migration_function_name = "db-migration-\${random_string.suffix.result}"
|
|
3246
3192
|
create_db_user_function_name = "db-create-db-user-\${random_string.suffix.result}"
|
|
3247
|
-
database_runtime_user
|
|
3193
|
+
database_runtime_user = "db_\${random_string.suffix.result}"
|
|
3248
3194
|
}
|
|
3249
3195
|
|
|
3250
3196
|
module "aurora" {
|
|
@@ -3310,7 +3256,7 @@ module "add_rdb_to_runtime_config" {
|
|
|
3310
3256
|
source = "../../../core/runtime-config/entry"
|
|
3311
3257
|
|
|
3312
3258
|
namespace = "database"
|
|
3313
|
-
key =
|
|
3259
|
+
key = local.runtime_config_key
|
|
3314
3260
|
value = {
|
|
3315
3261
|
hostname = module.aurora.cluster_endpoint
|
|
3316
3262
|
port = module.aurora.cluster_port
|
|
@@ -3323,9 +3269,8 @@ module "add_rdb_to_runtime_config" {
|
|
|
3323
3269
|
|
|
3324
3270
|
resource "aws_ecr_repository" "migration_handler" {
|
|
3325
3271
|
#checkov:skip=CKV_AWS_136:AES256 encryption is sufficient for ECR repositories
|
|
3326
|
-
#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
|
|
3327
3272
|
name = "db-migration-\${random_string.suffix.result}"
|
|
3328
|
-
image_tag_mutability = "
|
|
3273
|
+
image_tag_mutability = "IMMUTABLE"
|
|
3329
3274
|
force_delete = true
|
|
3330
3275
|
|
|
3331
3276
|
image_scanning_configuration {
|
|
@@ -3376,19 +3321,31 @@ data "external" "docker_digest" {
|
|
|
3376
3321
|
program = ["sh", "-c", "echo '{\\"digest\\":\\"'$(docker inspect \${var.docker_image_tag} --format '{{.Id}}')'\\"}' "]
|
|
3377
3322
|
}
|
|
3378
3323
|
|
|
3324
|
+
locals {
|
|
3325
|
+
# Content-based, immutable image tag derived from the local image digest
|
|
3326
|
+
image_tag = replace(data.external.docker_digest.result.digest, "sha256:", "")
|
|
3327
|
+
}
|
|
3328
|
+
|
|
3379
3329
|
resource "null_resource" "docker_publish" {
|
|
3380
3330
|
triggers = {
|
|
3381
3331
|
docker_digest = data.external.docker_digest.result.digest
|
|
3382
3332
|
repository_url = aws_ecr_repository.migration_handler.repository_url
|
|
3383
3333
|
docker_image_tag = var.docker_image_tag
|
|
3334
|
+
image_tag = local.image_tag
|
|
3384
3335
|
}
|
|
3385
3336
|
|
|
3386
3337
|
provisioner "local-exec" {
|
|
3387
3338
|
command = <<-EOT
|
|
3388
|
-
aws ecr get-login-password --region
|
|
3389
|
-
docker tag
|
|
3390
|
-
docker push
|
|
3339
|
+
aws ecr get-login-password --region "$AWS_REGION" | docker login --username AWS --password-stdin "$REPOSITORY_URL"
|
|
3340
|
+
docker tag "$DOCKER_IMAGE_TAG" "$REPOSITORY_URL:$IMAGE_TAG"
|
|
3341
|
+
docker push "$REPOSITORY_URL:$IMAGE_TAG"
|
|
3391
3342
|
EOT
|
|
3343
|
+
environment = {
|
|
3344
|
+
AWS_REGION = data.aws_region.current.region
|
|
3345
|
+
REPOSITORY_URL = self.triggers.repository_url
|
|
3346
|
+
DOCKER_IMAGE_TAG = self.triggers.docker_image_tag
|
|
3347
|
+
IMAGE_TAG = self.triggers.image_tag
|
|
3348
|
+
}
|
|
3392
3349
|
}
|
|
3393
3350
|
|
|
3394
3351
|
depends_on = [aws_ecr_repository_policy.migration_handler]
|
|
@@ -3651,10 +3608,10 @@ resource "null_resource" "create_db_user_trigger" {
|
|
|
3651
3608
|
command = <<-EOT
|
|
3652
3609
|
output_file=$(mktemp)
|
|
3653
3610
|
response=$(aws lambda invoke \\
|
|
3654
|
-
--region
|
|
3655
|
-
--function-name
|
|
3611
|
+
--region "$AWS_REGION" \\
|
|
3612
|
+
--function-name "$FUNCTION_NAME" \\
|
|
3656
3613
|
--cli-binary-format raw-in-base64-out \\
|
|
3657
|
-
--payload
|
|
3614
|
+
--payload "{\\"RequestType\\":\\"Create\\",\\"PhysicalResourceId\\":\\"db-user:$DB_USER\\"}" \\
|
|
3658
3615
|
"$output_file")
|
|
3659
3616
|
cat "$output_file"
|
|
3660
3617
|
echo "$response"
|
|
@@ -3664,6 +3621,11 @@ resource "null_resource" "create_db_user_trigger" {
|
|
|
3664
3621
|
fi
|
|
3665
3622
|
rm -f "$output_file"
|
|
3666
3623
|
EOT
|
|
3624
|
+
environment = {
|
|
3625
|
+
AWS_REGION = data.aws_region.current.region
|
|
3626
|
+
FUNCTION_NAME = self.triggers.function_name
|
|
3627
|
+
DB_USER = self.triggers.db_user
|
|
3628
|
+
}
|
|
3667
3629
|
}
|
|
3668
3630
|
|
|
3669
3631
|
depends_on = [aws_lambda_function.create_db_user, module.aurora]
|
|
@@ -3677,7 +3639,7 @@ resource "aws_lambda_function" "migration_handler" {
|
|
|
3677
3639
|
package_type = "Image"
|
|
3678
3640
|
function_name = local.migration_function_name
|
|
3679
3641
|
role = aws_iam_role.migration_handler.arn
|
|
3680
|
-
image_uri = "\${aws_ecr_repository.migration_handler.repository_url}
|
|
3642
|
+
image_uri = "\${aws_ecr_repository.migration_handler.repository_url}:\${local.image_tag}"
|
|
3681
3643
|
memory_size = 1024
|
|
3682
3644
|
timeout = 300
|
|
3683
3645
|
architectures = ["arm64"]
|
|
@@ -3722,8 +3684,8 @@ resource "null_resource" "migration_trigger" {
|
|
|
3722
3684
|
command = <<-EOT
|
|
3723
3685
|
output_file=$(mktemp)
|
|
3724
3686
|
response=$(aws lambda invoke \\
|
|
3725
|
-
--region
|
|
3726
|
-
--function-name
|
|
3687
|
+
--region "$AWS_REGION" \\
|
|
3688
|
+
--function-name "$FUNCTION_NAME" \\
|
|
3727
3689
|
--cli-binary-format raw-in-base64-out \\
|
|
3728
3690
|
"$output_file")
|
|
3729
3691
|
cat "$output_file"
|
|
@@ -3734,6 +3696,10 @@ resource "null_resource" "migration_trigger" {
|
|
|
3734
3696
|
fi
|
|
3735
3697
|
rm -f "$output_file"
|
|
3736
3698
|
EOT
|
|
3699
|
+
environment = {
|
|
3700
|
+
AWS_REGION = data.aws_region.current.region
|
|
3701
|
+
FUNCTION_NAME = self.triggers.function_name
|
|
3702
|
+
}
|
|
3737
3703
|
}
|
|
3738
3704
|
|
|
3739
3705
|
depends_on = [
|
|
@@ -3824,148 +3790,6 @@ datasource db {
|
|
|
3824
3790
|
"
|
|
3825
3791
|
`;
|
|
3826
3792
|
|
|
3827
|
-
exports[`ts#rdb generator > should generate the aurora shared construct > packages/db/scripts/docker-pull.ts 1`] = `
|
|
3828
|
-
"import { spawnSync } from 'child_process';
|
|
3829
|
-
|
|
3830
|
-
const ENGINE = 'docker';
|
|
3831
|
-
const image = process.argv[2];
|
|
3832
|
-
|
|
3833
|
-
const inspect = spawnSync(ENGINE, ['image', 'inspect', image], {
|
|
3834
|
-
stdio: 'ignore',
|
|
3835
|
-
});
|
|
3836
|
-
|
|
3837
|
-
if (inspect.status !== 0) {
|
|
3838
|
-
const pull = spawnSync(ENGINE, ['pull', image], { stdio: 'inherit' });
|
|
3839
|
-
if (pull.status !== 0) {
|
|
3840
|
-
process.exit(pull.status ?? 1);
|
|
3841
|
-
}
|
|
3842
|
-
}
|
|
3843
|
-
"
|
|
3844
|
-
`;
|
|
3845
|
-
|
|
3846
|
-
exports[`ts#rdb generator > should generate the aurora shared construct > packages/db/scripts/docker-start.ts 1`] = `
|
|
3847
|
-
"import { spawn, spawnSync } from 'child_process';
|
|
3848
|
-
|
|
3849
|
-
const ENGINE = 'docker';
|
|
3850
|
-
|
|
3851
|
-
const [containerName, image, hostPort, dbName, dbUser, dbPassword] =
|
|
3852
|
-
process.argv.slice(2);
|
|
3853
|
-
|
|
3854
|
-
const containerExists = (): boolean =>
|
|
3855
|
-
spawnSync(ENGINE, ['container', 'inspect', containerName], {
|
|
3856
|
-
stdio: 'ignore',
|
|
3857
|
-
}).status === 0;
|
|
3858
|
-
|
|
3859
|
-
const isRunning = (): boolean => {
|
|
3860
|
-
const result = spawnSync(
|
|
3861
|
-
ENGINE,
|
|
3862
|
-
['container', 'inspect', '-f', '{{.State.Running}}', containerName],
|
|
3863
|
-
{ encoding: 'utf-8' },
|
|
3864
|
-
);
|
|
3865
|
-
return result.status === 0 && result.stdout.trim() === 'true';
|
|
3866
|
-
};
|
|
3867
|
-
|
|
3868
|
-
if (containerExists()) {
|
|
3869
|
-
if (!isRunning()) {
|
|
3870
|
-
const start = spawnSync(ENGINE, ['start', containerName], {
|
|
3871
|
-
stdio: 'inherit',
|
|
3872
|
-
});
|
|
3873
|
-
if (start.status !== 0) process.exit(start.status ?? 1);
|
|
3874
|
-
}
|
|
3875
|
-
} else {
|
|
3876
|
-
const runArgs = [
|
|
3877
|
-
'run',
|
|
3878
|
-
'--name',
|
|
3879
|
-
containerName,
|
|
3880
|
-
'-e',
|
|
3881
|
-
\`POSTGRES_DB=\${dbName}\`,
|
|
3882
|
-
'-e',
|
|
3883
|
-
\`POSTGRES_USER=\${dbUser}\`,
|
|
3884
|
-
'-e',
|
|
3885
|
-
\`POSTGRES_PASSWORD=\${dbPassword}\`,
|
|
3886
|
-
'-e',
|
|
3887
|
-
\`PGDATA=/var/lib/postgresql/17/docker\`,
|
|
3888
|
-
'-p',
|
|
3889
|
-
\`\${hostPort}:5432\`,
|
|
3890
|
-
'-v',
|
|
3891
|
-
\`\${containerName}-data:/var/lib/postgresql\`,
|
|
3892
|
-
'-d',
|
|
3893
|
-
image,
|
|
3894
|
-
];
|
|
3895
|
-
const create = spawnSync(ENGINE, runArgs, { stdio: 'inherit' });
|
|
3896
|
-
if (create.status !== 0) process.exit(create.status ?? 1);
|
|
3897
|
-
}
|
|
3898
|
-
|
|
3899
|
-
const logs = spawn(ENGINE, ['logs', '-f', containerName], {
|
|
3900
|
-
stdio: ['ignore', 'inherit', 'inherit'],
|
|
3901
|
-
});
|
|
3902
|
-
|
|
3903
|
-
let exiting = false;
|
|
3904
|
-
|
|
3905
|
-
const cleanup = () => {
|
|
3906
|
-
if (exiting) return;
|
|
3907
|
-
exiting = true;
|
|
3908
|
-
spawnSync(ENGINE, ['stop', containerName], { stdio: 'ignore' });
|
|
3909
|
-
logs.kill();
|
|
3910
|
-
process.exit(0);
|
|
3911
|
-
};
|
|
3912
|
-
|
|
3913
|
-
process.on('SIGTERM', cleanup);
|
|
3914
|
-
process.on('SIGINT', cleanup);
|
|
3915
|
-
process.on('SIGHUP', cleanup);
|
|
3916
|
-
|
|
3917
|
-
logs.on('exit', (code) => {
|
|
3918
|
-
if (!exiting) process.exit(code ?? 0);
|
|
3919
|
-
});
|
|
3920
|
-
"
|
|
3921
|
-
`;
|
|
3922
|
-
|
|
3923
|
-
exports[`ts#rdb generator > should generate the aurora shared construct > packages/db/scripts/wait-for-db.ts 1`] = `
|
|
3924
|
-
"import { Client } from 'pg';
|
|
3925
|
-
|
|
3926
|
-
const noop = () => undefined;
|
|
3927
|
-
|
|
3928
|
-
const [portArg, dbArg, userArg, passwordArg] = process.argv.slice(2);
|
|
3929
|
-
const timeoutAt = Date.now() + 60000;
|
|
3930
|
-
|
|
3931
|
-
while (Date.now() < timeoutAt) {
|
|
3932
|
-
const client = new Client({
|
|
3933
|
-
host: 'localhost',
|
|
3934
|
-
port: parseInt(portArg),
|
|
3935
|
-
user: userArg,
|
|
3936
|
-
password: passwordArg,
|
|
3937
|
-
database: dbArg,
|
|
3938
|
-
connectionTimeoutMillis: 500,
|
|
3939
|
-
});
|
|
3940
|
-
client.on('error', noop);
|
|
3941
|
-
try {
|
|
3942
|
-
await client.connect();
|
|
3943
|
-
await client.end();
|
|
3944
|
-
console.log('Database is ready.');
|
|
3945
|
-
process.exit(0);
|
|
3946
|
-
} catch {
|
|
3947
|
-
console.log('Database is not ready.');
|
|
3948
|
-
await client.end().catch(noop);
|
|
3949
|
-
}
|
|
3950
|
-
await new Promise((r) => setTimeout(r, 200));
|
|
3951
|
-
}
|
|
3952
|
-
|
|
3953
|
-
throw new Error(\`Timed out waiting for postgres on port \${portArg}\`);
|
|
3954
|
-
"
|
|
3955
|
-
`;
|
|
3956
|
-
|
|
3957
|
-
exports[`ts#rdb generator > should generate the aurora shared construct > packages/db/src/constants.ts 1`] = `
|
|
3958
|
-
"export const DB_PACKAGE_NAME = 'Db';
|
|
3959
|
-
|
|
3960
|
-
// Local development connection details (used when SERVE_LOCAL=true, see serve-local Nx target)
|
|
3961
|
-
export const LOCAL_DB_PORT = 5432;
|
|
3962
|
-
export const LOCAL_DB_HOST = 'localhost';
|
|
3963
|
-
export const LOCAL_DB_NAME = 'database_name';
|
|
3964
|
-
export const LOCAL_DB_USER = 'dbadmin';
|
|
3965
|
-
export const LOCAL_DB_PASSWORD = 'password';
|
|
3966
|
-
"
|
|
3967
|
-
`;
|
|
3968
|
-
|
|
3969
3793
|
exports[`ts#rdb generator > should generate the aurora shared construct > packages/db/src/create-db-user-handler.ts 1`] = `
|
|
3970
3794
|
"import type { CloudFormationCustomResourceEvent } from 'aws-lambda';
|
|
3971
3795
|
import { randomBytes } from 'node:crypto';
|
|
@@ -4057,8 +3881,7 @@ export const handler = async (
|
|
|
4057
3881
|
`;
|
|
4058
3882
|
|
|
4059
3883
|
exports[`ts#rdb generator > should generate the aurora shared construct > packages/db/src/index.ts 1`] = `
|
|
4060
|
-
"export {
|
|
4061
|
-
export { getPrisma } from './prisma.js';
|
|
3884
|
+
"export { getPrisma } from './prisma.js';
|
|
4062
3885
|
"
|
|
4063
3886
|
`;
|
|
4064
3887
|
|
|
@@ -4110,16 +3933,20 @@ exports[`ts#rdb generator > should generate the aurora shared construct > packag
|
|
|
4110
3933
|
import { Signer } from '@aws-sdk/rds-signer';
|
|
4111
3934
|
import { Prisma, PrismaClient } from '../generated/prisma/client.js';
|
|
4112
3935
|
import { Pool } from 'pg';
|
|
4113
|
-
import {
|
|
4114
|
-
|
|
4115
|
-
|
|
4116
|
-
LOCAL_DB_NAME,
|
|
4117
|
-
LOCAL_DB_PASSWORD,
|
|
4118
|
-
LOCAL_DB_PORT,
|
|
4119
|
-
LOCAL_DB_USER,
|
|
4120
|
-
} from './constants.js';
|
|
3936
|
+
import { readFileSync } from 'fs';
|
|
3937
|
+
import { join, dirname } from 'path';
|
|
3938
|
+
import { fileURLToPath } from 'url';
|
|
4121
3939
|
import { getDatabaseConfig } from './utils.js';
|
|
4122
3940
|
|
|
3941
|
+
// Generated: must match runtimeConfigKey in config.json
|
|
3942
|
+
const runtimeConfigKey = 'Db';
|
|
3943
|
+
|
|
3944
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
3945
|
+
// config.json is only present in local dev (not included in the deployed bundle); guard with SERVE_LOCAL check
|
|
3946
|
+
const serveLocal = () =>
|
|
3947
|
+
JSON.parse(readFileSync(join(__dirname, '../config.json'), 'utf-8'))
|
|
3948
|
+
.serveLocal;
|
|
3949
|
+
|
|
4123
3950
|
let prismaClient: PrismaClient<Prisma.LogLevel> | undefined;
|
|
4124
3951
|
|
|
4125
3952
|
export const getPrisma = async <LogOpts extends Prisma.LogLevel>(
|
|
@@ -4128,13 +3955,14 @@ export const getPrisma = async <LogOpts extends Prisma.LogLevel>(
|
|
|
4128
3955
|
if (prismaClient) return prismaClient;
|
|
4129
3956
|
|
|
4130
3957
|
if (process.env.SERVE_LOCAL === 'true') {
|
|
3958
|
+
const { host, port, dbName, dbUser, dbPassword } = serveLocal();
|
|
4131
3959
|
const adapter = new PrismaPg(
|
|
4132
3960
|
new Pool({
|
|
4133
|
-
host
|
|
4134
|
-
port
|
|
4135
|
-
database:
|
|
4136
|
-
user:
|
|
4137
|
-
password:
|
|
3961
|
+
host,
|
|
3962
|
+
port,
|
|
3963
|
+
database: dbName,
|
|
3964
|
+
user: dbUser,
|
|
3965
|
+
password: dbPassword,
|
|
4138
3966
|
allowExitOnIdle: true,
|
|
4139
3967
|
}),
|
|
4140
3968
|
);
|
|
@@ -4146,7 +3974,7 @@ export const getPrisma = async <LogOpts extends Prisma.LogLevel>(
|
|
|
4146
3974
|
}
|
|
4147
3975
|
|
|
4148
3976
|
const { hostname, port, database, dbUser, region } =
|
|
4149
|
-
await getDatabaseConfig(
|
|
3977
|
+
await getDatabaseConfig(runtimeConfigKey);
|
|
4150
3978
|
const adapter = new PrismaPg(
|
|
4151
3979
|
new Pool({
|
|
4152
3980
|
host: hostname,
|
|
@@ -4508,6 +4336,21 @@ export interface AuroraDatabaseProps extends _AuroraDatabaseProps {
|
|
|
4508
4336
|
* @default true
|
|
4509
4337
|
*/
|
|
4510
4338
|
readonly enableKeyRotation?: boolean;
|
|
4339
|
+
|
|
4340
|
+
/**
|
|
4341
|
+
* Whether to export Aurora engine logs to CloudWatch Logs.
|
|
4342
|
+
* See https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_LogAccess.html
|
|
4343
|
+
*
|
|
4344
|
+
* @default false
|
|
4345
|
+
*/
|
|
4346
|
+
readonly enableCloudwatchLogs?: boolean;
|
|
4347
|
+
|
|
4348
|
+
/**
|
|
4349
|
+
* Whether to enable Performance Insights on the Aurora writer instance.
|
|
4350
|
+
*
|
|
4351
|
+
* @default true
|
|
4352
|
+
*/
|
|
4353
|
+
readonly enablePerformanceInsights?: boolean;
|
|
4511
4354
|
}
|
|
4512
4355
|
|
|
4513
4356
|
/**
|
|
@@ -4537,6 +4380,8 @@ export abstract class AuroraDatabase extends Construct {
|
|
|
4537
4380
|
deletionProtection = true,
|
|
4538
4381
|
removalPolicy = RemovalPolicy.RETAIN,
|
|
4539
4382
|
enableKeyRotation = true,
|
|
4383
|
+
enableCloudwatchLogs = false,
|
|
4384
|
+
enablePerformanceInsights = true,
|
|
4540
4385
|
engine,
|
|
4541
4386
|
engineVersion,
|
|
4542
4387
|
...clusterProps
|
|
@@ -4552,12 +4397,24 @@ export abstract class AuroraDatabase extends Construct {
|
|
|
4552
4397
|
vpc,
|
|
4553
4398
|
vpcSubnets,
|
|
4554
4399
|
engine: engine.clusterEngine(engineVersion ?? engine.defaultVersion),
|
|
4555
|
-
writer:
|
|
4400
|
+
writer:
|
|
4401
|
+
writer ??
|
|
4402
|
+
ClusterInstance.serverlessV2('writer', {
|
|
4403
|
+
enablePerformanceInsights,
|
|
4404
|
+
performanceInsightEncryptionKey: enablePerformanceInsights
|
|
4405
|
+
? key
|
|
4406
|
+
: undefined,
|
|
4407
|
+
}),
|
|
4556
4408
|
credentials: Credentials.fromGeneratedSecret(adminUser, {
|
|
4557
4409
|
encryptionKey: key,
|
|
4558
4410
|
}),
|
|
4559
4411
|
iamAuthentication: true,
|
|
4560
4412
|
monitoringInterval: Duration.seconds(5),
|
|
4413
|
+
cloudwatchLogsExports: enableCloudwatchLogs
|
|
4414
|
+
? engine.type === 'mysql'
|
|
4415
|
+
? ['audit', 'error', 'general', 'slowquery']
|
|
4416
|
+
: ['postgresql']
|
|
4417
|
+
: undefined,
|
|
4561
4418
|
defaultDatabaseName: databaseName,
|
|
4562
4419
|
storageEncrypted: true,
|
|
4563
4420
|
storageEncryptionKey: key,
|
|
@@ -4720,8 +4577,8 @@ export abstract class AuroraDatabase extends Construct {
|
|
|
4720
4577
|
exports[`ts#rdb generator > should generate the aurora shared construct 2`] = `
|
|
4721
4578
|
"import * as path from 'path';
|
|
4722
4579
|
import * as url from 'url';
|
|
4580
|
+
import { readFileSync } from 'fs';
|
|
4723
4581
|
import { Construct } from 'constructs';
|
|
4724
|
-
import { DB_PACKAGE_NAME } from ':proj/db';
|
|
4725
4582
|
import {
|
|
4726
4583
|
AuroraDatabase,
|
|
4727
4584
|
AuroraDatabaseEngines,
|
|
@@ -4729,6 +4586,16 @@ import {
|
|
|
4729
4586
|
} from '../../core/rdb/aurora.js';
|
|
4730
4587
|
import { findWorkspaceRoot } from '../../core/workspace.js';
|
|
4731
4588
|
|
|
4589
|
+
const { runtimeConfigKey } = JSON.parse(
|
|
4590
|
+
readFileSync(
|
|
4591
|
+
path.join(
|
|
4592
|
+
findWorkspaceRoot(url.fileURLToPath(new URL(import.meta.url))),
|
|
4593
|
+
'packages/db/config.json',
|
|
4594
|
+
),
|
|
4595
|
+
'utf-8',
|
|
4596
|
+
),
|
|
4597
|
+
) as { runtimeConfigKey: string };
|
|
4598
|
+
|
|
4732
4599
|
export type DbProps = Omit<
|
|
4733
4600
|
AuroraDatabaseProps,
|
|
4734
4601
|
| 'databaseName'
|
|
@@ -4748,7 +4615,7 @@ export class Db extends AuroraDatabase {
|
|
|
4748
4615
|
...props,
|
|
4749
4616
|
databaseName: 'database_name',
|
|
4750
4617
|
adminUser: 'databaseUser',
|
|
4751
|
-
runtimeConfigKey
|
|
4618
|
+
runtimeConfigKey,
|
|
4752
4619
|
migrationBundleDir: path.join(
|
|
4753
4620
|
findWorkspaceRoot(url.fileURLToPath(new URL(import.meta.url))),
|
|
4754
4621
|
'dist/packages/db/bundle/migration',
|
|
@@ -4766,17 +4633,14 @@ export class Db extends AuroraDatabase {
|
|
|
4766
4633
|
|
|
4767
4634
|
exports[`ts#rdb generator > should generate the aurora shared construct 3`] = `
|
|
4768
4635
|
"import { defineConfig } from 'prisma/config';
|
|
4636
|
+
import { readFileSync } from 'fs';
|
|
4769
4637
|
|
|
4770
4638
|
const getDatabaseUrl = async () => {
|
|
4771
4639
|
if (process.env.SERVE_LOCAL === 'true') {
|
|
4772
|
-
const {
|
|
4773
|
-
|
|
4774
|
-
|
|
4775
|
-
|
|
4776
|
-
LOCAL_DB_PORT,
|
|
4777
|
-
LOCAL_DB_USER,
|
|
4778
|
-
} = await import('./src/constants.js');
|
|
4779
|
-
return \`postgresql://\${LOCAL_DB_USER}:\${LOCAL_DB_PASSWORD}@\${LOCAL_DB_HOST}:\${LOCAL_DB_PORT}/\${LOCAL_DB_NAME}\`;
|
|
4640
|
+
const { host, port, dbName, dbUser, dbPassword } = JSON.parse(
|
|
4641
|
+
readFileSync('config.json', 'utf-8'),
|
|
4642
|
+
).serveLocal;
|
|
4643
|
+
return \`postgresql://\${dbUser}:\${dbPassword}@\${host}:\${port}/\${dbName}\`;
|
|
4780
4644
|
}
|
|
4781
4645
|
return process.env.DATABASE_URL;
|
|
4782
4646
|
};
|