我正在使用Serverless框架将功能部署在AWS Lambda

我正在尝试为发布的每个Lambda函数版本自动创建触发器。

部署无服务器应用程序时,将创建Lambda函数和触发器(在本例中为我的AWS IOT触发器),就像我们在下图中看到的那样:

amazon-web-services - 无服务器/AWS Lambda-为已发布的Lambda版本创建触发器-LMLPHP

但是对于我发布的lambda函数版本,触发器不存在,仅存在资源:

amazon-web-services - 无服务器/AWS Lambda-为已发布的Lambda版本创建触发器-LMLPHP

我不想每次发布新的lambda版本时都创建新的触发器。

因此,是否也可以为我的版本化lambda创建触发器?如果可能的话,请使用无服务器框架禁用旧版本?

我的serverless.yml文件:

service: serverless-lambdas
provider:
  name: aws
  runtime: nodejs6.10
  iamRoleStatements:
    - Effect: "Allow"
      Action:
        - "ses:*"
        - "iot:*"
      Resource:
        - "*"

functions:
   function1:
    name: "function1"
    handler: function1/handler.function1
    events:
      - iot:
          name: "iotEvent1"
          sql: "SELECT EXAMPLE"
          sqlVersion: "2016-03-23"
          enabled: true

最佳答案

更新

当我尝试使用自己的AWS Lambda以编程方式创建触发器时,遇到了类似的问题。

当我看到问题出在我的触发器上,而这个触发器没有调用已发布的Lambda函数的权限时,我陷入了困境。因此,我首先需要使用方法add-permission为触发器添加权限。 (这在AWS文档:/上没有明确写出)。

因此,在将触发器添加到Lambda之前,我使用了以下方法(在node.js中):

const addPermission = (ruleName) => {
  const thingArn = `arn:aws:iot:${IOT_REGION}:${SOURCE_ACCOUNT}:rule/${ruleName}`;
  const params = {
    Action: "lambda:InvokeFunction",
    FunctionName: LAMBDA_NAME,
    Principal: "iot.amazonaws.com",
    SourceAccount: SOURCE_ACCOUNT,
    SourceArn: thingArn,
    StatementId: `iot-sd-${Math.random().toString(36).substring(2) + Date.now().toString(36)}`
  };

  return new Promise((resolve, reject) => {
    lambda.addPermission(params).promise().then(result => {
      resolve(result)
    }).catch(err => reject(err))
  });
};


我为Serveless框架和Shazam测试了相同的功能!我的触发器已发布!我们现在可以在不更新Serveless代码的情况下执行类似的操作。

这样,将需要在Serveless源代码上解决此问题,而我将尝试尽快完成。



通过我的检查,这是AWS Lambda函数的默认行为,因此Serverless框架没有问题。

每次我发布Lambda函数时,现在都可以自动创建触发事件。

有关更多信息,我们可以阅读Versioning aliases的文档。

10-05 20:32
查看更多