白嫖MongoDB Atlas与AWS Lambda部署Twikoo并优选

1,654 字 9 分钟
AI 摘要
讲零成本自建Twikoo评论系统,使用MongoDB Atlas作数据库,AWS Lambda部署Twikoo,配置CloudFront自定义域名与优选,并用CloudWatch避免冷启动。

前言

一直想给博客找一个合适的评论系统,一开始考虑的是 Gitalk / Giscus,不过这两个方案都比较依赖 GitHub。对国内访客来说,加载 GitHub 相关资源有时候会比较抽象,而且登录不一定能登的上

于是最后还是决定自建一个 Twikoo。

Twikoo 的好处是评论区前端很轻,后端也不一定要自己买服务器。对于我这种博客整体都想serverless化的人来说,比较舒服的方案就是无服务器单独跑个twikoo

这套方案的优点:

  1. 不需要自己维护服务器。
  2. MongoDB Atlas 和AWS的免费额度对于博客完全够用,可以白嫖。 本文就从零开始写一遍

准备工作

你需要准备下面这些东西:

  1. 一个MongoDB Atlas账号。
  2. 一个AWS账号。
  3. 一个可以用来绑定lambda的子域名,推荐类似 twikoo.mihoyo.com。
  4. 一个已经能正常构建的静态博客。

区域怎么选

这点还是比较重要的,毕竟twikoo还是需要一个数据库,如果你决定跟我一样使用Mongo DB Atlas,建议选择一个 国内三网能直连的aws数据中心来跑lambda(如 AWS JP或AWS SG),AWS HK貌似只有移动直?然后Mongo DB的位置也选跟你函数一样的AWS数据中心,我在博客中使用的是:

AWS Lambda: AWS Tokyo / ap-northeast-1
MongoDB Atlas: AWS Tokyo / ap-northeast-1

原因是 Twikoo 的核心延迟不是“用户浏览器到 MongoDB”,而是:

用户浏览器 → Lambda → MongoDB Atlas

浏览器不会直接连 MongoDB。真正频繁互相通信的是 Lambda 函数和 Atlas 数据库,所以这两个东西放近一点最重要

我个人选择了东京

创建 MongoDB Atlas 数据库

打开 MongoDB Atlas 官网并登录:

MondoDB Cloud

如果是第一次使用,直接创建账号并登陆,然后来到如下界面 _2026-05-17_00.06.48

点击accept然后直接进入主界面,点create。

template选Free,512M够用了

_2026-05-17_00.08.52 Name随意,由于我们用AWS跑的twikoo,所以provider选aws,Region建议选日本东京(ap-northeast-1),因为这个地方lambda国内访问快。

_2026-05-17_00.11.04 完事后直接点Create Deployment即可, _2026-05-17_00.12.23 用户名密码写你记得住的,注意密码最好不要有特殊符号,没有什么奇奇怪怪的需求的话直接复制他的就行

然后记下来并点击create database user,在弹出的connect页面的“3. Add your connection string into your application code”复制连接信息存好,点击done。

接着在左边的Security-Database Access & Network Access-IP Access list中,点击edit,把他为你自动创建的那条改为0.0.0.0/0(全部ipv4地址)然后就可以收工了 _2026-05-17_00.04.09

完美~

部署 Twikoo 到 Lambda

安装Terraform CLI与AWS CLI

macOS(Homebrew):

Terminal window
brew tap hashicorp/tap
brew install hashicorp/tap/terraform
terraform -v
brew install awscli
aws --version

_2026-05-17_00.18.17 Linux:

Terminal window
sudo apt-get update && sudo apt-get install -y gnupg software-properties-common
wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor | sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install terraform
# 然后直接装aws cli就行

获取AWS AK与SK并配置awscli

前往AWS控制台- IAM-用户-我的安全凭证创建,新建一对ak与sk并保存妥当 我比较懒所以直接用root建了,最佳实践是新建一个只有AWSLambda_FullAccess,IAMFullAccess,AmazonEC2ContainerRegistryFullAccess,CloudWatchLogsFullAccess的iam用户然后拿他的ak sk 不过真的有人会这么做吗 然后打开终端

Terminal window
aws configure
# 依次输入:
# AWS Access Key ID
# AWS Secret Access Key
# Default region name (ap-northeast-1)
# Default output format (json)

配置Twikoo

clone twikoo的仓库并进入部署目录

Terminal window
git clone https://github.com/twikoojs/twikoo.git
cd twikoo/src/server/aws-lambda/terraform

接着配置 MongoDB Atlas URI,按之前的步骤在 MongoDB Atlas 创建好集群后,在 terraform 目录里新建变量文件terraform.tfvars:

mongodb_uri = "你复制的那一坨"
region = "ap-northeast-1"

接着开始初始化并执行 Terraform 部署,

Terminal window
# 1. 初始化 Terraform,下载 AWS Provider 插件
terraform init
# 2. 预览将要创建的资源(可选)
terraform plan
# 3. 正式创建 AWS 资源
terraform apply

当你执行apply时,Terraform 会提示输入 yes 确认,然后自动创建以下资源 :

IAM Role(Lambda执行权限)

AWS Lambda 函数(Twikoo本体)

Lambda Function URL(公开访问 URL)

_2026-05-17_00.34.06

接着会跑一大坨东西,可能会比较久,最终等他结束后会输出twikoo的地址

Terminal window
Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
Outputs:
lambda_function_url = "https://114514.ap-northeast-1.on.aws/"

打开即可看到twikoo页面 接着如果你没有自定义域名,套ctf的需求的话就可以直接把上面那一坨导入你的前端用了(不推荐)

一个小小的坑

WARNING

第一次部署的时候我提示了 Signature expired,这是因为你电脑跟 aws 服务器时间差异过大,同步一下时间即可。

配置Cloudfront

前往aws cft控制台新建一个分配,具体的步骤在往期博文里有详细教学,这里不再赘述,需要的信息如下:

配置源站

字段 填写值
Origin domain 你的lambda域名.ap-northeast-1.on.aws
Protocol HTTPS only
Origin path 留空
Name 随意

配置行为

字段 填写值
Viewer protocol policy Redirect HTTP to HTTPS
Allowed HTTP methods GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE
Cache policy CachingDisabled
Origin request policy AllViewerExceptHostHeader

然后自行参考往期博文配置好证书和自定义域名即可,

接着访问你的域名,看到以下提示即代表部署成功(乱码不影响使用) _2026-05-17_01.20.44

(可选但推荐) 优选Cloudfront

直接把你自己域名的cname地址改成公共优选cname即可,这里推荐使用微测网的,或者自行挑几个region和你lambda一样的cft ip

(可选)使用AWS Cloudwatch避免Twikoo冷启动

Lambda 容器在约 15-30 分钟无请求后会被销毁,这时候若有人打开你的评论区,你的twikoo就需要重新冷启动,会多几秒钟的加载时间。(不过也就几秒钟,其实无所谓) 这时可以用cloudwatch的隔一段时间访问一次你的twikoo避免他被销毁。

可以直接用你本地的aws-cli配置。

Terminal window
# 第一步:创建定时规则
aws events put-rule \
--name "twikoo-warmup" \
--schedule-expression "rate(5 minutes)" \
--state ENABLED \
--region ap-northeast-1
# 第二步:获取 Lambda ARN
LAMBDA_ARN=$(aws lambda get-function-configuration \
--function-name 记得改成你的真实函数名 \
--region ap-northeast-1 \
--query 'FunctionArn' \
--output text)
# 第三步:绑定目标 + 授权(一起执行)
aws events put-targets \
--rule "twikoo-warmup" \
--targets "Id=twikoo-warmup-target,Arn=$LAMBDA_ARN" \
--region ap-northeast-1
aws lambda add-permission \
--function-name twikoo \
--statement-id "twikoo-warmup-permission" \
--action lambda:InvokeFunction \
--principal events.amazonaws.com \
--region ap-northeast-1

一步一步返回:

Terminal window
[
"arn:aws:lambda:ap-northeast-1:114514:function:twikoo",
60,
128
]
{
"RuleArn": "arn:aws:events:ap-northeast-1:114514:rule/twikoo-warmup"
}
arn:aws:lambda:ap-northeast-1:114514:function:twikoo
{
"FailedEntryCount": 0,
"FailedEntries": []
}
{
"Statement": "{\"Sid\":\"twikoo-warmup-permission\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"events.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:ap-northeast-1:114514:function:twikoo\"}"
}

然后就ok了~直接在你前端写你cft里的twikoo域名就行了~

欢迎留言讨论喵

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

白嫖MongoDB Atlas与AWS Lambda部署Twikoo并优选

https://blog.icybit.cn/posts/40
作者
IcyMichiko
发布于
2026-05-16
许可协议
CC BY-NC-SA 4.0

评论

Markdown

评论区加载中…