在KONG上管理Nifcloud脚本和团队的讨论
本文是富士通云技术2017年圣诞日历的第12天的投稿。
第十一天我写了关于@yaaamaaaguuu在过去一年中所积累的见解的文章。他的见解比我的过去十年还要丰富,老实说我有些焦虑了。
首先
我是参与Nifcloud服务开发的工程师,从今年7月起担任经理职位,应对各种内外因素和时机的变化。作为经理,我必须明确地向团队成员传达一些不容易说出口但必须说的事情。然而,作为一个新手经理,我经常在面对一群优秀的工程师团队成员时感到困难重重。
这次是一个可以让像我这样胆小怕事的人也能向团队成员传达想传达的事情的故事。
方法
由于这是关于工程团队的讨论,所以最好在沟通中尽可能使用工程方法。这次我想要借助NIFCLOUD的无服务器服务脚本和开源丰富的插件来利用KONG作为魅力的APIGateWay基础设施来表达我的想法。终于有点像标题对应的文章了。
环境
-
- Docker version 17.11.0-ce
-
- KONG 0.11.2
-
- Postgresql 9.4
- ニフクラスクリプト
引入
首先,根据手册,使用Docker构建KONG和其数据存储Postgresql9.4。
建立PostgreSQL〜啟動
$ docker run -d --name kong-database \
-p 5432:5432 \
-e "POSTGRES_USER=kong" \
-e "POSTGRES_DB=kong" \
postgres:9.4
将模式等迁移
$ docker run --rm \
--link kong-database:kong-database \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
kong:latest kong migrations up
KONG构建 – 启动
$ docker run -d --name kong \
--link kong-database:kong-database \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
-e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
-e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
-e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
-e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
-p 8000:8000 \
-p 8443:8443 \
-p 8001:8001 \
-p 8444:8444 \
kong:latest
运行docker ps -a命令来确认一下。如果kong和kong-database都是UP状态的话,那就是没问题的。
脚本编写
我打算使用Quick Start中的脚本,不做任何修改。
根据上述页面创建脚本。
使用KONG将nifcloud-script插件部署并重新进行映像化。
KONG默认具有名为aws-lambda的官方插件,但很遗憾,没有针对Nifcloud Script的插件。因此,我们需要创建并安装一个新的插件。在创建插件时,我们将参考官方的插件开发 – 入门指南。本次我们参考了其他的lua-nginx-module来创建这个插件。部署后,请进行提交。
$ git clone https://github.com/Ken-Moriizumi/kong-nifcloud-script-sample.git nifcloud-script
$ docker cp nifcloud-script kong:/usr/local/share/lua/5.1/kong/plugins/
$ docker commit kong kong:nifcloud
安装KONG插件。
以下是与上述内容几乎相同的一种中文表达方式:除此之外,还添加了名为KONG_LOG_LEVEL和KONG_CUSTOM_PLUGINS的环境变量。此外,将使用刚才提交的镜像进行启动。
$ docker run -d --name kong \
--link kong-database:kong-database \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
-e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
-e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
-e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
-e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
-e "KONG_LOG_LEVEL=debug" \
-e "KONG_CUSTOM_PLUGINS=nifcloud-script" \
-p 8000:8000 \
-p 8443:8443 \
-p 8001:8001 \
-p 8444:8444 \
kong:nifcloud
确认nifcloud-script插件是否已加载,请执行docker logs kong。
环境已成功搭建。
执行
创建API
根据KONG的手册创建新的API。通常,upstream_url用于设置转发到的URL,但是这次我们将在插件内强制将其转发到Nifcloud Script,因此无所谓什么值。
curl -i -X POST \
--url http://localhost:8001/apis/ \
--data 'name=nifcloud-api' \
--data 'hosts=nifcloud' \
--data 'upstream_url=http://nifcloud.com'
启用 nifcloud-script 插件
接下来,请启用nifcloud-script插件来对上述创建的API进行操作。
在此过程中,请指定访问密钥和秘密密钥。
curl -X POST http://localhost:8001/apis/nifcloud-api/plugins \
--data "name=nifcloud-script" \
--data-urlencode "config.access_key=<nifcloud-access-key>" \
--data-urlencode "config.secret_key=<nifcloud-secret-key>" \
--data "config.region=jp-east-1" \
--data "config.function_name=dummy"
创建客户端并执行。
我已经使用KONG创建了基于Nifcloud脚本的APIGateWay。现在我将使用curl通过APIGateWay调用Nifcloud脚本。
$ curl -i -X POST --url http://${KONG_HOSTNAME}:8000/${EXEC_SCRIPT_NAME} --header 'Host: nifcloud'
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Connection: keep-alive
ETag: W/"27a-Wjd06nqimAWgaLmPnQYR1T3HGno"
Content-Length: 634
Access-Control-Allow-Origin: *
Date: Thu, 07 Dec 2017 07:25:36 GMT
Connection: keep-alive
Server: kong/0.11.2
<?xml version="1.0"?><ExecuteScriptResponse><requestId>5f08a68c-ea04-41e6-9374-615059356498</requestId><ExecuteScriptResult><Result><console><log/><err/></console><ResponseStatus>200</ResponseStatus><ScriptIdentifier>test1.js</ScriptIdentifier><RequestQuery><![CDATA[{"name":"merryChristmasAndHappyNewYear!!"}]]></RequestQuery><RequestBody><![CDATA[{}]]></RequestBody><ResponseHeader><![CDATA[{"Content-Type":"text/plain"}]]></ResponseHeader><RequestHeader><![CDATA[{}]]></RequestHeader><ResponseData><![CDATA[merryChristmasAndHappyNewYear!!]]></ResponseData><Status>200</Status></Result></ExecuteScriptResult></ExecuteScriptResponse>c
KONG_HOSTNAME 是用于构建API网关的域名或IP地址,
EXEC_SCRIPT_NAME 则是用于设置保存在NIFCLOUD上的脚本名称。
无事情况下,我收到了200的回应,但是即使是优秀的工程师也有点不明白他在说什么。
所以我制作了一个简单的客户端。
#!/bin/ruby
require "httpclient"
require "rexml/document"
client = HTTPClient.new
body = ""
header = {
"Host" => "nifcloud"
}
res = client.post(
"http://#{ENV['KONG_HOSTNAME']}:8000/#{ENV['EXEC_SCRIPT_NAME']}",
body,
header
)
doc = REXML::Document.new res.body
puts doc.elements['ExecuteScriptResponse/ExecuteScriptResult/Result/ResponseData'].text
# bundle exec ruby api-gateway-client.rb
merryChristmasAndHappyNewYear!!
这样,我们就能够简单明了地向大家发送圣诞节和新年的祝福了。祝福不仅仅是管理,它本身就是基本的沟通方式,通过使用lowerCamel形式,还能够增加一些亲密的私人感觉。根据场合的不同进行选择吧。
唯一的缺点可能是自制插件的制作有些粗糙,无法发送其他消息。
在结束时
对于这次的需求,我们创建了一个插件,但由于KONG默认提供了丰富的插件,所以如果只是用于轻量级的用途,几乎可以直接在现场应用。
我很后悔输出变成了lowerCamel,虽然完全没有使用Java。
让我们一起尝试使用KONG进行沟通,不仅仅是API管理,还可以进行团队管理。
明天将会发布@tunakyonn的文章《尝试在mBaaS上使用Unity WebGL》,敬请期待!