如何使用事件将JSON输入传递给部署在Serverless中的Cron计划Lambda?

35
我一直在尝试使用Serverless部署一个Lambda函数,以便在Cron计划下每小时调用它。当它被调用时,我希望Lambda内部的事件由我的JSON输入填充,而不是默认的Cron事件信息。
在AWS控制台中,我可以手动进入Lambda的Cron触发器,并将输入从“匹配事件”更改为“常量(JSON文本)”,以获得我想要的结果。由于Serverless在部署Lambda时创建了此规则,因此我认为应该通过serverless.yml文件中的配置来更改输入的方式。但是,在搜索Serverless文档时,我没有找到任何相关内容。因此,我现在想知道是否可以通过Serverless在其当前状态下实现这一点,如果可以,应该如何操作。
任何建议都将不胜感激。
编辑:有一个更新,应该添加了这个功能,但是我仍然无法使用Serverless 1.3.0(也已经测试过1.2.0)使用JSON进行部署计划任务。我使用的一些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

我更新了我的回答。 - Erndob
1个回答

31

修改你的编辑:我进行了一些搜索,看起来如果不是字符串,无服务器将自动禁用计划。这意味着如果您的整个事件是 - 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文件中像使用cloudwatch事件规则一样使用相同的和。与cloudwatch规则的唯一区别是你实际上可以传递一个对象,而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


你能传递一个数组吗?输入:['test1','test2'] - inside
输入:'["test1","test2"]',它必须用引号括起来吗? - inside
嗨@Erndob,你可以提供一下你找到这个内容的文档链接吗? - aviggiano
2
@OamarKanji 你应该为此创建一个单独的问题。 - Erndob
1
谢谢!从文档中我并没有明确得知,当使用“长语法”时,必须同时设置“enabled”字段。 - ronkot
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接