如何使用事件将 json 输入传递给在无服务器中部署的 Cron 计划 Lambda?

Posted

技术标签:

【中文标题】如何使用事件将 json 输入传递给在无服务器中部署的 Cron 计划 Lambda?【英文标题】:How do I pass json inputs to a Cron scheduled Lambda deployed in Serverless using event? 【发布时间】:2017-03-16 03:39:43 【问题描述】:

我一直在尝试在 Serverless 中部署 Lambda,以按每小时调用一次的 Cron 计划运行。当它被调用时,我希望 Lambda 中的事件由我自己的 JSON 输入而不是来自 Cron 事件的信息填充,这是部署时的默认输入。

在 AWS 控制台中,我可以手动进入 Lambda 的 Cron 触发器,并将输入从“匹配事件”更改为“常量(JSON 文本)”,以获得我想要的结果。由于 Serverless 在部署 Lambda 时创建了这个规则,我觉得应该有一些方法可以通过 serverless.yml 文件中的配置来更改输入。在搜索无服务器的文档时,我找不到任何东西,所以现在我想知道在当前状态下通过无服务器是否可以做到这一点,如果可以,该怎么做。

任何建议将不胜感激。

编辑:有一个更新应该添加了这个功能,但是我仍然无法使用无服务器 1.3.0 使用 JSON 进行部署(并且还使用 1.2.0 进行了测试)。我使用的 serverless.yml 的一些示例如下:

functions:
  test:
    handler: test.test
    description: "test serverless Lambda"
    memorySize: 128
    timeout: 300
    events:
      - schedule:
        rate: rate(10 minutes)
        input:
          key: value
      - schedule:
        rate: rate(10 minutes)
        input: '"key": "value"'
      - schedule:
        rate: rate(10 minutes)
        input:
          key: 'value'

从 1.3.0 开始,是否有人可以评论 Serverless 中此功能的状态,以及我上面的 serverless.yml 看起来是否正常?

编辑 2:发布工作的 serverless.yml

functions:
  test:
    handler: test.test
    description: "test serverless Lambda"
    memorySize: 128
    timeout: 300
    events:
      - schedule:
          rate: rate(10 minutes)
          enabled: true
          input:
            key: value
      - schedule:
          rate: rate(10 minutes)
          input: '"key": "value"'
          enabled: true
      - schedule:
          rate: rate(10 minutes)
          input:
            key: 'value'
          enabled: true

【问题讨论】:

我更新了答案 【参考方案1】:

编辑您的编辑:我做了一些挖掘,如果它不是字符串,似乎无服务器会自动禁用计划。这意味着如果您的整个活动是- schedule: rate(10 minutes),它将被启用。但如果您有其他属性,则必须启用它,因为默认情况下它会被禁用。

所以你当前的 .yml 应该是这样的:

functions:   test:
    handler: test.test
    description: "test serverless Lambda"
    memorySize: 128
    timeout: 300
    events:
      - schedule:
        rate: rate(10 minutes)
        enabled: true
        input:
          key: value
      - schedule:
        rate: rate(10 minutes)
        input: '"key": "value"'
        enabled: true
      - schedule:
        rate: rate(10 minutes)
        input:
          key: 'value'
        enabled: true

您可以在 serverless.yml 文件中使用相同的 inputinputPath,就像使用 cloudwatch 事件规则一样。与 cloudwath 规则的唯一区别是您实际上可以传递一个对象,而 serverless 会自动为您将其字符串化。

例子:

functions:
  crawl:
    handler: crawl
    events:
      - schedule: 
          rate: rate(1 hours)
          input: 
            key1: value1
            key2: value2

这将等于带有 input:"'key1':'value1','key2':'value2'" 的 cloudformation 事件规则,因此传递的是 json 而不是匹配的事件。

刚才注意到这个问题是在 11 月 2 日提出的。当时不可能这样做,但在提出问题后不久就实施了。 https://github.com/serverless/serverless/pull/2567

【讨论】:

感谢您的回复。我实际上一直在跟上这个 PR,但仍然无法使用我输入的 JSON 进行部署。我会更新问题并在其中发布一些示例。 我查看了您再次发布的第一个示例,我注意到问题在于缩进。我最初从 PR 复制了格式,其中不包括导致计划根本不出现的缩进。将 enabled 设置为 true 的提示也非常有用,非常感谢您的所有帮助! 你能传递一个数组吗?输入:['test1','test2'] @OamarKanji 你应该为此创建一个单独的问题 谢谢!从文档中我绝对不清楚当使用“长语法”时,一个必须还设置enabled字段。

以上是关于如何使用事件将 json 输入传递给在无服务器中部署的 Cron 计划 Lambda?的主要内容,如果未能解决你的问题,请参考以下文章

将变量传递给在 TabBar 中调用的视图

将事件分配给在运行时动态创建的 VCL 控件 (2)

将 int 文字传递给在 java 中采用整数的方法

K8S:将 runAsUser 权限传递给在容器内创建的文件

Clojure - 将组件传递给在启动或停止期间未执行的功能

传递给在 SwiftUI 中不带参数的调用的参数