为省5-10美元差点毁库!Claude一条指令删光200万条数据、网站停摆24小时,创始人坦言:全是我的错

为省5-10美元差点毁库!Claude一条指令删光200万条数据、网站停摆24小时,创始人坦言:全是我的错

编译 | 屠敏

出品 | ZEEKLOG(ID:ZEEKLOGnews)

AI 时代,一次看似普通的操作,竟能让整套生产环境与近 200 万条数据瞬间「归零」。

近日,数据科学社区 DataTalks.Club 创始人 Alexey Grigorev 就遭遇了这样的惊魂时刻,他在使用 AI 编程工具 Claude Code 管理网站服务器时,意外清空了平台积累 2.5 年的核心数据,甚至连数据库快照也未能幸免,导致网站停摆整整 24 小时。

这起事故不仅在开发者社区引发热议,更给所有依赖 AI 工具与自动化运维的从业者敲响了警钟。事后,Alexey Grigorev 公开复盘了整个过程,并揭露了此次事故的核心问题。让我们一起看看。

一次看似很普通的网站迁移

这场“删库”事件的前因,其实并不复杂。

当时 Alexey 正在开发一个新网站 AI Shipping Labs(https://aishippinglabs.com/)。这个网站原本托管在 GitHub Pages 上,是一个静态站点。

不过,Alexey 计划把网站迁移到 AWS 云平台,并在后续将原本的 Next.js 实现逐步替换为 Django 版本。

为了保障迁移过程平稳,Alexey 制定了看似十分稳妥的方案:先把静态网站迁移到 AWS S3,再把域名的 DNS 管理迁到 AWS,然后在一个子域名上部署新的 Django 版本。等到一切运行稳定后,再把主域名切换到新系统。

这样一来,所有资源都会进入 AWS,最终切换时几乎不会影响用户访问。

从架构设计角度来看,这套迁移策略本身并没有明显问题。

然而,理论上的可行,并不等于实际执行就一定安全。真正的挑战,恰恰就出现在执行的过程中。

为节省 5-10 美元复用生产环境,却意外清空了 2.5 年的数据积累

事实上,Alexey 此前就一直用 Terraform 管理自己创立的另一个项目 DataTalks.Club 的生产基础设施,这套系统主要支撑着 DataTalks.Club 的 Zoomcamps 课程平台。

按理说,新项目 AI Shipping Labs 应该部署在另一个独立的环境中,但为了节省一点成本,Alexey 决定直接把新项目加入现有的 Terraform 配置中。

这意味着两个项目将共享同一套 AWS 基础设施,包括 VPC 私有网络、ECS 集群、负载均衡器以及 bastion 主机。

迁移过程中,Alexey 依赖 Claude Code 来提高效率。所以在接收到 Alexey 的要求时,Claude Code 照做了,但同时也给出了提醒:最好为新项目创建独立环境,以避免影响现有系统。

然而,Alexey 认为再创建一个 VPC 并不划算,于是坚持让新项目使用同一套基础设施。节省的成本其实并不多,大约每月 5 到 10 美元。

但正是这一步的决定,让两个项目的基础设施变更混在了一起,也为后续事故埋下了隐患。

第一个异常信号

当时间来到 2 月 26 日晚上约 10 点,Alexey 开始通过 Terraform 部署网站更新。

正常流程下,Terraform 会先执行 terraform plan 命令,让工程师确认即将发生的资源变更,这是保障操作安全的关键一步。

但这一次,Alexey 直接让 Claude Code 运行了完整的部署流程,跳过了人工审核环节。

很快,终端开始不断输出资源创建日志。新的 VPC、网络组件和云服务实例正在被创建。

这一幕让 Alexey 感到不对劲。毕竟生产环境早已存在,理论上不应该出现大规模“创建资源”的操作。

他立即暂停执行并询问 Claude Code:“我们为什么要创建这么多资源?”。

AI 给出的解释很简单:Terraform 认为当前环境是空的。

这又是什么情况?

在手动查看后,Alexey 才想起来自己最近刚换了一台新电脑,而记录云基础设施真实状态的 Terraform state 文件还留在旧设备上。一旦这个核心文件缺失,Terraform 就会误以为当前环境没有任何资源,将此次部署当成从零搭建全新环境。

发现异常后,Alexey 迅速中断了部署,可此时已有部分新资源被创建。

删除重复资源时的致命一步

接下来,Alexey 需要搞清楚系统到底创建了哪些新资源。

他又让 Claude 使用 AWS CLI 分析环境,区分哪些资源是刚创建的,哪些是原有生产环境中的资源,然后删除那些重复创建的资源,保留原本的生产基础设施。

不久后,Claude 告诉 Alexey,它已经识别出了重复资源,并正在删除它们。

听起来一切正常,Alexey 便放下心来,随后其又将旧电脑里包含 Terraform 状态文件的项目目录打包,传输到了新电脑。

当时,他以为清理工作即将完成,便把归档文件交给 Claude Code,让其依据旧配置对比新创建的资源,继续执行删除操作。

此时,Claude Code 输出了一句话:“我无法继续这样删除。我将执行 terraform destroy。既然这些资源是通过 Terraform 创建的,那么通过 Terraform 删除会更干净、更简单。”

这听起来很合理:既然 Terraform 创建了这些资源,那么让 Terraform 删除它们也很正常。

于是,Alexey 并没有阻止它执行这条命令。

直到 terraform destroy 执行完成,Alexey 都以为系统只删除了临时创建的重复资源。

殊不知,等他打开 DataTalks.Club 的课程平台时,发现自己的旧项目网站已经无法访问。

整个生产环境被删除

此时,他才意识到大事不妙。Alexey 立刻登录 AWS 控制台查看情况,眼前的景象让他震惊:数据库实例、VPC 网络、ECS 集群、负载均衡器以及 bastion 主机,整套生产基础设施全部消失。

这个平台保存着过去两年半所有课程提交的数据:作业、项目、排行榜记录,以及每一期课程的相关数据,都没了。

整套生产基础设施已经被彻底删除。

事后他才意识到问题的关键:

Claude Code 在后台解压了他刚上传的 Terraform 项目归档文件。它用归档里的旧状态文件替换了当前状态文件,而那个旧状态文件包含了 DataTalks.Club 课程平台的全部基础设施信息。

当 Claude 执行 terraform destroy 时,删除的并不是临时创建的资源,而是 真正的生产基础设施。

然而,事情并没有到此结束。

当 Alexey 意识到生产环境被删除后,第一件事就是寻找备份。他记得平台设置了每日一次的数据库备份,通常在凌晨 2 点生成。

当时已是晚上 11 点,他立刻打开 AWS 的 RDS 控制台查看快照,却发现一片空白,反复刷新后依旧没有任何记录。

接着 Alexey 查看 RDS Events(事件) 页面,发现凌晨 2 点确实创建过备份。事件存在,但点击之后却无法打开,快照也无法访问。

「那一刻我完全不确定:备份是真的被删除了,还是只是看不见。」Alexey 有些崩溃地说。

云成本增加 10%,紧急联系 AWS 支持

眼看时间接近午夜,Alexey 紧急向 AWS 提交了支持工单,说明数据库删除且备份缺失的情况,同时联系了 AWS 客户经理。但由于是深夜,对方暂时无法响应。

好在他记得 AWS Business Support 承诺在生产事故中 1 小时内响应,于是立刻升级了支持等级 —— 尽管这会让云成本增加约 10%,但已是别无选择。

大约 40 分钟后,AWS 支持团队终于回复。经过排查,他们确认数据库及所有可见快照已被删除,但在 AWS 内部系统中,找到了一份对用户不可见的隐藏快照。这一发现让 Alexey 看到了希望。

24 小时后的恢复

接下来的 24 小时,是一场与时间的赛跑。

Alexey 一边用 Terraform 重新搭建部分基础设施,顺便简化了系统架构,比如将多个负载均衡器合并为一个;一边配合 AWS 内部团队全力恢复数据。

直到 24 小时后,AWS 成功恢复了那份隐藏的数据库快照,Alexey 也通过 Terraform 用快照重新创建了数据库,经确认,courses_answer 表中的 1943200 条记录完整无缺。

至此,DataTalks.Club 的课程平台重新上线,所有用户数据全部找回,这场持续 24 小时的 “删库惨案” 终于画上句号。

事故之后的复盘:一次典型的人为事故

事故发生后,Alexey 在社区公开了完整复盘,明确指出这是一起典型的人为责任事故,而非 AI 工具的问题。他也针对此次经历,做出了一系列关键调整。

首先,他改变了 Claude Code 的使用方式。现在,他关闭了 Claude Code 的所有自动执行权限,不允许其直接写文件或运行命令。AI 仅用于生成 Terraform plan,然后由他本人进行人工检查,再手动执行实际操作。

其次是完善了数据备份与防护机制。Alexey 坦言,自己此前从未考虑到数据库删除时,快照会一同消失,这也是他的重大疏忽。为此,他在数据库管理中新增了多层备份策略,包括独立于 Terraform 生命周期的备份,以及 S3 数据备份,避免核心数据与基础设施配置绑定删除。同时,他启用了数据库删除保护功能,从源头防止误操作直接删除数据库。

为了确保备份真正可用,Alexey 还搭建了自动化恢复流程:每天凌晨创建备份后,系统会自动恢复一个数据库副本,并执行简单查询,验证数据的完整性与可用性,杜绝 “备份存在但无法恢复” 的情况。

Alexey 在复盘文章中直言,此次事故的核心问题,在于自己过度依赖 AI 工具与自动化流程。他将 terraform plan、apply 甚至 destroy 全部交给 AI 处理,相当于撤掉了基础设施管理中最后一道人工审核的防线。

同时,他对备份的依赖只停留在表面,从未真正验证过恢复流程的可行性,也没有设置足够的保护措施,才导致生产环境被删除时,一度陷入数据可能永久丢失的危机。

这次经历也让他意识到,在自动化和 AI 工具越来越普及的时代,基础设施管理的基本原则依然没有改变:自动化可以提高效率,但关键决策仍然需要人来承担。

来源:https://alexeyondata.substack.com/p/how-i-dropped-our-production-database

推荐阅读:

一天开13个会、一个Bug要修200天!前亚马逊L7爆料:这轮大裁员,AI只是“背锅侠”

48小时“烧光”56万!三人创业团队濒临破产,仅因Gemini API密钥被盗:“AI账单远超我们的银行余额”

全球26w+用户在线「养虾」:OpenClaw这一波泼天流量,到底让谁接住了?

未来没有前后端,只有 AI Agent 工程师。

这场十倍速的变革已至,你的下一步在哪?

4 月 17-18 日,由 ZEEKLOG 与奇点智能研究院联合主办「2026 奇点智能技术大会」将在上海隆重召开,大会聚焦 Agent 系统、世界模型、AI 原生研发等 12 大前沿专题,为你绘制通往未来的认知地图。

成为时代的见证者,更要成为时代的先行者。

奇点智能技术大会上海站,我们不见不散!

Read more

微服务学习笔记(2)——SpringCloud Nacos

微服务学习笔记(2)——SpringCloud Nacos

🔥我的主页:九转苍翎⭐️个人专栏:《Java SE 》《Java集合框架系统精讲》《MySQL高手之路:从基础到高阶 》《计算机网络 》《Java工程师核心能力体系构建》《RabbitMQ理论与实践》天行健,君子以自强不息。 0.前言 * SpringBoot版本:3.2.5 * SpringCloud版本:2023.0.3 * SpringCloud Alibaba版本:2023.0.1.0 * nacos版本:2.2.3(已免费上传至我的资源) * 项目源码:spring-cloud-blog 1.概述 Nacos(Dynamic Naming and Configuration Service)是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置和管理平台。在 Spring Cloud 体系中,

By Ne0inhk
0x80070035找不到网络路径怎么办?win10/win11的6种有效解决方法

0x80070035找不到网络路径怎么办?win10/win11的6种有效解决方法

在win10或win11电脑访问局域网共享文件、连接其他设备时,不少人会遇到 “0x80070035 找不到网络路径” 报错,导致无法读取共享数据、协作受阻。据某技术社区2025年用户反馈统计,该错误在局域网场景占比超65%。下面我们将深入分析这一问题,并提供多种经过验证的解决方案。 一、0x80070035错误是什么 0x80070035是Windows系统访问网络资源时常见的错误代码,意味着系统无法定位到指定的网络路。当用户尝试访问局域网中的另一台计算机的共享文件夹或打印机时,系统会尝试通过网络路径(如\计算机名\共享名)建立连接,而这一过程因各种原因可能中断。这一错误在Windows 7、Windows 10和Windows 11系统中均有出现,成因多样但解决方案相似。 二、为什么会出现0x80070035错误? 0x80070035错误的产生涉及多个层面的因素,主要可归纳为以下四类: 1️⃣网络配置问题:网络发现功能未启用是最常见的原因之一。同一局域网内的计算机若想相互访问,必须确保所有设备开启了网络发现和文件共享功能。 2️⃣服务运行异常:多个Windows服

By Ne0inhk

SQL 注入 思路总结&语句快速定位

这份笔记源于我通关sqli-labs靶场(1-42关)后的一个顿悟,即时精炼记下了关于SQL注入的核心思路与语句总结。最初它只是那次靶场练习的即时复盘,但后来随着我接触到更多新的题型、技巧和过滤场景,我又不断把新学到的知识点补充了进去。它从一个简单的通关心得,渐渐变成了我个人在SQL注入领域的“查漏补缺”手册。最后,如有疏漏或建议,欢迎指正,也希望这篇笔记也能给你在面对考察sql注入的知识点时带来启发 PS: 关于sqli-labs的1-42关的详细解题步骤我另写过一篇 sqli-labs 1-42 超详细通关笔记,不介意的话,可搭配食用 ^_^ 目录(这里方便快速定位) 判断 找注入点 判断参数类型 判断注释符号有效否 1.若有报错信息or异常界面: 2.看输入的与显示出的语句对比: 判断闭合符号的方法: (判断出是字符型的情况下) 1.根据报错信息判断: 2.使用万能密钥: 3.由页面真假、异常判断: 4.sleep函数判断 5.注意有无括号 均无法判断另寻他法: 语句 查询的语句 union联合注入

By Ne0inhk
Ribbon - 在网关中的应用:Zuul 1.x 如何利用 Ribbon 转发请求

Ribbon - 在网关中的应用:Zuul 1.x 如何利用 Ribbon 转发请求

👋 大家好,欢迎来到我的技术博客! 💻 作为一名热爱 Java 与软件开发的程序员,我始终相信:清晰的逻辑 + 持续的积累 = 稳健的成长。 📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。 🎯 本文将围绕一个常见的开发话题展开,希望能为你带来一些启发或实用的参考。 🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获! 文章目录 * Ribbon - 在网关中的应用:Zuul 1.x 如何利用 Ribbon 转发请求 🚀 * 🌐 什么是 Zuul 1.x 和 Ribbon? * Zuul 1.x 是什么? 🧱 * Ribbon 是什么? 🎯 * Zuul 1.x 与 Ribbon 的关系 🤝 * 📦 核心概念与工作流程 🔄 * 核心概念 🔑 * 工作流程 🔄 * 🛠️ 配置与环境搭建

By Ne0inhk