zuplo 6.67.32 → 6.68.0
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/README.md +9 -0
- package/docs/_index.md +44 -0
- package/docs/ai-gateway/apps.mdx +28 -0
- package/docs/ai-gateway/custom-providers.mdx +54 -0
- package/docs/ai-gateway/getting-started.mdx +224 -0
- package/docs/ai-gateway/guardrails.mdx +65 -0
- package/docs/ai-gateway/integrations/ai-sdk.mdx +109 -0
- package/docs/ai-gateway/integrations/claude-code.mdx +49 -0
- package/docs/ai-gateway/integrations/codex.mdx +78 -0
- package/docs/ai-gateway/integrations/goose.mdx +104 -0
- package/docs/ai-gateway/integrations/langchain.mdx +66 -0
- package/docs/ai-gateway/integrations/openai.mdx +99 -0
- package/docs/ai-gateway/introduction.mdx +85 -0
- package/docs/ai-gateway/managing-apps.mdx +46 -0
- package/docs/ai-gateway/managing-providers.mdx +66 -0
- package/docs/ai-gateway/managing-teams.mdx +63 -0
- package/docs/ai-gateway/policies/akamai-ai-firewall.mdx +125 -0
- package/docs/ai-gateway/policies/comet-opik-tracing.mdx +139 -0
- package/docs/ai-gateway/policies/galileo-tracing.mdx +147 -0
- package/docs/ai-gateway/providers.mdx +32 -0
- package/docs/ai-gateway/teams.mdx +38 -0
- package/docs/ai-gateway/universal-api.mdx +43 -0
- package/docs/ai-gateway/usage-limits.mdx +89 -0
- package/docs/api-management/introduction.md +127 -0
- package/docs/articles/accounts/audit-logs.mdx +227 -0
- package/docs/articles/accounts/billing.mdx +25 -0
- package/docs/articles/accounts/default-api-key.mdx +30 -0
- package/docs/articles/accounts/delete-account.mdx +36 -0
- package/docs/articles/accounts/enterprise-sso.mdx +116 -0
- package/docs/articles/accounts/managing-account-members.mdx +45 -0
- package/docs/articles/accounts/managing-project-members.mdx +37 -0
- package/docs/articles/accounts/members-and-roles.mdx +21 -0
- package/docs/articles/accounts/roles-and-permissions.mdx +115 -0
- package/docs/articles/accounts/zuplo-api-keys.mdx +94 -0
- package/docs/articles/add-api-to-backstage.mdx +216 -0
- package/docs/articles/advanced-path-matching.mdx +139 -0
- package/docs/articles/api-key-administration.mdx +47 -0
- package/docs/articles/api-key-api.mdx +220 -0
- package/docs/articles/api-key-authentication.mdx +195 -0
- package/docs/articles/api-key-buckets.mdx +61 -0
- package/docs/articles/api-key-end-users.mdx +52 -0
- package/docs/articles/api-key-leak-detection.mdx +75 -0
- package/docs/articles/api-key-management.mdx +100 -0
- package/docs/articles/api-key-react-component.mdx +90 -0
- package/docs/articles/api-key-service-limits.mdx +14 -0
- package/docs/articles/archiving-requests-to-storage.mdx +119 -0
- package/docs/articles/branch-based-deployments.mdx +184 -0
- package/docs/articles/bypass-policy-for-testing.mdx +117 -0
- package/docs/articles/check-ip-address.mdx +17 -0
- package/docs/articles/ci-cd-azure/basic-deployment.mdx +49 -0
- package/docs/articles/ci-cd-azure/deploy-and-test.mdx +47 -0
- package/docs/articles/ci-cd-azure/local-testing.mdx +59 -0
- package/docs/articles/ci-cd-azure/multi-stage-deployment.mdx +88 -0
- package/docs/articles/ci-cd-azure/pr-preview-environments.mdx +50 -0
- package/docs/articles/ci-cd-azure/tag-based-releases.mdx +37 -0
- package/docs/articles/ci-cd-bitbucket/basic-deployment.mdx +27 -0
- package/docs/articles/ci-cd-bitbucket/deploy-and-test.mdx +41 -0
- package/docs/articles/ci-cd-bitbucket/local-testing.mdx +34 -0
- package/docs/articles/ci-cd-bitbucket/multi-stage-deployment.mdx +52 -0
- package/docs/articles/ci-cd-bitbucket/pr-preview-environments.mdx +46 -0
- package/docs/articles/ci-cd-bitbucket/tag-based-releases.mdx +27 -0
- package/docs/articles/ci-cd-circleci/basic-deployment.mdx +34 -0
- package/docs/articles/ci-cd-circleci/deploy-and-test.mdx +44 -0
- package/docs/articles/ci-cd-circleci/local-testing.mdx +50 -0
- package/docs/articles/ci-cd-circleci/multi-stage-deployment.mdx +82 -0
- package/docs/articles/ci-cd-circleci/pr-preview-environments.mdx +47 -0
- package/docs/articles/ci-cd-circleci/tag-based-releases.mdx +38 -0
- package/docs/articles/ci-cd-github/basic-deployment.mdx +48 -0
- package/docs/articles/ci-cd-github/cleanup-on-branch-delete.mdx +123 -0
- package/docs/articles/ci-cd-github/deploy-and-test.mdx +82 -0
- package/docs/articles/ci-cd-github/local-testing.mdx +102 -0
- package/docs/articles/ci-cd-github/multi-stage-deployment.mdx +136 -0
- package/docs/articles/ci-cd-github/pr-preview-environments.mdx +106 -0
- package/docs/articles/ci-cd-github/tag-based-releases.mdx +99 -0
- package/docs/articles/ci-cd-gitlab/basic-deployment.mdx +28 -0
- package/docs/articles/ci-cd-gitlab/deploy-and-test.mdx +44 -0
- package/docs/articles/ci-cd-gitlab/local-testing.mdx +39 -0
- package/docs/articles/ci-cd-gitlab/mr-preview-environments.mdx +52 -0
- package/docs/articles/ci-cd-gitlab/multi-stage-deployment.mdx +64 -0
- package/docs/articles/ci-cd-gitlab/tag-based-releases.mdx +28 -0
- package/docs/articles/composite-policy-reference.mdx +284 -0
- package/docs/articles/configuring-auth0-for-mcp-auth.mdx +186 -0
- package/docs/articles/configuring-okta-for-mcp-auth.mdx +208 -0
- package/docs/articles/convert-urls-to-openapi.mdx +62 -0
- package/docs/articles/cors.mdx +447 -0
- package/docs/articles/custom-audit-log-policy.mdx +95 -0
- package/docs/articles/custom-ci-cd-azure.mdx +81 -0
- package/docs/articles/custom-ci-cd-bitbucket.mdx +80 -0
- package/docs/articles/custom-ci-cd-circleci.mdx +78 -0
- package/docs/articles/custom-ci-cd-github.mdx +99 -0
- package/docs/articles/custom-ci-cd-gitlab.mdx +79 -0
- package/docs/articles/custom-ci-cd.mdx +82 -0
- package/docs/articles/custom-code-patterns.md +418 -0
- package/docs/articles/custom-domains.mdx +258 -0
- package/docs/articles/custom-logging-example.mdx +139 -0
- package/docs/articles/ddos-protection.mdx +138 -0
- package/docs/articles/development-options.mdx +49 -0
- package/docs/articles/environment-variables.mdx +134 -0
- package/docs/articles/environments.mdx +143 -0
- package/docs/articles/fastly-zuplo-host-setup.mdx +41 -0
- package/docs/articles/github-deployment-testing.mdx +101 -0
- package/docs/articles/gke-with-upstream-auth-policy.mdx +192 -0
- package/docs/articles/graphql-security.mdx +180 -0
- package/docs/articles/handling-form-data.mdx +61 -0
- package/docs/articles/health-checks.mdx +109 -0
- package/docs/articles/hosting-options.mdx +70 -0
- package/docs/articles/lazy-load-configuration-into-cache.mdx +92 -0
- package/docs/articles/limits.mdx +98 -0
- package/docs/articles/local-development-debugging.mdx +44 -0
- package/docs/articles/local-development-env-variables.mdx +23 -0
- package/docs/articles/local-development-installing-packages.mdx +23 -0
- package/docs/articles/local-development-routes-designer.mdx +27 -0
- package/docs/articles/local-development-services.mdx +40 -0
- package/docs/articles/local-development-troubleshooting.mdx +56 -0
- package/docs/articles/local-development.mdx +81 -0
- package/docs/articles/log-plugin-aws-cloudwatch.mdx +83 -0
- package/docs/articles/log-plugin-datadog.mdx +84 -0
- package/docs/articles/log-plugin-dynatrace.mdx +75 -0
- package/docs/articles/log-plugin-gcp.mdx +75 -0
- package/docs/articles/log-plugin-loki.mdx +136 -0
- package/docs/articles/log-plugin-new-relic.mdx +84 -0
- package/docs/articles/log-plugin-splunk.mdx +104 -0
- package/docs/articles/log-plugin-sumo.mdx +73 -0
- package/docs/articles/log-plugin-vmware-log-insight.mdx +154 -0
- package/docs/articles/log-request-response-data.mdx +398 -0
- package/docs/articles/logging.mdx +115 -0
- package/docs/articles/manual-mcp-oauth-testing.mdx +193 -0
- package/docs/articles/mcp-quickstart.mdx +135 -0
- package/docs/articles/metrics-plugins.mdx +371 -0
- package/docs/articles/migrate-from-apigee.md +408 -0
- package/docs/articles/migrate-from-aws-api-gateway.md +248 -0
- package/docs/articles/migrate-from-azure-apim.md +292 -0
- package/docs/articles/migrate-from-kong.md +300 -0
- package/docs/articles/migration-overview.md +81 -0
- package/docs/articles/monetization/api-access.mdx +69 -0
- package/docs/articles/monetization/billing-models.md +520 -0
- package/docs/articles/monetization/developer-portal.md +167 -0
- package/docs/articles/monetization/features.mdx +98 -0
- package/docs/articles/monetization/index.mdx +113 -0
- package/docs/articles/monetization/meters.mdx +135 -0
- package/docs/articles/monetization/monetization-policy.md +314 -0
- package/docs/articles/monetization/plan-examples.mdx +366 -0
- package/docs/articles/monetization/plans.mdx +266 -0
- package/docs/articles/monetization/pricing-models.mdx +225 -0
- package/docs/articles/monetization/private-plans.md +154 -0
- package/docs/articles/monetization/quickstart.md +355 -0
- package/docs/articles/monetization/rate-cards.mdx +171 -0
- package/docs/articles/monetization/stripe-integration.md +195 -0
- package/docs/articles/monetization/subscription-lifecycle.md +298 -0
- package/docs/articles/monetization/tax-collection.md +166 -0
- package/docs/articles/monetization/troubleshooting.md +272 -0
- package/docs/articles/monetization-custom.mdx +71 -0
- package/docs/articles/monetization-integrations.mdx +104 -0
- package/docs/articles/monitoring-your-gateway.mdx +53 -0
- package/docs/articles/monorepo-deployment.mdx +350 -0
- package/docs/articles/multiple-auth-policies.mdx +81 -0
- package/docs/articles/non-standard-ports.mdx +30 -0
- package/docs/articles/oauth-authentication.mdx +54 -0
- package/docs/articles/openapi-server-urls.mdx +60 -0
- package/docs/articles/openapi.mdx +130 -0
- package/docs/articles/opentelemetry.mdx +250 -0
- package/docs/articles/per-user-rate-limits-using-db.mdx +112 -0
- package/docs/articles/performance-testing.mdx +304 -0
- package/docs/articles/plugin-akamai-api-security.mdx +76 -0
- package/docs/articles/plugin-azure-blob.mdx +73 -0
- package/docs/articles/plugin-azure-event-hubs.mdx +64 -0
- package/docs/articles/plugin-hydrolix-traffic-peak.mdx +147 -0
- package/docs/articles/policies.mdx +33 -0
- package/docs/articles/rename-or-move-project.mdx +39 -0
- package/docs/articles/rick-and-morty-api-developer-portal-example.mdx +23 -0
- package/docs/articles/routing.mdx +193 -0
- package/docs/articles/s3-signed-url-uploads.mdx +521 -0
- package/docs/articles/secure-tunnel.mdx +84 -0
- package/docs/articles/securing-backend-mtls.mdx +268 -0
- package/docs/articles/securing-your-backend.mdx +148 -0
- package/docs/articles/security.mdx +105 -0
- package/docs/articles/sharing-code-across-projects.mdx +412 -0
- package/docs/articles/source-control-setup-azure.mdx +13 -0
- package/docs/articles/source-control-setup-bitbucket.mdx +43 -0
- package/docs/articles/source-control-setup-github.mdx +172 -0
- package/docs/articles/source-control-setup-gitlab.mdx +12 -0
- package/docs/articles/source-control.mdx +80 -0
- package/docs/articles/step-1-setup-basic-gateway-local.mdx +136 -0
- package/docs/articles/step-1-setup-basic-gateway.mdx +118 -0
- package/docs/articles/step-2-add-rate-limiting-local.mdx +126 -0
- package/docs/articles/step-2-add-rate-limiting.mdx +82 -0
- package/docs/articles/step-3-add-api-key-auth-local.mdx +199 -0
- package/docs/articles/step-3-add-api-key-auth.mdx +166 -0
- package/docs/articles/step-4-deploying-to-the-edge.mdx +220 -0
- package/docs/articles/step-5-dynamic-rate-limiting.mdx +167 -0
- package/docs/articles/support.mdx +144 -0
- package/docs/articles/terraform.mdx +114 -0
- package/docs/articles/testing-graphql.mdx +34 -0
- package/docs/articles/testing.mdx +522 -0
- package/docs/articles/troubleshooting-slow-responses.mdx +301 -0
- package/docs/articles/troubleshooting.md +302 -0
- package/docs/articles/tsconfig.mdx +105 -0
- package/docs/articles/tunnel-setup.mdx +195 -0
- package/docs/articles/tunnel-troubleshooting.mdx +50 -0
- package/docs/articles/update-zup-in-github-action.mdx +110 -0
- package/docs/articles/use-openapi-extension-data.mdx +79 -0
- package/docs/articles/users/multifactor-authentication.mdx +64 -0
- package/docs/articles/users/profile.mdx +13 -0
- package/docs/articles/versioning-on-zuplo.mdx +89 -0
- package/docs/articles/waf-ddos-akamai.md +133 -0
- package/docs/articles/waf-ddos-aws-waf-shield.mdx +85 -0
- package/docs/articles/waf-ddos-fastly.mdx +251 -0
- package/docs/articles/waf-ddos.mdx +140 -0
- package/docs/articles/zuplo-waf.mdx +156 -0
- package/docs/ask.mdx +3 -0
- package/docs/cli/authentication.mdx +56 -0
- package/docs/cli/connectivity.mdx +38 -0
- package/docs/cli/create-zuplo-api.mdx +80 -0
- package/docs/cli/delete.mdx +79 -0
- package/docs/cli/deploy.mdx +156 -0
- package/docs/cli/deploy.partial.mdx +46 -0
- package/docs/cli/dev.mdx +115 -0
- package/docs/cli/docs.mdx +66 -0
- package/docs/cli/editor.mdx +50 -0
- package/docs/cli/global-options.mdx +19 -0
- package/docs/cli/init.mdx +74 -0
- package/docs/cli/link.mdx +74 -0
- package/docs/cli/list.mdx +55 -0
- package/docs/cli/mtls-certificate-create.mdx +94 -0
- package/docs/cli/mtls-certificate-delete.mdx +55 -0
- package/docs/cli/mtls-certificate-describe.mdx +55 -0
- package/docs/cli/mtls-certificate-disable.mdx +55 -0
- package/docs/cli/mtls-certificate-list.mdx +47 -0
- package/docs/cli/mtls-certificate-update.mdx +72 -0
- package/docs/cli/openapi-convert.mdx +111 -0
- package/docs/cli/openapi-merge.mdx +138 -0
- package/docs/cli/openapi-merge.partial.mdx +29 -0
- package/docs/cli/openapi-overlay.mdx +123 -0
- package/docs/cli/overview.mdx +78 -0
- package/docs/cli/project-create.mdx +43 -0
- package/docs/cli/source-migrate.mdx +18 -0
- package/docs/cli/source-upgrade.mdx +41 -0
- package/docs/cli/test.mdx +70 -0
- package/docs/cli/test.partial.mdx +7 -0
- package/docs/cli/tunnel-create.mdx +53 -0
- package/docs/cli/tunnel-create.partial.mdx +9 -0
- package/docs/cli/tunnel-delete.mdx +35 -0
- package/docs/cli/tunnel-delete.partial.mdx +9 -0
- package/docs/cli/tunnel-describe.mdx +45 -0
- package/docs/cli/tunnel-describe.partial.mdx +5 -0
- package/docs/cli/tunnel-list.mdx +35 -0
- package/docs/cli/tunnel-list.partial.mdx +9 -0
- package/docs/cli/tunnel-rate-token.partial.mdx +9 -0
- package/docs/cli/tunnel-rotate-token.mdx +39 -0
- package/docs/cli/tunnel-services-describe.mdx +45 -0
- package/docs/cli/tunnel-services-describe.partial.mdx +9 -0
- package/docs/cli/tunnel-services-update.mdx +48 -0
- package/docs/cli/variable-create.mdx +91 -0
- package/docs/cli/variable-create.partial.mdx +5 -0
- package/docs/cli/variable-update.mdx +75 -0
- package/docs/cli/variable-update.partial.mdx +5 -0
- package/docs/concepts/api-keys.md +146 -0
- package/docs/concepts/authentication.mdx +109 -0
- package/docs/concepts/how-zuplo-works.mdx +120 -0
- package/docs/concepts/project-structure.mdx +174 -0
- package/docs/concepts/rate-limiting.md +246 -0
- package/docs/concepts/request-lifecycle.mdx +56 -0
- package/docs/concepts/source-control-and-deployment.mdx +229 -0
- package/docs/conferences/conference-prize-terms.mdx +80 -0
- package/docs/dedicated/akamai/ai-powered-applications.mdx +223 -0
- package/docs/dedicated/akamai/architecture.mdx +280 -0
- package/docs/dedicated/akamai/caching.mdx +212 -0
- package/docs/dedicated/akamai/cdn.mdx +156 -0
- package/docs/dedicated/architecture.mdx +208 -0
- package/docs/dedicated/custom-domains.mdx +31 -0
- package/docs/dedicated/federated-gateways.mdx +80 -0
- package/docs/dedicated/networking.mdx +69 -0
- package/docs/dedicated/overview.mdx +80 -0
- package/docs/dedicated/source-control.mdx +63 -0
- package/docs/dev-portal/dev-portal-create-consumer-on-auth.mdx +134 -0
- package/docs/dev-portal/introduction.mdx +65 -0
- package/docs/dev-portal/local-development.mdx +72 -0
- package/docs/dev-portal/migration.mdx +526 -0
- package/docs/dev-portal/node-modules.mdx +45 -0
- package/docs/dev-portal/updating.mdx +28 -0
- package/docs/dev-portal/zudoku/components/alert.mdx +130 -0
- package/docs/dev-portal/zudoku/components/badge.mdx +70 -0
- package/docs/dev-portal/zudoku/components/button.mdx +132 -0
- package/docs/dev-portal/zudoku/components/callout.mdx +112 -0
- package/docs/dev-portal/zudoku/components/card.mdx +104 -0
- package/docs/dev-portal/zudoku/components/checkbox.mdx +72 -0
- package/docs/dev-portal/zudoku/components/client-only.mdx +79 -0
- package/docs/dev-portal/zudoku/components/code-tabs.mdx +179 -0
- package/docs/dev-portal/zudoku/components/dialog.mdx +167 -0
- package/docs/dev-portal/zudoku/components/head.mdx +199 -0
- package/docs/dev-portal/zudoku/components/icons.mdx +27 -0
- package/docs/dev-portal/zudoku/components/input.mdx +96 -0
- package/docs/dev-portal/zudoku/components/label.mdx +86 -0
- package/docs/dev-portal/zudoku/components/link.mdx +242 -0
- package/docs/dev-portal/zudoku/components/markdown.mdx +151 -0
- package/docs/dev-portal/zudoku/components/mermaid.mdx +81 -0
- package/docs/dev-portal/zudoku/components/playground.mdx +87 -0
- package/docs/dev-portal/zudoku/components/secret.mdx +78 -0
- package/docs/dev-portal/zudoku/components/select.mdx +176 -0
- package/docs/dev-portal/zudoku/components/shadcn.mdx +73 -0
- package/docs/dev-portal/zudoku/components/slider.mdx +108 -0
- package/docs/dev-portal/zudoku/components/slot.mdx +119 -0
- package/docs/dev-portal/zudoku/components/stepper.mdx +138 -0
- package/docs/dev-portal/zudoku/components/switch.mdx +96 -0
- package/docs/dev-portal/zudoku/components/syntax-highlight.mdx +602 -0
- package/docs/dev-portal/zudoku/components/textarea.mdx +78 -0
- package/docs/dev-portal/zudoku/components/tooltip.mdx +195 -0
- package/docs/dev-portal/zudoku/components/typography.mdx +61 -0
- package/docs/dev-portal/zudoku/configuration/ai-assistants.md +64 -0
- package/docs/dev-portal/zudoku/configuration/api-catalog.md +108 -0
- package/docs/dev-portal/zudoku/configuration/api-reference.md +397 -0
- package/docs/dev-portal/zudoku/configuration/authentication-auth0.md +173 -0
- package/docs/dev-portal/zudoku/configuration/authentication-azure-ad.md +238 -0
- package/docs/dev-portal/zudoku/configuration/authentication-clerk.md +110 -0
- package/docs/dev-portal/zudoku/configuration/authentication-firebase.md +61 -0
- package/docs/dev-portal/zudoku/configuration/authentication-pingfederate.md +136 -0
- package/docs/dev-portal/zudoku/configuration/authentication-supabase.md +225 -0
- package/docs/dev-portal/zudoku/configuration/authentication.md +199 -0
- package/docs/dev-portal/zudoku/configuration/build-configuration.mdx +147 -0
- package/docs/dev-portal/zudoku/configuration/docs.md +282 -0
- package/docs/dev-portal/zudoku/configuration/footer.mdx +214 -0
- package/docs/dev-portal/zudoku/configuration/llms.md +89 -0
- package/docs/dev-portal/zudoku/configuration/navigation.mdx +408 -0
- package/docs/dev-portal/zudoku/configuration/overview.md +380 -0
- package/docs/dev-portal/zudoku/configuration/protected-routes.md +149 -0
- package/docs/dev-portal/zudoku/configuration/search.md +169 -0
- package/docs/dev-portal/zudoku/configuration/sentry.mdx +44 -0
- package/docs/dev-portal/zudoku/configuration/site.md +124 -0
- package/docs/dev-portal/zudoku/configuration/slots.mdx +124 -0
- package/docs/dev-portal/zudoku/configuration/vite-config.md +18 -0
- package/docs/dev-portal/zudoku/custom-plugins.md +287 -0
- package/docs/dev-portal/zudoku/customization/colors-theme.mdx +275 -0
- package/docs/dev-portal/zudoku/customization/fonts.md +110 -0
- package/docs/dev-portal/zudoku/extending/events.md +124 -0
- package/docs/dev-portal/zudoku/guides/custom-pages.md +106 -0
- package/docs/dev-portal/zudoku/guides/environment-variables.md +99 -0
- package/docs/dev-portal/zudoku/guides/mermaid.mdx +70 -0
- package/docs/dev-portal/zudoku/guides/navigation-migration.md +87 -0
- package/docs/dev-portal/zudoku/guides/navigation-rules.mdx +197 -0
- package/docs/dev-portal/zudoku/guides/processors.mdx +234 -0
- package/docs/dev-portal/zudoku/guides/static-files.md +55 -0
- package/docs/dev-portal/zudoku/guides/transforming-examples.md +156 -0
- package/docs/dev-portal/zudoku/guides/using-multiple-apis.md +87 -0
- package/docs/dev-portal/zudoku/markdown/admonitions.md +128 -0
- package/docs/dev-portal/zudoku/markdown/code-blocks.md +196 -0
- package/docs/dev-portal/zudoku/markdown/frontmatter.md +172 -0
- package/docs/dev-portal/zudoku/markdown/mdx.md +68 -0
- package/docs/dev-portal/zudoku/markdown/overview.md +275 -0
- package/docs/dev-portal/zudoku/plugins.md +5 -0
- package/docs/dev-portal/zudoku/writing.mdx +72 -0
- package/docs/errors/bad-request.mdx +39 -0
- package/docs/errors/build-error.mdx +45 -0
- package/docs/errors/fatal-project-error.mdx +39 -0
- package/docs/errors/gateway-timeout.mdx +33 -0
- package/docs/errors/get-head-body-error.mdx +41 -0
- package/docs/errors/main-mod-error.mdx +40 -0
- package/docs/errors/no-project-set.mdx +41 -0
- package/docs/errors/not-found.mdx +43 -0
- package/docs/errors/rate-limit-exceeded.mdx +31 -0
- package/docs/errors/schema-validation-failed.mdx +51 -0
- package/docs/errors/system-configuration-error.mdx +44 -0
- package/docs/errors/unauthorized.mdx +50 -0
- package/docs/errors/unknown-error.mdx +42 -0
- package/docs/errors.mdx +14 -0
- package/docs/guides/canary-routing-for-employees.mdx +385 -0
- package/docs/guides/geolocation-backend-routing.mdx +404 -0
- package/docs/guides/modify-openapi-paths.mdx +371 -0
- package/docs/guides/openapi-overlays.mdx +492 -0
- package/docs/guides/overview.mdx +12 -0
- package/docs/guides/user-based-backend-routing.mdx +437 -0
- package/docs/handlers/aws-lambda.mdx +201 -0
- package/docs/handlers/custom-handler.mdx +112 -0
- package/docs/handlers/legacy-dev-portal-handler.mdx +135 -0
- package/docs/handlers/mcp-server.mdx +730 -0
- package/docs/handlers/openapi.mdx +78 -0
- package/docs/handlers/redirect.mdx +115 -0
- package/docs/handlers/system-handlers.mdx +41 -0
- package/docs/handlers/url-forward.mdx +204 -0
- package/docs/handlers/url-rewrite.mdx +224 -0
- package/docs/handlers/websocket-handler.mdx +154 -0
- package/docs/home.mdx +6 -0
- package/docs/managed-edge/overview.md +78 -0
- package/docs/mcp-server/configuration-migration-guide.mdx +344 -0
- package/docs/mcp-server/custom-tools.mdx +487 -0
- package/docs/mcp-server/graphql.mdx +241 -0
- package/docs/mcp-server/introduction.mdx +122 -0
- package/docs/mcp-server/openai-apps-sdk.mdx +160 -0
- package/docs/mcp-server/prompts.mdx +283 -0
- package/docs/mcp-server/resources.mdx +288 -0
- package/docs/mcp-server/testing.mdx +53 -0
- package/docs/mcp-server/tools.mdx +306 -0
- package/docs/policies/_index.md +92 -0
- package/docs/policies/ab-test-inbound/intro.md +8 -0
- package/docs/policies/ab-test-inbound/policy.ts +14 -0
- package/docs/policies/ab-test-inbound/schema.json +27 -0
- package/docs/policies/ab-test-outbound/intro.md +8 -0
- package/docs/policies/ab-test-outbound/policy.ts +26 -0
- package/docs/policies/ab-test-outbound/schema.json +27 -0
- package/docs/policies/acl-policy-inbound/intro.md +5 -0
- package/docs/policies/acl-policy-inbound/policy.ts +32 -0
- package/docs/policies/acl-policy-inbound/schema.json +52 -0
- package/docs/policies/akamai-ai-firewall/schema.json +98 -0
- package/docs/policies/amberflo-metering-inbound/doc.md +183 -0
- package/docs/policies/amberflo-metering-inbound/intro.md +20 -0
- package/docs/policies/amberflo-metering-inbound/schema.json +108 -0
- package/docs/policies/api-key-inbound/doc.md +77 -0
- package/docs/policies/api-key-inbound/intro.md +30 -0
- package/docs/policies/api-key-inbound/schema.json +84 -0
- package/docs/policies/archive-request-aws-s3-inbound/intro.md +4 -0
- package/docs/policies/archive-request-aws-s3-inbound/policy.ts +58 -0
- package/docs/policies/archive-request-aws-s3-inbound/schema.json +68 -0
- package/docs/policies/archive-request-azure-storage-inbound/doc.md +31 -0
- package/docs/policies/archive-request-azure-storage-inbound/intro.md +4 -0
- package/docs/policies/archive-request-azure-storage-inbound/policy.ts +54 -0
- package/docs/policies/archive-request-azure-storage-inbound/schema.json +53 -0
- package/docs/policies/archive-request-gcp-storage-inbound/doc.md +63 -0
- package/docs/policies/archive-request-gcp-storage-inbound/intro.md +4 -0
- package/docs/policies/archive-request-gcp-storage-inbound/policy.ts +68 -0
- package/docs/policies/archive-request-gcp-storage-inbound/schema.json +47 -0
- package/docs/policies/archive-response-aws-s3-outbound/intro.md +2 -0
- package/docs/policies/archive-response-aws-s3-outbound/policy.ts +59 -0
- package/docs/policies/archive-response-aws-s3-outbound/schema.json +68 -0
- package/docs/policies/archive-response-azure-storage-outbound/doc.md +31 -0
- package/docs/policies/archive-response-azure-storage-outbound/intro.md +3 -0
- package/docs/policies/archive-response-azure-storage-outbound/policy.ts +54 -0
- package/docs/policies/archive-response-azure-storage-outbound/schema.json +53 -0
- package/docs/policies/audit-log-inbound/doc.md +78 -0
- package/docs/policies/audit-log-inbound/intro.md +10 -0
- package/docs/policies/audit-log-inbound/schema.json +81 -0
- package/docs/policies/auth0-jwt-auth-inbound/doc.md +125 -0
- package/docs/policies/auth0-jwt-auth-inbound/intro.md +17 -0
- package/docs/policies/auth0-jwt-auth-inbound/schema.json +74 -0
- package/docs/policies/authzen-inbound/doc.md +24 -0
- package/docs/policies/authzen-inbound/intro.md +31 -0
- package/docs/policies/authzen-inbound/schema.json +126 -0
- package/docs/policies/axiomatics-authz-inbound/doc.md +144 -0
- package/docs/policies/axiomatics-authz-inbound/intro.md +11 -0
- package/docs/policies/axiomatics-authz-inbound/schema.json +161 -0
- package/docs/policies/basic-auth-inbound/intro.md +9 -0
- package/docs/policies/basic-auth-inbound/schema.json +99 -0
- package/docs/policies/bot-detection-inbound/intro.md +4 -0
- package/docs/policies/bot-detection-inbound/schema.json +56 -0
- package/docs/policies/brownout-inbound/doc.md +55 -0
- package/docs/policies/brownout-inbound/intro.md +12 -0
- package/docs/policies/brownout-inbound/schema.json +115 -0
- package/docs/policies/caching-inbound/doc.md +209 -0
- package/docs/policies/caching-inbound/intro.md +23 -0
- package/docs/policies/caching-inbound/schema.json +98 -0
- package/docs/policies/change-method-inbound/schema.json +56 -0
- package/docs/policies/clear-headers-inbound/schema.json +59 -0
- package/docs/policies/clear-headers-outbound/schema.json +59 -0
- package/docs/policies/clerk-jwt-auth-inbound/doc.md +85 -0
- package/docs/policies/clerk-jwt-auth-inbound/intro.md +4 -0
- package/docs/policies/clerk-jwt-auth-inbound/schema.json +68 -0
- package/docs/policies/cognito-jwt-auth-inbound/intro.md +7 -0
- package/docs/policies/cognito-jwt-auth-inbound/schema.json +74 -0
- package/docs/policies/comet-opik-tracing-inbound/schema.json +65 -0
- package/docs/policies/complex-rate-limit-inbound/doc.md +20 -0
- package/docs/policies/complex-rate-limit-inbound/intro.md +23 -0
- package/docs/policies/complex-rate-limit-inbound/schema.json +142 -0
- package/docs/policies/composite-inbound/doc.md +69 -0
- package/docs/policies/composite-inbound/intro.md +15 -0
- package/docs/policies/composite-inbound/schema.json +59 -0
- package/docs/policies/composite-outbound/intro.md +6 -0
- package/docs/policies/composite-outbound/schema.json +59 -0
- package/docs/policies/curity-phantom-token-inbound/doc.md +109 -0
- package/docs/policies/curity-phantom-token-inbound/intro.md +3 -0
- package/docs/policies/curity-phantom-token-inbound/schema.json +68 -0
- package/docs/policies/custom-code-inbound/doc.md +267 -0
- package/docs/policies/custom-code-inbound/intro.md +2 -0
- package/docs/policies/custom-code-inbound/schema.json +48 -0
- package/docs/policies/custom-code-outbound/doc.md +235 -0
- package/docs/policies/custom-code-outbound/intro.md +2 -0
- package/docs/policies/custom-code-outbound/schema.json +43 -0
- package/docs/policies/firebase-jwt-inbound/intro.md +6 -0
- package/docs/policies/firebase-jwt-inbound/schema.json +68 -0
- package/docs/policies/formdata-to-json-inbound/schema.json +60 -0
- package/docs/policies/galileo-tracing-inbound/schema.json +65 -0
- package/docs/policies/geo-filter-inbound/doc.md +33 -0
- package/docs/policies/geo-filter-inbound/schema.json +108 -0
- package/docs/policies/graphql-complexity-limit-inbound/doc.md +48 -0
- package/docs/policies/graphql-complexity-limit-inbound/intro.md +2 -0
- package/docs/policies/graphql-complexity-limit-inbound/schema.json +90 -0
- package/docs/policies/graphql-disable-introspection-inbound/doc.md +66 -0
- package/docs/policies/graphql-disable-introspection-inbound/intro.md +15 -0
- package/docs/policies/graphql-disable-introspection-inbound/schema.json +48 -0
- package/docs/policies/graphql-introspection-filter-outbound/doc.md +148 -0
- package/docs/policies/graphql-introspection-filter-outbound/schema.json +79 -0
- package/docs/policies/hmac-auth-inbound/doc.md +30 -0
- package/docs/policies/hmac-auth-inbound/intro.md +10 -0
- package/docs/policies/hmac-auth-inbound/policy.ts +70 -0
- package/docs/policies/hmac-auth-inbound/schema.json +53 -0
- package/docs/policies/http-deprecation-outbound/doc.md +73 -0
- package/docs/policies/http-deprecation-outbound/schema.json +83 -0
- package/docs/policies/ip-restriction-inbound/intro.md +8 -0
- package/docs/policies/ip-restriction-inbound/policy.ts +40 -0
- package/docs/policies/ip-restriction-inbound/schema.json +58 -0
- package/docs/policies/jwt-scopes-inbound/schema.json +59 -0
- package/docs/policies/ldap-auth-inbound/schema.json +56 -0
- package/docs/policies/mock-api-inbound/schema.json +72 -0
- package/docs/policies/moesif-inbound/doc.md +44 -0
- package/docs/policies/moesif-inbound/intro.md +6 -0
- package/docs/policies/moesif-inbound/schema.json +68 -0
- package/docs/policies/monetization-inbound/doc.md +87 -0
- package/docs/policies/monetization-inbound/intro.md +6 -0
- package/docs/policies/monetization-inbound/schema.json +102 -0
- package/docs/policies/mtls-auth-inbound/intro.md +6 -0
- package/docs/policies/mtls-auth-inbound/schema.json +68 -0
- package/docs/policies/okta-fga-authz-inbound/doc.md +181 -0
- package/docs/policies/okta-fga-authz-inbound/intro.md +20 -0
- package/docs/policies/okta-fga-authz-inbound/schema.json +104 -0
- package/docs/policies/okta-jwt-auth-inbound/intro.md +7 -0
- package/docs/policies/okta-jwt-auth-inbound/schema.json +74 -0
- package/docs/policies/open-id-jwt-auth-inbound/doc.md +58 -0
- package/docs/policies/open-id-jwt-auth-inbound/intro.md +30 -0
- package/docs/policies/open-id-jwt-auth-inbound/schema.json +128 -0
- package/docs/policies/openfga-authz-inbound/doc.md +207 -0
- package/docs/policies/openfga-authz-inbound/intro.md +17 -0
- package/docs/policies/openfga-authz-inbound/schema.json +191 -0
- package/docs/policies/openmeter-inbound/doc.md +163 -0
- package/docs/policies/openmeter-inbound/intro.md +18 -0
- package/docs/policies/openmeter-inbound/schema.json +183 -0
- package/docs/policies/prompt-injection-outbound/doc.md +106 -0
- package/docs/policies/prompt-injection-outbound/intro.md +4 -0
- package/docs/policies/prompt-injection-outbound/schema.json +74 -0
- package/docs/policies/propel-auth-jwt-inbound/doc.md +88 -0
- package/docs/policies/propel-auth-jwt-inbound/intro.md +4 -0
- package/docs/policies/propel-auth-jwt-inbound/schema.json +74 -0
- package/docs/policies/query-param-to-header-inbound/doc.md +70 -0
- package/docs/policies/query-param-to-header-inbound/intro.md +5 -0
- package/docs/policies/query-param-to-header-inbound/schema.json +74 -0
- package/docs/policies/quota-inbound/doc.md +235 -0
- package/docs/policies/quota-inbound/intro.md +7 -0
- package/docs/policies/quota-inbound/schema.json +133 -0
- package/docs/policies/rate-limit-inbound/doc.md +78 -0
- package/docs/policies/rate-limit-inbound/intro.md +30 -0
- package/docs/policies/rate-limit-inbound/schema.json +134 -0
- package/docs/policies/rbac-policy-inbound/intro.md +3 -0
- package/docs/policies/rbac-policy-inbound/policy.ts +42 -0
- package/docs/policies/rbac-policy-inbound/schema.json +52 -0
- package/docs/policies/readme-metrics-inbound/doc.md +1 -0
- package/docs/policies/readme-metrics-inbound/intro.md +3 -0
- package/docs/policies/readme-metrics-inbound/schema.json +84 -0
- package/docs/policies/remove-headers-inbound/schema.json +59 -0
- package/docs/policies/remove-headers-outbound/schema.json +59 -0
- package/docs/policies/remove-query-params-inbound/schema.json +59 -0
- package/docs/policies/replace-string-outbound/schema.json +69 -0
- package/docs/policies/request-size-limit-inbound/schema.json +60 -0
- package/docs/policies/request-validation-inbound/doc.md +72 -0
- package/docs/policies/request-validation-inbound/intro.md +24 -0
- package/docs/policies/request-validation-inbound/schema.json +98 -0
- package/docs/policies/require-origin-inbound/intro.md +12 -0
- package/docs/policies/require-origin-inbound/schema.json +65 -0
- package/docs/policies/secret-masking-outbound/doc.md +41 -0
- package/docs/policies/secret-masking-outbound/intro.md +13 -0
- package/docs/policies/secret-masking-outbound/schema.json +65 -0
- package/docs/policies/semantic-cache-inbound/doc.md +63 -0
- package/docs/policies/semantic-cache-inbound/intro.md +4 -0
- package/docs/policies/semantic-cache-inbound/schema.json +179 -0
- package/docs/policies/set-body-inbound/intro.md +7 -0
- package/docs/policies/set-body-inbound/schema.json +56 -0
- package/docs/policies/set-headers-inbound/doc.md +41 -0
- package/docs/policies/set-headers-inbound/intro.md +2 -0
- package/docs/policies/set-headers-inbound/schema.json +83 -0
- package/docs/policies/set-headers-outbound/schema.json +83 -0
- package/docs/policies/set-query-params-inbound/schema.json +83 -0
- package/docs/policies/set-status-outbound/schema.json +62 -0
- package/docs/policies/sleep-inbound/schema.json +56 -0
- package/docs/policies/stripe-webhook-verification-inbound/intro.md +2 -0
- package/docs/policies/stripe-webhook-verification-inbound/schema.json +60 -0
- package/docs/policies/supabase-jwt-auth-inbound/doc.md +29 -0
- package/docs/policies/supabase-jwt-auth-inbound/intro.md +12 -0
- package/docs/policies/supabase-jwt-auth-inbound/schema.json +86 -0
- package/docs/policies/transform-body-inbound/intro.md +8 -0
- package/docs/policies/transform-body-inbound/policy.ts +16 -0
- package/docs/policies/transform-body-inbound/schema.json +27 -0
- package/docs/policies/transform-body-outbound/intro.md +8 -0
- package/docs/policies/transform-body-outbound/policy.ts +19 -0
- package/docs/policies/transform-body-outbound/schema.json +27 -0
- package/docs/policies/upstream-azure-ad-service-auth-inbound/doc.md +82 -0
- package/docs/policies/upstream-azure-ad-service-auth-inbound/intro.md +20 -0
- package/docs/policies/upstream-azure-ad-service-auth-inbound/schema.json +84 -0
- package/docs/policies/upstream-firebase-admin-auth-inbound/intro.md +10 -0
- package/docs/policies/upstream-firebase-admin-auth-inbound/schema.json +68 -0
- package/docs/policies/upstream-firebase-user-auth-inbound/intro.md +2 -0
- package/docs/policies/upstream-firebase-user-auth-inbound/schema.json +113 -0
- package/docs/policies/upstream-gcp-federated-auth-inbound/doc.md +139 -0
- package/docs/policies/upstream-gcp-federated-auth-inbound/intro.md +21 -0
- package/docs/policies/upstream-gcp-federated-auth-inbound/schema.json +96 -0
- package/docs/policies/upstream-gcp-jwt-inbound/intro.md +10 -0
- package/docs/policies/upstream-gcp-jwt-inbound/schema.json +62 -0
- package/docs/policies/upstream-gcp-service-auth-inbound/doc.md +132 -0
- package/docs/policies/upstream-gcp-service-auth-inbound/intro.md +25 -0
- package/docs/policies/upstream-gcp-service-auth-inbound/schema.json +95 -0
- package/docs/policies/upstream-zuplo-jwt-auth-inbound/doc.md +213 -0
- package/docs/policies/upstream-zuplo-jwt-auth-inbound/intro.md +16 -0
- package/docs/policies/upstream-zuplo-jwt-auth-inbound/schema.json +101 -0
- package/docs/policies/validate-json-schema-inbound/doc.md +129 -0
- package/docs/policies/validate-json-schema-inbound/intro.md +7 -0
- package/docs/policies/validate-json-schema-inbound/schema.json +56 -0
- package/docs/policies/web-bot-auth-inbound/doc.md +104 -0
- package/docs/policies/web-bot-auth-inbound/intro.md +16 -0
- package/docs/policies/web-bot-auth-inbound/schema.json +76 -0
- package/docs/policies/xml-to-json-outbound/doc.md +71 -0
- package/docs/policies/xml-to-json-outbound/intro.md +4 -0
- package/docs/policies/xml-to-json-outbound/schema.json +117 -0
- package/docs/programmable-api/audit-log.mdx +74 -0
- package/docs/programmable-api/background-dispatcher.mdx +124 -0
- package/docs/programmable-api/background-loader.mdx +104 -0
- package/docs/programmable-api/cache.mdx +186 -0
- package/docs/programmable-api/compatibility-dates.mdx +201 -0
- package/docs/programmable-api/console-logging.mdx +48 -0
- package/docs/programmable-api/context-data.mdx +127 -0
- package/docs/programmable-api/custom-cors-policy.mdx +64 -0
- package/docs/programmable-api/environment.mdx +328 -0
- package/docs/programmable-api/hooks.mdx +569 -0
- package/docs/programmable-api/http-problems.mdx +385 -0
- package/docs/programmable-api/jwt-service-plugin.mdx +420 -0
- package/docs/programmable-api/logger.mdx +223 -0
- package/docs/programmable-api/memory-zone-read-through-cache.mdx +96 -0
- package/docs/programmable-api/node-modules.mdx +67 -0
- package/docs/programmable-api/not-found-handler.mdx +47 -0
- package/docs/programmable-api/oauth-protected-resource-plugin.mdx +46 -0
- package/docs/programmable-api/overview.mdx +213 -0
- package/docs/programmable-api/problem-response-formatter.mdx +183 -0
- package/docs/programmable-api/request-user.mdx +289 -0
- package/docs/programmable-api/reusing-code.mdx +26 -0
- package/docs/programmable-api/route-raw.mdx +55 -0
- package/docs/programmable-api/runtime-behaviors.mdx +25 -0
- package/docs/programmable-api/runtime-errors.mdx +246 -0
- package/docs/programmable-api/runtime-extensions.mdx +340 -0
- package/docs/programmable-api/safely-clone-a-request-or-response.mdx +57 -0
- package/docs/programmable-api/streaming-zone-cache.mdx +155 -0
- package/docs/programmable-api/web-crypto-apis.mdx +219 -0
- package/docs/programmable-api/web-standard-apis.mdx +109 -0
- package/docs/programmable-api/zone-cache.mdx +131 -0
- package/docs/programmable-api/zp-body-removed.mdx +32 -0
- package/docs/programmable-api/zuplo-context.mdx +414 -0
- package/docs/programmable-api/zuplo-id-token.mdx +90 -0
- package/docs/programmable-api/zuplo-json.mdx +91 -0
- package/docs/programmable-api/zuplo-request.mdx +200 -0
- package/docs/sample-apis.mdx +78 -0
- package/docs/self-hosted/overview.md +60 -0
- package/package.json +6 -5
|
@@ -0,0 +1,521 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Generating S3 Signed URLs for Large File Uploads
|
|
3
|
+
sidebar_label: S3 Signed URL Uploads
|
|
4
|
+
description:
|
|
5
|
+
Learn how to bypass Zuplo's 500MB limit by generating pre-signed S3 URLs for
|
|
6
|
+
direct client uploads to Amazon S3.
|
|
7
|
+
tags:
|
|
8
|
+
- integrations
|
|
9
|
+
- backends
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
Zuplo's managed edge deployment has a 500MB request body size limit. For
|
|
13
|
+
applications that need to handle larger files, you can generate pre-signed S3
|
|
14
|
+
URLs that allow clients to upload directly to Amazon S3, bypassing the gateway
|
|
15
|
+
entirely.
|
|
16
|
+
|
|
17
|
+
:::tip{title="Managed Dedicated"}
|
|
18
|
+
|
|
19
|
+
If you require larger request sizes you can consider Zuplo's
|
|
20
|
+
[Managed Dedicated](../dedicated/overview.mdx) offering which allows custom
|
|
21
|
+
request size limits. Contact your Zuplo offering which allows custom request
|
|
22
|
+
size limits. Contact your Zuplo representative for more information.
|
|
23
|
+
|
|
24
|
+
:::
|
|
25
|
+
|
|
26
|
+
This approach offers several benefits:
|
|
27
|
+
|
|
28
|
+
- Upload files larger than 500MB
|
|
29
|
+
- Reduce bandwidth costs and latency
|
|
30
|
+
- Offload file transfer from your gateway
|
|
31
|
+
- Maintain security through temporary, scoped upload permissions
|
|
32
|
+
|
|
33
|
+
## Prerequisites
|
|
34
|
+
|
|
35
|
+
Before you begin, you need:
|
|
36
|
+
|
|
37
|
+
- An AWS account with S3 access
|
|
38
|
+
- An S3 bucket configured for your uploads
|
|
39
|
+
- AWS credentials (Access Key ID and Secret Access Key) with S3 write
|
|
40
|
+
permissions
|
|
41
|
+
- The AWS region where your bucket is located
|
|
42
|
+
|
|
43
|
+
Store your AWS credentials securely in Zuplo environment variables:
|
|
44
|
+
|
|
45
|
+
- `AWS_ACCESS_KEY_ID` - Your AWS access key
|
|
46
|
+
- `AWS_SECRET_ACCESS_KEY` - Your AWS secret key
|
|
47
|
+
- `AWS_REGION` - Your S3 bucket region (for example, `us-east-1`)
|
|
48
|
+
- `AWS_S3_BUCKET` - Your S3 bucket name
|
|
49
|
+
|
|
50
|
+
## Installing Dependencies
|
|
51
|
+
|
|
52
|
+
If you are developing locally and want code completion, etc., in your project,
|
|
53
|
+
install the AWS SDK for S3 to your project. These
|
|
54
|
+
dependencies](../programmable-api/node-modules.mdx) are already available in the
|
|
55
|
+
Zuplo runtime.
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
npm install @aws-sdk/client-s3 @aws-sdk/s3-request-presigner
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Creating the Handler
|
|
62
|
+
|
|
63
|
+
Create a new module in your Zuplo project that generates pre-signed URLs. This
|
|
64
|
+
handler accepts file metadata and returns a signed URL that clients can use to
|
|
65
|
+
upload directly to S3.
|
|
66
|
+
|
|
67
|
+
```ts title="modules/s3-signed-url.ts"
|
|
68
|
+
import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";
|
|
69
|
+
import { getSignedUrl } from "@aws-sdk/s3-request-presigner";
|
|
70
|
+
import { ZuploContext, ZuploRequest, environment } from "@zuplo/runtime";
|
|
71
|
+
|
|
72
|
+
interface UploadRequest {
|
|
73
|
+
fileName: string;
|
|
74
|
+
contentType: string;
|
|
75
|
+
// Optional: add custom metadata fields
|
|
76
|
+
metadata?: Record<string, string>;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
interface UploadResponse {
|
|
80
|
+
uploadUrl: string;
|
|
81
|
+
key: string;
|
|
82
|
+
expiresIn: number;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export default async function (
|
|
86
|
+
request: ZuploRequest,
|
|
87
|
+
context: ZuploContext,
|
|
88
|
+
): Promise<Response> {
|
|
89
|
+
// Parse request body
|
|
90
|
+
const body = (await request.json()) as UploadRequest;
|
|
91
|
+
|
|
92
|
+
if (!body.fileName || !body.contentType) {
|
|
93
|
+
return new Response(
|
|
94
|
+
JSON.stringify({
|
|
95
|
+
error: "fileName and contentType are required",
|
|
96
|
+
}),
|
|
97
|
+
{
|
|
98
|
+
status: 400,
|
|
99
|
+
headers: { "content-type": "application/json" },
|
|
100
|
+
},
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Configure S3 client
|
|
105
|
+
const s3Client = new S3Client({
|
|
106
|
+
region: environment.AWS_REGION,
|
|
107
|
+
credentials: {
|
|
108
|
+
accessKeyId: environment.AWS_ACCESS_KEY_ID!,
|
|
109
|
+
secretAccessKey: environment.AWS_SECRET_ACCESS_KEY!,
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
// Generate a unique key for the file
|
|
114
|
+
// Consider adding user ID or other identifiers to organize uploads
|
|
115
|
+
const timestamp = Date.now();
|
|
116
|
+
const key = `uploads/${timestamp}-${body.fileName}`;
|
|
117
|
+
|
|
118
|
+
// Create the put object command
|
|
119
|
+
const command = new PutObjectCommand({
|
|
120
|
+
Bucket: environment.AWS_S3_BUCKET,
|
|
121
|
+
Key: key,
|
|
122
|
+
ContentType: body.contentType,
|
|
123
|
+
Metadata: body.metadata,
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
try {
|
|
127
|
+
// Generate pre-signed URL that expires in 1 hour
|
|
128
|
+
const expiresIn = 3600;
|
|
129
|
+
const uploadUrl = await getSignedUrl(s3Client, command, { expiresIn });
|
|
130
|
+
|
|
131
|
+
const response: UploadResponse = {
|
|
132
|
+
uploadUrl,
|
|
133
|
+
key,
|
|
134
|
+
expiresIn,
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
return new Response(JSON.stringify(response), {
|
|
138
|
+
status: 200,
|
|
139
|
+
headers: { "content-type": "application/json" },
|
|
140
|
+
});
|
|
141
|
+
} catch (error) {
|
|
142
|
+
context.log.error("Failed to generate signed URL", error);
|
|
143
|
+
|
|
144
|
+
return new Response(
|
|
145
|
+
JSON.stringify({
|
|
146
|
+
error: "Failed to generate upload URL",
|
|
147
|
+
}),
|
|
148
|
+
{
|
|
149
|
+
status: 500,
|
|
150
|
+
headers: { "content-type": "application/json" },
|
|
151
|
+
},
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## Configuring the Route
|
|
158
|
+
|
|
159
|
+
Add a route in your `routes.oas.json` file to expose this handler:
|
|
160
|
+
|
|
161
|
+
```json
|
|
162
|
+
{
|
|
163
|
+
"paths": {
|
|
164
|
+
"/uploads/request-url": {
|
|
165
|
+
"post": {
|
|
166
|
+
"summary": "Request pre-signed S3 upload URL",
|
|
167
|
+
"x-zuplo-route": {
|
|
168
|
+
"handler": {
|
|
169
|
+
"export": "default",
|
|
170
|
+
"module": "$import(@/modules/s3-signed-url)"
|
|
171
|
+
},
|
|
172
|
+
"corsPolicy": "anything-goes"
|
|
173
|
+
},
|
|
174
|
+
"requestBody": {
|
|
175
|
+
"required": true,
|
|
176
|
+
"content": {
|
|
177
|
+
"application/json": {
|
|
178
|
+
"schema": {
|
|
179
|
+
"type": "object",
|
|
180
|
+
"properties": {
|
|
181
|
+
"fileName": {
|
|
182
|
+
"type": "string"
|
|
183
|
+
},
|
|
184
|
+
"contentType": {
|
|
185
|
+
"type": "string"
|
|
186
|
+
},
|
|
187
|
+
"metadata": {
|
|
188
|
+
"type": "object"
|
|
189
|
+
}
|
|
190
|
+
},
|
|
191
|
+
"required": ["fileName", "contentType"]
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
},
|
|
196
|
+
"responses": {
|
|
197
|
+
"200": {
|
|
198
|
+
"description": "Pre-signed upload URL"
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
:::note
|
|
208
|
+
|
|
209
|
+
Consider adding authentication policies to your route to ensure only authorized
|
|
210
|
+
users can request upload URLs.
|
|
211
|
+
|
|
212
|
+
:::
|
|
213
|
+
|
|
214
|
+
## Client Implementation
|
|
215
|
+
|
|
216
|
+
Here's how clients can use the generated signed URL to upload files:
|
|
217
|
+
|
|
218
|
+
### JavaScript/TypeScript
|
|
219
|
+
|
|
220
|
+
```ts
|
|
221
|
+
// Step 1: Request the signed URL from your API
|
|
222
|
+
async function requestUploadUrl(
|
|
223
|
+
fileName: string,
|
|
224
|
+
contentType: string,
|
|
225
|
+
): Promise<{ uploadUrl: string; key: string }> {
|
|
226
|
+
const response = await fetch(
|
|
227
|
+
"https://your-api.zuplo.app/uploads/request-url",
|
|
228
|
+
{
|
|
229
|
+
method: "POST",
|
|
230
|
+
headers: {
|
|
231
|
+
"content-type": "application/json",
|
|
232
|
+
// Add authentication headers as needed
|
|
233
|
+
authorization: "Bearer YOUR_TOKEN",
|
|
234
|
+
},
|
|
235
|
+
body: JSON.stringify({
|
|
236
|
+
fileName,
|
|
237
|
+
contentType,
|
|
238
|
+
metadata: {
|
|
239
|
+
// Optional: add custom metadata
|
|
240
|
+
userId: "user123",
|
|
241
|
+
},
|
|
242
|
+
}),
|
|
243
|
+
},
|
|
244
|
+
);
|
|
245
|
+
|
|
246
|
+
if (!response.ok) {
|
|
247
|
+
throw new Error("Failed to get upload URL");
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
return response.json();
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// Step 2: Upload the file directly to S3
|
|
254
|
+
async function uploadFile(file: File): Promise<string> {
|
|
255
|
+
// Get the signed URL
|
|
256
|
+
const { uploadUrl, key } = await requestUploadUrl(file.name, file.type);
|
|
257
|
+
|
|
258
|
+
// Upload directly to S3
|
|
259
|
+
const uploadResponse = await fetch(uploadUrl, {
|
|
260
|
+
method: "PUT",
|
|
261
|
+
body: file,
|
|
262
|
+
headers: {
|
|
263
|
+
"content-type": file.type,
|
|
264
|
+
},
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
if (!uploadResponse.ok) {
|
|
268
|
+
throw new Error("Failed to upload file");
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// Return the S3 key for reference
|
|
272
|
+
return key;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
// Usage
|
|
276
|
+
const fileInput = document.querySelector('input[type="file"]');
|
|
277
|
+
fileInput.addEventListener("change", async (event) => {
|
|
278
|
+
const file = event.target.files[0];
|
|
279
|
+
if (file) {
|
|
280
|
+
try {
|
|
281
|
+
const s3Key = await uploadFile(file);
|
|
282
|
+
console.log("File uploaded successfully:", s3Key);
|
|
283
|
+
} catch (error) {
|
|
284
|
+
console.error("Upload failed:", error);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
### React Example
|
|
291
|
+
|
|
292
|
+
```tsx
|
|
293
|
+
import { useState } from "react";
|
|
294
|
+
|
|
295
|
+
function FileUploader() {
|
|
296
|
+
const [uploading, setUploading] = useState(false);
|
|
297
|
+
const [progress, setProgress] = useState(0);
|
|
298
|
+
|
|
299
|
+
const handleUpload = async (file: File) => {
|
|
300
|
+
setUploading(true);
|
|
301
|
+
setProgress(0);
|
|
302
|
+
|
|
303
|
+
try {
|
|
304
|
+
// Request signed URL
|
|
305
|
+
const response = await fetch(
|
|
306
|
+
"https://your-api.zuplo.app/uploads/request-url",
|
|
307
|
+
{
|
|
308
|
+
method: "POST",
|
|
309
|
+
headers: {
|
|
310
|
+
"content-type": "application/json",
|
|
311
|
+
authorization: `Bearer ${getAuthToken()}`,
|
|
312
|
+
},
|
|
313
|
+
body: JSON.stringify({
|
|
314
|
+
fileName: file.name,
|
|
315
|
+
contentType: file.type,
|
|
316
|
+
}),
|
|
317
|
+
},
|
|
318
|
+
);
|
|
319
|
+
|
|
320
|
+
const { uploadUrl, key } = await response.json();
|
|
321
|
+
|
|
322
|
+
// Upload to S3 with progress tracking
|
|
323
|
+
const xhr = new XMLHttpRequest();
|
|
324
|
+
|
|
325
|
+
xhr.upload.addEventListener("progress", (e) => {
|
|
326
|
+
if (e.lengthComputable) {
|
|
327
|
+
setProgress((e.loaded / e.total) * 100);
|
|
328
|
+
}
|
|
329
|
+
});
|
|
330
|
+
|
|
331
|
+
await new Promise((resolve, reject) => {
|
|
332
|
+
xhr.addEventListener("load", () => {
|
|
333
|
+
if (xhr.status === 200) {
|
|
334
|
+
resolve(key);
|
|
335
|
+
} else {
|
|
336
|
+
reject(new Error("Upload failed"));
|
|
337
|
+
}
|
|
338
|
+
});
|
|
339
|
+
|
|
340
|
+
xhr.addEventListener("error", () => reject(new Error("Upload failed")));
|
|
341
|
+
|
|
342
|
+
xhr.open("PUT", uploadUrl);
|
|
343
|
+
xhr.setRequestHeader("Content-Type", file.type);
|
|
344
|
+
xhr.send(file);
|
|
345
|
+
});
|
|
346
|
+
|
|
347
|
+
alert("File uploaded successfully!");
|
|
348
|
+
} catch (error) {
|
|
349
|
+
console.error("Upload failed:", error);
|
|
350
|
+
alert("Upload failed. Please try again.");
|
|
351
|
+
} finally {
|
|
352
|
+
setUploading(false);
|
|
353
|
+
}
|
|
354
|
+
};
|
|
355
|
+
|
|
356
|
+
return (
|
|
357
|
+
<div>
|
|
358
|
+
<input
|
|
359
|
+
type="file"
|
|
360
|
+
onChange={(e) => {
|
|
361
|
+
const file = e.target.files?.[0];
|
|
362
|
+
if (file) handleUpload(file);
|
|
363
|
+
}}
|
|
364
|
+
disabled={uploading}
|
|
365
|
+
/>
|
|
366
|
+
{uploading && <progress value={progress} max="100" />}
|
|
367
|
+
</div>
|
|
368
|
+
);
|
|
369
|
+
}
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
## Security Considerations
|
|
373
|
+
|
|
374
|
+
### Time-Limited URLs
|
|
375
|
+
|
|
376
|
+
Pre-signed URLs expire after the specified duration (default: 1 hour in the
|
|
377
|
+
example). Adjust the `expiresIn` parameter based on your needs:
|
|
378
|
+
|
|
379
|
+
```ts
|
|
380
|
+
// Shorter expiration for sensitive uploads
|
|
381
|
+
const expiresIn = 600; // 10 minutes
|
|
382
|
+
|
|
383
|
+
// Longer expiration for large files
|
|
384
|
+
const expiresIn = 7200; // 2 hours
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
### File Organization
|
|
388
|
+
|
|
389
|
+
Consider organizing uploads by user or purpose to simplify management:
|
|
390
|
+
|
|
391
|
+
```ts
|
|
392
|
+
// Organize by user and date
|
|
393
|
+
const userId = request.user.sub; // From authentication
|
|
394
|
+
const date = new Date().toISOString().split("T")[0];
|
|
395
|
+
const key = `uploads/${userId}/${date}/${timestamp}-${body.fileName}`;
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
### Content Type Validation
|
|
399
|
+
|
|
400
|
+
Validate file types before generating signed URLs:
|
|
401
|
+
|
|
402
|
+
```ts
|
|
403
|
+
const allowedTypes = [
|
|
404
|
+
"image/jpeg",
|
|
405
|
+
"image/png",
|
|
406
|
+
"image/gif",
|
|
407
|
+
"application/pdf",
|
|
408
|
+
"video/mp4",
|
|
409
|
+
];
|
|
410
|
+
|
|
411
|
+
if (!allowedTypes.includes(body.contentType)) {
|
|
412
|
+
return new Response(
|
|
413
|
+
JSON.stringify({
|
|
414
|
+
error: "File type not allowed",
|
|
415
|
+
}),
|
|
416
|
+
{
|
|
417
|
+
status: 400,
|
|
418
|
+
headers: { "content-type": "application/json" },
|
|
419
|
+
},
|
|
420
|
+
);
|
|
421
|
+
}
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
### File Size Limits
|
|
425
|
+
|
|
426
|
+
While S3 can handle files up to 5TB, you may want to enforce size limits. Add
|
|
427
|
+
validation on the client side and consider implementing S3 bucket policies to
|
|
428
|
+
enforce maximum object sizes.
|
|
429
|
+
|
|
430
|
+
## Advanced Features
|
|
431
|
+
|
|
432
|
+
### Multipart Upload for Very Large Files
|
|
433
|
+
|
|
434
|
+
For files larger than 5GB, use multipart uploads. This requires generating
|
|
435
|
+
signed URLs for each part:
|
|
436
|
+
|
|
437
|
+
```ts
|
|
438
|
+
import {
|
|
439
|
+
CreateMultipartUploadCommand,
|
|
440
|
+
UploadPartCommand,
|
|
441
|
+
} from "@aws-sdk/client-s3";
|
|
442
|
+
|
|
443
|
+
// Create multipart upload
|
|
444
|
+
const multipartCommand = new CreateMultipartUploadCommand({
|
|
445
|
+
Bucket: environment.AWS_S3_BUCKET,
|
|
446
|
+
Key: key,
|
|
447
|
+
ContentType: body.contentType,
|
|
448
|
+
});
|
|
449
|
+
|
|
450
|
+
const multipartUpload = await s3Client.send(multipartCommand);
|
|
451
|
+
const uploadId = multipartUpload.UploadId;
|
|
452
|
+
|
|
453
|
+
// Generate signed URLs for each part
|
|
454
|
+
// Client uploads each part separately, then completes the upload
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
### Upload Notifications
|
|
458
|
+
|
|
459
|
+
Set up S3 event notifications to trigger actions when uploads complete:
|
|
460
|
+
|
|
461
|
+
1. Configure S3 bucket notifications to send events to SQS, SNS, or Lambda
|
|
462
|
+
2. Process uploaded files asynchronously
|
|
463
|
+
3. Update your database with file metadata
|
|
464
|
+
4. Run virus scanning or other validations
|
|
465
|
+
|
|
466
|
+
### Pre-signed POST URLs
|
|
467
|
+
|
|
468
|
+
For browser uploads with additional security, use pre-signed POST URLs instead
|
|
469
|
+
of PUT:
|
|
470
|
+
|
|
471
|
+
```ts
|
|
472
|
+
import { createPresignedPost } from "@aws-sdk/s3-presigned-post";
|
|
473
|
+
|
|
474
|
+
const { url, fields } = await createPresignedPost(s3Client, {
|
|
475
|
+
Bucket: environment.AWS_S3_BUCKET,
|
|
476
|
+
Key: key,
|
|
477
|
+
Conditions: [
|
|
478
|
+
["content-length-range", 0, 10485760], // 10MB max
|
|
479
|
+
["starts-with", "$Content-Type", "image/"],
|
|
480
|
+
],
|
|
481
|
+
Expires: 3600,
|
|
482
|
+
});
|
|
483
|
+
|
|
484
|
+
// Client submits multipart/form-data with the fields
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
## Troubleshooting
|
|
488
|
+
|
|
489
|
+
### CORS Issues
|
|
490
|
+
|
|
491
|
+
If clients receive CORS errors when uploading to S3, configure CORS on your S3
|
|
492
|
+
bucket:
|
|
493
|
+
|
|
494
|
+
```json
|
|
495
|
+
[
|
|
496
|
+
{
|
|
497
|
+
"AllowedHeaders": ["*"],
|
|
498
|
+
"AllowedMethods": ["PUT", "POST"],
|
|
499
|
+
"AllowedOrigins": ["https://your-domain.com"],
|
|
500
|
+
"ExposeHeaders": ["ETag"],
|
|
501
|
+
"MaxAgeSeconds": 3000
|
|
502
|
+
}
|
|
503
|
+
]
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
### Invalid Signature Errors
|
|
507
|
+
|
|
508
|
+
Ensure your AWS credentials are correct and have the necessary permissions. The
|
|
509
|
+
IAM user or role needs `s3:PutObject` permission for the bucket.
|
|
510
|
+
|
|
511
|
+
### Clock Skew
|
|
512
|
+
|
|
513
|
+
Pre-signed URLs are sensitive to time differences. Ensure your systems have
|
|
514
|
+
accurate time synchronization via NTP.
|
|
515
|
+
|
|
516
|
+
## Related Resources
|
|
517
|
+
|
|
518
|
+
- [Custom Handler Documentation](../handlers/custom-handler.mdx)
|
|
519
|
+
- [Environment Variables](./environment-variables.mdx)
|
|
520
|
+
- [AWS S3 Documentation](https://docs.aws.amazon.com/s3/)
|
|
521
|
+
- [AWS SDK for JavaScript v3](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/)
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Secure Tunnel
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
For customers running on bare metal, on-premises, or other non-cloud providers
|
|
6
|
+
tunnels provides a way to secure your backend without mTLS or IAM.
|
|
7
|
+
|
|
8
|
+
The way this system works is by deploying a small service inside your network or
|
|
9
|
+
VPC that makes a secure outbound connection to Zuplo's infrastructure. Your
|
|
10
|
+
Zuplo API Gateway can then use this tunnel to securely route traffic to your
|
|
11
|
+
private API. The benefits of a secure tunnel are:
|
|
12
|
+
|
|
13
|
+
1. Because the tunnel makes an outbound connection, there is no need for your
|
|
14
|
+
API to be exposed on the internet at all.
|
|
15
|
+
2. All traffic between Zuplo and your API is fully encrypted.
|
|
16
|
+
3. You eliminate the need to configure complex ingress, firewall, or other types
|
|
17
|
+
of policies to route traffic into your API. Simply install the tunnel and
|
|
18
|
+
Zuplo takes care of the rest.
|
|
19
|
+
|
|
20
|
+
## How does the Tunnel Work?
|
|
21
|
+
|
|
22
|
+
The Zuplo tunnel can run on virtually any infrastructure. The most common way
|
|
23
|
+
users install the tunnel is as a Docker container, but we can provide you a
|
|
24
|
+
build in virtually any format (for example an Azure VM, etc.). The tunnel itself
|
|
25
|
+
is a lightweight service that when started makes an outbound connection to the
|
|
26
|
+
Zuplo network and then through to your Zuplo Gateway.
|
|
27
|
+
|
|
28
|
+
When the tunnel service connects to the Zuplo network, traffic from your gateway
|
|
29
|
+
can be routed to internal services running in your network or VPC. For example,
|
|
30
|
+
if your API is running on the internal DNS address `external-api.local`, the
|
|
31
|
+
tunnel will route traffic from the Zuplo API Gateway to your internal service
|
|
32
|
+
based only on the code and policies you have set up in your Zuplo Gateway.
|
|
33
|
+
|
|
34
|
+
The example below illustrates how the Zuplo tunnel would be configured in an AWS
|
|
35
|
+
ECS Cluster. Notice that there is no public IP address or ingress traffic in
|
|
36
|
+
this configuration. This is a completely private VPC. The tunnel makes an
|
|
37
|
+
outbound connection to the Zuplo Gateway and then uses internal DNS to route
|
|
38
|
+
requests to the Private API.
|
|
39
|
+
|
|
40
|
+

|
|
41
|
+
|
|
42
|
+
## Is this Secure?
|
|
43
|
+
|
|
44
|
+
Zuplo builds on top of many different tools to ensure that your gateway and API
|
|
45
|
+
stay secure. Each tunnel uses a secret key that allows it to securely connect to
|
|
46
|
+
Zuplo's network. Under the hood, Zuplo relies on Cloudflare's network for
|
|
47
|
+
establishing secure and reliable tunnel connections. Each tunnel is configured
|
|
48
|
+
with unique access policies that allow only the Zuplo Gateway that you have
|
|
49
|
+
authorized to make connections over that tunnel. Every incoming request is
|
|
50
|
+
terminated using Cloudflare's network which provides sophisticated DDoS, bot,
|
|
51
|
+
and threat protections. Next, the request is routed through your Zuplo Gateway
|
|
52
|
+
which can be configured with all policies and code you require to control access
|
|
53
|
+
to your API. By default, no requests will be routed from your gateway to your
|
|
54
|
+
API until you configure routes, URL rewrites, and policies in your Gateway.
|
|
55
|
+
|
|
56
|
+
All traffic is terminated at the edge with SSL certificates and encrypted
|
|
57
|
+
through the entire route to your API. All requests that your gateway makes to
|
|
58
|
+
Zuplo's internal services like API Key Management or Rate Limiting are also
|
|
59
|
+
transported over secure and encrypted tunnels.
|
|
60
|
+
|
|
61
|
+
Every request is logged and you can configure Zuplo's logs to push to the log
|
|
62
|
+
service of your choice.
|
|
63
|
+
|
|
64
|
+
## How will tunnels perform?
|
|
65
|
+
|
|
66
|
+
Most customers are fine running two instances of the tunnel service for
|
|
67
|
+
redundancy in the event one pod/service fails. Each tunnel is able to handle
|
|
68
|
+
millions of requests per minute. For customers that require additional scale,
|
|
69
|
+
simply increase the number of tunnel instances you are running or configure auto
|
|
70
|
+
scaling on your deployment. It's unlikely that the tunnel will become the
|
|
71
|
+
bottleneck in your traffic before other factors, but if you do run into any
|
|
72
|
+
issues [contact support](mailto:support@zuplo.com) and we will work out a
|
|
73
|
+
solution that meets your scale requirements.
|
|
74
|
+
|
|
75
|
+
## How should I Configure the Tunnel?
|
|
76
|
+
|
|
77
|
+
You should run your tunnel with an IAM role or other network policies that only
|
|
78
|
+
allow the tunnel to make requests to the network services that you want your
|
|
79
|
+
Gateway to access. This can be done in a variety of ways depending on your
|
|
80
|
+
setup. IAM roles, network segregation, and internal service meshes are common
|
|
81
|
+
means of controlling which services the tunnel can access.
|
|
82
|
+
|
|
83
|
+
For details on how to configure a tunnel on your network see
|
|
84
|
+
[the setup guide](tunnel-setup.mdx).
|