内容
<div align="center">
# 🧠 亚马逊Bedrock聊天机器人
**一款由亚马逊Bedrock提供支持的自行托管的生成式AI助手。**
开放式网页界面 · Bedrock访问网关 · MCP工具 — 容器化并在AWS ECS Fargate上部署,使用Terraform。
[](https://www.terraform.io/)
[](https://aws.amazon.com/fargate/)
[](https://aws.amazon.com/bedrock/)
📖 在 [Medium](https://aws.plainenglish.io/deploying-your-own-chatgpt-on-aws-with-amazon-bedrock-and-open-webui-eb4ae62bfc74) 上阅读配套文章
</div>
---
## 概述
该仓库在您自己的AWS账户上部署一个完整的、私有的生成式AI聊天机器人 — 一个由亚马逊Bedrock模型(Claude, Titan, …)支持的精致聊天界面,无需编写任何前端代码。所有内容都定义为Terraform,并作为ECS Fargate上的容器进行交付。


> [!NOTE]
> 该项目旨在作为 **概念验证 / 起步点**。默认配置倾向于快速、低摩擦部署,而不是生产强化 — 在公开暴露之前,请查看 [安全说明](#安全说明)。
## 功能
- 🧱 **亚马逊Bedrock** — Claude, Titan和其他基础模型
- 💬 **[开放式网页界面](https://github.com/open-webui/open-webui)** — 一个时尚的、类似ChatGPT的界面
- 🔁 **[Bedrock访问网关](https://github.com/aws-samples/bedrock-access-gateway)** — Bedrock前面的OpenAI兼容API
- 🔌 **[MCPO](https://github.com/open-webui/mcpo)** — 将MCP服务器(时间,GitLab,Linear,…)作为工具暴露给UI
- ☁️ **ECS Fargate(ARM64)** — 完全无服务器容器
- 🔒 **包含所有必要组件** — VPC,ALB,EFS,S3,Secrets Manager,IAM,可选自定义域和VPC端点
## 架构
| 组件 | 角色 |
| --- | --- |
| **应用程序负载均衡器** | 公共入口点(HTTP,或使用自定义域的HTTPS) |
| **开放式网页界面** | ECS Fargate上的聊天界面(私有子网),数据保存在 **EFS** 上,上传到 **S3** |
| **Bedrock访问网关** | 将OpenAI样式的调用转换为Bedrock;在 `gateway.bedrock.local` 访问 |
| **MCPO** | 在 `mcpo.bedrock.local` 通过HTTP提供MCP工具 |
| **Cloud Map** | 服务之间的私有服务发现(`*.bedrock.local`) |
| **Secrets Manager** | API密钥和第三方令牌 |
| **S3** | 远程Terraform状态(本地锁定)+用户上传 |
## 先决条件
- 一个具有 [Bedrock模型访问权限](https://docs.aws.amazon.com/bedrock/latest/userguide/model-access.html) 的 **AWS账户**
- 配置了命名配置文件的 **AWS CLI**
- 本地运行的 **Docker** — 在 `apply` 期间构建并推送镜像到ECR
- **Terraform** `>= 1.11.0`
## 快速开始
```bash
git clone https://github.com/louis-fiori/aws-bedrock-chatbot.git
cd aws-bedrock-chatbot
# 1. 配置您的AWS账户 / 区域 / 配置文件
cp terraform.tfvars.example terraform.tfvars
$EDITOR terraform.tfvars
# 2. 部署
./deploy.sh
```
`deploy.sh` 是Makefile的薄封装。等效的手动步骤是:
```bash
make setup-state # 一次性:为远程状态创建S3存储桶
make init # 配置S3后端
make apply # 克隆源,构建和推送镜像,部署堆栈
```
当它完成时,获取URL并在浏览器中打开:
```bash
make output
```
在第一次访问时注册账户,并开始与Bedrock模型聊天。
> Terraform运行会自动克隆开放式网页界面和Bedrock访问网关源,并为Open WebUI镜像提高Node构建内存限制 — 无需手动编辑。
## 配置
所有输入都位于 `terraform.tfvars` (参见 `terraform.tfvars.example` )。
| 变量 | 默认值 | 描述 |
| --- | --- | --- |
| `account_id` | — | 您的AWS账户ID |
| `region` | `eu-west-1` | 部署区域 |
| `profile` | — | 要使用的AWS CLI配置文件 |
| `domain_name` | `null` | 自定义域(当`enable_domain`为`true`时需要) |
| `feature_toggles.enable_domain` | `false` | 提供ACМ证书并在ALB上提供HTTPS。需要`domain_name`和现有的Route 53托管区域,以及指向ALB的DNS记录(`make output`)。 |
| `feature_toggles.enable_vpc_endpoints` | `false` | 添加接口VPC端点(Bedrock,ECR,Secrets Manager,Logs,…)以实现私有连接 |
模型/源版本(开放式网页界面,Bedrock访问网关)在 [`variables.tf`](variables.tf) 中固定。
### MCPO第三方令牌
MCPO附带GitLab和Linear MCP服务器。它们的令牌在Secrets Manager中创建,带有`REPLACE_ME`占位符,以便服务可以启动;在第一次部署后设置实际值(Terraform不会覆盖它们):
```bash
aws secretsmanager put-secret-value --secret-id <gitlab-token-...> --secret-string "<your-gitlab-pat>"
aws secretsmanager put-secret-value --secret-id <linear-token-...> --secret-string "<your-linear-key>"
```
## 安全说明
这是概念验证;在实际应用之前请查看这些:
- **无TLS,无域** — 使用`enable_domain = false`时,应用程序通过纯 **HTTP** 提供服务。
- **开放注册** — 任何可以访问负载均衡器的人都可以注册账户。
- **广泛的IAM** — 任务角色出于方便使用广泛的权限(`bedrock:*`,`s3:*`)。
对于生产环境:启用域(HTTPS),限制访问(WAF / 源IP / 身份验证),并缩小IAM策略。
## 销毁
```bash
make destroy # 销毁应用程序堆栈
make clean # 删除克隆的源和本地Terraform文件
```
`make setup-state`创建的远程状态存储桶不会被`make destroy`删除 — 如果您想清理所有内容,请手动删除它。
## 故障排除
- **开放式网页界面构建内存不足** — Node构建内存限制已自动提高;如果仍然失败,请为Docker提供更多内存。
- **MCPO工具身份验证失败** — 确保您替换了`REPLACE_ME`令牌占位符(参见上文)。