无服务器/AWS Lambda - 为已发布的 lambda 版本创建触发器

问题描述 投票:0回答:1

我正在使用 Serverless 框架在 AWS Lambda 上部署我的函数。

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

当我部署无服务器应用程序时,将创建 Lambda 函数和触发器(在本例中是我的 AWS IoT 触发器),如下图所示:

Lambda function with trigger

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

Published version without trigger

我不想每次发布新的 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
amazon-web-services aws-lambda serverless-framework serverless
1个回答
0
投票

更新

当我尝试使用自己的 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))
  });
};

我使用 Serverless 框架和 Shazam! 测试了相同的功能。我的触发器已发布!在无服务器代码未更新的情况下,我们现在可以使用此解决方法。

这样的话,这个问题就需要在Serverless源码中解决,我会尽快解决。


根据我的观察,这是 AWS Lambda 函数的默认行为,因此Serverless 框架本身没有问题。

每次发布 Lambda 函数时,都无法自动创建触发事件。

有关更多信息,您可以阅读有关版本化别名的文档。

© www.soinside.com 2019 - 2024. All rights reserved.