# CDK deployment (doc_redaction) Interactive installer: [`cdk_install.py`](cdk_install.py). Configuration: [`config/cdk_config.env`](config/cdk_config.env). Human-oriented walkthrough: [Installation Guide](https://seanpedrick-case.github.io/doc_redaction/src/installation_guide.html). ## CloudFront response headers (CSP / CORS) When `USE_CLOUDFRONT=True` and `CLOUDFRONT_ENABLE_SECURE_RESPONSE_HEADERS=True`, the stack **creates** a CloudFront **response headers policy** (see [`cdk_cloudfront_headers.py`](cdk_cloudfront_headers.py) and [`config/response-headers-policy-config.json`](config/response-headers-policy-config.json)). The policy is created as a standalone resource so it appears in the account's CloudFront policy list and can be attached manually. Attaching the policy to the distribution's behaviors is controlled separately by `CLOUDFRONT_ATTACH_SECURE_RESPONSE_HEADERS` (**default `False`**). Attaching the CSP/security headers tends to break demonstration mode (Cognito redirect flows and mixed Express origins), so by default the policy is created but **left detached**. Set `CLOUDFRONT_ATTACH_SECURE_RESPONSE_HEADERS=True` to wire it onto the distribution. The policy’s **CORS origin** and **Content-Security-Policy** `connect-src` (Gradio WebSocket: `wss://…`) must match the browser-facing app URL. ### Why `cloudfront_placeholder.net` appears on first deploy The real `*.cloudfront.net` domain is only assigned **after** the distribution is created. The response headers policy is a **separate** CloudFormation resource referenced by the distribution; it cannot reference `distribution.domain_name` without a **circular dependency** (distribution → policy → distribution). On the first deploy, `CLOUDFRONT_DOMAIN` and `COGNITO_REDIRECTION_URL` therefore use a synth-time placeholder (`cloudfront_placeholder.net`). CSP/CORS are built from those values. ### Automatic fix (installer) After the initial `cdk deploy`, [`cdk_install.py`](cdk_install.py): 1. Reads `CloudFrontDistributionURL` from stack outputs. 2. Writes the real domain to `CLOUDFRONT_DOMAIN` and `COGNITO_REDIRECTION_URL` in `cdk_config.env` (and updates Cognito callback URLs via API). 3. Prompts for a **one-off refresh deploy** of `RedactionStack` so the response headers policy and related config use the real domain. Use `--yes` to accept the refresh deploy without prompting. If you skip it, run manually: ```bash cd cdk cdk deploy RedactionStack ``` ### Single-pass alternative (custom domain) If you set `SSL_CERTIFICATE_DOMAIN` and `ACM_SSL_CERTIFICATE_ARN` (production profile), the app origin is known at synth time and CSP/CORS are correct on the **first** deploy—no placeholder and no refresh deploy. ### Verify after deploy In the AWS console: **CloudFront** → your distribution → **Behaviors** → response headers policy. CORS should list `https://` and CSP `connect-src` should include `wss://` (not `cloudfront_placeholder.net`).