Amazon web services 在CloudWatch计划事件中将上一个结果传递给下一个Lambda调用
说明 我将AWS CloudWatch事件设置为每5分钟调用一个Lambda函数 我想实现的是监视API的响应是否已更改。因此,我希望将上一次调用的结果传递给下一次调用,以便进行比较 结果是<200个元素的数组,因此非常小 我的考虑是:Amazon web services 在CloudWatch计划事件中将上一个结果传递给下一个Lambda调用,amazon-web-services,amazon-s3,aws-lambda,amazon-cloudwatch,amazon-efs,Amazon Web Services,Amazon S3,Aws Lambda,Amazon Cloudwatch,Amazon Efs,说明 我将AWS CloudWatch事件设置为每5分钟调用一个Lambda函数 我想实现的是监视API的响应是否已更改。因此,我希望将上一次调用的结果传递给下一次调用,以便进行比较 结果是
- 我可以使用S3在这里获取和检索结果
- 使用AWS弹性文件系统(EFS)在调用之间存储数据
是否有一种更简单的方法在Lambda函数调用之间传递结果?没错,EFS的开销可能太大了 然而,amazons3和DynamoDB都非常适合在Lambda函数的单独调用之间持久化数据
Lambda服务本身不提供开箱即用的长期持久性。最好以无状态方式构建函数,并使用无服务器持久性服务(如S3或DynamoDB)来存储状态。没错,EFS的开销可能太大了 然而,amazons3和DynamoDB都非常适合在Lambda函数的单独调用之间持久化数据
Lambda服务本身不提供开箱即用的长期持久性。最好以无状态的方式构建函数,并使用无服务器持久性服务(如S3或DynamoDB)来存储状态。我允许自己根据@Marcin关于使用的评论添加一个答案,因为它解决了我的问题并解决了轻量级解决方案的要求 下面是一个计数器示例,每次调用Lambda函数时计数器都会递增:
// handler.js, Lambda entry point
const AWS = require('aws-sdk')
const ssm = new AWS.SSM();
const SSM_KEY = 'SSMData';
const getSSMData = async () => {
var getParams = {
Name: SSM_KEY,
};
try {
const data = await new Promise((resolve, reject) => {
ssm.getParameter(getParams, (error, data) => {
if (error) reject(error)
if (data) resolve(data)
});
});
if (data.Parameter && data.Parameter.Value) {
return JSON.parse(data.Parameter.Value)
} else {
return null
}
} catch (error) {
return false
}
}
const putSSMData = async (data) => {
const jsonData = JSON.stringify(data)
var putParams = {
DataType: "text",
Name: SSM_KEY, /* required */
Type: 'String',
Value: jsonData, /* Max 4kb */
Overwrite: true
};
try {
await new Promise((resolve, reject) => {
ssm.putParameter(putParams, (error, data) => {
if (error) reject(error)
if (data) resolve(data)
});
});
return true
} catch (error) {
console.log(error, error.stack);
return false;
}
};
module.exports.hello = async (event, context) => {
let previousResult = await getSSMData()
if (!previousResult) {
previousResult = {
count: 0
}
}
console.log({ previousResult })
const nextResult = { ...previousResult, count: previousResult.count + 1 }
await putSSMData(nextResult)
};
结果
Lambda调用1:{previousResult:{count:0}}
Lambda调用2:{previousResult:{count:1}}
Lambda调用3:{previousResult:{count:2}}
权限
必须为Lambda函数添加IAM角色才能使用SSM。使用无服务器框架:
iamRoleStatements:
- Effect: "Allow"
Action:
- "ssm:GetParameter"
Resource:
- "arn:aws:ssm:<REGION>:<ACCOUNT_ID>:parameter/SSMData"
- Effect: "Allow"
Action:
- "ssm:PutParameter"
Resource:
- "arn:aws:ssm:<REGION>:<ACCOUNT_ID>:parameter/SSMData"
IAM角色声明:
-效果:“允许”
行动:
-“ssm:GetParameter”
资源:
-“arn:aws:ssm:::参数/SSMData”
-效果:“允许”
行动:
-“ssm:PutParameter”
资源:
-“arn:aws:ssm:::参数/SSMData”
我还允许自己根据@Marcin关于使用的评论添加一个答案,因为它解决了我的问题并解决了轻量级解决方案的要求
下面是一个计数器示例,每次调用Lambda函数时计数器都会递增:
// handler.js, Lambda entry point
const AWS = require('aws-sdk')
const ssm = new AWS.SSM();
const SSM_KEY = 'SSMData';
const getSSMData = async () => {
var getParams = {
Name: SSM_KEY,
};
try {
const data = await new Promise((resolve, reject) => {
ssm.getParameter(getParams, (error, data) => {
if (error) reject(error)
if (data) resolve(data)
});
});
if (data.Parameter && data.Parameter.Value) {
return JSON.parse(data.Parameter.Value)
} else {
return null
}
} catch (error) {
return false
}
}
const putSSMData = async (data) => {
const jsonData = JSON.stringify(data)
var putParams = {
DataType: "text",
Name: SSM_KEY, /* required */
Type: 'String',
Value: jsonData, /* Max 4kb */
Overwrite: true
};
try {
await new Promise((resolve, reject) => {
ssm.putParameter(putParams, (error, data) => {
if (error) reject(error)
if (data) resolve(data)
});
});
return true
} catch (error) {
console.log(error, error.stack);
return false;
}
};
module.exports.hello = async (event, context) => {
let previousResult = await getSSMData()
if (!previousResult) {
previousResult = {
count: 0
}
}
console.log({ previousResult })
const nextResult = { ...previousResult, count: previousResult.count + 1 }
await putSSMData(nextResult)
};
结果
Lambda调用1:{previousResult:{count:0}}
Lambda调用2:{previousResult:{count:1}}
Lambda调用3:{previousResult:{count:2}}
权限
必须为Lambda函数添加IAM角色才能使用SSM。使用无服务器框架:
iamRoleStatements:
- Effect: "Allow"
Action:
- "ssm:GetParameter"
Resource:
- "arn:aws:ssm:<REGION>:<ACCOUNT_ID>:parameter/SSMData"
- Effect: "Allow"
Action:
- "ssm:PutParameter"
Resource:
- "arn:aws:ssm:<REGION>:<ACCOUNT_ID>:parameter/SSMData"
IAM角色声明:
-效果:“允许”
行动:
-“ssm:GetParameter”
资源:
-“arn:aws:ssm:::参数/SSMData”
-效果:“允许”
行动:
-“ssm:PutParameter”
资源:
-“arn:aws:ssm:::参数/SSMData”
谢谢您的回答。是的,ddb也是一种选择,但对于只存储一个文档来说,似乎也有很多选择。如果没有更简单的方法,那么我会把它和一个S3 bucket配对。DynamoDB不在乎存储一个元素还是100亿个元素。它可以根据您的需要进行扩展,这使它成为一个轻量级商店。S3也一样。谢谢你的回答。是的,ddb也是一种选择,但对于只存储一个文档来说,似乎也有很多选择。如果没有更简单的方法,那么我会把它和一个S3 bucket配对。DynamoDB不在乎存储一个元素还是100亿个元素。它可以根据您的需要进行扩展,这使它成为一个轻量级商店。与S3相同。如果数据不太多,您也可以将其存储在ssm参数存储中。如果数据不太多,您也可以将其存储在ssm参数存储中。