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-Statusactive - Cloudflare-Account existiert
- API-Token erstellt unter dash.cloudflare.com/profile/api-tokens mit:
Account:Cloudflare Tunnel:EditZone: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.
Related
- cloudflare-migration-guide — Voraussetzung (NS-Switch + CF-Account)
- mcp-vf-hosted — der Ziel-Service
- cloudflare-capability-map — strategischer Kontext + Cost-Vergleich
- cloudflare-dsgvo — Compliance-Vorbedingungen