如何将值传递给CloudWatch中的Lambda函数?

20
什么是在处理来自CloudWatch定时器的ping时,包装函数的最佳方法?例如,考虑下面的lambda函数:
export const fn = (event, context, callback) => {
  const { year, make, model, } = event.queryStringParameters

  return otherFn({ year, make, model, })
    .then(res => response(callback, res))
    .catch(err => console.log(err))
}

如果我对该函数进行ping操作,会出现错误,因为CloudWatch请求中没有queryStringParameters。从技术上讲,这仍然可以保持Lambda函数的热启动(这是我的目标),但我不想有一个不必要冗长的错误列表。
我注意到CloudWatch允许您包含输入参数(可能)传递给Lambda函数:

configure input

如何以最聪明的方式包装上述函数,使其能够接受一个ping?理想情况下,它应该像这样:

export const fn = (event, context, callback) => {
  if (event.ping) return ping(callback) // the ping function is an import to stay DRY
  const { year, make, model, } = event.queryStringParameters

  return otherFn({ year, make, model, })
    .then(res => response(callback, res))
    .catch(err => console.log(err))
}

我可以传递一些JSON来修改事件,例如:
{ "ping": true }

我已经阅读了有关输入的文档,但是对于各种输入类型的含义以及如何使用它们,我并不清楚...
1个回答

40

如果您选择输入选项“常量(JSON文本)”,则应该在下方出现一个输入框。您需要输入JSON代码 {"ping": true}。您的函数将获得JSON对象作为event事件,并且您可以像访问您的代码一样访问event.ping

如果您正在使用Serverless框架,而不是在AWS控制台中进行操作,您可以为您的函数添加一个调度事件。这将是您现有HTTP事件的补充。您可以在定时事件的输入部分下添加ping: true参数,就像这样:

scheduledFunction:
  handler: index.handler
  events:
    - schedule:
        rate: rate(1 minute)
        enabled: true
        input:
          ping: true

这将使用指定的计划创建和启用CloudWatch日志事件,并在event对象中发送输入参数ping


这实际上是对问题的回答。版主可以标记一下吗? - Yevhenii Herasymchuk
1
这是一个非常优雅的回答,但它只涉及到无服务器框架,我建议使用类似于AWS SAM或AWS Cloudformation的东西会更有帮助。 - noobie-php
确实是一个绝对的答案。非常有帮助,虽然在 AWS 文档中找不到。 - Tharsan Sivakumar
只是再添加一个与任何框架无关的示例,它是一个CloudFormation示例:https://gist.github.com/RichardSilveira/81a4fad4eadcbfab318a7cd7448e7e92 - Richard Lee

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