无服务器/AWS Lambda - 为已发布的 lambda 版本创建触发器
Serverless / AWS Lambda - Create the triggers for the published lambda versions
我正在使用 Serverless framework to deploy my functions on the AWS Lambda
我正在尝试为我发布的每个 Lambda 函数版本自动创建触发器。
当我部署我的无服务器应用程序时,会创建 Lambda 函数和触发器(在本例中是我的 AWS IOT 触发器),如下图所示:
但对于我发布的 lambda 函数版本,触发器不存在,只有资源:
我不想每次发布新的 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))
});
};
我测试了无服务器框架和Shazam的相同功能!我的触发器已发布!在无服务器代码未更新的情况下,我们现在可以做这样的事情。
这样,这个问题就需要在Serverless源码上解决了,我会尽快解决的。
根据我的检查,这是 AWS Lambda 函数的默认行为,因此 Serverless 框架没有问题。
每次发布 Lambda 函数时,都无法自动创建触发事件。
更多信息,我们可以阅读Versioning aliases的文档。
我正在使用 Serverless framework to deploy my functions on the AWS Lambda
我正在尝试为我发布的每个 Lambda 函数版本自动创建触发器。
当我部署我的无服务器应用程序时,会创建 Lambda 函数和触发器(在本例中是我的 AWS IOT 触发器),如下图所示:
但对于我发布的 lambda 函数版本,触发器不存在,只有资源:
我不想每次发布新的 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))
});
};
我测试了无服务器框架和Shazam的相同功能!我的触发器已发布!在无服务器代码未更新的情况下,我们现在可以做这样的事情。
这样,这个问题就需要在Serverless源码上解决了,我会尽快解决的。
根据我的检查,这是 AWS Lambda 函数的默认行为,因此 Serverless 框架没有问题。
每次发布 Lambda 函数时,都无法自动创建触发事件。
更多信息,我们可以阅读Versioning aliases的文档。