龙虾 AI 自己开服务器:OpenClaw 全自动部署实战,25 分钟 0 命令(附完整代码)
这不是标题党——我真的在聊天框里跟 OpenClaw(社区昵称"龙虾"🦞)说了一句"帮我再部署一个",然后它自己创建了 EC2 实例、分配了弹性 IP、SSH 过去装好了环境、写好了配置文件、启动了新的 Gateway。全程 25 分钟,我没打开过终端。本文是「OpenClaw 云上实战指南」系列第 3 篇,教你复现这个过程。
它到底干了什么?
先看时间线:
| 时间 | 操作 | 谁干的 |
|---|---|---|
| 0:00 | 部署母体龙虾,给 IAM 权限 | 人类 |
| 0:00 | 查询网络资源,清理闲置 EIP | 龙虾 |
| 0:00 | 创建 x86 EC2,分配绑定 EIP | 龙虾 |
| 0:06 | 自己给自己加权限,打通 SSH | 龙虾 |
| 0:14 | 远程安装 Node.js + OpenClaw | 龙虾 |
| 0:19 | 手写配置,启动 Gateway | 龙虾 |
| 0:22 | 提供 bot token 和 pairing code | 人类 |
| 0:25 | 新龙虾正常响应 ✅ | 龙虾 |
人类总操作时间:不超过 5 分钟。 其余全是 AI 自主完成。
前提条件
要复现这个实验,你需要:
- 一只已经在跑的 OpenClaw(第 1 篇教过怎么部署)
- 足够的 IAM 权限(下面详细说)
- 一个新的 Telegram Bot Token(每个 OpenClaw 实例需要独立的 bot)
第 1 步:给龙虾 IAM 权限
这是整个实验的信任基础——你需要告诉亚马逊云科技:"这台服务器上的程序,有权限操作我的云资源。"
给 OpenClaw 所在 EC2 实例的 IAM 角色添加以下权限:
| 权限策略 | 用途 |
|---|---|
AmazonEC2FullAccess | 创建/管理 EC2 实例、弹性 IP、安全组 |
IAMFullAccess | 管理 IAM 策略(龙虾需要给自己加权限) |
AmazonBedrockFullAccess | 调用 AI 模型 |
⚠️ 这些权限适合实验和测试。生产环境请遵循权限收敛原则,只授予必要的操作权限。实验结束后记得收紧。
第 2 步:跟龙虾聊天——"帮我再部署一个"
以下是真实对话记录(简化版)。整个过程在 Telegram 里完成。
2.1 龙虾自查环境
人类:帮我看看你所在区域的网络资源情况。
龙虾:(自动执行了 aws ec2 describe-addresses 等命令)
你有 3 个弹性 IP:
- 1.1.1.1 → 绑在我身上
- 2.2.2.2 → 闲置
- 3.3.3.3 → 也闲置(在花冤枉钱)
要清理吗?
龙虾执行的命令:
aws ec2 describe-addresses --region ap-southeast-1
aws ec2 describe-instances --region ap-southeast-1
2.2 龙虾创建新服务器
人类:开一台 x86 的 EC2,配置和你一样,但要 x86 不要 ARM。
龙虾:(创建了 t3.large 实例,分配 EIP,绑定到新实例)
新实例已就绪:
- i-0fa6ff98817xxxxxx (t3.large, Ubuntu 24.04)
- EIP: 2.2.2.2
龙虾执行的命令:
aws ec2 run-instances \
--instance-type t3.large \
--image-id <ubuntu-24.04-x86-ami> \
--key-name xxxxxxx \
--security-group-ids sg-07c7ee9aa12dxxxx \
--subnet-id subnet-02d4f3a65e8xxxxx \
--iam-instance-profile Name=OpenClaw \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=OpenClaw-x86}]'
aws ec2 associate-address --allocation-id <id> --instance-id <id>
2.3 龙虾自己给自己加权限
这是最"赛博朋克"的一步——龙虾发现自己 SSH 不过去,于是决定自己解决:
龙虾:SSH 不通——Permission denied。我只有自己的密钥,没有新实例的 PEM 文件。
不过我可以用 EC2 Instance Connect 解决。我需要给自己加一个 IAM 权限。
人类:你自己加吧。
龙虾:(给自己的 IAM Role 加了 ec2-instance-connect:SendSSHPublicKey 权限)
✅ 权限加好了。推送公钥中……
(推送临时公钥到新实例,趁 60 秒有效窗口把公钥永久写入 authorized_keys)
✅ SSH 打通了。
龙虾执行的命令:
# 给自己加权限
aws iam put-role-policy \
--role-name OpenClaw \
--policy-name EC2InstanceConnect \
--policy-document '{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": "ec2-instance-connect:SendSSHPublicKey",
"Resource": "arn:aws:ec2:ap-southeast-1:*:instance/<new-id>"
}]
}'
# 推送临时公钥(60 秒有效)
aws ec2-instance-connect send-ssh-public-key \
--instance-id <id> --instance-os-user ubuntu \
--ssh-public-key file:///home/ubuntu/.ssh/id_ed25519.pub
# 趁窗口写入永久公钥
ssh ubuntu@<ip> 'echo "<pubkey>" >> ~/.ssh/authorized_keys'
💡 踩坑提示:
ec2-instance-connect:SendSSHPublicKey推送的公钥只有 60 秒有效。龙虾的策略是:推送后立刻 SSH 进去,把公钥写入authorized_keys,一劳永逸。
2.4 龙虾远程部署新龙虾
人类:开始部署吧。
龙虾:
步骤:
1. 装 Node.js 22
2. 安装 OpenClaw
3. 写配置文件(参考我自己的配置)
4. 启动 Gateway
需要一个新的 Telegram Bot Token。
人类:(去 BotFather 创建了新 bot,发来 token)
龙虾:(全部通过 SSH 远程完成)
✅ 新龙虾已上线。去给它发条消息。
龙虾执行的核心命令:
# 远程安装 Node.js
ssh ubuntu@<ip> 'curl -fsSL https://deb.nodesource.com/setup_22.x | \
sudo -E bash - && sudo apt-get install -y nodejs'
# 远程安装 OpenClaw
ssh ubuntu@<ip> 'npm install -g openclaw'
# 远程写配置(龙虾参考了自己的配置,手写了新实例的版本)
ssh ubuntu@<ip> 'cat > ~/.openclaw/openclaw.json << EOF
{
"models": {
"providers": {
"amazon-bedrock": {
"auth": "aws-sdk",
"models": [
{ "id": "us.anthropic.claude-sonnet-4-6" }
]
}
}
},
"channels": {
"telegram": {
"enabled": true,
"botToken": "<NEW_BOT_TOKEN>"
}
}
}
EOF'
# 启动并设为开机自启
ssh ubuntu@<ip> 'openclaw gateway install && \
loginctl enable-linger ubuntu && \
systemctl --user start openclaw-gateway.service'
2.5 新龙虾激活
人类:(给新 bot 发了消息) 它要配对,code 是 XXXXXXXX。
龙虾:(在新实例上执行了 openclaw pairing approve)
✅ 配对完成。新龙虾已经可以正常对话了。
最终架构
┌──────────────────────┐ ┌──────────────────────┐
│ ARM EC2 │ SSH │ x86 EC2 │
│ t4g.large │◄───────►│ t3.large │
│ │ │ │
│ OpenClaw Gateway │ │ OpenClaw Gateway │
│ "母体龙虾" │ │ "子体龙虾" │
│ │ │ │
│ Bedrock (零密钥) │ │ Bedrock (零密钥) │
└──────────────────────┘ └──────────────────────┘
两只龙虾完全独立:各自有自己的 Telegram bot、对话记忆、工作空间。通过内网 SSH 互通。
实验结束:安全收紧
部署完成后,母体龙虾自动给新生龙虾换了一个权限更小的 IAM 角色:
# 创建只有 Bedrock 权限的新角色
aws iam create-role --role-name BabyClaw \
--assume-role-policy-document '{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {"Service": "ec2.amazonaws.com"},
"Action": "sts:AssumeRole"
}]
}'
aws iam attach-role-policy --role-name BabyClaw \
--policy-arn arn:aws:iam::aws:policy/AmazonBedrockFullAccess
# 替换子体龙虾的角色
aws ec2 replace-iam-instance-profile-association \
--association-id <id> \
--iam-instance-profile Name=BabyClaw
母体保留完整权限(能管理基础设施),子体只保留 Bedrock 权限(只能调模型)。这是基本的安全实践。
踩坑总结
| 坑 | 解决方案 |
|---|---|
| EC2 Instance Connect 公钥只有 60 秒有效 | 推送后立刻 SSH 进去写入 authorized_keys |
| IAM 策略传播有延迟 | put-role-policy 后等约 10 秒再操作 |
| SSH 断开后 systemd user service 停止 | 必须执行 loginctl enable-linger ubuntu |
| 新实例没有 Python/pip | Node.js 方式安装 OpenClaw 不依赖 Python |
| Bedrock 模型 ID 需要用 Inference Profile | 用 us. 前缀的 ID 启用跨区域路由 |
这说明了什么?
这个实验展示的不只是"AI 能执行命令"——而是 AI 能够理解自己的运行环境、发现问题、自主解决问题、并完成一个完整的端到端部署流程。
核心前提是亚马逊云科技的 IAM + Bedrock + EC2 组合:
- IAM 角色让 AI 拥有精细化的云资源操作权限,而不是一把万能钥匙
- Bedrock 提供零密钥的模型调用,新实例不需要配置任何 API Key
- EC2 提供标准化的计算环境,AI 可以用 CLI 完全自动化地操作
当这三者结合,AI 就不只是"能聊天"了——它能自主管理基础设施。
下一步
- 多 Agent 架构:一个实例跑多个 AI 助手,按群/按人隔离
- 成本优化:Nova Lite + Graviton 混合路由策略
关注亚马逊云开发者账号获取更新。
参考链接
- OpenClaw GitHub | 官方文档
- 还在养龙虾?教你让龙虾自己生龙虾
- 推出 OpenClaw on Amazon Lightsail
- 把 OpenClaw 部署到云上:一个值得认真考虑的选择
- Amazon EC2 | IAM | Amazon Bedrock
本文是「OpenClaw 云上实战指南」系列第 3 篇。 作者:亚马逊云开发者 | 实验过程基于官方博客真实记录