年轻人的第一个AWS Lambda函数

  • 前言

之前用Go写的VSCO接口失效了,下午又用Python重新写了一个。因为VSCO的锁区,导致在香港的服务器无法获取到需要的json,而美国服务器延迟又略大,又不想专门为这个API开一台服务器用,这时候突然想到了AWS的Lambda函数。

AWS Lambda介绍我就直接复制 https://aws.amazon.com/cn/documentation/lambda/

使用 AWS Lambda,您无需预置或管理服务器即可运行代码。您只需为使用的计算时间付费,在代码未运行期间不产生任何费用。您可以为几乎任何类型的应用程序或后端服务运行代码,而无需任何管理。只需上传您的代码,Lambda会处理运行和扩展高可用性代码所需的一切工作。您可以将您的代码设置为自动从其他 AWS 服务触发,或者直接从任何 Web 或移动应用程序调用。

而从公网调用这个函数,又需要Amazon API Gateway https://aws.amazon.com/cn/documentation/apigateway/

Amazon API Gateway 是一种完全托管型服务,使开发人员可以轻松发布、维护、监控和保护任何规模的 API。创建 API 以从后端服务(比如 Amazon Elastic Compute Cloud (Amazon EC2) 上运行的应用程序、AWS Lambda 上运行的代码或者任何 Web 应用程序)访问数据、业务逻辑或功能。可将 API Gateway 视为云中的一个背板,用于连接 AWS 服务和其他公有或私有网站。它可以提供一致的 RESTful 应用程序编程接口 (API),让移动和 Web 应用程序可以访问 AWS 服务。

这样看下来,我把Lambda函数写好,使用API Gateway来控制访问,整体下来就是一个无服务器应用程序的demo了。

API Gateway 与 AWS Lambda 共同构成 AWS 无服务器基础设施中面向应用程序的部分。对于调用公开 AWS 服务的应用程序,您可以使用 Lambda 与所需的服务交互,并通过 API Gateway 中的 API 方法来使用 Lambda 函数。AWS Lambda 在高可用性计算基础设施上运行代码。它会进行必要的计算资源执行和管理工作。为了支持无服务器应用程序,API Gateway 可以支持与 AWS Lambda 的简化代理集成和 HTTP 终端节点。

  • 实践

为了访问速度,这里我选择AWS的东京区域,首先创建一个Lambda函数,当前支持C#,Go,JAVA,Nodejs,Python几种语言的不同版本,足够日常使用了,这里我选择Python,并且把代码上传到AWS,注意配置好主函数(您函数中的 filename.handler-method 值。例如:“main.handler” 将调用在 main.py 中定义的处理程序方法。)

左边添加一个触发器,这里采用API Gateway,配置好方法请求等参数,这里需要注意的是在API Gateway管理界面需要配置好各种请求和相应阶段以后可以进行测试,并且需要部署API,而部署完以后的API是有Stage的,URL里也需要注意有Stage,否则会报 {"message":"Missing Authentication Token"} 错误。

绑定自定义域名aws-apne-gateway.tms.im,这里需要先在ACM(Amazon Certificate Manager)里导入或者生成域名证书。

这样就完成了一个Lambda函数的部署,整体操作下来还是很简单顺畅的。

  • 总结

一直想体验一下AWS的FaaS架构,今天也是借着这个小需求的机会体验了一把FaaS,感觉是开发者的福音,完全不需要考虑后端服务器的环境,部署等各种问题,只需要关注核心逻辑实现,把函数当成一个简单的黑盒实现即可。
缺点嘛也很明显,只适合不是那么复杂的可以拆分出来的函数逻辑的实现,和微服务架构有点像,如果业务逻辑很重并且非常缠绕,互相依赖太严重,无法通过拆分成小函数来执行的话可能就不太适合FaaS架构了。

nginx模块开发遇到的一个坑

先说总结:ngx_rbtree在不同worker进程相互独立。

然后是过程:

今天因为一个nginx模块开发的时候,不同fd进来使用ngx_find_value在红黑树ngx_rbtree里找不到上一个fd设置的值的情况,调试了一下午。

突然想起来nginx是多进程模式,有一个worker_processes参数。而模块又是worker进程分别调用,同样红黑树也是不同worker进程维护自己的红黑树。

怪不得接入不同worker的fd在红黑树中设置的值相互查不到。

骷髅峡谷拆机

前言

闲着没事拆拆骷髅峡谷看看,没想到出奇的简单。螺丝位置我都用红圈圈出来了。

先拆上盖

上盖

再拆下盖

上盖

拆上盖内部螺丝

上盖内部

拆下盖内部螺丝

下盖内部

把内部推出来,要把接口那地方稍微按一下,内壳部分就能拿出来了。

内部

把电路板拿出来,小心两根天线。

电路板

完工

看上去做工真的不错,顺便清理下风扇的灰尘。装回去声音小多了。

K2P B1版本刷梅林固件

前言

由于K2拿回家里用了,于是又撸了一台K2P放在办公室用,也是为了它的千兆有线网口,毕竟办公室是千兆网,通过K2P访问共享存储会方便快速很多。

早上下的单,第二天中午才到,一到手还是熟悉的开箱,长相颜值确实比K2高了很多,网上很多图片我也就不放了,银色版本,全身金属质感,炫酷。

简介

到手第一件事依旧是刷机,毕竟原生固件有众所周知的问题,但是一看我这版本是B1,哎毕竟非洲人。

K2P出了两个不同版本(或者严谨的说是三个,但是A2和A1只是在电容和屏蔽罩上有差别,CPU都是一样的,就不细分了),分别是A1和B1。其中A1采用的MTK MT7621A的处理器,而B1采用的是博通BCM47189,性能上面的差别网上众说纷纭,但是我试用下来反正千兆能跑满,也就不纠结那么多了。毕竟不花钱又能要求啥呢。

如果你是A1版本,那么恭喜你,网上有很多傻瓜方案都可以搞定,非常简单方便,大致流程无非是刷入Breed->刷入固件->开心使用吧。甚至Bootloader都有很多种,除了Breed还有其他可选。固件更是有非常多的选择,这里推荐荒野无灯的padavan,毕竟我K2也用的padavan还不错,当然如果喜欢LEDE之类的爱折腾的玩家也可以刷入LEDE等其他固件。

而我这B1版本就比较惨了(连官方都没出适配B1的固件),因为博通方案的缘故,Breed是没希望了,看了下至少还有一个梅林固件可用,并且CFE的一个小漏洞也让我们能开启telnet进行一些命令行操作,勉强够用了,期待以后有更多大神推出更多固件和BL。

刷机(仅限B1)

准备(开Telnet)

  1. 首先要进入官方的CFE恢复界面,开启一下telnet功能来备份官方固件(毕竟万一梅林不好用或者哪天用到了官方固件)。方法还是老套路,长按reset开机,10s后可以用192.168.2.1进入CFE界面。(这里吐槽一下斐讯的路由器默认IP居然是192.168.2.X段的)

  2. 去http://pan.baidu.com/s/1boIHBXH下载修改版的固件。

  3. 在计算机上启动tftp服务器,将固件解压后放入tftp服务器根目录,然后在CFE网页输入

    http://192.168.2.1/do.htm?cmd=flash±noheader+你电脑IP:固件名

固件名默认是k2p_bcm_v10d.bin+flash0.trx,而电脑IP我设置的192.168.2.2

  1. 等个几分钟就刷好了。可以ping 192.168.2.1来看,刷的时候是不通的,刷完又通了。然后重启。

备份官方固件

  1. telnet进去路由器

  2. cat /dev/mtd0 /dev/mtd1 /dev/mtd3 /dev/mtd4 /dev/mtd5 /dev/mtd6 /dev/mtd7 > /tmp/all.bin

  3. mount --bind /tmp/all.bin /www/web-static/fonts/icofont.eot

  4. 去http://192.168.2.1/web-static/fonts/icofont.eot下载固件
    下载后将icofont.eot改名为all.bin,并确认固件大小为16777216字节

刷机

  1. http://pan.baidu.com/s/1boIHBXH 下载固件
  2. 同样在tftp服务器根目录下放上固件。使用
    http://192.168.2.1/do.htm?cmd=flash±noheader+你电脑IP:固件名 刷入
    (这里固件名是K2P_Merlin_V10d.trx+flash0.trx)
  3. ping一下看刷完了用http://192.168.2.1/do.htm?cmd=nvram+erase清除下内存,然后重启。
  4. 享受梅林固件

恢复MAC地址

因为梅林和官方的内存结构不一样,所以mac地址没了,需要手动设置一下。刷完以后在web的“系统管理”-“系统设置”页面打开telnet或ssh,telnet或ssh登录名和密码是你的web登录名及密码。

ssh上去使用

设置WAN口地址
nvram set wan0_hwaddr=路由器MAC地址
设置LAN口地址
nvram set lan_hwaddr=路由器MAC地址 
nvram set et0macaddr=路由器MAC地址 
设置2.4G地址
nvram set w1_hwaddr=路由器MAC地址
nvram set wl0_hwaddr=路由器MAC地址
nvram set 0:macaddr=路由器MAC地址
设置5G地址
nvram set wl1_hwaddr=路由器MAC地址+1
nvram set sb/1/macaddr=路由器MAC地址+1
保存上述设置
nvram commit

即可

后记

刷完以后用了一段时间,表示一切正常,需要的功能(你懂得)都有,还可以开双WAN,千兆也可以跑满,不错的说。

使用Travis CI自动发布Hexo的文章

自从使用了Hexo静态博客以后是越来越懒了,连服务器环境都懒得配置了,索性直接发布在Github pages上面,后面又因为Github pages不支持https和cdn,外边又套了一层Netlify。最近又突然懒得连Hexo的环境也不想要了,甚至连服务器都不想用了。于是想想直接用github repo+Travis CI来帮我编译Hexo的静态博客。

初步的想法是把原始的post的md文件和theme放到一个repository里,然后写好.travis.yml,每次写文章后的push会触发Travis CI来进行构建,构建完毕后再把public文件夹push到Github pages的repository里,这个push会触发Netlify来拉取并完成发布。

首先需要在github的profile settings里生成一个Personal access tokens提供给Travis CI的编译后push使用。
把这个token配置到Travis CI的Environment Variables里即可。

接下来就是编写.travis.yml

language: node_js
node_js: stable
	 
# S: Build Lifecycle
install:
	  - npm install
	 
	script:
	  - hexo g
	 
	after_script:
	  - cd ./public
	  - git init
	  - git config user.name "TMs"
	  - git config user.email "tms@live.cn"
	  - git add .
	  - git commit -m "Update"
	  - git push --force --quiet "https://${TOKEN}@github.com/imtms/imtms.github.io.git" master:master
	# E: Build LifeCycle
	 
	branches:
	  only:
	    - blog-source

这里指定构建环境为nodejs,执行npm install来进行依赖安装,随后执行hexo g进行文章的编译,完成后进入到public文件夹并推送到Github pages的repository里。并且只针对blog-source分支进行编译。这里的TOKEN即为自动去环境变量里获取上面github settings里生成的TOKEN。

一切准备就绪,去Travis CI里打开针对blog-source的自动构建,进行一次push,观察结果。

顺便加上信仰徽章,可以随时观察构建状态:Build Status

这下写博客连服务器和数据库都不需要了,运行hexo的nodejs环境也不需要了。而且可以随时在任何有git的电脑写。实在不行用github的在线编辑都能写。。。感谢Travis CI,感谢Github,感谢Netlify。