
使用 Terraform 将 streetmerchant 部署到 AWS ECS Fargate基础设施即代码实战指南【免费下载链接】streetmerchant The worlds 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 Channelterraform 目录结构一览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/credentialsAWS 凭证文件路径credential_profiledefault凭证文件中对应的 section 名regioneu-west-2AWS 区域这些变量通过 provider.tf 注入 AWS providerprovider 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_filestring~/.aws/credentialsAWS 凭证文件路径credential_profilestringdefault凭证文件中的账号 section 名regionstringeu-west-2AWS 区域app_namestringstreetmerchant应用名用于命名集群、服务、日志组、仪表盘等资源memorystring2048ECS 任务内存MBcpunumber1024ECS 任务 CPU 单位streetmerchant_envmap{}注入容器的dotenv键值对ecs_task_execution_role_namestringmyEcsTaskExecutionRoleECS 任务执行 IAM 角色名其中memory与cpu在 resource-ecs.tf 中被同时用于任务定义与容器定义容器侧通过parseint(var.memory, 10)将字符串转为整数满足 JSON 模板对数字类型的要求。基础设施实现原理四份资源文件拆解VPC 网络层resource-vpc.tfterraform/resource-vpc.tf 构建了一套最小可用的公网网络栈aws_vpc.mainCIDR10.0.0.0/16开启 DNS 支持aws_internet_gateway.main提供公网出口aws_subnet.aws-subnet使用与 VPC 相同的 CIDR 块开启map_public_ip_on_launch即子网内实例自动获得公网 IPaws_route_table.mainaws_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.tfterraform/resource-ecs.tf 是核心编排文件包含四类资源aws_ecs_cluster.main命名{app_name}-ecs-clusteraws_ecs_service.main关联集群与任务定义desired_count 1始终运行 1 个实例launch_type FARGATE并将任务放入上述子网并分配公网 IPIAM 执行角色通过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.tfterraform/resource-logging.tf 实现了容器 → CloudWatch 日志 → 指标 → 仪表盘的完整可观测链路aws_cloudwatch_log_group.main日志组保留期retention_in_days 3指标过滤器对每个商店由split(,, var.streetmerchant_env[STORES])从 STORES 环境变量拆解而来各创建两个aws_cloudwatch_log_metric_filterout_of_stock日志模式${store} \OUT OF STOCK\命中即向命名空间{app_name}-out-of-stock写入指标值 1error日志模式${store} \ERROR\命中即向命名空间{app_name}-error写入指标值 1aws_cloudwatch_dashboard.main渲染 dashboard.json.template生成两张时序图out of stock 与 error统计方式Sum、周期 300 秒、时间范围最近 1 小时。这一设计的前提是 streetmerchant 的日志确实包含这些关键字。在 src/logger.ts 中可以找到依据当商品缺货时日志输出形如✖ {产品信息} :: OUT OF STOCKOUT 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_TOKENSLACK_CHANNEL、DISCORD_WEB_HOOK、TELEGRAM_ACCESS_TOKENTELEGRAM_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 worlds easiest, most powerful stock checker项目地址: https://gitcode.com/GitHub_Trending/st/streetmerchant创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考