IcyBlog

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

技术 MongoDB 博客 1,654 9 分钟

前言

一直想给博客找一个合适的评论系统,一开始考虑的是 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):

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

_2026-05-17_00.18.17 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)

_2026-05-17_00.34.06

接着会跑一大坨东西,可能会比较久,最终等他结束后会输出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
ProtocolHTTPS only
Origin path留空
Name随意

配置行为

字段填写值
Viewer protocol policyRedirect HTTP to HTTPS
Allowed HTTP methodsGET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE
Cache policyCachingDisabled
Origin request policyAllViewerExceptHostHeader

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

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

(可选但推荐) 优选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域名就行了~

欢迎留言讨论喵

评论

Markdown

评论区加载中…