AWS ECS¶
你可以将 OpenBot 镜像 作为 EC2 实例上的 Amazon ECS 服务运行。不支持 AWS Fargate(参见 Fargate)。该服务与任何 Docker 容器一样,是你账户中的一个普通远程主机。它不发布任何端口。
请先阅读 Docker。本页仅说明其选项的 ECS 相关设置。
实例¶
为 OpenBot 使用一台 EC2 实例,采用 Amazon ECS 优化的 Amazon Linux 2023 AMI。OpenBot 需要镜像的 seccomp 配置文件,而 ECS 任务定义无法设置 seccomp 配置文件:dockerSecurityOptions 只接受 no-new-privileges、apparmor:、label: 和 credentialspec:。因此,该实例的 Docker 守护进程会对每个容器使用该配置文件。不要在这台实例上运行其他任务。
使用启动模板创建实例,并配置以下设置:
- 为
/data添加第二个 EBS 卷,设备名为/dev/sdf,并将DeleteOnTermination设为false。要将数据迁移到新实例,请先为旧卷创建快照,再将其放入此映射中。 - 仅使用 IMDSv2(
HttpTokens为required),跳数限制为 1(HttpPutResponseHopLimit)。智能体在容器内具有完全访问权限。在bridge模式下,跳数限制为 1 可阻止智能体从实例元数据中读取实例角色的凭证。
在用户数据中,先挂载该卷,将其所有权交给镜像用户,并在 ECS 启动任务前设置守护进程选项。使用任务定义中的镜像版本:
#!/bin/bash
set -euo pipefail
version=<version>
device=/dev/sdf
# The data volume. mkfs runs only on a volume with no file system.
blkid "$device" || mkfs -t xfs "$device"
mkdir -p /srv/openbot-data
echo "UUID=$(blkid -s UUID -o value "$device") /srv/openbot-data xfs defaults,nofail 0 2" >>/etc/fstab
mount /srv/openbot-data
chown 1000:1000 /srv/openbot-data
# The seccomp profile of that image version, and no-new-privileges, for each container.
[ ! -e /etc/docker/daemon.json ] || { echo "Add the two keys to /etc/docker/daemon.json." >&2; exit 1; }
curl -fsSL -o /etc/docker/openbot-seccomp.json \
"https://raw.githubusercontent.com/nightly-labs/openbot/v$version/docker/seccomp.json"
cat >/etc/docker/daemon.json <<'EOF'
{ "seccomp-profile": "/etc/docker/openbot-seccomp.json", "no-new-privileges": true }
EOF
systemctl restart docker
echo ECS_CLUSTER=openbot >>/etc/ecs/ecs.config
用户数据只在实例首次启动时运行。当你更改镜像版本时,请再次获取该版本的 seccomp 配置文件。
任务定义¶
{
"family": "openbot",
"requiresCompatibilities": ["EC2"],
"networkMode": "bridge",
"taskRoleArn": "arn:aws:iam::<account>:role/openbot-task",
"executionRoleArn": "arn:aws:iam::<account>:role/openbot-execution",
"volumes": [{ "name": "data", "host": { "sourcePath": "/srv/openbot-data" } }],
"containerDefinitions": [
{
"name": "openbot",
"image": "ghcr.io/nightly-labs/openbot:<version>",
"essential": true,
"memory": 4096,
"linuxParameters": { "sharedMemorySize": 1024 },
"stopTimeout": 60,
"mountPoints": [{ "sourceVolume": "data", "containerPath": "/data" }],
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/ecs/openbot",
"awslogs-region": "<region>",
"awslogs-stream-prefix": "openbot",
"awslogs-create-group": "true"
}
}
}
]
}
| 设置 | Docker 选项 | 原因 |
|---|---|---|
sharedMemorySize: 1024 |
--shm-size 1g |
Chromium 使用共享内存。 |
stopTimeout: 60 |
--stop-timeout 60 |
OpenBot 在退出前会停止其智能体并关闭数据库。 |
host.sourcePath |
-v openbot-data:/data |
所有数据都在 /data 中。 |
daemon.json |
--security-opt |
参见 实例。 |
镜像以 tini 作为进程 1 启动。不要设置 initProcessEnabled。
要通过 AWS Secrets Manager 或 SSM Parameter Store 提供提供商 API 密钥,请为容器添加 secrets,例如 { "name": "XAI_API_KEY", "valueFrom": "<secret ARN>" }。执行角色必须能够读取该密钥。智能体可以读取 OpenBot 的每个变量(参见 环境)。
任务角色仅用于 ECS Exec。智能体可以读取任务角色的凭证,因此不要授予它其他权限。
服务¶
创建一个 desiredCount 为 1、minimumHealthyPercent 为 0、maximumPercent 为 100 的服务。两个任务绝不能使用同一个 /data:部署会先停止旧任务,再启动新任务。为 登录 启用 enableExecuteCommand。
使用版本标签。要升级,请使用新标签注册任务定义并更新服务。不要回退到旧标签(参见 升级)。
登录¶
ECS Exec 会在容器中打开一个终端。任务角色需要 ssmmessages:CreateControlChannel、ssmmessages:CreateDataChannel、ssmmessages:OpenControlChannel 和 ssmmessages:OpenDataChannel。在你的计算机上安装适用于 AWS CLI 的 Session Manager 插件,然后运行:
aws ecs execute-command --cluster openbot --task <task ID> --container openbot \
--interactive --command "openbot login"
openbot status、logout 和 name 以相同方式工作。日志位于 CloudWatch 日志组 /ecs/openbot 中,而不是 openbot logs 中。
网络¶
任务只发起出站连接。允许 HTTPS 访问公司防火墙或代理会阻止 OpenBot 中列出的主机以及你的提供商,并允许用于远程使用的 TURN 中继的 UDP 和 TCP 端口。安全组不需要任何入站规则。
备份¶
停止服务(desiredCount 为 0),为数据卷创建快照,然后重新启动服务。将 /data 保持为一个整体(参见 数据)。
Fargate¶
Fargate 无法运行启用了 Electron 沙箱的镜像:
dockerSecurityOptions在 Fargate 上无效,并且 Fargate 不会添加除SYS_PTRACE以外的任何能力。如果 Fargate 的默认配置文件拒绝用户命名空间,容器会停止并显示有关 seccomp 配置文件的消息。- Fargate 将数据存储在 EFS(一种网络文件系统)上。OpenBot 数据库使用 SQLite WAL 模式,该模式无法在网络文件系统上工作。
Fargate 不允许设置共享内存大小。当 /dev/shm 小于 1 GiB 时,镜像
会指示 Chromium 使用 /tmp。
不要为了使用 Fargate 而关闭沙箱。请改用 EC2,或托管服务器。
未确认¶
此设置未在 AWS 上测试。未确认:ECS 优化版 Amazon Linux 2023 AMI 上的用户数据、该 AMI 上带有镜像配置文件的用户命名空间、镜像在 Fargate 上的启动、ECS Exec 使用的用户、/dev/sdf 到 NVMe 设备的链接,以及 daemon.json 中 no-new-privileges 对 ECS agent 和 ECS Exec 的影响。从其脚本来看,openbot 命令可以以 root 身份和镜像用户的身份运行。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 openbo/openbot