龙虾 AI 自己开服务器:OpenClaw 全自动部署实战,25 分钟 0 命令(附完整代码)

10 阅读1分钟

龙虾 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 自主完成。


前提条件

要复现这个实验,你需要:

  1. 一只已经在跑的 OpenClaw(第 1 篇教过怎么部署)
  2. 足够的 IAM 权限(下面详细说)
  3. 一个新的 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/pipNode.js 方式安装 OpenClaw 不依赖 Python
Bedrock 模型 ID 需要用 Inference Profileus. 前缀的 ID 启用跨区域路由

这说明了什么?

这个实验展示的不只是"AI 能执行命令"——而是 AI 能够理解自己的运行环境、发现问题、自主解决问题、并完成一个完整的端到端部署流程

核心前提是亚马逊云科技的 IAM + Bedrock + EC2 组合:

  • IAM 角色让 AI 拥有精细化的云资源操作权限,而不是一把万能钥匙
  • Bedrock 提供零密钥的模型调用,新实例不需要配置任何 API Key
  • EC2 提供标准化的计算环境,AI 可以用 CLI 完全自动化地操作

当这三者结合,AI 就不只是"能聊天"了——它能自主管理基础设施。


下一步

  • 多 Agent 架构:一个实例跑多个 AI 助手,按群/按人隔离
  • 成本优化:Nova Lite + Graviton 混合路由策略

关注亚马逊云开发者账号获取更新。


参考链接


本文是「OpenClaw 云上实战指南」系列第 3 篇。 作者:亚马逊云开发者 | 实验过程基于官方博客真实记录