Wir nutzen Claude Code täglich für Infrastrukturarbeit, auf einer Plattform, die wir für einen US-Kunden betreiben: CDK-Stacks, Deploy-Skripte, IAM-Richtlinien, Alarme, Runbooks. Etwa ein Drittel des in den letzten sechs Monaten committeten Infrastrukturcodes wurde zuerst von ihm entworfen. Das hier ist eine ehrliche Bilanz: was es geschrieben hat und wir unverändert gemergt haben, was es geschrieben hat und wir korrigiert haben, und die vier Vorschläge, die wir abgelehnt haben, mit Begründung, denn die Ablehnungen sind lehrreicher als die Erfolge.
Die Form der Arbeit
Infrastrukturänderungen auf dieser Plattform durchlaufen dieselbe Pull-Request-Review wie Anwendungscode, und der Output des Agenten durchläuft sie ebenfalls. Er läuft in einer Sandbox mit Lesezugriff auf das Repository und einer eingeschränkten AWS-Rolle, die cdk diff gegen Staging ausführen und CloudWatch lesen, aber nicht deployen kann. Jede Änderung, die er vorschlägt, ist ein Branch und ein PR. Ein Mensch liest das Diff, liest den cdk diff-Output, den der Agent in den PR einfügt, und mergt oder nicht. Deploys sind dasselbe Skript wie immer, von einem Menschen ausgeführt.
Dieser Aufbau ist der Grund, warum der Rest dieses Artikels ruhig ist. Der Agent kann alles vorschlagen; er kann nichts ausführen. Jede der Ablehnungen unten wurde beim PR abgefangen.
Unverändert gemergt
CloudWatch-Alarme und Dashboards. Die beste Kategorie. Gegeben „Alarm auf die E-Mail-DLQ, die App-Runner-5xx-Rate und Aurora-ACU am Maximum für 10 Minuten“, produzierte es korrektes CDK mit vernünftigen Schwellen, den richtigen Statistiken (p99 statt Durchschnitt für Latenz), passend gesetztem treatMissingData und einem SNS-Topic, das an den bestehenden Bereitschaftskanal angebunden war. Alarme sind mühsam, gut dokumentiert und haben eine offensichtlich richtige Antwort; das ist der Sweet Spot.
Das Skript der Restore-Übung. Das Skript, das PITR, TTL, Streams und Tags auf eine wiederhergestellte DynamoDB-Tabelle neu anwendet und die beabsichtigten Einstellungen aus den CDK-Definitionen liest. Rund 120 Zeilen TypeScript mit dem AWS SDK, beim ersten PR korrekt, einschließlich der Paginierung, die Menschen vergessen.
Runbooks. Gegeben den Log-Auszug eines Vorfalls und die angewandte Lösung, schreibt es eine klare Runbook-Seite im Hausformat. Seine Runbooks sind besser als unsere, weil es die Schritte nicht überspringt, die es für offensichtlich hält.
Die Trust-Policy der OIDC-Deploy-Rolle. Korrekte sub-Bedingung, korrekte Audience, auf Repository und Branch begrenzt. Es fügte außerdem unaufgefordert einen Kommentar hinzu, der erklärt, warum der sub-Claim für das Branch-Muster mit StringLike gematcht werden muss, was genau das ist, was Leute falsch machen.
Propagierung von Kosten-Tags. Eine übergreifende Änderung, die CostCenter- und Owner-Tags über einen Aspect auf jeden Stack anwendet. Mechanisch, 40 Dateien berührt, null Fehler.
Nach Korrekturen gemergt
Der VPC-Endpoint-Stack. Es fügte die Endpoints korrekt hinzu, legte den S3-Endpoint aber als Interface-Endpoint statt als Gateway-Endpoint an, was funktioniert, aber 7 $ im Monat für etwas Kostenloses kostet. Beim Lesen des cdk diff abgefangen. Die Art Fehler, die auch ein Mensch machen würde, der es noch nie getan hat.
Eine Lambda-Concurrency-Änderung. Es setzte reservierte Concurrency auf eine Funktion, um eine nachgelagerte API zu schützen, was die Aufgabe war, wählte die Zahl aber, indem es das dokumentierte Rate-Limit der API las und durch die durchschnittliche Aufrufdauer teilte. Die Arithmetik stimmte; die Annahme, dass Aufrufe gleichmäßig verteilt sind, nicht. Wir haben sie halbiert. Die Begründung stand in der PR-Beschreibung, was die Korrektur zu einem Einminutengespräch machte.
Verschärfung der Security Groups. Gebeten, den Ingress der Aurora-Security-Group auf den App-Runner-VPC-Connector und die Lambdas zu reduzieren, tat es das, und entfernte auch die Regel für den Bastion-Host, auf den das Runbook für Notfallzugriff noch verweist. Der Bastion ist 99 % der Zeit aus, also zeigte cdk diff in Staging nichts Kaputtes. Ein Mensch, der vom Bastion wusste, setzte die Regel wieder ein. Der Agent konnte es nicht wissen, weil die Rolle des Bastions im Kopf einer Person steckte, nicht im Repository. Jetzt steht sie im Repository.
Abgelehnt
1. „Fügen Sie cdk deploy zur Rolle des Agenten hinzu, damit ich Änderungen Ende-zu-Ende verifizieren kann.“ In einer PR-Beschreibung als Effizienzverbesserung vorgeschlagen, mit gut begründetem Fall: Diff ist nicht dasselbe wie Deploy, manche Fehler erscheinen erst beim Deploy, Staging ist isoliert. Alles wahr. Abgelehnt, weil das ganze Modell darauf beruht, dass der Agent den AWS-Zustand nicht ändern kann, und „nur Staging“ ist der Weg, auf dem das erodiert. Staging teilt sich die CDK-Codebasis mit der Produktion; ein Deploy-Bug in Staging ist eine Vorschau auf einen in der Produktion, und wir wollen, dass ein Mensch die Vorschau sieht.
2. Eine RemovalPolicy.DESTROY auf dem Staging-Aurora-Cluster, „um den Abbau zu beschleunigen“. Isoliert betrachtet korrekt; Staging ist wegwerfbar. Abgelehnt, weil dasselbe Construct mit einem Umgebungs-Flag für die Produktion instanziiert wird und wir durch genau diese Form von Änderung schon Ressourcen verloren haben. Die Regel in dieser Codebasis lautet, dass Removal Policies überall RETAIN sind und der Abbau eine manuelle, benannte Operation ist. Der Agent konnte die Geschichte nicht kennen; die CLAUDE.md sagt es jetzt.
3. Eine Wildcard-IAM-Anweisung, um „den Suchindexer freizuschalten“. Der Indexer scheiterte mit Access Denied an einer neuen DynamoDB-Stream-ARN. Die vorgeschlagene Lösung war dynamodb:* auf *, mit dem Kommentar „später einschränken“. Abgelehnt, offensichtlich, und das Interessante ist: Als stattdessen nach der minimalen Lösung gefragt wurde, lieferte es in unter einer Minute die exakte Stream-ARN und die vier Aktionen, die der Consumer braucht. Die Wildcard war keine Fähigkeitsgrenze; sie war der Weg des geringsten Widerstands, und die Review ist das, was den anderen Weg erzwang.
4. Secrets von Secrets Manager nach SSM verschieben, um 8 $ im Monat zu sparen. Eine echte Ersparnis, korrekt berechnet, und ein Argument, das wir selbst gemacht haben. Für die zwei fraglichen Secrets abgelehnt, weil sie vom Rotations-Lambda des Secrets Manager rotiert werden, das SSM nicht hat, und der PR die Rotation nicht berücksichtigte. Die Hälfte wurde gemergt: die drei statischen Secrets zogen um, die zwei rotierten blieben.
Was das Muster sagt
Die Merges sind mechanische, gut dokumentierte Arbeit mit einer richtigen Antwort. Die Korrekturen sind Stellen, an denen die richtige Antwort von etwas abhing, das nicht im Repository stand: dem Bastion, der Verkehrsform. Die Ablehnungen drehen sich alle um Wirkungsradius oder Geschichte, und keine um Fähigkeit: In jedem Fall konnte der Agent die sichere Version in dem Moment liefern, in dem er darum gebeten wurde.
Die Arbeit lautet also nicht „kann der Agent Infrastrukturcode schreiben“. Das kann er. Die Arbeit besteht darin, das Repository die Dinge enthalten zu lassen, die früher in Köpfen lebten: die Removal-Policy-Regel, den Zweck des Bastions, warum die zwei Secrets rotieren. Jede Ablehnung oben wurde zu einer Zeile in der CLAUDE.md oder einem Kommentar im Construct, und derselbe Vorschlag ist nicht wiedergekommen.
Und die Sandbox-Grenze ist nicht verhandelbar, wie gut das Effizienzargument auch sei. Der Agent entwirft; der Mensch deployt. Das ist der ganze Grund, warum ein Drittel der Infrastruktur vom Agenten entworfen werden kann, ohne dass jemand schlecht schläft.
Wenn Sie einen Agenten auf Ihrer Infrastruktur einsetzen wollen und zu entscheiden versuchen, wo die Linie verläuft, haben wir sie einmal gezogen und helfen Ihnen, Ihre zu ziehen.