蚊章汇 - FaaS
type: channel
link: https://linuxcn.bwsl.wang/tag/FaaS/
items: 使用 Apex 和 Compose MongoDB 开发 serverless

使用 Apex 和 Compose MongoDB 开发 serverless
type: item
date: 2017-07-19T03:48:08+08:00
description: Apex 是一个将开发和部署 AWS Lambda 函数的过程打包了的工具。它提供了一个本地命令行工具来创建安全上下文、部署函数，甚至追踪云端日志。由于 AWS Lambda 服务将函数看成独立的单元，Apex 提供了一个框架层将一系列函数作为一个项目。另外，它将服务拓展到不仅仅是 Java，Javascript 和 Ptyhon 语言，甚至包括 Go 语言。两年前 Express （基本上是 NodeJS 事实标准上的网络框架层）的作者，离开了 Node 社区，而将其注意力转向 Go （谷歌创造的后端服务语言），以及 Lambda（由 AWS 提供的函数即服务）。尽管一个开发者的行为无法引领一股潮流，但是来看看他正在做的名叫 Apex 项目会很有趣，因为它可能预示着未来很大一部分网络开发的改变。什么是 Lambda?如今，人们如果不能使用自己的硬件，他们会选择付费使用一些云端的虚拟服务器。在云上，他们会部署一个完整的协议栈如 Node、Express，和一个自定义应用。或者如果他们更进一步使用了诸如 Heroku 或者 Bluemix 之类的新玩意，也可能在某些已经预配置好 Node 的容器中仅仅通过部署应用代码来部署他们完整的应用。在这个抽象的阶梯上的下一步是单独部署函数到云端而不是一个完整的应用。这些函数之后可以被一大堆外部事件触发。例如，AWS 的 API 网关服务可以将代理 HTTP 请求作为触发函数的事件，而函数即服务（FaaS）的供应方根据要求执行匹配的函数。Apex 起步Apex 是一个将 AWS 命令行接口封装起来的命令行工具。因此，开始使用 Apex 的第一步就是确保你已经安装和配置了从 AWS 获取的命令行工具（详情请查看 AWS CLI Getting Started 或者 Apex documentation）。接下来，安装 Apex：curl https://raw.githubusercontent.com/apex/apex/master/install.sh | sh 然后为你的新项目创建一个目录并运行：apex init 这步会配置好一些必须的安全策略，并且将项目名字附在函数名后，因为 Lambda 使用扁平化的命名空间。同时它也会创建一些配置文件和默认的 “Hello World" 风格的 Javascript 函数的 functions 目录。Apex/Lambda 一个非常友好的特性是创建函数非常直观。创建一个以你函数名为名的新目录，然后在其中创建项目。如果想要使用 Go 语言，你可以创建一个叫 simpleGo 的目录然后在其中创建一个小型的 main 函数：// serverless/functions/simpleGo/main.go package main import ( "encoding/json" "github.com/apex/go-apex" "log" ) type helloEvent struct { Hello string `json:"hello"` } func main() { apex.HandleFunc(func(event json.RawMessage, ctx *apex.Context) (interface{}, error) { var h helloEvent if err := json.Unmarshal(event, &h); err != nil { return nil, err } log.Print("event.hello:", h.Hello) return h, nil }) } Node 是 Lambda 所支持的运行环境，Apex 使用 NodeJS shim 来调用由上述程序产生的二进制文件。它将 event 传入二进制文件的 STDIN，将从二进制返回的 STDOUT 作为 value。通过 STDERR 来显示日志。apex.HandleFunc 用来为你管理所有的管道。事实上在 Unix 惯例里这是一个非常简单的解决方案。你甚至可以通过在本地命令行执行 go run main.go 来测试它。通过 Apex 向云端部署稍显琐碎：注意，这将会对你的函数指定命名空间，控制版本，甚至为其他多开发环境如 staging 和 production配置env。通过 apex invoke 在云端执行也比较琐碎：当然我们也可以追踪一些日志：这些是从 AWS CloudWatch 返回的结果。它们都在 AWS 的 UI 中可见，但是当在另一个终端参照此结果来署它会更快。窥探内部的秘密来看看它内部到底部署了什么很具有指导性。Apex 将 shim 和所有需要用来运行函数的东西打包起来。另外，它会提前做好配置如入口…