跳转至

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