1Password → AWS-SM Auto-Sync
Marvin pflegt Secrets nur noch in 1Password. AWS Secrets Manager ist Push-Mirror. ECS-Services redeployen automatisch wenn ein Secret sich aendert. Kein Doppel-Pflegen, kein AWS-Console-Geklicke.
Status 2026-05-19 — MVP live
Friseur-Bot ist auf das neue Pattern migriert:
- 1P-Item
whatsapp-friseur-im-sueden(VaultPersonal) ist Source of Truth - AWS-SM-Secret
mcp-whatsapp-hosted/whatsapp-config-friseur-im-sueden-OBHZhRist Mirror - ECS-Task-Definition
McpWhatsappHostedTaskDef2BB905D2:5liest aus neuem Pfad - IAM-Wildcard
whatsapp-config-*+cloudflared-token-*erlaubt zukuenftige Kunden ohne Policy-Touch - CDK-Drift komplett geschlossen via
cdk deploy(Commitd96edf1auf Branchfeat/360dialog-providerin~/source/mcps/) - Zwei Pre-existing Audit-Findings beim Deploy mitgefixt: F016 Image-Digest-Pinning + F002 META_APP_SECRET (HMAC-Webhook-Validation)
Offen:
- Altes Secret
mcp-whatsapp-hosted/whatsapp-config-825vxBwird von niemandem mehr referenziert. ~2026-06-02 schedule-delete mit 7-Tage-Recovery-Window feat/360dialog-provider-Branch push auf Remote- Token-Validitaet via echte WhatsApp-Test-Message verifizieren (Health-Endpoint testet das nicht)
Zwei-Stufen-Ansatz
| Stufe | Was | Wann | Setup | Auto-Sync? |
|---|---|---|---|---|
| MVP (aktiv 2026-05-19) | Lokales Bash-Skript av-key-sync — liest 1P-Item via op CLI, schreibt nach AWS-SM, triggert ECS-Force-Redeploy | sofort, fuer aktuelle 1-3 Kunden | 0 (Skript steht) | nein — manueller Aufruf, dafuer kein Setup |
| Native (Roadmap) | 1Password Environments push direkt nach AWS-SM via Nitro Enclave | ab ~5 Kunden, wenn manueller Aufruf nervt | ~3h einmalig | ja — bei jedem 1P-Save |
MVP-Empfehlung jetzt: Skript nutzen. Keine 1P-UI-Klicks, keine SAML-Setup, kein Lambda. Kostet 0 EUR. Native-Integration ergaenzt das spaeter ohne Reibung.
TL;DR (Native, fuer Phase 2)
- 1Password Environments (Beta seit Juni 2025) sync direkt nach AWS-SM, kostenlos, EU, push-basiert via AWS Nitro Enclaves
- 3h Initial-Setup + ~5 min pro neuer Kunde
- Zusatz: ~50 Zeilen Lambda fuer ECS-Force-Redeploy bei Secret-Change
- Cost: 0.01/Monat, AWS-SM-Cost bleibt gleich)
MVP — av-key-sync Skript
Pfad: assets/scripts/av-key-sync.sh
Was es macht (in einem Aufruf)
- Liest ein 1P-Item via
opCLI (Touch-ID oder 1P-Desktop-Integration noetig) - Wandelt alle Custom-Fields des Items in flaches JSON um
- Schreibt JSON nach AWS Secrets Manager (
create-secretoderput-secret-value) - Triggert
ecs update-service --force-new-deploymentdamit der Container den neuen Wert holt
Vorbedingungen (einmalig)
# CLIs (sollten alle schon da sein, prueft das Skript selbst)
brew install 1password-cli jq awscli
# 1Password Touch-ID-Integration aktivieren (1P Desktop-App)
# Settings → Developer → Integrate with 1Password CLI ✓
# AWS-Profile + SSO
aws sso login --profile av-productionPATH-Shortcut (einmalig, damit av-key-sync direkt aufrufbar):
echo 'export PATH="$HOME/source/agentic-ventures/assets/scripts:$PATH"' >> ~/.zshrc
ln -sf av-key-sync.sh ~/source/agentic-ventures/assets/scripts/av-key-sync
source ~/.zshrcDaily Use — neuer WhatsApp-Kunde anlegen
- In 1Password Desktop: neuer Item (Typ „API Credential” oder „Login” mit Custom-Fields). Beispiel-Name:
whatsapp-friseur-im-sueden. Custom-Fields:ACCESS_TOKEN= Meta-TokenPHONE_NUMBER_ID= aus MetaBUSINESS_ACCOUNT_ID= aus MetaAPP_ID= aus Meta
- Im Terminal:
av-key-sync \ "whatsapp-friseur-im-sueden" \ "mcp-whatsapp-hosted/whatsapp-config-friseur-im-sueden" \ "mcp-whatsapp-hosted" - Touch-ID bestaetigen wenn 1P fragt. Fertig.
Was passiert:
- 1P-Item wird gelesen (Felder als JSON)
- AWS-SM-Secret wird angelegt oder geupdated (idempotent)
- ECS-Service redeployed automatisch
- Container ist in ~60s live mit neuem Token
Token rotieren
Gleicher Aufruf — Skript ist idempotent. put-secret-value legt nur neue Version an wenn Inhalt sich aendert (AWS-SM dedupliziert), force-redeploy triggert trotzdem. Sicher zu wiederholen.
# 1P-Item updaten → dann
av-key-sync "whatsapp-friseur-im-sueden" "mcp-whatsapp-hosted/whatsapp-config-friseur-im-sueden" "mcp-whatsapp-hosted"Nur Secret schreiben ohne Redeploy
SKIP_REDEPLOY=1 av-key-sync ...Andere 1P-Vault
OP_VAULT="agentic-ventures-prod" av-key-sync ...Was das Skript NICHT macht
- Kein automatischer Sync bei 1P-Save (dafuer kommt Phase 2 — Native)
- Keine bidirektionale Sync (AWS-SM nie direkt editieren — wird beim naechsten Skript-Run ueberschrieben)
- Keine Multi-Kunden-Batch (pro Aufruf ein Kunde, was OK ist weil Onboarding eh selten)
Limits
- Werte muessen Strings sein (keine binaeren Files)
- 1P-Item muss in dem angegebenen Vault liegen
- Service muss existieren und in
av-production-Cluster laufen - Field-Labels in 1P werden als JSON-Keys uebernommen — also Labels sauber benennen (z.B.
ACCESS_TOKENnicht „Access Token (Meta)“)
Architektur
flowchart LR M[Marvin] -->|Touch-ID + Save| OP[1Password Environment<br/>'mcp-whatsapp-friseur-im-sueden'] OP -->|Push via Nitro Enclave| SM[AWS SM<br/>mcp-whatsapp-hosted/whatsapp-config-friseur] SM -->|CloudTrail PutSecretValue| EB[EventBridge Rule<br/>secret-changed-mcp-prefix] EB --> L[Lambda<br/>force-redeploy-on-secret-change] L -->|UpdateService<br/>forceNewDeployment=true| ECS[ECS Fargate Task<br/>mcp-whatsapp-hosted] ECS -->|GetSecretValue beim Start| SM
Vorbedingungen
| Bedingung | Status | Was tun wenn nicht |
|---|---|---|
| 1Password-Account aktiv | ✅ | — |
| 1Password Business/Teams Plan (fuer Environments) | ❓ pruefen | Plan-Page in 1P checken. Falls Personal/Family: Pricing-Check ob Business sich lohnt — alternativ Fallback auf DIY-Sync (Service Account + Lambda) |
AWS-Account av-production mit IAM-Admin-Zugriff (Marvin) | ✅ | — |
| eu-central-1 als Default-Region | ✅ | — |
| Bestehende ECS-Services kennen (mcp-whatsapp-hosted, mcp-vf-hosted, etc.) | ✅ siehe _index | — |
Phase A — Initial-Setup (einmalig, ~3h)
A.1 — 1P-Environments-Feature aktivieren (15 min)
- In 1Password.com einloggen → Settings → Developer Tools → Environments (Beta) aktivieren
- Falls Plan-Upgrade noetig: erst pruefen ob bestehender Plan reicht (1P Business hat es nativ, Personal/Family koennte beschraenkt sein)
- Verifizieren: in 1P-Sidebar erscheint neue Section “Environments”
Output: Environments-Tab in 1P sichtbar.
A.2 — AWS-Seite vorbereiten: SAML-Trust + IAM-Role (45 min)
- In
av-production-AWS-Console (SSO-Login als AdminAccess): - SAML Identity Provider anlegen unter IAM → Identity Providers → Add provider:
- Provider type: SAML
- Name:
1password-environments - Metadata document: aus 1P-Environments-Setup-Page herunterladen
- IAM-Role anlegen unter IAM → Roles → Create role:
- Trusted entity: SAML 2.0 Federation → IdP
1password-environments - Permissions-Policy (inline):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "secretsmanager:CreateSecret", "secretsmanager:PutSecretValue", "secretsmanager:UpdateSecret", "secretsmanager:DescribeSecret", "secretsmanager:TagResource" ], "Resource": "arn:aws:secretsmanager:eu-central-1:425924867359:secret:mcp-*" } ] }- Role Name:
OnePasswordEnvironmentsSync
- Trusted entity: SAML 2.0 Federation → IdP
- Role-ARN kopieren — wird in A.3 gebraucht
Output: IAM-Role-ARN arn:aws:iam::425924867359:role/OnePasswordEnvironmentsSync.
A.3 — 1P mit AWS verbinden (15 min)
- In 1P → Environments → Add Integration → AWS Secrets Manager
- Felder ausfuellen:
- AWS-Account-ID:
425924867359 - Region:
eu-central-1 - IAM-Role-ARN: aus A.2
- Friendly Name:
av-production-eu-central-1
- AWS-Account-ID:
- Test Connection klicken — sollte gruen
- Save
Output: AWS-Integration in 1P verbunden.
A.4 — Test-Environment anlegen + Sync verifizieren (30 min)
- In 1P-Environments → New Environment:
- Name:
mcp-test-sync(Wegwerf) - Vault:
agentic-ventures-prod(anlegen falls noch nicht vorhanden) - Variables:
HELLO=world - Sync target:
av-production-eu-central-1 - Target secret name:
test/onepassword-sync-check
- Name:
- Save
- Innerhalb ~30 Sek in AWS-Console → Secrets Manager pruefen ob
test/onepassword-sync-checkerscheint mit{"HELLO":"world"} - In 1P den Wert auf
world2aendern → Save → in AWS-SM nach 30 Sek verifizieren - Test-Environment loeschen, AWS-SM-Secret manuell schedule-deletion
Output: End-to-End-Sync funktioniert.
A.5 — Redeploy-Lambda bauen (~1h)
Eigene Routine via SKILL. Brief:
- Name:
force-redeploy-on-secret-change - Trigger: EventBridge Rule auf CloudTrail-Event
PutSecretValuemit Secret-ARN-Prefixmcp-* - Action: Liest aus EventBridge-Event den Secret-Namen, mapped via Convention (
mcp-<service>-hosted/...→ ECS-Servicemcp-<service>-hostedin Clusterav-production), ruftecs.update_service(cluster=..., service=..., forceNewDeployment=True) - Permissions:
ecs:UpdateServiceaufarn:aws:ecs:eu-central-1:425924867359:service/av-production/mcp-* - Logging: CloudWatch + Slack-Webhook bei Error
- Cost: ~$0.01/Monat
Code-Skeleton:
import boto3, re, json
ecs = boto3.client("ecs")
CLUSTER = "av-production"
SECRET_TO_SERVICE = re.compile(r"^(mcp-[a-z-]+-hosted)/")
def handler(event, context):
secret_id = event["detail"]["requestParameters"]["secretId"]
m = SECRET_TO_SERVICE.match(secret_id)
if not m:
print(f"Secret {secret_id} matches no ECS service prefix — skip")
return
service = m.group(1)
print(f"Force-redeploy {CLUSTER}/{service} due to {secret_id} change")
ecs.update_service(cluster=CLUSTER, service=service, forceNewDeployment=True)EventBridge-Pattern:
{
"source": ["aws.secretsmanager"],
"detail-type": ["AWS API Call via CloudTrail"],
"detail": {
"eventName": ["PutSecretValue", "UpdateSecret"],
"requestParameters": {
"secretId": [{"prefix": "mcp-"}]
}
}
}Output: Lambda deployed in av-production, Test mit Test-Secret-Change triggert Redeploy.
Phase B — Bestehende Secrets migrieren (~1-2h, abhaengig von Anzahl)
Reihenfolge: erst unkritische Test-Services, dann produktive Kunden-MCPs.
| Reihenfolge | Service | AWS-SM-Secret | 1P-Environment-Name |
|---|---|---|---|
| 1 | (Test) | test/onepassword-sync-check | test-sync |
| 2 | mcp-vf-hosted | mcp-vf-hosted/upstream-tokens | mcp-vf-hosted |
| 3 | mcp-whatsapp-hosted (Friseur) | mcp-whatsapp-hosted/whatsapp-config | mcp-whatsapp-friseur-im-sueden |
| 4 | mcp-calcom-hosted | mcp-calcom-hosted/api-key (falls vorhanden) | mcp-calcom-friseur-im-sueden |
| 5 | mcp-replicate-hosted (sobald live) | mcp-replicate-hosted/replicate-token | mcp-replicate-hosted |
Pro Service:
- Aktuellen AWS-SM-Wert mit
aws secretsmanager get-secret-valueziehen → JSON-Felder notieren - In 1P neues Environment anlegen mit gleichen Variablen
- Sync-Target = bestehender AWS-SM-Secret-Name (1P-Sync wird neue Version oben drauf schreiben)
- Sync laufen lassen, Wert in AWS-SM gegenpruefen
- Force-Redeploy abwarten (Lambda triggert ihn) und Service-Logs pruefen ob Token noch funktioniert
- Im AWS-SM-Inventar secrets-manager in Spalte “Quelle” “1P-managed” eintragen
Phase C — Daily Use Anleitung (fuer Marvin)
Neuer Kunde anlegen (z.B. neuer Salon mit WhatsApp)
- 1P oeffnen → Environments → New Environment
- Name:
mcp-whatsapp-<kunde-slug>(z.B.mcp-whatsapp-salon-zwei) - Vault:
agentic-ventures-prod - Variables ausfuellen:
ACCESS_TOKEN= Meta-WhatsApp-Token (kopiert aus Meta Business Settings)PHONE_NUMBER_ID= aus MetaBUSINESS_ACCOUNT_ID= aus MetaAPP_ID= aus Meta
- Sync target:
av-production-eu-central-1 - Target secret name:
mcp-whatsapp-hosted/whatsapp-config-<kunde-slug> - Save — fertig.
Was automatisch passiert:
- Sync nach AWS-SM (~30 Sek)
- Force-Redeploy von
mcp-whatsapp-hosted-ECS-Service via Lambda - Container startet neu, liest neuen Token, ist live
Was du NICHT machst:
- AWS-Console oeffnen
aws secretsmanager-Befehle tippenecs update-service-Befehle tippen- Sync triggern
Token rotieren
- In Meta Business Settings neuen Token generieren
- 1P-Environment oeffnen → Value von
ACCESS_TOKENueberschreiben → Save - Fertig — Sync + Redeploy laeuft automatisch
Token niemals in Bash-History, Logs, Slack, Email. Nur 1P-UI.
Secret loeschen (Kunde geht weg)
- 1P-Environment → ⋯ → Delete
- AWS-SM-Secret bleibt — manuell schedule-deletion (Recovery-Window 7 Tage):
aws --profile av-production --region eu-central-1 secretsmanager delete-secret \
--secret-id mcp-whatsapp-hosted/whatsapp-config-<kunde-slug> \
--recovery-window-in-days 7Multi-Tenant-Pattern
Ein 1P-Vault, mehrere Environments — empfohlen vom Research:
Vault "agentic-ventures-prod"
├── mcp-vf-hosted → mcp-vf-hosted/upstream-tokens
├── mcp-whatsapp-friseur-im-sueden → mcp-whatsapp-hosted/whatsapp-config-friseur-im-sueden
├── mcp-whatsapp-salon-zwei → mcp-whatsapp-hosted/whatsapp-config-salon-zwei
├── mcp-calcom-friseur-im-sueden → mcp-calcom-hosted/api-key-friseur-im-sueden
├── mcp-replicate-hosted → mcp-replicate-hosted/replicate-token
└── ...
Warum nicht ein Vault pro Kunde: Service-Account-Vault-Zugriff kann nach Erstellung nicht mehr erweitert werden — neuer Kunde = neuer Vault = neuer Service Account. Ein zentraler Vault mit Environments-pro-Service skaliert besser.
Limits + Risks
| Limit / Risk | Mitigation |
|---|---|
| 1P-Environments ist Beta | Funktional stabil seit Juni 2025, aber API kann sich aendern. Fallback dokumentieren: DIY-Sync via Service-Account + Lambda |
| 64 KB pro Environment | Bei Configs <1 KB irrelevant. Bei grossen Configs (z.B. Brand-Kits): splitten in mehrere Environments |
| Sync ist unidirektional 1P → AWS | Wenn jemand AWS-SM direkt editiert: Aenderung wird beim naechsten 1P-Save ueberschrieben. Regel: AWS-SM nie direkt editieren, immer via 1P |
| Service Account kompromittiert | Token rotieren via 1P-UI, Audit-Log pruefen, AWS-SM-CloudTrail-Logs gegenpruefen |
| 1P-Account kompromittiert | 2FA Pflicht + Hardware-Key, Master-Password lang. Bei Verdacht: Service-Account-Tokens revoken in 1P |
| Force-Redeploy-Lambda failure | CloudWatch-Alarm + Slack-Webhook bei Errors. Manueller Fallback: aws ecs update-service --force-new-deployment |
| Nuke-Risk: User loescht versehentlich Environment | Bei secretsmanager:CreateSecret-Permission ohne DeleteSecret-Permission: 1P kann nicht loeschen. Manuelle Schedule-Deletion bleibt explizit |
Cost
| Position | Monat |
|---|---|
| 1P Environments Sync | $0 (kostenlos jeder Tier) |
| Bestehende 1P-Subscription | unveraendert |
| AWS Secrets Manager | 4) |
| Redeploy-Lambda | ~$0.01 |
| EventBridge Rules | $0 (under free tier) |
| Total zusaetzlich | ~$0.01/Monat |
Roadmap nach Live
- Phase D (optional, 2-4 Wochen nach Live): Onboarding-Skill
kunde-onboardender die 1P-Environment-Anlage + ECS-Service-Verifizierung als gefuehrten Flow abbildet. Triggert bei „neuer Kunde fuer receptionist”. - Phase E (optional, wenn 5+ Kunden): Dashboard-Page
dashboard.agenticventures.de/secretsdie alle 1P-Environments + AWS-SM-Mirror-Status anzeigt (read-only, via Lambda + 1P-Connect). NICHT als Eingabe-UI — Eingabe bleibt 1P.
Sources
- 1P Developer Docs — AWS Secrets Manager Sync
- 1P Blog — Launch Juni 2025
- 1P Marketplace — AWS SM Integration
- AWS re:Post — ECS-Restart nach Secret-Rotation
- Vollstaendige Recherche: report
Related
- _index — Parent-Projekt Secret-Konsolidierung
- plan — Bisheriger Phasen-Plan (dieses Sub-File ist eine neue Phase, ergaenzt aber ueberschreibt nicht)
- secrets-manager — AWS-SM-Inventar (nach Migration mit „Quelle: 1P-managed”-Spalte ergaenzen)
- SKILL — Token-Rotation wird durch dieses Pattern vereinfacht (nur noch 1P-Edit statt aws-Befehle)