Cloudflare-Tunnel-Migration mcp-vf-hosted (VERALTET)

⚠️ VERALTET seit 2026-05-11 — Annahmen falsch. Dieser Prompt ging davon aus dass ECS Express Mode eine klassische Task-Definition hat in der man einen Sidecar (cloudflared) hinzufuegen kann. ECS Express unterstuetzt aber nur einen primary Container (API-Doku). Sidecar-Pattern braucht klassisches Fargate.

Aktueller Prompt: fargate-tunnel-migration-prompt Architektur-Entscheidung: hosted-mcp-architektur-2026 Pattern-File: mcp-hosting-fargate-tunnel


Ausfuehrbarer Prompt um den ECS-Service mcp-vf-hosted vom ALB-Setup auf Cloudflare-Tunnel-Sidecar umzubauen. Spart ~17€/Monat ALB-Fixkosten (siehe Cost-Analyse).

Wann ausfuehren

  • NS-Switch in cloudflare-migration-guide mindestens angestossen — Tunnel selbst geht auch wenn Zone noch pending, nur Phase 4 (DNS-Cutover) wartet auf Zone-Status active
  • Cloudflare-Account existiert
  • API-Token erstellt unter dash.cloudflare.com/profile/api-tokens mit:
    • Account:Cloudflare Tunnel:Edit
    • Zone:DNS:Edit (scoped auf agenticventures.de)

Pre-Run-Setup (Mensch, ~5 Min)

export CF_API_TOKEN="<token-aus-cloudflare-dashboard>"
export CF_ACCOUNT_ID="<account-id-aus-dashboard-rechts-oben>"
export CF_ZONE_ID="<zone-id-von-agenticventures.de-overview-seite>"
 
# Sanity-Check
curl -s -H "Authorization: Bearer $CF_API_TOKEN" \
  https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID | jq '.result.status'
# Erwartet: "active" oder "pending"

Der Prompt (Copy-Paste in frische Claude-Code-Session in ~/source/mcps/mcp-vf-hosted/)

# Ziel: ECS-Service mcp-vf-hosted hinter Cloudflare Tunnel statt ALB
 
## Kontext
 
- Repo: `~/source/mcps/mcp-vf-hosted` — FastMCP v2 Wrapper, läuft heute auf AWS ECS Express in `av-production` (425924867359), eu-central-1
- Aktueller Endpoint: `mc-1a56ed08537b4f9fae11028fe698af47.ecs.eu-central-1.on.aws` (ALB-managed, Express-Mode)
- Cloudflare-Zone `agenticventures.de` ist in NS-Propagation — Zone evtl. noch nicht aktiv
- Ziel-Topologie: cloudflared als Sidecar im Task, ALB raus, Origin nur noch via Tunnel erreichbar
- Doku-Refs: `~/source/agentic-ventures/intern/capabilities/mcps/mcp-vf-hosted.md`, `~/source/agentic-ventures/intern/projekte/mcp-pipeline-aws/cloudflare-migration-guide.md`, `~/source/agentic-ventures/intern/wissen/prozesse/cloudflare-capability-map.md`
 
## Vorbedingungen (zuerst prüfen, bei Fehler stoppen)
 
1. `aws sts get-caller-identity --profile av-production` → Account 425924867359
2. `echo $CF_API_TOKEN` gesetzt — Token mit `Cloudflare Tunnel:Edit` + `Zone:DNS:Edit` für `agenticventures.de`
3. `echo $CF_ACCOUNT_ID` gesetzt
4. `echo $CF_ZONE_ID` gesetzt
5. Cloudflare-Zone-Status prüfen: `curl -s -H "Authorization: Bearer $CF_API_TOKEN" https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID | jq '.result.status'` — Wert `active` ideal, `pending` akzeptabel (Phase 4 verschoben), alles andere → stop
6. ECS-Service-Status: `aws ecs describe-services --cluster default --services mcp-vf-hosted --profile av-production --region eu-central-1` — muss `ACTIVE` sein
 
Bei einer Failed-Bedingung: stoppen, Diagnose ausgeben, **nicht** raten.
 
## Phase 1 — Tunnel anlegen (NS-unabhängig, geht sofort)
 
1. Prüfen ob Tunnel `mcp-vf-hosted` schon existiert:
   ```
   curl -s -H "Authorization: Bearer $CF_API_TOKEN" \
     "https://api.cloudflare.com/client/v4/accounts/$CF_ACCOUNT_ID/cfd_tunnel?name=mcp-vf-hosted"
   ```
   Wenn ja → ID merken, Schritt 2 überspringen.
 
2. Tunnel anlegen via API `POST /accounts/{id}/cfd_tunnel` mit Body `{"name":"mcp-vf-hosted","config_src":"cloudflare"}`. Response liefert `id` und `token` (Connector-Token).
 
3. Tunnel-Token in AWS Secrets Manager speichern:
   ```
   aws secretsmanager create-secret \
     --name mcp-vf-hosted/cloudflared-token \
     --secret-string "$TUNNEL_TOKEN" \
     --profile av-production --region eu-central-1
   ```
   Bei `ResourceExistsException`: `put-secret-value` statt `create-secret`.
 
4. Ingress-Konfiguration für Tunnel setzen via `PUT /accounts/{id}/cfd_tunnel/{tunnel-id}/configurations`:
   ```json
   {"config":{"ingress":[
     {"hostname":"mcp-vf.agenticventures.de","service":"http://localhost:8080"},
     {"service":"http_status:404"}
   ]}}
   ```
 
## Phase 2 — ECS-Task-Definition erweitern (NS-unabhängig)
 
1. Aktuelle Task-Def holen: `aws ecs describe-task-definition --task-definition mcp-vf-hosted --profile av-production --region eu-central-1 > /tmp/td-current.json`
 
2. Sidecar-Container zur `containerDefinitions`-Liste hinzufügen:
   ```json
   {
     "name": "cloudflared",
     "image": "cloudflare/cloudflared:latest",
     "essential": true,
     "command": ["tunnel", "--no-autoupdate", "run"],
     "secrets": [
       {"name": "TUNNEL_TOKEN", "valueFrom": "arn:aws:secretsmanager:eu-central-1:425924867359:secret:mcp-vf-hosted/cloudflared-token"}
     ],
     "logConfiguration": {
       "logDriver": "awslogs",
       "options": {
         "awslogs-group": "/aws/ecs/default/mcp-vf-hosted-cloudflared",
         "awslogs-region": "eu-central-1",
         "awslogs-stream-prefix": "cloudflared",
         "awslogs-create-group": "true"
       }
     }
   }
   ```
 
3. IAM-Task-Exec-Role muss `secretsmanager:GetSecretValue` auf den neuen Secret-ARN haben. Falls fehlt: Policy ergänzen, **nicht** breit auf alle Secrets.
 
4. Neue Task-Def-Revision registrieren: `aws ecs register-task-definition --cli-input-json file:///tmp/td-new.json --profile av-production --region eu-central-1`
 
5. ECS-Service auf neue Revision updaten: `aws ecs update-service --cluster default --service mcp-vf-hosted --task-definition mcp-vf-hosted:<NEW_REV> --profile av-production --region eu-central-1`
 
6. Deployment beobachten bis `runningCount == desiredCount` und `deployments` nur eine PRIMARY hat. Maximal 5 Minuten warten, dann CloudWatch-Logs des `cloudflared`-Containers checken auf `Registered tunnel connection`.
 
## Phase 3 — Smoke-Test über Tunnel-Hostname (jetzt sofort möglich)
 
Der Tunnel ist über `<tunnel-id>.cfargotunnel.com` erreichbar, **ohne** dass die Zone aktiv sein muss. Aber Cloudflare-Edge braucht das in der DNS — nur für die finale Subdomain ist die aktive Zone Pflicht.
 
Testen mit `Host`-Header-Override:
```
curl -sS -i https://<tunnel-id>.cfargotunnel.com/health \
  -H "Host: mcp-vf.agenticventures.de"
```
Erwartet: `HTTP/2 200`, `{"ok":true,"service":"vf-mono",...}`.
 
Bei Fehler: cloudflared-Logs in CloudWatch, ECS-Task-Status, `aws logs tail`.
 
## Phase 4 — DNS-Cutover (NUR wenn CF-Zone-Status = `active`)
 
Wenn Phase 1 Schritt 5 `pending` ergab: hier STOP, dem User sagen „Phase 4 läuft sobald NS-Propagation durch ist".
 
Wenn `active`:
 
1. DNS-Record `mcp-vf` in Zone holen, ID merken.
2. Record updaten: `type: CNAME`, `content: <tunnel-id>.cfargotunnel.com`, `proxied: true`.
3. ~60s warten (Cloudflare-Edge-Cache-TTL).
4. Smoke-Test ohne Host-Override:
   ```
   curl -sS -i https://mcp-vf.agenticventures.de/health
   ```
   Erwartet: `HTTP/2 200`, Header `server: cloudflare`, `cf-ray: ...`.
5. 24h Observability-Phase ausrufen — keine ALB-Löschung in dieser Session.
 
## Phase 5 — ALB-Abbau (NICHT in dieser Session, nur dokumentieren)
 
Nach 24h sauberem Lauf:
- ECS-Service-Definition: `loadBalancers` leer setzen
- ALB Target-Group + Listener + ALB selbst löschen
- Kosten-Ersparnis verifizieren in Cost Explorer
- `mcp-vf-hosted.md` aktualisieren (Endpoint-Tabelle, Cost-Sektion)
 
## Rollback (falls Phase 2 oder Phase 4 bricht)
 
- ECS-Service auf vorherige Task-Def zurück: `aws ecs update-service --task-definition mcp-vf-hosted:<OLD_REV>`
- DNS-Record wieder auf alten Hostname (`mc-1a56ed08537b4f9fae11028fe698af47.ecs.eu-central-1.on.aws`, proxied)
- Tunnel kann gelassen werden — kostet nichts wenn unbenutzt
 
## Wiki-Updates am Ende der Session
 
Wenn alles bis inkl. Phase 4 grün:
- `~/source/agentic-ventures/intern/capabilities/mcps/mcp-vf-hosted.md` — Architektur-Diagramm, Endpoint, Cost-Sektion
- `~/source/agentic-ventures/intern/projekte/mcp-pipeline-aws/_index.md` — Phase 1B als done markieren, Phase „ALB-Abbau" anlegen
- `~/source/agentic-ventures/intern/wissen/prozesse/mcp-hosting-aws-ecs-express.md` — Tunnel-Pattern als Standard für künftige hosted MCPs
 
## Was du NICHT tun darfst
 
- ALB löschen in dieser Session — erst nach 24h Beobachtung
- Bestehendes Production-Secret (`mcp-vf-hosted/upstream-tokens`) anfassen
- `mcp-vf-hosted`-Source-Code ändern — die Migration ist rein Infrastruktur
- Andres claude.ai-Connector neu konfigurieren — Identifier bleibt `https://mcp-vf.agenticventures.de/mcp`

DSGVO-Hinweis

Vor erstem Production-Smoke gegen Andres Daten: cloudflare-dsgvo To-Dos abhaken — insbesondere Subprozessor-Eintrag in Andres AVV.