白嫖MongoDB Atlas与AWS Lambda部署Twikoo并优选
前言
一直想给博客找一个合适的评论系统,一开始考虑的是 Gitalk / Giscus,不过这两个方案都比较依赖 GitHub。对国内访客来说,加载 GitHub 相关资源有时候会比较抽象,而且登录不一定能登的上
于是最后还是决定自建一个 Twikoo。
Twikoo 的好处是评论区前端很轻,后端也不一定要自己买服务器。对于我这种博客整体都想serverless化的人来说,比较舒服的方案就是无服务器单独跑个twikoo
这套方案的优点:
- 不需要自己维护服务器。
- MongoDB Atlas 和AWS的免费额度对于博客完全够用,可以白嫖。 本文就从零开始写一遍
准备工作
你需要准备下面这些东西:
- 一个MongoDB Atlas账号。
- 一个AWS账号。
- 一个可以用来绑定lambda的子域名,推荐类似
twikoo.mihoyo.com。 - 一个已经能正常构建的静态博客。
区域怎么选
这点还是比较重要的,毕竟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 官网并登录:
如果是第一次使用,直接创建账号并登陆,然后来到如下界面

点击accept然后直接进入主界面,点create。
template选Free,512M够用了
Name随意,由于我们用AWS跑的twikoo,所以provider选aws,Region建议选日本东京(ap-northeast-1),因为这个地方lambda国内访问快。
完事后直接点Create Deployment即可,
用户名密码写你记得住的,注意密码最好不要有特殊符号,没有什么奇奇怪怪的需求的话直接复制他的就行
然后记下来并点击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地址)然后就可以收工了

完美~
部署 Twikoo 到 Lambda
安装Terraform CLI与AWS CLI
macOS(Homebrew):
brew tap hashicorp/tap
brew install hashicorp/tap/terraform
terraform -v
brew install awscli
aws --version
Linux:
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 不过真的有人会这么做吗
然后打开终端
aws configure
# 依次输入:
# AWS Access Key ID
# AWS Secret Access Key
# Default region name (ap-northeast-1)
# Default output format (json)
配置Twikoo
clone twikoo的仓库并进入部署目录
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 部署,
# 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)

接着会跑一大坨东西,可能会比较久,最终等他结束后会输出twikoo的地址
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 |
然后自行参考往期博文配置好证书和自定义域名即可,
接着访问你的域名,看到以下提示即代表部署成功(乱码不影响使用)

(可选但推荐) 优选Cloudfront
直接把你自己域名的cname地址改成公共优选cname即可,这里推荐使用微测网的,或者自行挑几个region和你lambda一样的cft ip
(可选)使用AWS Cloudwatch避免Twikoo冷启动
Lambda 容器在约 15-30 分钟无请求后会被销毁,这时候若有人打开你的评论区,你的twikoo就需要重新冷启动,会多几秒钟的加载时间。(不过也就几秒钟,其实无所谓) 这时可以用cloudwatch的隔一段时间访问一次你的twikoo避免他被销毁。
可以直接用你本地的aws-cli配置。
# 第一步:创建定时规则
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
一步一步返回:
[
"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域名就行了~
欢迎留言讨论喵
评论