Apache OpenWhisk

本文原文链接:https://docs.konghq.com/hub/kong-inc/openwhisk/

该插件调用OpenWhisk操作。 它可以与其他请求插件结合使用以保护,管理或扩展功能。

术语

  • plugin: 在请求被代理到上游API之前或之后,在Kong内部执行操作的插件。
  • Service: 表示外部 upstream API或微服务的Kong实体。
  • Route: 表示将下游请求映射到上游服务的方法的Kong实体。
  • Consumer: 代表使用API的开发人员或机器的Kong实体。当使用Kong时,Consumer 仅与Kong通信,其代理对所述上游API的每次调用。
  • Credential: 与Consumer关联的唯一字符串,也称为API密钥。
  • upstream service: 这是指位于Kong后面的您自己的 API/service,转发客户端请求。

安装

您可以使用LuaRocks软件包管理器来安装插件

  1. $ luarocks install kong-plugin-openwhisk

或从源码安装它。 有关插件安装的更多信息,请参阅文档插件开发-安装/卸载插件

配置

在 Service 上启用插件

使用数据库:

通过发出以下请求在Service上配置此插件:

  1. $ curl -X POST http://kong:8001/services/{service}/plugins \
  2. --data "name=openwhisk" \
  3. --data "config.host=OPENWHISK_HOST" \
  4. --data "config.path=PATH_TO_ACTION" \
  5. --data "config.action=ACTION_NAME" \
  6. --data "config.service_token=AUTHENTICATION_TOKEN"

不使用数据库:

通过添加此部分在服务上配置此插件执行声明性配置文件:

  1. plugins:
  2. - name: openwhisk
  3. service: {service}
  4. config:
  5. host: OPENWHISK_HOST
  6. path: PATH_TO_ACTION
  7. action: ACTION_NAME
  8. service_token: AUTHENTICATION_TOKEN

在这两种情况下,{service}是此插件配置将定位的Service的idname

在 Route 上启用插件

使用数据库:

通过发出以下请求在 Route 上配置此插件:

  1. $ curl -X POST http://kong:8001/routes/{route}/plugins \
  2. --data "name=openwhisk" \
  3. --data "config.host=OPENWHISK_HOST" \
  4. --data "config.path=PATH_TO_ACTION" \
  5. --data "config.action=ACTION_NAME" \
  6. --data "config.service_token=AUTHENTICATION_TOKEN"

不使用数据库:

通过添加此部分在 Route 上配置此插件执行声明性配置文件:

  1. plugins:
  2. - name: openwhisk
  3. route: {route}
  4. config:
  5. host: OPENWHISK_HOST
  6. path: PATH_TO_ACTION
  7. action: ACTION_NAME
  8. service_token: AUTHENTICATION_TOKEN

在这两种情况下,{route}是此插件配置将定位的 route 的idname

在 Consumer 上启用插件

使用数据库:

您可以使用http://localhost:8001/plugins在特定的Consumers上启用此插件:

  1. $ curl -X POST http://kong:8001/consumers/{consumer}/plugins \
  2. --data "name=openwhisk" \
  3. \
  4. --data "config.host=OPENWHISK_HOST" \
  5. --data "config.path=PATH_TO_ACTION" \
  6. --data "config.action=ACTION_NAME" \
  7. --data "config.service_token=AUTHENTICATION_TOKEN"

不使用数据库:

通过添加此部分在Consumer上配置此插件执行声明性配置文件:

  1. plugins:
  2. - name: openwhisk
  3. consumer: {consumer}
  4. config:
  5. host: OPENWHISK_HOST
  6. path: PATH_TO_ACTION
  7. action: ACTION_NAME
  8. service_token: AUTHENTICATION_TOKEN

在这两种情况下,{consumer}都是此插件配置将定位的Consumeridusername
您可以组合consumer_idservice_id 。 在同一个请求中,进一步缩小插件的范围。

全局插件

  • 使用数据库: 可以使用http://kong:8001/plugins/配置所有插件。
  • 不使用数据库: 可以通过plugins:配置所有插件:声明性配置文件中的条目。

与任何 Service ,Route 或 Consumer (或API,如果您使用旧版本的Kong)无关的插件被视为“全局”,并将在每个请求上运行。有关更多信息,请阅读插件参考插件优先级部分。

参数

以下是可在此插件配置中使用的所有参数的列表:

参数 默认值 描述
name 要使用的插件的名称,在本例中为openwhisk
service_id 此插件将定位的 Service 的ID。
route_id 此插件将定位的 Route 的ID。
enabled true 是否将应用此插件。
consumer_id 此插件将定位的Consumer的id
config.host OpenWhisk服务的Host
config.port
optional
443 OpenWhisk服务的Port
config.path Action资源的路径。
config.action 插件要调用的Action的名称。
config.service_token 用于访问Openwhisk资源的服务令牌。
config.https_verify
optional
false 将其设置为true可对Openwhisk服务进行身份验证。
config.https
optional
true 使用HTTPS与OpenWhisk服务器连接。
config.result
optional
true 仅返回调用的Action的结果。
config.timeout
optional
60000 在终止与OpenWhisk服务器的连接之前的超时(以毫秒为单位)。
config.keepalive
optional
60000 在关闭之前,与OpenWhisk服务器的空闲连接将存活的时间(以毫秒为单位)。

注意:如果config.https_verify设置为true,则将根据Kong配置中lua_ssl_trusted_certificate指令指定的CA证书来验证服务器证书。

示例

在这个演示中,我们在MacOS上的一个随机机器上运行Kong和Openwhisk平台

  1. 使用wsk cli在Openwhisk平台上使用以下代码片段创建javascript Action hello

    1. function main(params) {
    2. var name = params.name || 'World';
    3. return {payload: 'Hello, ' + name + '!'};
    4. }
    1. $ wsk action create hello hello.js
    2. ok: created action hello
  2. 创建一个Service 或者 Route

    使用数据库

    创建一个Service

    1. $ curl -i -X POST http://localhost:8001/services/ \
    2. --data "name=openwhisk-test" \
    3. --data "url=http://example.com"
    4. HTTP/1.1 201 Created
    5. ...

    创建一个使用该Service 的Route。

    1. $ curl -i -f -X POST http://localhost:8001/services/openwhisk-test/routes/ \
    2. --data "paths[]=/"
    3. HTTP/1.1 201 Created
    4. ...

    不使用数据库 在声明性配置文件上添加Service和关联的Route:

    1. services:
    2. - name: openwhisk-test
    3. url: http://example.com
    4. routes:
    5. - service: openwhisk-test
    6. paths: ["/"]
  3. 在Route上启用openwhisk插件

    使用数据库

    可以在Service或Route上启用插件。本示例使用Service。

    1. $ curl -i -X POST http://localhost:8001/services/openwhisk-test/plugins \
    2. --data "name=openwhisk" \
    3. --data "config.host=192.168.33.13" \
    4. --data "config.service_token=username:key" \
    5. --data "config.action=hello" \
    6. --data "config.path=/api/v1/namespaces/guest"
    7. HTTP/1.1 201 Created
    8. ...

    不使用数据库

    plugins:添加一个条目:声明性配置yaml条目。它可以与Service或Route相关联。这个例子使用了一个Service:

    1. plugins:
    2. - name: openwhisk
    3. config:
    4. host: 192.168.33.13
    5. service_token: username:key
    6. action: hello
    7. path: /api/v1/namespaces/guest
  4. 发出调用动作的请求

    没有参数

    1. $ curl -i -X POST http://localhost:8000/ -H "Host:example.com"
    2. HTTP/1.1 200 OK
    3. ...
    4. {
    5. "payload": "Hello, World!"
    6. }

    参数为form-urlencoded

    1. $ curl -i -X POST http://localhost:8000/ -H "Host:example.com" --data "name=bar"
    2. HTTP/1.1 200 OK
    3. ...
    4. {
    5. "payload": "Hello, bar!"
    6. }

    参数为JSON

    1. $ curl -i -X POST http://localhost:8000/ -H "Host:example.com" \
    2. -H "Content-Type:application/json" --data '{"name":"bar"}'
    3. HTTP/1.1 200 OK
    4. ...
    5. {
    6. "payload": "Hello, bar!"
    7. }

    参数为multipart form

    1. $ curl -i -X POST http://localhost:8000/ -H "Host:example.com" -F name=bar
    2. HTTP/1.1 100 Continue
    3. HTTP/1.1 200 OK
    4. ...
    5. {
    6. "payload": "Hello, bar!"
    7. }

    参数作为查询字符串

    1. $ curl -i -X POST http://localhost:8000/?name=foo -H "Host:example.com"
    2. HTTP/1.1 200 OK
    3. ...
    4. {
    5. "payload": "Hello, foo!"
    6. }

    OpenWhisk元数据响应

    当Kong的config.result设置为false时,将返回OpenWhisk的元数据作为响应:

    1. $ curl -i -X POST http://localhost:8000/?name=foo -H "Host:example.com"
    2. HTTP/1.1 200 OK
    3. ...
    4. {
    5. "duration": 4,
    6. "name": "hello",
    7. "subject": "guest",
    8. "activationId": "50218ff03f494f62abbde5dfd2fcc68a",
    9. "publish": false,
    10. "annotations": [{
    11. "key": "limits",
    12. "value": {
    13. "timeout": 60000,
    14. "memory": 256,
    15. "logs": 10
    16. }
    17. }, {
    18. "key": "path",
    19. "value": "guest/hello"
    20. }],
    21. "version": "0.0.4",
    22. "response": {
    23. "result": {
    24. "payload": "Hello, foo!"
    25. },
    26. "success": true,
    27. "status": "success"
    28. },
    29. "end": 1491855076125,
    30. "logs": [],
    31. "start": 1491855076121,
    32. "namespace": "guest"
    33. }

限制

使用伪造的上游服务

当使用OpenWhisk插件时,响应将由插件本身返回,而无需将请求代理到任何上游服务。这意味着服务的hostportpath属性将被忽略,但是仍然必须指定要由Kong验证的实体。特别是host属性必须是IP地址,或者由您的名称服务器解析的主机名。

响应插件

系统中有一个已知的限制,阻止一些响应插件被执行。我们计划在未来取消这一限制。