AWS国际版 AWS亚马逊云小程序开发环境
你是不是也经历过这种场面:
凌晨两点,盯着控制台里那个红色的 502 Bad Gateway 傻笑,仿佛它在跟你玩捉迷藏;
翻了八遍 AWS 文档,发现它写的是「支持小程序后端」,但没告诉你「支持的前提是你得先给 API Gateway 手动加个微信信任域名白名单」;
在微信群里问「AWS 能不能跑小程序?」,有人秒回「当然可以!」,然后你点开他发的链接——是三年前的 Serverless Framework v1.27 教程,连 Lambda 层(Layer)都还没普及……
别急,今天这篇不讲虚的,不列概念图,不塞英文缩写轰炸,就当咱俩蹲在星巴克角落,一杯冰美式分着喝,我边敲键盘边给你捋清楚:AWS 上搞小程序,到底怎么落地?
第一步:别急着写代码,先让 AWS 认你这个「人」
注册 AWS 账号时,别信「免费套餐 12 个月」的甜言蜜语。它确实免费,但有个隐藏条款:一旦你开了 API Gateway 的 REST API(不是 HTTP API),哪怕只建一个最简路由,每月首百万请求免费,但——每个集成响应头(Integration Response Header)都要单独计费。
所以,刚起步,直接选 HTTP API。它便宜、快、自带 CORS,还不用配 Integration Response。微信小程序调用时,它比 REST API 少绕两道弯,延迟低 80ms 左右(实测,非玄学)。
顺便提醒:用个人身份证注册完,立刻进 Service Control Policies(SCP) 把 IAM 用户默认权限收紧。为啥?因为某天你手抖点错「全部资源」→「全部操作」,第二天收到邮件:「您本月 Lambda 调用次数超限,账单 $2,468.32」——而你只是想测试个登录接口。
第二步:后端三件套,不是拼乐高,是搭积木
小程序后端 ≠ 全家桶。AWS 上最轻量、最稳、最适合 MVP 的组合是:
- Lambda:写业务逻辑,Python/Node.js 随便挑,建议 Node.js(微信生态更熟);
- DynamoDB:存用户 openid、session_key、订单状态,别碰 RDS——小项目用 MySQL,就像用吊车拧螺丝;
- API Gateway(HTTP API):当门卫,验签名、转请求、设限流,不干别的。
重点来了:Lambda 函数名别起 wechat-login-handler,改叫 prod-wechat-login-v2。为什么?因为等你上线三天后加了个「手机号一键登录」功能,再建个函数,名字一模一样——结果微信开发者工具里调用的还是旧版,而你根本没意识到,因为控制台里两个函数并排躺着,长得像双胞胎。
第三步:本地开发?别信「Serverless Offline」
那个号称「完美模拟 Lambda 本地运行」的插件,会在你调用 context.getRemainingTimeInMillis() 时返回 undefined,而你的鉴权逻辑偏偏靠它做超时熔断……最后上线才发现,用户连续点三次登录,后端直接卡死。
真实推荐方案:本地起 Express + 模拟 Lambda handler 接口。代码长这样:
app.post('/login', async (req, res) => {
const event = { body: JSON.stringify(req.body) };
const result = await yourLambdaHandler(event, {});
res.json(JSON.parse(result.body));
});
好处?你能用 Chrome DevTools 断点、看内存泄漏、抓 SQL 查询——而 Serverless Offline 里,你连 console.log 都要猜输出在哪行。
第四步:微信那边,才是真正的「结界」
小程序调用 AWS 接口,必须过三关:
- 域名白名单:在「微信公众平台 → 开发管理 → 服务器域名」里填你的 API Gateway 域名(如
https://xxx.execute-api.us-east-1.amazonaws.com),注意:必须带 https,必须是根路径,不能带 /prod; - CORS 头:API Gateway HTTP API 默认不开 CORS,手动加:
Access-Control-Allow-Origin: *(上线前换成具体域名); - HTTPS 强制:AWS 自带证书,但如果你用了 CloudFront 做缓存,记得把「Viewer Protocol Policy」设为
Redirect HTTP to HTTPS,否则微信真机里提示「不安全的域名」,连请求都发不出去。
血泪教训:有次我忘了在 API Gateway 的 Route Response 里加 Access-Control-Allow-Methods: POST,GET,OPTIONS,结果小程序里 wx.request 直接静默失败,控制台连 error 都不报——因为预检 OPTIONS 请求被拦在半路,连 Lambda 的日志都没进。
第五步:上线前,做三件事,救你命
- 在 Lambda 函数里加全局错误捕获:别信 try/catch 包住 handler 就万事大吉。Node.js 中 Promise.reject() 不触发 catch,得用
process.on('unhandledRejection', ...); - 给 DynamoDB 表加 TTL(Time To Live)字段:比如 session 表加
expiresAt(时间戳),开 TTL 后 AWS 自动清理过期项,省得你半夜被报警短信吵醒说「读写容量超限」; - 用微信开发者工具「条件编译」打标记:本地用
http://localhost:3000,测试环境用https://test.api.yourdomain.com,线上走正式网关——别靠改 config 文件,那玩意儿容易 commit 错分支。
最后说句实在话
AWS 不是银弹,但它像一把瑞士军刀:钝的时候能砸核桃,尖的时候能雕花。小程序用它,优势不在「多酷炫」,而在「出问题时,你能看清每一层谁背锅」——CloudWatch 日志查 5 秒定位到 Lambda 内存溢出,X-Ray 追踪显示 DynamoDB 查询慢了 300ms,连 S3 的 PUT 请求耗时都标得清清楚楚。
而那些「一键部署」的 BaaS 平台?它们把错误包装成「服务不可用」四个字,你连重试按钮该不该点都拿不准。
所以,别怕命令行,别嫌控制台按钮多,更别信「零配置上云」的广告语。
真正的小程序稳定,从来不是靠平台多厉害,而是你亲手拧紧了每一个螺丝——从 IAM 权限最小化,到 Lambda 冷启动预热,再到微信域名白名单少打一个字母。
现在,关掉这篇文章,打开你的 AWS 控制台。
创建第一个 HTTP API,起个名字,别带中文,别用下划线,就叫 api-prod。
然后,深呼吸,点「创建」。
AWS国际版 ——这一步,比写一万行代码,都算真正开工了。

