1. 项目概述:OpenClaw 全自动部署实战
去年我在团队内部做过一个有趣的实验:让一个已经部署好的 AI 助手(我们内部代号叫"龙虾")自主部署另一个 AI 助手实例。整个过程完全自动化,从创建 EC2 实例到配置环境,再到启动服务,人类只需要提供必要的授权和 token。最令人惊讶的是,这个过程中我甚至没有打开过终端窗口,所有操作都是通过 Telegram 聊天界面完成的。
这个实验的核心价值在于验证了 AI 系统在云环境中的自主运维能力。通过合理配置 IAM 权限和自动化流程,AI 可以像人类工程师一样管理云资源,甚至在某些标准化操作上比人类更高效。下面我将详细拆解这个实验的完整流程和技术细节。
2. 核心架构与工作原理
2.1 系统组件与交互流程
整个自动化部署系统由以下几个关键组件构成:
- 母体 OpenClaw 实例:已经部署好的 AI 助手,运行在 EC2 实例上
- AWS 服务栈:
- EC2:计算资源管理
- IAM:权限控制
- Bedrock:AI 模型服务
- VPC:网络隔离
- Telegram 接口:人机交互通道
- 子体 OpenClaw 实例:将被自动部署的新实例
交互流程如下图所示(文字描述版):
code复制人类操作者 → Telegram 消息 → 母体 OpenClaw → AWS API 调用 → 创建新 EC2 实例
↓
母体 OpenClaw ← SSH 连接 ← 新 EC2 实例 ← 配置完成通知
2.2 关键技术实现原理
这个自动化部署过程依赖于几个关键技术点:
- IAM 角色委托:母体实例通过附加的 IAM 角色获得必要的云资源操作权限
- EC2 Instance Connect:临时 SSH 密钥推送机制,解决初始连接问题
- 配置模板化:新实例的配置基于母体实例的当前状态生成
- 服务自举:通过 systemd 用户服务实现持久化运行
3. 详细部署步骤解析
3.1 前期准备工作
在开始自动化部署前,需要确保以下条件已经满足:
-
基础环境:
- 一个已经正常运行的 OpenClaw 实例(母体)
- AWS 账户和必要的服务配额
- 可用的弹性 IP 地址
-
权限配置:
json复制{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:*",
"iam:*",
"bedrock:*"
],
"Resource": "*"
}
]
}
注意:生产环境应该遵循最小权限原则,这里展示的是实验用的宽松策略
- 网络准备:
- 确认安全组规则允许实例间 SSH 通信
- 检查子网可用 IP 地址数量
3.2 核心部署流程
3.2.1 实例创建与网络配置
当通过 Telegram 发送"帮我再部署一个"指令后,母体 OpenClaw 会执行以下操作:
- 查询当前区域的 EC2 资源状况:
bash复制aws ec2 describe-instances --region ap-southeast-1 \
--filters "Name=tag:Name,Values=OpenClaw*"
- 检查并回收闲置的弹性 IP:
bash复制# 列出所有弹性IP
aws ec2 describe-addresses --region ap-southeast-1
# 释放未使用的弹性IP
aws ec2 release-address --allocation-id eipalloc-12345678
- 创建新的 EC2 实例:
bash复制aws ec2 run-instances \
--image-id ami-0abcdef1234567890 \ # Ubuntu 24.04 LTS
--instance-type t3.large \
--key-name openclaw-keypair \
--security-group-ids sg-12345678 \
--subnet-id subnet-12345678 \
--iam-instance-profile Name=OpenClaw-Instance-Profile \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=OpenClaw-Child}]'
3.2.2 SSH 连接建立
这是整个流程中最关键也最复杂的部分。由于新实例没有预先配置 SSH 密钥,母体需要通过 EC2 Instance Connect 建立初始连接:
- 首先为母体添加必要的权限:
bash复制aws iam put-role-policy \
--role-name OpenClaw-Role \
--policy-name EC2InstanceConnectAccess \
--policy-document '{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": "ec2-instance-connect:SendSSHPublicKey",
"Resource": "arn:aws:ec2:ap-southeast-1:123456789012:instance/i-0abcdef1234567890"
}]
}'
- 推送临时 SSH 公钥(有效期60秒):
bash复制aws ec2-instance-connect send-ssh-public-key \
--instance-id i-0abcdef1234567890 \
--instance-os-user ubuntu \
--ssh-public-key file:///home/ubuntu/.ssh/id_rsa.pub \
--region ap-southeast-1
- 在临时密钥有效期内建立连接并配置永久密钥:
bash复制ssh -o StrictHostKeyChecking=no ubuntu@<new-instance-ip> \
"echo '$(cat /home/ubuntu/.ssh/id_rsa.pub)' >> ~/.ssh/authorized_keys"
3.2.3 软件环境部署
成功建立 SSH 连接后,母体开始在新实例上部署 OpenClaw:
- 安装 Node.js 运行环境:
bash复制ssh ubuntu@<new-instance-ip> \
"curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash - && sudo apt-get install -y nodejs"
- 安装 OpenClaw 核心包:
bash复制ssh ubuntu@<new-instance-ip> "sudo npm install -g openclaw"
- 生成配置文件(基于母体配置模板):
bash复制ssh ubuntu@<new-instance-ip> "mkdir -p ~/.openclaw && cat > ~/.openclaw/config.json << 'EOF'
{
\"telegram\": {
\"botToken\": \"$NEW_BOT_TOKEN\",
\"adminIds\": [$ADMIN_ID]
},
\"aws\": {
\"region\": \"ap-southeast-1\",
\"bedrock\": {
\"enabled\": true
}
}
}
EOF"
- 设置系统服务:
bash复制ssh ubuntu@<new-instance-ip> \
"loginctl enable-linger ubuntu && \
systemctl --user enable --now openclaw-gateway.service"
4. 安全与权限管理
4.1 初始宽松权限策略
在部署阶段,母体需要较宽的权限范围:
json复制{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:*",
"iam:*",
"bedrock:*"
],
"Resource": "*"
}
]
}
4.2 部署后权限收紧
部署完成后,应该立即将子体实例的权限缩小到最小必要范围:
- 创建受限的 IAM 角色:
bash复制aws iam create-role \
--role-name OpenClaw-Child-Role \
--assume-role-policy-document '{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {"Service": "ec2.amazonaws.com"},
"Action": "sts:AssumeRole"
}]
}'
- 附加最小权限策略:
bash复制aws iam attach-role-policy \
--role-name OpenClaw-Child-Role \
--policy-arn arn:aws:iam::aws:policy/AmazonBedrockReadOnlyAccess
- 替换实例角色:
bash复制aws ec2 replace-iam-instance-profile-association \
--association-id iip-assoc-12345678 \
--iam-instance-profile Name=OpenClaw-Child-Profile
5. 常见问题与解决方案
5.1 SSH 连接问题
问题现象:EC2 Instance Connect 成功推送密钥但仍无法连接
排查步骤:
- 检查安全组是否允许 SSH(22端口)
- 确认实例处于运行状态
- 检查系统日志是否有异常:
bash复制aws ec2 get-console-output --instance-id i-0abcdef1234567890
解决方案:
- 确保安全组规则正确
- 检查网络ACL是否阻止连接
- 确认实例操作系统用户正确(Ubuntu 通常为'ubuntu')
5.2 IAM 权限延迟
问题现象:新添加的 IAM 策略不立即生效
典型表现:
- API 调用返回 AccessDenied
- 新创建的实例无法获取元数据
解决方案:
- 策略变更后等待约10秒
- 可以通过以下命令检查策略是否已附加:
bash复制aws iam list-attached-role-policies --role-name OpenClaw-Role
5.3 服务启动失败
问题现象:OpenClaw 网关服务无法保持运行
可能原因:
- systemd 用户服务未正确配置
- 缺少 linger 设置
解决方案:
bash复制# 确保 linger 已启用
loginctl enable-linger ubuntu
# 重新加载 systemd 配置
systemctl --user daemon-reload
# 查看服务日志
journalctl --user-unit openclaw-gateway.service -b
6. 性能优化建议
6.1 实例类型选择
根据实际负载情况,可以考虑以下实例类型组合:
| 场景 | 推荐实例类型 | 月成本(按需) | 特点 |
|---|---|---|---|
| 开发测试 | t3.micro | ~$7 | 低成本入门 |
| 中小规模 | t3.large | ~$70 | 平衡性价比 |
| 高并发 | c6i.xlarge | ~$150 | 计算优化 |
| 持续负载 | m6i.large | ~$100 | 通用型 |
6.2 自动化脚本优化
可以将常用部署操作封装为可重用的脚本:
bash复制#!/bin/bash
# deploy_openclaw.sh
INSTANCE_ID=$1
BOT_TOKEN=$2
# 推送安装脚本
scp install_openclaw.sh ubuntu@${INSTANCE_IP}:/tmp/
# 远程执行安装
ssh ubuntu@${INSTANCE_IP} \
"NEW_BOT_TOKEN=${BOT_TOKEN} /tmp/install_openclaw.sh"
# 验证服务状态
ssh ubuntu@${INSTANCE_IP} \
"systemctl --user status openclaw-gateway.service"
7. 成本控制策略
7.1 资源监控与回收
建议设置以下 CloudWatch 告警:
-
弹性 IP 闲置告警:
- 指标:Addresses-Associated == 0
- 阈值:持续24小时
- 动作:发送通知或自动释放
-
实例利用率告警:
- 指标:CPUUtilization < 10%
- 阈值:持续48小时
- 动作:发送提醒考虑停止实例
7.2 使用 Spot 实例
对于非关键任务实例,可以使用 Spot 实例降低成本:
bash复制aws ec2 run-instances \
--instance-market-options '{"MarketType":"spot"}' \
--spot-options '{"SpotInstanceType":"persistent","InstanceInterruptionBehavior":"stop"}' \
...其他参数...
8. 扩展应用场景
8.1 多区域部署
通过少量修改,可以实现跨区域部署:
bash复制# 在不同区域创建实例
aws ec2 run-instances \
--region us-west-2 \
...其他参数...
# 配置跨区域 Bedrock 访问
{
"aws": {
"regions": ["ap-southeast-1", "us-west-2"],
"bedrock": {
"defaultRegion": "ap-southeast-1"
}
}
}
8.2 自动伸缩组集成
可以将此方案与 Auto Scaling 结合:
- 创建启动模板:
bash复制aws ec2 create-launch-template \
--launch-template-name OpenClaw-Launch-Template \
--launch-template-data '{"UserData":"base64-encoded-user-data-script"}'
- 设置自动伸缩策略:
bash复制aws autoscaling put-scaling-policy \
--policy-name OpenClaw-Scale-Out \
--auto-scaling-group-name OpenClaw-ASG \
--scaling-adjustment 1 \
--adjustment-type ChangeInCapacity
在实际操作中,我发现这种自动化部署模式特别适合需要频繁创建相似环境的场景。通过合理设计权限边界和审核机制,可以在保证安全的前提下大幅提升运维效率。一个实用的技巧是在自动化流程中加入人工确认环节,比如在创建关键资源前要求二次确认,这样可以避免意外操作带来的风险。