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 (Vault Personal) ist Source of Truth
  • AWS-SM-Secret mcp-whatsapp-hosted/whatsapp-config-friseur-im-sueden-OBHZhR ist Mirror
  • ECS-Task-Definition McpWhatsappHostedTaskDef2BB905D2:5 liest aus neuem Pfad
  • IAM-Wildcard whatsapp-config-* + cloudflared-token-* erlaubt zukuenftige Kunden ohne Policy-Touch
  • CDK-Drift komplett geschlossen via cdk deploy (Commit d96edf1 auf Branch feat/360dialog-provider in ~/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-825vxB wird 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

StufeWasWannSetupAuto-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-Redeploysofort, fuer aktuelle 1-3 Kunden0 (Skript steht)nein — manueller Aufruf, dafuer kein Setup
Native (Roadmap)1Password Environments push direkt nach AWS-SM via Nitro Enclaveab ~5 Kunden, wenn manueller Aufruf nervt~3h einmaligja — 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)

  1. Liest ein 1P-Item via op CLI (Touch-ID oder 1P-Desktop-Integration noetig)
  2. Wandelt alle Custom-Fields des Items in flaches JSON um
  3. Schreibt JSON nach AWS Secrets Manager (create-secret oder put-secret-value)
  4. Triggert ecs update-service --force-new-deployment damit 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-production

PATH-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 ~/.zshrc

Daily Use — neuer WhatsApp-Kunde anlegen

  1. In 1Password Desktop: neuer Item (Typ „API Credential” oder „Login” mit Custom-Fields). Beispiel-Name: whatsapp-friseur-im-sueden. Custom-Fields:
    • ACCESS_TOKEN = Meta-Token
    • PHONE_NUMBER_ID = aus Meta
    • BUSINESS_ACCOUNT_ID = aus Meta
    • APP_ID = aus Meta
  2. Im Terminal:
    av-key-sync \
      "whatsapp-friseur-im-sueden" \
      "mcp-whatsapp-hosted/whatsapp-config-friseur-im-sueden" \
      "mcp-whatsapp-hosted"
  3. 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_TOKEN nicht „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

BedingungStatusWas tun wenn nicht
1Password-Account aktiv
1Password Business/Teams Plan (fuer Environments)❓ pruefenPlan-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)

  1. In 1Password.com einloggen → Settings → Developer Tools → Environments (Beta) aktivieren
  2. Falls Plan-Upgrade noetig: erst pruefen ob bestehender Plan reicht (1P Business hat es nativ, Personal/Family koennte beschraenkt sein)
  3. 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)

  1. In av-production-AWS-Console (SSO-Login als AdminAccess):
  2. SAML Identity Provider anlegen unter IAM → Identity Providers → Add provider:
    • Provider type: SAML
    • Name: 1password-environments
    • Metadata document: aus 1P-Environments-Setup-Page herunterladen
  3. 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
  4. 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)

  1. In 1P → Environments → Add Integration → AWS Secrets Manager
  2. Felder ausfuellen:
    • AWS-Account-ID: 425924867359
    • Region: eu-central-1
    • IAM-Role-ARN: aus A.2
    • Friendly Name: av-production-eu-central-1
  3. Test Connection klicken — sollte gruen
  4. Save

Output: AWS-Integration in 1P verbunden.

A.4 — Test-Environment anlegen + Sync verifizieren (30 min)

  1. 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
  2. Save
  3. Innerhalb ~30 Sek in AWS-Console → Secrets Manager pruefen ob test/onepassword-sync-check erscheint mit {"HELLO":"world"}
  4. In 1P den Wert auf world2 aendern → Save → in AWS-SM nach 30 Sek verifizieren
  5. 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 PutSecretValue mit Secret-ARN-Prefix mcp-*
  • Action: Liest aus EventBridge-Event den Secret-Namen, mapped via Convention (mcp-<service>-hosted/... → ECS-Service mcp-<service>-hosted in Cluster av-production), ruft ecs.update_service(cluster=..., service=..., forceNewDeployment=True)
  • Permissions: ecs:UpdateService auf arn: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.

ReihenfolgeServiceAWS-SM-Secret1P-Environment-Name
1(Test)test/onepassword-sync-checktest-sync
2mcp-vf-hostedmcp-vf-hosted/upstream-tokensmcp-vf-hosted
3mcp-whatsapp-hosted (Friseur)mcp-whatsapp-hosted/whatsapp-configmcp-whatsapp-friseur-im-sueden
4mcp-calcom-hostedmcp-calcom-hosted/api-key (falls vorhanden)mcp-calcom-friseur-im-sueden
5mcp-replicate-hosted (sobald live)mcp-replicate-hosted/replicate-tokenmcp-replicate-hosted

Pro Service:

  1. Aktuellen AWS-SM-Wert mit aws secretsmanager get-secret-value ziehen → JSON-Felder notieren
  2. In 1P neues Environment anlegen mit gleichen Variablen
  3. Sync-Target = bestehender AWS-SM-Secret-Name (1P-Sync wird neue Version oben drauf schreiben)
  4. Sync laufen lassen, Wert in AWS-SM gegenpruefen
  5. Force-Redeploy abwarten (Lambda triggert ihn) und Service-Logs pruefen ob Token noch funktioniert
  6. 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)

  1. 1P oeffnen → Environments → New Environment
  2. Name: mcp-whatsapp-<kunde-slug> (z.B. mcp-whatsapp-salon-zwei)
  3. Vault: agentic-ventures-prod
  4. Variables ausfuellen:
    • ACCESS_TOKEN = Meta-WhatsApp-Token (kopiert aus Meta Business Settings)
    • PHONE_NUMBER_ID = aus Meta
    • BUSINESS_ACCOUNT_ID = aus Meta
    • APP_ID = aus Meta
  5. Sync target: av-production-eu-central-1
  6. Target secret name: mcp-whatsapp-hosted/whatsapp-config-<kunde-slug>
  7. 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 tippen
  • ecs update-service-Befehle tippen
  • Sync triggern

Token rotieren

  1. In Meta Business Settings neuen Token generieren
  2. 1P-Environment oeffnen → Value von ACCESS_TOKEN ueberschreiben → Save
  3. Fertig — Sync + Redeploy laeuft automatisch

Token niemals in Bash-History, Logs, Slack, Email. Nur 1P-UI.

Secret loeschen (Kunde geht weg)

  1. 1P-Environment → ⋯ → Delete
  2. 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 7

Multi-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 / RiskMitigation
1P-Environments ist BetaFunktional stabil seit Juni 2025, aber API kann sich aendern. Fallback dokumentieren: DIY-Sync via Service-Account + Lambda
64 KB pro EnvironmentBei Configs <1 KB irrelevant. Bei grossen Configs (z.B. Brand-Kits): splitten in mehrere Environments
Sync ist unidirektional 1P → AWSWenn jemand AWS-SM direkt editiert: Aenderung wird beim naechsten 1P-Save ueberschrieben. Regel: AWS-SM nie direkt editieren, immer via 1P
Service Account kompromittiertToken rotieren via 1P-UI, Audit-Log pruefen, AWS-SM-CloudTrail-Logs gegenpruefen
1P-Account kompromittiert2FA Pflicht + Hardware-Key, Master-Password lang. Bei Verdacht: Service-Account-Tokens revoken in 1P
Force-Redeploy-Lambda failureCloudWatch-Alarm + Slack-Webhook bei Errors. Manueller Fallback: aws ecs update-service --force-new-deployment
Nuke-Risk: User loescht versehentlich EnvironmentBei secretsmanager:CreateSecret-Permission ohne DeleteSecret-Permission: 1P kann nicht loeschen. Manuelle Schedule-Deletion bleibt explizit

Cost

PositionMonat
1P Environments Sync$0 (kostenlos jeder Tier)
Bestehende 1P-Subscriptionunveraendert
AWS Secrets Manager4)
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-onboarden der 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/secrets die alle 1P-Environments + AWS-SM-Mirror-Status anzeigt (read-only, via Lambda + 1P-Connect). NICHT als Eingabe-UI — Eingabe bleibt 1P.

Sources

  • _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)