Astro Cloudflare Deploy Creates a SESSION KV Binding: When to Set session: false
If an Astro Cloudflare deploy asks for permission to create a KV namespace named SESSION even though your application does not use sessions, check Astro’s session setting before changing your API token. With Astro 7.2.0, set session: false when the app has no session storage. If the app does use sessions, keep session support enabled and declare a real KV binding with its namespace ID.
This failure usually appears after astro build has succeeded. The Cloudflare adapter can generate a Wrangler configuration that asks Wrangler to auto-provision a SESSION binding. Deploy then fails because the token cannot create or edit KV resources, which makes an application configuration problem look like a generic authentication problem.
Decide whether the app needs Astro sessions
Astro sessions are for server-side user data such as a cart, a login flow, or a short-lived form state. A static site, documentation site, or mostly prerendered blog normally does not need them. If your application never reads Astro.session and does not need server-side per-user state, opt out explicitly:
import { defineConfig } from 'astro/config';import cloudflare from '@astrojs/cloudflare';
export default defineConfig({ adapter: cloudflare(), session: false,});The session: false option is the useful boundary here. It tells Astro that session support is not part of this deployment, so the runtime and adapter do not need to arrange storage for it. It is not a permission workaround: do not add it if a route or integration actually depends on Astro.session.
If the site is fully static, also reconsider whether the Cloudflare adapter is needed at all. An adapter is for a deployment that needs server output or Cloudflare runtime features. A static build can be deployed as generated files without a server-side session store. The Astro static site with Caddy and Docker guide covers that separate deployment boundary.
Confirm the generated Wrangler configuration
Inspect the deployment artifact rather than guessing from the source configuration. Run the build, then look for the generated server configuration:
pnpm exec astro buildrg -n 'SESSION|kv_namespaces|session' dist/server/wrangler.jsonThe exact generated file can vary with the adapter and project settings, but the Cloudflare issue that motivated this check reports an id-less SESSION entry in dist/server/wrangler.json. An id-less KV namespace is a signal for Wrangler to provision a resource during deploy. It is different from a binding that points at an existing namespace ID.
After setting session: false, rebuild from a clean output directory and inspect the generated configuration again:
rm -rf distpnpm exec astro buildrg -n 'SESSION|kv_namespaces|session' dist/server/wrangler.json || trueThe rm command is intentionally limited to the generated dist/ directory. In CI, use the build system’s clean-output option or a disposable workspace instead of deleting a shared directory.
Keep sessions and configure the KV binding instead
When the application needs sessions, do not disable them just to get a deploy through. Create or select a KV namespace, then declare the binding with its real ID in the Wrangler configuration used by the deployment:
{ "kv_namespaces": [ { "binding": "SESSION", "id": "your-production-namespace-id" } ]}The binding name must match the name expected by the Astro Cloudflare adapter. Astro documents SESSION as the default binding name and provides an option for a custom binding name. If you use a custom name, keep the adapter setting and Wrangler configuration aligned; changing only one side produces a different runtime failure after the deploy succeeds.
Cloudflare requires a namespace ID for a KV binding. Treat that ID and the environment it belongs to as deployment configuration, not as a value to invent in the source repository. Use separate preview and production namespaces when the data must not cross environments.
Fix the token only when provisioning is intentional
If the build output legitimately contains a new KV namespace request, the deploy token needs permission to perform that operation. The Astro issue reports the failure as a missing Workers KV Storage: Edit permission. Grant that permission only to the deployment identity that needs to create or update namespaces, and prefer a pre-created namespace with an explicit ID when your release process requires infrastructure changes to be reviewed separately.
Check the token after deciding which path you need:
- No session state: set
session: false, rebuild, and confirm the generated config no longer asks for an automatic session namespace. - Existing session state: declare the correct binding and namespace ID, then deploy with the normal worker permissions.
- Intentional provisioning: keep the id-less binding only when your infrastructure policy allows Wrangler to provision it, and grant the narrowly required KV permission.
Do not respond to this error by giving a broad account token more permissions. The generated binding tells you which capability is missing; it does not justify granting unrelated account access.
Verify the failure path before production
Use a preview project or a disposable namespace for the first deploy after changing the session configuration. Check all three stages independently:
pnpm exec astro buildwrangler deploy --dry-runwrangler deployThe dry run helps distinguish a generated configuration problem from an API permission problem. After a successful deploy, exercise one route that would read or write a session if sessions are enabled. For a session-free site, verify that the server starts without a SESSION binding and that the static or server-rendered routes return normally.
Astro 7.2.0 also removes unnecessary session runtime dependencies when no session driver is wired. That makes the explicit opt-out useful for edge deployments, but the main reason to use it is correctness: the deployment should request only resources the application needs.
FAQ
Why does Astro mention KV when my code never calls KV?
The Cloudflare adapter can configure session storage for the deployment. The generated Wrangler configuration may therefore contain a default SESSION binding even when your application code does not visibly call the KV API. Check whether the app needs sessions and opt out when it does not.
Should I add session: false to every Astro Cloudflare project?
No. Add it only when the application does not use Astro sessions. A cart, login state, or other server-side per-user data may require session storage and a real KV binding.
Why does the build pass while deploy fails?
The build writes the adapter’s deployment configuration locally. Wrangler performs the Cloudflare API operation during deployment, so a missing KV permission or an id-less binding can remain invisible until wrangler deploy runs.
References:
Report a typo or broken link, or suggest a related topic.