使用 Terraform 将 streetmerchant 部署到 AWS ECS Fargate:基础设施即代码实战指南
【免费下载链接】streetmerchant🤖 The world's easiest, most powerful stock checker项目地址: https://gitcode.com/GitHub_Trending/st/streetmerchant
本篇指南讲解如何利用仓库内terraform/目录提供的完整 Terraform 配置,将 streetmerchant 的 Docker 镜像一键部署到 AWS ECS Fargate 无服务器容器环境。你将掌握从 AWS 凭证配置、.tfvars变量注入、terraform init/plan/apply三步发布,到 CloudWatch 库存监控指标与仪表盘自动生成的全过程,并理解每份.tf资源文件背后的实现原理与参数含义。
为什么选择云上部署
streetmerchant 是一款自动轮询各零售商网站、实时检测商品库存的库存监控工具。本地运行时,它会在检测到补货后直接打开本地浏览器跳转到购买页面。但正如 terraform/README.md 所说明的,当运行在云端基础设施上时,没有本地浏览器可供跳转,因此你必须接入一种聊天/消息通知渠道(如 Slack、Discord、Telegram 等),让库存告警以通知的形式送达。
原作者的经验是:将容器运行在
eu-west-2(欧洲伦敦)区域,足以在 PS5 于 Amazon 补货时及时收到告警并跟随链接完成购买。此为作者个人运行经验,实际延迟与可用性因网络、商店与区域而异。
云端部署的收益很直接:容器 7×24 小时持续运行,不依赖本地电脑的开关机状态;配合 ECS Fargate 按量计费,成本可控且免运维服务器。
前置依赖
- Terraform 14(原文档明确要求;仓库内 provider.tf 声明的 AWS provider 版本为
~> 3.0,即 3.x 系列) - AWS 账号及已配置好凭证的 AWS CLI 环境
- 用于接收告警的聊天通知渠道(如 Slack Token + Channel)
terraform 目录结构一览
terraform/ ├── README.md # 部署说明(本文对应文档) ├── provider.tf # AWS provider 与认证配置 ├── variables.tf # 全部可调变量及默认值 ├── terraform.tfvars # 示例变量文件(按需重命名/修改) ├── resource-vpc.tf # VPC / 网关 / 子网 / 路由表 ├── resource-ecs.tf # ECS 集群、服务、任务定义与 IAM 角色 ├── resource-logging.tf # CloudWatch 日志组、指标过滤器与仪表盘 ├── taskdef.json.template # ECS 任务定义容器模板 └── dashboard.json.template # CloudWatch 仪表盘模板快速开始:三步完成部署
1. 配置变量文件
仓库提供了一个示例变量文件 terraform/terraform.tfvars,内容如下:
credential_profile = "ps5" streetmerchant_env = { "STORES" = "amazon-uk,game,argos,box,currys,johnlewis,shopto,smythstoys,very,amazon-it,amazon-nl" "SHOW_ONLY_SERIES" = "sonyps5c,sonyps5de" "SLACK_TOKEN" = "your slack api token" "SLACK_CHANNEL" = "your slack channel name" }将其按自己的需求重命名或修改。关键原则(原文档强调):任何你希望在dotenv文件中设置的配置项,都必须以键值对形式写入terraform.tfvars的streetmerchant_env,才能注入到 Fargate 容器环境变量中。
2. 认证
使用你自己的 AWS 账号进行认证,方式与任何 AWS 命令行工具一致。如果需要,可以在 AWS credentials 文件中添加一个独立 section,并在terraform.tfvars中通过credential_profile指定该 profile 名(配置方法参见 AWS 官方 CLI 配置文件文档,此处不再赘述)。
从 variables.tf 可以看到认证相关的三个变量及默认值:
| 变量 | 默认值 | 含义 |
|---|---|---|
credential_file | ~/.aws/credentials | AWS 凭证文件路径 |
credential_profile | default | 凭证文件中对应的 section 名 |
region | eu-west-2 | AWS 区域 |
这些变量通过 provider.tf 注入 AWS provider:
provider "aws" { region = var.region shared_credentials_file = var.credential_file profile = var.credential_profile }3. 执行部署
cd ./terraform terraform init terraform plan terraform applyterraform init:初始化工作目录并下载 AWS provider 插件;terraform plan:预览将要创建的云资源清单(强烈建议先执行,确认资源无误);terraform apply:实际创建 VPC、ECS、IAM、CloudWatch 等全部资源。
变量详解:一份表读懂全部可调参数
terraform/variables.tf 定义了以下变量,除streetmerchant_env外均提供默认值:
| 变量 | 类型 | 默认值 | 说明 |
|---|---|---|---|
credential_file | string | ~/.aws/credentials | AWS 凭证文件路径 |
credential_profile | string | default | 凭证文件中的账号 section 名 |
region | string | eu-west-2 | AWS 区域 |
app_name | string | streetmerchant | 应用名,用于命名集群、服务、日志组、仪表盘等资源 |
memory | string | 2048 | ECS 任务内存(MB) |
cpu | number | 1024 | ECS 任务 CPU 单位 |
streetmerchant_env | map | {} | 注入容器的dotenv键值对 |
ecs_task_execution_role_name | string | myEcsTaskExecutionRole | ECS 任务执行 IAM 角色名 |
其中memory与cpu在 resource-ecs.tf 中被同时用于任务定义与容器定义(容器侧通过parseint(var.memory, 10)将字符串转为整数,满足 JSON 模板对数字类型的要求)。
基础设施实现原理:四份资源文件拆解
VPC 网络层(resource-vpc.tf)
terraform/resource-vpc.tf 构建了一套最小可用的公网网络栈:
aws_vpc.main:CIDR10.0.0.0/16,开启 DNS 支持;aws_internet_gateway.main:提供公网出口;aws_subnet.aws-subnet:使用与 VPC 相同的 CIDR 块,开启map_public_ip_on_launch,即子网内实例自动获得公网 IP;aws_route_table.main+aws_main_route_table_association.main:将0.0.0.0/0路由指向互联网网关,并关联为主路由表。
Fargate 任务需要公网 IP 才能访问目标商店网站,这正是服务配置assign_public_ip = true与子网map_public_ip_on_launch = true配套的原因。
ECS 容器编排层(resource-ecs.tf)
terraform/resource-ecs.tf 是核心编排文件,包含四类资源:
aws_ecs_cluster.main:命名{app_name}-ecs-cluster;aws_ecs_service.main:关联集群与任务定义,desired_count = 1(始终运行 1 个实例),launch_type = "FARGATE",并将任务放入上述子网并分配公网 IP;- IAM 执行角色:通过
aws_iam_policy_document允许ecs-tasks.amazonaws.com服务担任角色,并挂载 AWS 托管策略AmazonECSTaskExecutionRolePolicy(任务拉取镜像、写入 CloudWatch 日志所需权限); aws_ecs_task_definition.main:使用templatefile()渲染 taskdef.json.template,声明FARGATE兼容性、awsvpc网络模式,并注入 CPU/内存与容器环境变量。
其中环境变量注入的关键实现:
locals { container_env = [for k, v in var.streetmerchant_env : { name: k, value: v}] }这行for表达式将streetmerchant_env的 map 结构转换为 ECS 容器定义所需的{name, value}对象数组,再经jsonencode传入模板的${environment}占位符。
任务定义模板 taskdef.json.template 的核心内容:
{ "name": "${name}-task", "image": "ghcr.io/jef/streetmerchant:latest", "cpu": ${cpu}, "memory": ${memory}, "essential": true, "environment": ${environment}, "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "${awslogs-group}", "awslogs-region": "${region}", "awslogs-stream-prefix": "ecs" } } }可见容器直接使用 streetmerchant 官方镜像ghcr.io/jef/streetmerchant:latest,日志通过awslogs驱动汇入 CloudWatch 日志组(这也是下方监控指标的数据来源)。
日志与监控层(resource-logging.tf)
terraform/resource-logging.tf 实现了"容器 → CloudWatch 日志 → 指标 → 仪表盘"的完整可观测链路:
aws_cloudwatch_log_group.main:日志组,保留期retention_in_days = 3;- 指标过滤器:对每个商店(由
split(",", var.streetmerchant_env["STORES"])从 STORES 环境变量拆解而来)各创建两个aws_cloudwatch_log_metric_filter:out_of_stock:日志模式"${store} \"OUT OF STOCK\"",命中即向命名空间{app_name}-out-of-stock写入指标值 1;error:日志模式"${store} \"ERROR\"",命中即向命名空间{app_name}-error写入指标值 1;
aws_cloudwatch_dashboard.main:渲染 dashboard.json.template,生成两张时序图("out of stock" 与 "error"),统计方式Sum、周期 300 秒、时间范围最近 1 小时。
这一设计的前提是 streetmerchant 的日志确实包含这些关键字。在 src/logger.ts 中可以找到依据:当商品缺货时,日志输出形如✖ {产品信息} :: OUT OF STOCK(OUT OF STOCK以红色标注);错误日志同样包含ERROR关键字。因此指标过滤器能精确匹配每个商店的缺货与错误事件,实时反映在 CloudWatch 仪表盘上。
streetmerchant_env:如何把 dotenv 配置搬上云
streetmerchant_env是连接本地配置与云端容器的桥梁。仓库根目录的 dotenv-example 列出了 streetmerchant 支持的全部环境变量(所有配置项均为可选),常见的几类:
- 商店与过滤:
STORES(要监控的商店列表,逗号分隔)、SHOW_ONLY_SERIES/SHOW_ONLY_BRANDS/SHOW_ONLY_MODELS(按系列/品牌/型号过滤)、MAX_PRICE_SERIES_*(各系列最高可接受价格); - 通知渠道:
SLACK_TOKEN+SLACK_CHANNEL、DISCORD_WEB_HOOK、TELEGRAM_ACCESS_TOKEN+TELEGRAM_CHAT_ID、EMAIL_*、TWILIO_*等(云上部署时至少配置一种); - 运行行为:
HEADLESS、IN_STOCK_WAIT_TIME、PAGE_SLEEP_MIN/MAX、PAGE_BACKOFF_MIN/MAX、PAGE_TIMEOUT、LOG_LEVEL等。
原文档特别强调:本地dotenv文件能设置的每一项,都要显式写入terraform.tfvars的streetmerchant_env才会生效,因为 Terraform 无法读取本地 dotenv 文件,一切以变量注入为准。示例 tfvars 中SLACK_TOKEN与SLACK_CHANNEL即为云上告警渠道的典型配置。
部署后的运维要点
- 查看告警:关注你配置的通知渠道(如 Slack 频道);同时可在 AWS 控制台打开
{app_name}-dashboard仪表盘查看各商店的缺货/错误指标变化; - 查看容器日志:前往 CloudWatch Logs 的
streetmerchant日志组(保留 3 天),可核对OUT OF STOCK/ERROR原始日志,与指标过滤结果互相印证; - 调整监控范围:修改
terraform.tfvars中STORES后重新执行terraform apply,指标过滤器与仪表盘会随商店列表自动重建; - 资源费用:Fargate 按任务 CPU/内存计费,默认配置为 1024 CPU / 2048 MB,可在
variables.tf中按需调整。
结语
terraform/目录为 streetmerchant 提供了从网络、容器编排到日志监控的完整 IaC 方案:一条命令创建 VPC + Fargate 任务 + CloudWatch 仪表盘,配合streetmerchant_env的变量注入机制,将本地dotenv配置无缝迁移到云端。对于希望 24 小时无人值守盯库存、并通过聊天通知接收告警的使用者而言,这是一套开箱即用、且每一步资源都能在配置文件中找到依据的部署路径。
【免费下载链接】streetmerchant🤖 The world's easiest, most powerful stock checker项目地址: https://gitcode.com/GitHub_Trending/st/streetmerchant
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考